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?
time-integration
jcora
fuente
fuente
Respuestas:
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
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 + 1tnorte tn + 1 tn + 1 / 2 X0 0 v1 / 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.
fuente
0.5
factor? Parece estar haciendo lo mismo que tomar la velocidadn-1/2dt
hace unos segundos, que es lo que parece que estás sugiriendo.