Alla ricerca di Runge-Kutta 8 ° ordine in C / C ++


10

Vorrei usare il metodo Runge-Kutta dell'8 ° ordine (89) in un'applicazione di meccanica / astrodinamica celeste, scritta in C ++, usando una macchina Windows. Quindi mi chiedo se qualcuno conosce una buona libreria / implementazione documentata e libera da usare? Va bene se è scritto in C, purché non ci siano problemi di compilazione prevedibili.

Finora ho trovato questa libreria (mymathlib) . Il codice sembra ok, ma non ho trovato alcuna informazione sulla licenza.

Potete aiutarmi rivelando alcune delle alternative che potreste conoscere e che soddisferebbero il mio problema?

EDIT:
Vedo che non ci sono davvero tanti codici sorgente C / C ++ disponibili come mi aspettavo. Pertanto anche una versione Matlab / Octave andrebbe bene (deve essere ancora libera di usare).

Risposte:


8

Sia GNU Scientific Library (GSL) (C) che Boost Odeint (C ++) presentano metodi Runge-Kutta di ottavo ordine.

Entrambi sono opensource e sotto Linux e Mac dovrebbero essere direttamente disponibili dal gestore dei pacchetti. Sotto Windows, sarà probabilmente più facile usare Boost piuttosto che GSL.

GSL è pubblicato sotto la licenza GPL e Boost Odeint sotto la licenza Boost.

Modifica: Ok, Boost Odeint NON ha il metodo Runge-Kutta 89, solo il 78, ma fornisce una ricetta per creare stepper Runge-Kutta arbitrari.

I metodi dell'ottavo ordine sono comunque piuttosto elevati e molto probabilmente esagerano per il tuo problema.

Prince-Dormand si riferisce a un tipo specifico di Runge-Kutta e non è direttamente correlato all'ordine, ma il più comune è 45. Matlabs ode45, che è il loro algoritmo ODE consigliato, è un'implementazione Prince-Dormand 45. Questo è lo stesso algoritmo implementato in Boost Odeint Runge_Kutta_Dopri5 .


1
Grazie per la risposta. OK, ora è imbarazzante, ho dato un'occhiata a Boost Odeint anche prima di chiedere qui, e ho trovato solo "runge_kutta_fehlberg78". È la cosa giusta? In realtà non conosco le differenze tra i methonds quando usato nella pratica, ma stavo cercando un RK89 (chiamato anche Dormand-Prince mentre cerco su Internet). Puoi commentare o espandere la tua risposta in merito a questo argomento, per favore? Grazie.
James C

Post aggiornato per rispondere alle tue domande. Prince-Dormand 45 molto probabilmente risolverà bene i tuoi problemi.
LKlevin,

15

Se stai facendo la meccanica celeste su scale temporali lunghe, l'uso di un classico integratore Runge-Kutta non risparmierà energia. In tal caso, probabilmente sarebbe meglio usare un integratore simplettico. Boost.odeint implementa anche uno schema Runge-Kutta semplificato del 4 ° ordine che funzionerebbe meglio per lunghi intervalli di tempo. GSL non implementa alcun metodo simplettico, per quanto ne so.


Grazie per la risposta. Un simpatico Runge-Kutta del 4 ° ordine darebbe risultati migliori rispetto all'RKF78, se usato con i satelliti terrestri (orbita bassa e orbita più profonda), forse per un periodo di 1-3 orbite?
James C,

@JamesC Sì. Per un lungo periodo, il metodo simplettico è molto meglio.
eccstartup,

@eccstartup - Cosa considereresti un lungo periodo qui? Perché potrebbe essere lungo quanto un'orbita di un pianeta attorno al Sole, o alcune orbite di un satellite meteorologico intorno alla Terra, ecc.
James C

@JamesC Non ho riscontrato questo grosso problema. Ma per i miei problemi di modello, con molte orbite calcolate, i metodi simplettici danno orbite molto perfette.
eccstartup,

Quindi, è un consiglio programmare di possedere una versione del metodo implicito di Runge-Kutta, che include molti metodi simplettici con l'ordine più alto che desideri.
eccstartup,

4

riassumendo alcuni punti:

  1. Se si tratta di un'integrazione a lungo termine di un modello non dissapativo, un integratore simpatico è quello che stai cercando.
  2. Altrimenti, poiché è un'equazione del moto, i metodi di Runge-Kutta Nystrom saranno più efficienti di una trasformazione in un sistema del primo ordine. Esistono metodi RKN di ordine elevato dovuti a DP. Ci sono alcune implementazioni, come qui a Julia sono documentate ed eccone una MATLAB .
  3. I metodi Runge-Kutta di alto ordine sono necessari solo se si desidera una soluzione di alta precisione. Se ha tolleranze inferiori, un RK del 5 ° ordine sarà probabilmente più veloce (per lo stesso errore). La cosa migliore da fare se è necessario risolverlo spesso è testare diversi metodi. In questo set di benchmark su problemi a 3 corpi vediamo che (per lo stesso errore) i metodi RK di alto ordine sono solo un miglioramento marginale della velocità, sebbene come errore -> 0 puoi vedere che il miglioramento va già a> 5x contro Dormand -Prince 45 ( DP5) quando si osservano 4 cifre di precisione (tuttavia le tolleranze sono molto più basse per questo. Le tolleranze sono solo un campo di gioco in qualsiasi problema). Man mano che le tolleranze aumentano, il miglioramento di un metodo RK di ordine elevato aumenta, ma potrebbe essere necessario iniziare a utilizzare numeri di precisione più elevati.
  4. L'algoritmo Dormand-Prince order 7/8 ha un tableau di 8 ° ordine diverso rispetto al metodo DP853 di Hairer's dop853e DifferentialEquations.jl DP8(che sono gli stessi). Quest'ultimo metodo 853 non può essere implementato nella versione tableau standard di un metodo Runge-Kutta poiché il suo stimatore di errore non è standard. Ma questo metodo è molto più efficiente e non consiglierei nemmeno di usare i vecchi metodi Fehlberg 7/8 o DP 7/8.
  5. Per i metodi RK di alto ordine, i metodi Verner "Efficient" sono il gold standard. Ciò si manifesta nei parametri di riferimento che ho collegato. Puoi codificarli in Boost da solo o utilizzare uno dei 2 pacchetti che li implementano se li desideri più facilmente (Mathematica o DifferentialEquations.jl).

