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˙v˙= v= Fm,
mxn+1Xn + 1- xnΔ tvn + 1- vnΔ t= vn= Fnm,
nXn + 1vn + 1= xn+ Δ t ⋅ vn= vn+ Δ t Fnm.
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 + 1vn + 1 / 2= xn+ Δ t ⋅ vn + 1 / 2= vn - 1 / 2+ Δ t Fnm
. 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.
ω = G Mr3----√,
Mr