V splošnem imamo seveda več kot le dve telesi. Gibanje vseh teles ne moremo izračunati analitično, zato se moramo poslužiti numerični integraciji. Zaradi popolnega nadzora in izgleda smo se odločili, da bomo napisali svoj integrator in prikaz rezultata v HTML s pomočjo javascript-a, za čim hitrejši in nemoteni prikaz.
Astronomski pojavi običajno trajajo dolgo časa (na primer perioda orbite Zemlje okoli Sonca je po definiciji enaka enemu letu). Da v mednarodnem sistemu enot lahko simuliramo astronomske pojave torej potrebujemo zelo veliko korakov. Zato uporabimo astronomski sistem enot, kjer ena časovna enota predstavlja eno leto (po definiciji ), masna enota predstavlja maso Sonca (po definiciji ) in dolžinska enota predstavlja astronomsko enoto (po definiciji ). V takem sistemu zaradi tretjega Keplerjevega zakona v primeru Zemlje velja še:
Integracijske metode¶
Izraz za silo poznamo točno, iz izraza za silo pa točno poznamo pospešek telesa. Toda tu sedaj nastane problem v temu, kako upoštevamo ta pospešek - čas namreč simuliramo po korakih, in te koraki so običajno veliki, zato da rezultat simulacije dobimo v zmernem času. Poslužiti se moramo torej aproksimacijam, ki jih je veliko.
Eksplicitna Eulerjeva metoda¶
Je najbolj enostavna in posledično najbolj nezanesljiva metoda. Ta pravi, da upoštevamo klasične enačbe za gibanje telesa in upoštevamo diskretni korak:
Takoj lahko uvidimo zakaj je ta način neprimeren. Predstavljajmo si satelit, ki kroži okoli Zemlje - njegova hitrost je vedno tangencialna na krožnico. Če ga premaknemo za vektor hitrosti, bo satelit že po prvi iteraciji padel dol iz krožnice.
Semi-implicitna Eulerjeva metoda¶
Ta je zelo podobna eksplicitni metodi, le da za premik upošteva hitrost v naslednjem koraku:
Če pomislimo na enakem primeru kroženja satelita okoli Zemlje, je to res nekoliko bolje. Satelit bo v naslednji točki res imel hitrost, ki kaže bolj usmerjeno proti središču Zemlje (odmik od krožnice bo torej manjši).
Pozicijska Verlet metoda¶
Ta je že nekoliko bolj neintuitivna, toda jo je zelo lahko izpeljati. Ideja je da novo pozicijo izračunamo kar neposredno iz pospeška, ki ga poznamo točno:
Pri tej metodi torej sploh ne upoštevamo hitrosti, zato je ne bomo simulirali (metoda ni uporabna za natančnost, morali pa bi zelo spremeniti strukturo simulatorja, kar se ne splača za samo eno primerjavo). Začetni pogoj sta sedaj dve točki, kjer drugo lahko posredno izračunamo iz hitrosti:
Hitrostna Verlet metoda¶
Ta je še nekoliko boljša kot pozicijska Verlet metoda, saj izračuna še vmesni korak, s pomočjo katerega lahko boljše oceni nove parametre telesa:
Toda kot je razvidno iz formule, hitrost nastavimo glede na pospešek, ki ga moramo ponovno izračunati v novi poziciji (torej gre za bolj časovno potratno metodo).
Leapfrog metoda¶
Ta je zelo podobna hitrostni Verlet metodi, le da zanjo ni potrebno shraniti prejšnjih pospeškov, ampak vmesne hitrosti:
Runge-Kutta metoda¶
Ta je nekoliko podobna Leapfrog in hitrostni Verlet metodi, le da ima več vmesnih izračunov (zato je tudi najbolj potratna). Metoda sloni na izračunu naslednjega stanja s pomočjo odvoda in nekega poljubnega koraka :
Naslednjo vrednost lahko izračunamo z več vmesnimi izračuni. Na primer metoda RK4 ima 4 vmesne izračune:
Da izračunamo neko vrednost v naslednjem trenutku torej potrebujemo še njen odvod. Za vektorje to seveda velja po komponentah, zato vse skupaj lahko zapišemo v vektorski obliki, zanimata pa nas tako pozicija kot hitrost:
PosixPath('/srv/simastro/book/simulations/N_body_problem.html')