Qual è il modo corretto di integrarsi nelle simulazioni di astronomia?


15

Sto creando un semplice simulatore di astronomia che dovrebbe usare la fisica newtoniana per simulare il movimento dei pianeti in un sistema (o qualsiasi oggetto, per quella materia). Tutti i corpi sono cerchi in un piano euclideo, che hanno proprietà come posizione, velocità, massa, raggio e forza risultante.

Voglio aggiornare l'universo in piccoli intervalli di tempo, di solito pochi millisecondi, ma non sono sicuro di come calcolare correttamente le modifiche di posizione.

La forza è semplice: fr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2).

Ma come posso procedere da lì?

Potrei farlo:

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

Ma questo, ovviamente, sarebbe falso. Forse se aggiungessi 0,5 come fattore nel calcolo della posizione?


È troppo divertente non commentare: è davvero un problema astronomico comune simulare il movimento di "piante" ;-)
Wolfgang Bangerth,

Risposte:


17

In sostanza hai la risposta - non è necessario il fattore 0,5.

Essenzialmente hai un sistema bidimensionale di ODE del primo ordine: dove tutto è una funzione del tempo tranne presumibilmente , e i punti indicano i derivati ​​del tempo. Se esegui una semplice e differenziazione di primo ordine, a quella di Eulero in avanti, trovi o Qui sto indicizzando il timestep con .mx n + 1 -xn

X˙=vv˙=Fm,
mxn+1
Xn+1-XnΔt=vnvn+1-vnΔt=Fnm,
n
Xn+1=Xn+Δtvnvn+1=vn+ΔtFnm.
n

Tuttavia, forward-Euler è intrinsecamente instabile. Fortunatamente, c'è un metodo simpatico proprio dietro l'angolo. (L'articolo collegato è più un troncone, ma potrebbe contenere alcuni collegamenti utili.) La chiave è di avanzare posizioni da a usando le velocità a . Cioè, supponiamo che ti siano stati dati e per ogni particella. Quindi puoi usare per integrarsi in avanti nel tempo. Questo è noto come metodo leapfrogtntn+1tn+1/2X0v1/2

Xn+1=Xn+Δtvn+1/2vn+1/2=vn-1/2+ΔtFnm
. Con questo, il tuo sistema conserva una sorta di energia e le orbite hanno meno probabilità di volare all'infinito o cose del genere a causa della crescita esponenziale dell'errore di arrotondamento.

L'unico problema è come ottenere , poiché presumibilmente inizi con . Lì dovresti usare uno schema tanto preciso quanto sei pronto a scrivere, il Runge-Kutta del quarto ordine è una scelta popolare. Potrebbe essere instabile a lungo termine, ma c'è solo così tanto errore che presenterai in mezzo timestep, e quell'errore verrà mantenuto piccolo in seguito dallo schema leapfrog.v1/2v0

Infine, questa risposta si applica a qualsiasi sim di gravità newtoniana generale. Se vuoi davvero cerchi perfetti , come menzionato nel passaggio nella domanda, non otterrai quelli se non in un sistema idealizzato in cui i pianeti non interagiscono tra loro e le condizioni iniziali sono scelte giuste. In tal caso, non è necessario integrarsi affatto, poiché la velocità angolare (radianti per unità di tempo) di un tale oggetto è semplicemente dove è la massa dell'oggetto centrale e è il raggio dell'orbita. Questo può essere usato per testare l'accuratezza della tua simulazione.

ω=solMr3,
Mr

Ehi, puoi spiegare perché non ho bisogno del 0.5fattore? Sembra che stia facendo la stessa cosa di prendere la velocità n-1/2dtpochi secondi fa, ed è quello che sembra che tu stia suggerendo.
jcora,

Sarebbe lo stesso solo se la velocità a fosse 0. Quello che vuoi è una stima del primo ordine della media di e (quest'ultima che non conosci), non la media di e . (n-1)vnvn+1vn0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.