¿Cuál es la forma correcta de integrarse en simulaciones de astronomía?

15

Estoy creando un simulador de astronomía simple que debería usar la física newtoniana para simular el movimiento de los planetas en un sistema (o cualquier objeto, para el caso). Todos los cuerpos son círculos en un plano euclidiano, que tienen propiedades como posición, velocidad, masa, radio y la fuerza resultante.

Quiero actualizar el universo en pequeños pasos, generalmente unos pocos milisegundos, pero no estoy seguro de cómo calcular correctamente los cambios de posición.

La fuerza es simple: fr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2).

Pero, ¿cómo sigo desde allí?

Yo podría hacer esto:

a = Fr/body.m
v += a*dt
position += v*dt

Pero eso, por supuesto, sería falso. ¿Tal vez si agregué 0.5 como factor en el cálculo de la posición?

jcora
fuente
Es demasiado divertido no comentarlo: de hecho, es un problema astronómico común simular el movimiento de "plantas" ;-)
Wolfgang Bangerth

Respuestas:

17

Básicamente tienes la respuesta: no necesitas el factor 0.5.

Esencialmente, tiene un sistema bidimensional de EDO de primer orden: donde todo es función del tiempo, excepto presumiblementem, y los puntos denotan derivadas del tiempo. Si hace una diferenciación de primer orden simple, de estilo Euler hacia adelante, encontrará x n + 1 -xn

X˙=vv˙=Fmetro,
metro o xn+1
Xnorte+1-XnorteΔt=vnortevnorte+1-vnorteΔt=Fnortemetro,
Aquí estoy indexando el paso de tiempo conn.
Xnorte+1=Xnorte+Δtvnortevnorte+1=vnorte+ΔtFnortemetro.
norte

Sin embargo, el avance de Euler es inherentemente inestable. Afortunadamente, hay un método simpléctico a la vuelta de la esquina. (Eso artículo enlazado es más de un talón, pero podría contener algunos enlaces útiles.) La clave está en las posiciones de avance de a t n + 1 utilizando velocidades en t n + 1 / 2 . Es decir, supongamos que se les dio x 0 y v 1 / 2 para cada partícula. Entonces podrías usar x n + 1tnortetnorte+1tnorte+1/ /2X0 0v1/ /2 para integrarse adelante en el tiempo. Esto se conoce como elmétodo leapfrog. Con esto, su sistema conserva una especie de energía, y es menos probable que las órbitas vuelen al infinito o algo así debido al crecimiento exponencial del error de redondeo.

Xnorte+1=Xnorte+Δtvnorte+1/ /2vnorte+1/ /2=vnorte-1/ /2+ΔtFnortemetro

v1/ /2v0 0

ω=solMETROr3,
METROr

fuente
Oye, ¿puedes explicar por qué no necesito el 0.5factor? Parece estar haciendo lo mismo que tomar la velocidad n-1/2dthace unos segundos, que es lo que parece que estás sugiriendo.
jcora
(norte-1)vnortevnorte+1vnorte0 0