Posso utilizzare uno schema di time stepping esplicito per determinare numericamente se un ODE è rigido?


10

Ho un ODE:

u ( 0 ) = - 1u=1000u+sin(t)
u(0)=11000001

So che questo particolare ODE è rigido, analiticamente. So anche che se usiamo un metodo esplicito (forward) di time stepping (Euler, Runge-Kutta, Adams, ecc.), Il metodo dovrebbe restituire errori molto grandi se la fase temporale è troppo grande. Quindi, ho due domande:

  1. È così che vengono determinati gli ODE rigidi, in generale, quando un'espressione analitica per il termine di errore non è disponibile o derivabile?

  2. In generale, quando l'ODE è rigido, come posso determinare un timestep "abbastanza piccolo"?


Esistono metodi standard per rilevare la rigidità usando metodi espliciti. Sto inserendo questo commento qui perché potrebbe essere difficile trovare la mia risposta più dettagliata di seguito.
David Ketcheson,

Risposte:


6

Per rispondere alle tue domande:

  1. Per quanto ne so, in pratica, se i metodi espliciti richiedono passi temporali straordinariamente piccoli rispetto alla scala temporale di interesse (vedere le risposte a questa domanda su cosa significa che un ODE è rigido ) al fine di ottenere risultati accurati, quindi per a tutti gli effetti, il tuo problema è rigido. Per determinare i requisiti sulla dimensione del gradino, fare affidamento su una delle tante librerie là fuori scritte da esperti (la suite MATLAB ne è un esempio, anche SUNDIALS, VODE, DASPK, DASSL, LSODE, ecc.), Che hanno euristica adattativa del time stepping. Il manuale SUNDIALS spiega le regole di decisione che usano per determinare la dimensione dei passi che il pacchetto richiede, per darti un esempio di regole che vengono utilizzate nella pratica.

  2. Ancora una volta, userei una libreria con il tempo adattivo in pratica, perché è più efficiente farlo. Tuttavia, se stavi codificando un metodo da solo, utilizzando dimensioni di passo fisse, se notassi grandi oscillazioni o la tua soluzione "esplodesse", allora sospetteresti che il tuo passo temporale fosse troppo grande e lo riduresti. Ripetere l'operazione fino ad ottenere una soluzione numerica ragionevolmente ben educata. Libri di testo come Ascher e Petzold e Hairer e Wanner hanno buoni esempi di questo fenomeno.


9

Un modo migliore per osservarlo è che per un problema rigido, qualsiasi calcolo esplicito stabile porta a un errore che è molto più piccolo della tolleranza di errore richiesta .

Esistono molti buoni metodi per rilevare automaticamente la rigidità usando schemi espliciti, in particolare le coppie Runge-Kutta incorporate. Vedi ad esempio:

Nel secondo esempio di faleichik, poiché la dimensione del passo è ridotta, si vedrebbe un'improvvisa riduzione drammatica dell'errore a livelli molto al di sotto di una tolleranza desiderata tipica quando viene superata la soglia di timestep stabile. Quindi un buon stimatore di errori rivelerebbe davvero la rigidità del problema. Nel primo problema, l'errore ottenuto con una dimensione del gradino stabile sarebbe nell'intervallo della tolleranza desiderata tipica, indicando la non rigidità.

Si noti di conseguenza che qualsiasi problema diventa non rigido se è richiesta una tolleranza di errore sufficientemente rigorosa.


2
Erano documenti a cui stavo per collegarmi prima di vedere la tua risposta. +1, ovviamente. :) Vorrei anche aggiungere questo , questo e infine questo . Questo è sicuramente un problema ben studiato ...
JM

9