2

Vorrei aggiungere che mentre ciò che Geoff Oxberry suggerisce per l'integrazione a lungo termine (usando integratori simplettici) è vero, in alcuni casi non funzionerà. Più specificamente, se si hanno forze dissipative, il sistema non conserva più l'energia, e quindi in questo caso non è possibile ricorrere a integratori simplettici. La persona che stava ponendo la domanda stava parlando di orbite terrestri basse e tali orbite mostrano una grande quantità di resistenza atmosferica, che è una forza dissipativa che preclude l'uso di integratori così simplettici.

In quel caso specifico (e per i casi in cui non è possibile utilizzare / non avere accesso / non si desidera utilizzare gli integratori simplettici), si consiglia l'uso dell'integratore Bulirsch-Stoer se si necessita di precisione ed efficienza su tempi lunghi. Funziona bene per esperienza ed è anche raccomandato dalle Ricette numeriche (Press et al., 2007).


No, non raccomandare ricette numeriche. Soprattutto, nella maggior parte dei casi Burlirsch-Stoer non dovrebbe essere raccomandato. Questo è un problema ben noto con il libro. Guarda un mucchio di confusioni dei migliori ricercatori nel campo qui: uwyo.edu/buerkle/misc/wnotnr.html . Se vuoi benchmark su questo, vedi il primo libro di Hairer in cui vedrai che BS non fa quasi mai bene. L'ordine più elevato è più efficace solo quando gli errori sono abbastanza bassi e noi (e altri) abbiamo fatto il benchmarking per dimostrare in modo abbastanza coerente che è efficace solo per la precisione in virgola mobile.
Chris Rackauckas,

Non posso parlare troppo per NR poiché l'ho usato principalmente per ODE, ma mi sembra che i reclami nella pagina a cui ti colleghi siano vecchi e siano stati risolti dagli autori di NR nella loro risposta (fine della pagina), ma questo è fuori tema. Per quanto riguarda l'integrazione a lungo termine delle orbite con elevata precisione (diciamo, 13-14 cifre) che è ciò di cui ho parlato nella mia risposta, è dimostrato da tempo che i metodi di estrapolazione funzionano bene (vedi il capitolo di Montenbruck & Gill sull'integrazione numerica). Anche articoli più recenti lo usano e ha dimostrato a me e agli altri un metodo affidabile ed efficiente.
Vienna,

M&G lo prova solo con dop853 e i metodi RK di ordine superiore più moderni, come quelli dovuti a Verner, sono molto più efficienti. Anche M&G sembra misurare solo usando le valutazioni delle funzioni, che sono un debole indicatore dei tempi. Inoltre non va contro i metodi Runge-Kutta Nystrom che sono specifici per ODE di secondo ordine e sono più efficienti dei metodi RK del primo ordine applicati al secondo ordine di un po '. A 13-14 cifre BS è probabilmente competitivo sulla maggior parte dei problemi, ma è ben lungi dall'essere una scelta ovvia e non ho visto un diagramma di precisione del lavoro con metodi recenti in disaccordo con quello.
Chris Rackauckas,

M&G testano RKN contro RK, e BS e altri contro RKN (pagine 123-132 e 151-154) e dicono che sono i metodi più efficienti di RK (escluso Verner anche se lo citano). BS ha dimostrato di essere efficiente a 13-14 cifre, che era la mia affermazione, l'ho visto testato contro dop853, ABM (12), Taylor e RK8 standard e funziona bene. Devo ammettere che non l'ho visto testato contro RKN ma da quello che posso vedere da M&G non è lontano da FILG11 per esempio. Sono sinceramente interessato a RK di Verner e guarderò i tuoi link sopra. Hai un documento che li verifica tutti per vedere?
viiv

Sono tornato indietro e ho riprogrammato un sacco di parametri su DiffEqBenchmarks.jl e odexnon ho avuto la tendenza giusta. Quindi, almeno per gli ODE del 1 ° ordine e per le tolleranze >=1e-13, l'estrapolazione non sembra andare bene e di solito non è nemmeno vicina. Ciò è in linea con la rivendicazione di cui sopra.
Chris Rackauckas,
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.