Códigos de Python para resolver y animar la dinámica de masas que interactúan mediante fuerzas gravitatorias. El script principal es nbody/nobdy.py
, que simula la evolución de un sistema de masas usando un integrador temporal tipo leapfrog. El script nbody/animation.py
puede utilizarse para generar una animación de los resultados obtenidos utilizando PyGame. Todas las unidades están en el sistema internacional.
Para correr estos códigos es necesario instalar las siguientes librerías: NumPy, PyGame, pandas, tqdm y PyYAML, lo cual puede hacerse mediante el comando:
pip install numpy pygame-ce pandas tqdm pyyaml
Para tener una copia de este repositorio en tu sistema, podés clonar el mismo usando
git clone https://github.com/ffiza/nbody.git
o bien descargar el repositorio comprimido en formato ZIP yendo a Code > Download ZIP
.
Para animar las simulaciones inlcuidas en este repositorio (cuyos resultados están almacenados en el directorio results/
, en una archivo CSV por simulación) sólo es necesario ejecutar
python nbody/animation.py --result [nombre_resultados]
Por ejemplo, para animar los resultados dentro del archivo simulation_p01_ic01.csv
, ejecutar
python nbody/animation.py --result simulation_p01_ic01
La simulación inicia pausada y puede activarse presionando P
. Además, R
resetea la animación y D
muestra o esconde el panel del debugger.
Para ejecutar tus propias simulaciones, es necesario que crees un nuevo archivo dentro del directorio configs/
y otro dentro del directorio ics/
, como se describe más abajo. Luego, simplemente podés correr
python nbody/nbody.py --physics [nombre_archivo_configs] --ic [nombre_archivo_ics]
Python va a correr toda la simulación (tené en cuenta que cuantas más partículas haya más lenta va a ser la ejecución) y guardar los resultados en el directorio results/
, en un archivo CSV.
Finalmente, para animar tus resultados, podés correr
python nbody/animation.py --result [nombre_resultados]
Los archivos de configuración relacionados con la física (paso temporal para la integración, longitud de suavizado, constante gravitatoria) para cada simulación pueden encontrarse en configs/
en formato yml
, las condiciones iniciales están en ics/
, los resultados de cada corrida son almacenados en results/
y las configuraciones globales (comunes a todas las corridas) se encuentran en configs/global.yml
.
Algunas animaciones pueden encontrarse en YouTube.
Ejemplo 1: Órbitas parabólicas (simulation_p01_ic01
)
Un ejemplo de dos cuerpos que describen órbitas parabólicas (la energía mecánica total del sistema es nula).
Ejemplo 2: Órbitas parabólicas (simulation_p02_ic02
)
Un ejemplo de dos cuerpos que describen órbitas parabólicas, pero la mínima distancia entre ambos en la mitad de la distancia inicial.
Ejemplo 3: Órbitas elípticas (simulation_p03_ic03
)
Un ejemplo de dos cuerpos con energía mecánica total negativa que describen órbitas elípticas.
Ejemplo 4: Órbitas elípticas con errores numéricos (simulation_p04_ic04
)
Un ejemplo de dos cuerpos con energía mecánica total negativa que describen órbitas elípticas claramente distorsionadas debido a errores numéricos en la integración de las ecuaciones diferenciales.
Ejemplo 5: Órbitas elípticas con mayor resolución temporal (simulation_p05_ic05
)
El caso anterior, pero con un paso temporal menor para prevenir errores numéricos en la integración.