L'impostazione del benchmark
Nel software Julia DifferentialEquations.jl abbiamo implementato molti metodi di ordine superiore, inclusi i metodi Feagin. Puoi vederlo nel nostro elenco di metodi , e poi ce ne sono molti altri che puoi usare come tableau forniti . Poiché tutti questi metodi sono messi insieme, è possibile eseguire facilmente il benchmark tra di loro. Puoi vedere i benchmark che ho online qui e vedere che è molto semplice confrontare molti algoritmi diversi. Quindi, se vuoi dedicare qualche minuto per eseguire i benchmark, provaci. Ecco un riassunto di ciò che viene fuori.
Prima di tutto è importante notare che, se guardi ciascuno dei benchmark, vedrai che i nostri DP5
(Ordine 5 di Dormand-Prince) e i DP8
metodi sono più veloci dei codici Hairer Fortran ( dopri5
e dop853
), e quindi queste implementazioni sono ottimizzate molto bene . Questi mostrano che, come notato in un altro thread, l'uso eccessivo dei metodi Dormand-Prince è dovuto al fatto che i metodi sono già scritti, non perché sono ancora i migliori. Quindi il vero confronto tra le implementazioni più ottimizzate è tra i metodi Tsitorous, i metodi Verner e i metodi Feagin di DifferentialEquations.jl.
I risultati
In generale, i metodi di un ordine superiore a 7 hanno un costo computazionale aggiunto che di solito non è superato dall'ordine, date le tolleranze scelte. Uno dei motivi è che le scelte dei coefficienti per i metodi di ordine inferiore sono più ottimizzate (hanno piccoli "coefficienti di errore di troncamento di principio", che contano di più quando non si è asintopicamente piccoli). Puoi vedere che in molti problemi come qui i metodi Verner Efficient 6 e 7 funzionano molto bene, ma metodi come Verner Efficient 8 possono avere una pendenza inferiore. Questo perché i "guadagni" di ordine superiore si combinano con tolleranze inferiori, quindi c'è sempre una tolleranza in cui i metodi di ordine superiore saranno più efficienti.
Tuttavia, la domanda è allora, quanto in basso? In un'implementazione ben ottimizzata, questo diventa piuttosto basso per due motivi. Il primo motivo è perché i metodi di ordine inferiore implementano qualcosa chiamato FSAL (il primo uguale all'ultimo). Questa proprietà significa che i metodi di ordine inferiore riutilizzano una valutazione della funzione dal passaggio precedente al passaggio successivo e quindi hanno effettivamente una valutazione della funzione in meno. Se questo viene usato correttamente, allora qualcosa come un metodo del 5 ° ordine (Tsitorous o Dormand-Prince) sta effettivamente prendendo 5 valutazioni delle funzioni invece delle 6 suggerite dai tableau. Questo vale anche per il metodo Verner 6.
L'altro motivo è dovuto alle interpolazioni. Uno dei motivi per utilizzare un metodo di ordine molto elevato è prendere meno passaggi e semplicemente interpolare i valori intermedi. Tuttavia, al fine di ottenere i valori intermedi, la funzione di interpolazione potrebbe richiedere più valutazioni delle funzioni rispetto a quelle utilizzate per eseguire il passaggio. Se guardi i metodi di Verner, sono necessarie 8 valutazioni di funzioni extra per il metodo Ordine 8 per ottenere un interpolante Ordine 8. Molte volte i metodi di ordine basso forniscono un'interpolazione "libera", ad esempio la maggior parte dei metodi di ordine 5 ha un'interpolazione di ordine 4 libera (nessuna valutazione di funzione extra). Quindi questo significa che se hai bisogno di valori intermedi (di cui avrai bisogno per una buona trama se stai usando un metodo di ordine elevato), ci sono alcuni costi nascosti extra. Tieni conto del fatto che questi valori interpolati sono davvero importanti per la gestione degli eventi e la risoluzione delle equazioni differenziali di ritardo e capisci perché i costi di interpolazione extra influiscono.
E i metodi Feagin?
Quindi vedrai che i metodi Feagin mancano sospettosamente dai parametri di riferimento. Stanno bene, i test di convergenza funzionano su numeri di precisione arbitrari, ecc., Ma per farli funzionare bene bisogna chiedere tolleranze piuttosto assurde. Ad esempio, ho scoperto in benchmark non pubblicati che Feagin14
supera le prestazioni Vern9
(metodo Verner Efficient del 9 ° ordine) a tolleranze simili 1e-30
. Per applicazioni con dinamiche caotiche (come nei pleidi o problemi di astrofisica a 3 corpi), potresti volere questa quantità di precisione a causa della dipendenza sensibile (errori nei sistemi caotici composti velocemente). Tuttavia, la maggior parte delle persone sta probabilmente calcolando con numeri in virgola mobile a precisione doppia e non ho trovato un punto di riferimento in cui superino in questo dominio di tolleranza.
Inoltre, non esiste alcun interpolante da associare ai metodi Feagin. Quindi quello che faccio è semplicemente mettere un'interpolazione eremita del terzo ordine su di loro in modo che uno esista (e funzioni sorprendentemente bene). Tuttavia, se non esiste una funzione di interpolazione standard, è possibile eseguire il metodo ricorsivo Hermite (utilizzare questa interpolazione per ottenere il punto medio, quindi eseguire un'interpolazione del 5 ° ordine, ecc.) Per ottenere un'interpolazione di ordine elevato, ma questo è molto costoso e il risultato l'interpolazione non ha necessariamente un termine di errore di troncamento a basso principio (quindi va bene solo quando dt
è veramente piccolo, che è esattamente l'opposto del caso che vogliamo!). Quindi, se mai hai bisogno di un'interpolazione davvero buona per abbinare la tua precisione, devi almeno tornare a qualcosa del genere Vern9
.
Nota sull'estrapolazione
Si noti che i metodi di estrapolazione sono semplicemente algoritmi per la generazione di metodi Runge-Kutta di ordine arbitrario. Tuttavia, per il loro ordine prendono più passi del necessario e hanno coefficienti di errore di troncamento ad alto principio, e quindi non sono così efficienti come un metodo RK ben ottimizzato in un dato ordine. Ma data l'analisi precedente, ciò significa che esiste un dominio di tolleranza estremamente bassa in cui questi metodi faranno meglio dei metodi "noti" RK. Ma in ogni benchmark che ho eseguito, sembra che non sia diventato così basso.
Nota sulla stabilità
La scelta non ha davvero nulla a che fare con i problemi di stabilità. In effetti, se passi attraverso i tab DifferusEquations.jl (puoi solo plot(tab)
per le regioni di stabilità) vedrai che la maggior parte dei metodi ha regioni di stabilità sospettosamente simili. Questa è in realtà una scelta. Di solito quando si derivano i metodi, l'autore di solito fa quanto segue:
- Trova i coefficienti di errore di troncamento del principio più basso (ovvero i coefficienti per i termini del prossimo ordine)
- Soggetto ai vincoli dell'ordine
- E avvicina la regione di stabilità a quella del metodo Ordine 5 di Dormand-Prince.
Perché l'ultima condizione? Bene, poiché quel metodo tende ad essere sempre stabile con il modo in cui vengono fatte le scelte di misure adattive controllate da PI, quindi è una buona barra per le regioni di stabilità "abbastanza buone". Quindi non è un caso che tutte le regioni di stabilità tendano ad essere simili.
Conclusione
Ci sono compromessi in ogni scelta di metodo. I metodi RK di ordine più alto non sono semplicemente così efficienti con tolleranze più basse sia perché è più difficile ottimizzare la scelta dei coefficienti, sia perché il numero di valutazioni delle funzioni è composto (e aumenta ancora più rapidamente quando sono coinvolte interpolazioni). Tuttavia, se la tolleranza scende abbastanza, vincono, ma le tolleranze richieste possono essere molto al di sotto delle applicazioni "standard" (vale a dire realmente applicabili solo ai sistemi caotici).