Dormand Prince in Javascript

Trascrivo qui i risultati di quattro casi prova di crescente difficoltà

// Il risultato finale dovrebbe essere [1,7.38905609893065]

...100
...101
...102

// Il risultato finale dovrebbe essere [-1,0]

...200
...201
...202

// Il risultato finale dovrebbe essere [146079760576,0,0,30500] ossia la distanza dal Sole dovrebbe essere circa 146 miliardi di metri e la velocità tangenziale, lungo y dovrebbe essere quella data all'inizio ossia 30500. L'orbita dovrebbe essere completata e la durata dell'orbita ossia il tempo finale è stato determinato usando la soluzione esatta del moto ellittico. Usando le formule si è fissata la lunghezza del transitorio ossia un anno ovvero un intero periodo di rivoluzione che è risultato essere di 31556606 secondi...31 milioni circa...

Notare che questo è un test più impegnativo dei precedenti dato che richiede la soluzione di 4 equazioni differenziali.

...300
...301
...302

// Un sistema a tre corpi non ammette una soluzione analitica per cui il solo test possibile è il confronto tra calcoli fatti a diversa tolleranza degli errori...

...400
...401
...402
...403
//

Dormand Prince in maximese

Qui sono le funzioni originarie che ho realizzato in Maxima programmandole in questo discutibile modo... Utilizzata in questa funzione:

Bibliografia

Panoramica dell'algoritmo

In una sola tabella ecco i coefficienti, in forma di numeri razionali, del Runge Kutta di Dormand Prince. In gergo questa si chiama la tabella del sig. Butcher... citata anche nella wikipedia...

 i    c[i]     a[i,1]     a[i,2]     a[i,3]     a[i,4]     a[i,5]     a[i,6]     b[i]    bp[i] 
1 0 0 0 0 0 0 0 35384 517957600
2 15 15 0 0 0 0 0 0 0
3 310 340 940 0 0 0 0 5001113 757116695
4 45 4445 − 5615 329 0 0 0 125192 393640
5 89 193726561 − 253602187 644486561 − 212729 0 0 − 21876784 − 92097339200
6 1 90173168 − 35533 467325247 49176 − 510318656 0 1184 1872100
7 1 35384 0 5001113 125192 − 21876784 1184 0 140

Qui invece fornisco gli stessi dati ma moltiplicati per un opportuno coefficiente ossia 171362822400 in modo di poter usare nei programmi in Fortran, C, Javascript etc... solo numeri interi specificabili in modo ESATTO.

i a[i,1] a[i,2] a[i,3] a[i,4] a[i,5] a[i,6]
1 0 0 0 0 0 0
2 34272564480 0 0 0 0 0
3 12852211680 38556635040 0 0 0 0
4 167554759680 -639754536960 609290035200 0 0 0
5 505965644800 -1987087872000 1683278643200 -49833907200 0 0
6 487745760600 -1843448544000 1526229734400 47708967600 -46873096200 0
7 15619007250 0 76982400000 111564337500 -55243291950 22440369600

i c[i] b[i] bp[i]
1 0 15619007250 15407778771
2 34272564480 0 0
3 51408846720 76982400000 77711166720
4 137090257920 111564337500 105227483130
5 152322508800 -55243291950 -46527128109
6 171362822400 22440369600 15259451328
7 171362822400 0 4284070560

Ovviamente non voglio mettere in competizione questo solutore di equazioni differenziali alle derivate ordinarie con le funzioni realizzate da competenti in Maxima o in Mathematica 9 ma penso che questa versione del Runge Kutta di Dormand e Prince serva a ... fini didattici per capire come si può affrontare questo tipo di problemi

Insomma il mio è solo il desiderio di essere capace di camminare con le mie gambe ed evitare di annegare anche se, ovviamente, pur sapendo camminare e stare a galla, è molto meglio usare una bicicletta o una motocicletta o una automobile e, in mare, stare su una robusta e potente nave...

Giampaolo Bottoni
gpbottoni@gmail.com
http://www.alumni.polimi.it/it/Wall
( ing. nucleare 1972 )