1. Possiamo rilevare numericamente la rigidità semplicemente applicando metodi espliciti?

  • Supponiamo di avere un problema con il valore iniziale per alcuni ODE su . Prendi un grande passo e un metodo Euler esplicito, esegui i tuoi calcoli con un passo costante e ottieni questi punti:τ = 1 τ[0,10]τ=1 τ

    inserisci qui la descrizione dell'immagine

    Si stima l'errore e sembra essere grande. Bene, allora prendi e ottieniτ=0.1inserisci qui la descrizione dell'immagine

    La stima dell'errore è ora accettabile. Stepsize è piccolo relativamente a .[ 0 , 10 ] τ=0.1[0,10]

    Quindi, il problema è rigido? La risposta è NO ! Per riprodurre correttamente le oscillazioni della soluzione è necessario un piccolo passo in avanti .

    Il problema che abbiamo risolto è

    y(t)=2cosπt,y(0)=1.

  • Ora prendi un altro ODE sullo stesso intervallo, ed Euler esplicito ti dà quasi la stessa soluzione numerica:τ=1

    inserisci qui la descrizione dell'immagine

    Prendi e ora la soluzione numerica èτ=0.1

    inserisci qui la descrizione dell'immagine

    La stima dell'errore ora è piccola. Stepsize è piccolo relativamente a .[ 0 , 10 ] τ=0.1[0,10]

    Questo problema è rigido? ! Abbiamo fatto molti piccoli passi per riprodurre la soluzione che sta cambiando molto lentamente. Questo è irrazionale! L'entità del passo temporale qui è limitata dalle proprietà di stabilità di Eulero esplicito .

    Questo problema è

    y(t)=2y(t)+sint/2,y(0)=1.

Nota che il numero di dimensioni del gradino può essere molto maggiore se prendiamo un intervallo di integrazione più lungo.


Conclusione: le informazioni sui timestep e sugli errori corrispondenti non sono sufficienti per rilevare la rigidità. Dovresti anche guardare la soluzione ottenuta. Se varia lentamente e la dimensione è molto piccola, è molto probabile che il problema sia rigido. Se la soluzione oscilla rapidamente e ti fidi della tua tecnica di stima degli errori, questo problema non è rigido.


2. Come determinare la dimensione massima che consente di integrare il problema rigido con il metodo esplicito?

Se si utilizza un risolutore esplicito black-box con controllo automatico dei passi, non è necessario eseguire alcuna operazione: il software prenderà le misure necessarie in modo adattivo.

Supponiamo che tu voglia ottenere la soluzione manualmente con un passo costante, o semplicemente stimare quante ore dovresti aspettare fino a quando il tuo metodo esplicito non risolverà il problema. Quindi dovresti conoscere lo spettro della tua matrice Jacobi. Supponiamo che sia reale e si trovi in (nel tuo esempio ).Λ = - 1000[Λ,0]Λ=1000

Quindi dovresti calcolare l' intervallo di stabilità reale ( dominio di stabilità in casi complessi) del tuo metodo esplicito. Non è troppo difficile, devi solo consultare un libro di testo su questo argomento. Nel caso di Eulero esplicito questo intervallo è . Ora, se vuoi che la tua soluzione non esploda, dovresti prendere tale che risieda nell'intervallo di stabilità, cioè nel nostro caso τ Λ τ τ 2[2,0]τΛτ

τ2|Λ|.

Se vuoi maggiore coerenza, dovresti prendere poiché permolto probabilmente la tua soluzione produrrà oscillazioni innaturali (ma sbiadite).1/| Λ| <τ2/| Λ|

τ1|Λ|,
1/|Λ|<τ2/|Λ|

Naturalmente tale analisi è applicabile principalmente per problemi lineari con spettro noto. Per problemi più pratici dovremmo fare affidamento su metodi numerici di rilevamento della rigidità (vedere riferimenti e commenti in altre risposte).


Come menzionato in alcuni degli articoli a cui David era legato, il metodo di alimentazione per trovare autovalori dominanti (opportunamente modificato) è una scelta abituale per i rilevatori di rigidità basati su Jacobian.
JM
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.