Stabilità assoluta, problemi stiff e sistemi di equazioni differenziali
In questa pagina 7
La nota precedente (Metodi di Eulero esplicito, implicito e Crank-NicolsonProblema di Cauchy $y'=f(t,y)$, $y(t_0)=y_0$, con $f$ lipschitziana in $y$ (costante $L$): ben posto. Nodi $t_n=t_0+nh$, $u_n\approx y(t_n)$. Eulero esplicito $u_{n+1}=u_n+h,f(t_n,u_n)$; Eulero implicito $u_{n+1}=u_n+h,f(t_{n+1},u_{n+1})$ (equazione da risolvere a ogni passo: punto fisso se $hL<1$, Newton, o formula chiusa se $f$ è lineare); Crank-Nicolson $u_{n+1}=u_n+\frac h2[f(t_n,u_n)+f(t_{n+1},u_{n+1})]$ (regola dei trapezi). Errore di troncamento locale $\tau_n=\frac{y(t_{n+1})-y(t_n)}h-\Phi$: $\frac h2y''$ (EE), $-\frac h2y''$ (EI), $-\frac{h^2}{12}y'''$ (CN). Consistenza + stabilità $\Rightarrow$ convergenza: ordine 1 per EE e EI, ordine 2 per CN, cioè errore globale $O(h)$ e $O(h^2)$; per EE $|e_n|\le\frac{Mh}{2L}\big(e^{L(t_n-t_0)}-1\big)$ con $M=\max|y''|$ (D). Dimezzando $h$ l'errore si divide per 2 (EE, EI) o per 4 (CN).Metodi di Eulero esplicito, implicito e Crank-Nicolson →) mostra che l'errore tende a zero per . Ma in pratica si usa un fisso, e il calcolatore ha un tempo finito. Un metodo di ordine alto con un passo troppo grande può dare risultati che esplodono in modo del tutto indipendente dall'accuratezza: è un problema di stabilità. Qui si studia quanto deve essere piccolo perché la soluzione numerica si comporti come quella vera (che decade, se il sistema fisico dissipa), cosa sono i problemi stiff, e come si trattano i sistemi di equazioni, che includono le equazioni di ordine superiore (l'oscillatore, il pendolo, i circuiti con più componenti).
Prerequisiti: Problema di Cauchy per sistemi di equazioni differenzialiUn sistema in forma normale è y' = f(t, y) con y a valori in Rⁿ; il problema di Cauchy aggiunge y(t₀) = y₀. Ogni equazione di ordine n si riduce a un sistema del primo ordine. Peano: f continua ⇒ esiste almeno una soluzione locale (non unica in generale: y' = y^(2/3)). Cauchy-Lipschitz: f e ∂f/∂y continue (o lipschitziana in y) ⇒ esistenza e unicità locali, e una soluzione massimale. Può esplodere in tempo finito (y' = y²); se |f(t,y)| ≤ H + K|y| su una striscia [a,b] × Rⁿ la soluzione è globale.Problema di Cauchy per sistemi di equazioni differenziali →, Sistemi lineari ed equazioni del secondo ordine a coefficienti costantiUn sistema lineare y' = A(t)y + g(t) con coefficienti continui ha, per ogni dato iniziale, una e una sola soluzione, definita su tutto l'intervallo (D). Le soluzioni del sistema omogeneo formano uno spazio vettoriale di dimensione n (D); quelle del sistema completo sono una soluzione particolare più l'integrale omogeneo (D). Per y'' + by' + cy = 0 si cercano e^(λt): tre casi (D). Un sistema 2×2 a coefficienti costanti si riduce a u'' − (tr A)u' + (det A)u = g, risolta con il metodo di somiglianza.Sistemi lineari ed equazioni del secondo ordine a coefficienti costanti →, Oscillatore massa-molla-smorzatore e transitoriMassa m, molla k e smorzatore viscoso c con forza esterna F(t): m x'' + c x' + k x = F(t), cioè x'' + (c/m) x' + (k/m) x = F/m. Grandezze: ω0 = √(k/m), smorzamento critico c_cr = 2√(km), ζ = c/c_cr. Libero: c > c_cr due esponenziali negativi (sovrasmorzato, nessuna oscillazione), c = c_cr (c1 + c2 t) e^(−ω0 t), c < c_cr e^(−ct/2m)(c1 cos ωd t + c2 sin ωd t) con ωd = ω0√(1−ζ²); con c > 0 ogni moto libero tende a 0 (transitorio). Forzato F0 cos Ωt con c > 0: x = transitorio + regime permanente X cos(Ωt − φ), X = F0/√((k−mΩ²)² + c²Ω²), tan φ = cΩ/(k−mΩ²); massimo di X per Ω² = k/m − c²/(2m²). Primo ordine m v' + c v = F: v = F/c + (v0 − F/c) e^(−ct/m), costante di tempo τ = m/c.Oscillatore massa-molla-smorzatore e transitori →, Autovalori e autovettoriUn autovettore è un vettore non nullo che una funzione lineare manda in un suo multiplo; si trovano gli autovalori come radici del polinomio caratteristico det(A − λI) e gli autovettori come nucleo di A − λI. Matrici simili hanno gli stessi autovalori.Autovalori e autovettori →, Fattorizzazione LU, pivoting e CholeskyRisolvere $A\mathbf x=\mathbf b$ con Gauss equivale a fattorizzare $A=LU$ ($L$ triangolare inferiore con $1$ sulla diagonale e i moltiplicatori $l_{ik}=\frac{a_{ik}^{(k)}}{a_{kk}^{(k)}}$ sotto la diagonale, $U$ la matrice a scala finale) e poi risolvere $L\mathbf y=\mathbf b$ (in avanti) e $U\mathbf x=\mathbf y$ (all'indietro). Esiste (ed è unica) se i minori principali di testa $\det A_k$, $k<n$, sono $\ne0$. Costo $\frac23n^3$ flop per la fattorizzazione, $2n^2$ per ogni termine noto; $\det A=\prod u_{kk}$. Con un pivot piccolo l'algoritmo è instabile: il pivoting parziale (scambio di righe che porta in posizione di pivot l'elemento di modulo massimo della colonna) dà $PA=LU$ con $|l_{ik}|\le1$ ed esiste per ogni $A$ invertibile. Se $A$ è simmetrica definita positiva esiste $A=LL^T$ (Cholesky), con $l_{jj}=\sqrt{a_{jj}-\sum_{k<j}l_{jk}^2}$ e $l_{ij}=\frac{a_{ij}-\sum_{k<j}l_{ik}l_{jk}}{l_{jj}}$; costo $\frac13n^3$, senza pivoting.Fattorizzazione LU, pivoting e Cholesky → (i metodi impliciti per sistemi richiedono la risoluzione di un sistema lineare a ogni passo).
1. Il problema test e la stabilità assoluta
La soluzione di , , con e è . Un metodo è assolutamente stabile con il passo se anche la soluzione numerica tende a . Applicando i tre metodi (con ):
- EE: ;
- EI: ;
- CN: .
In tutti i casi , quindi se e solo se .
Definizione. La regione di stabilità assoluta è . Il metodo è A-stabile se contiene tutto il semipiano .
- EE. : disco di centro e raggio . Per reale: . Condizionatamente stabile.
- EE con complesso (): , e dividendo per si ottiene . Per si ritrova ; con la parte immaginaria il limite è più severo, e per (autovalori quasi immaginari, poco smorzamento) tende a zero. Esempio: dà , mentre sarebbe sbagliato.
- EI. : esterno del disco di centro e raggio ; contiene tutto il semipiano sinistro (se è ). A-stabile.
- CN. : la regione è esattamente il semipiano sinistro. A-stabile.
Grafico interattivo: Piano z = h·lambda: regione di stabilità di Eulero esplicito (interno del cerchio centrato in -1, raggio 1) e cerchio di centro +1 e raggio 1, il cui esterno è la regione di Eulero implicito; Crank-Nicolson è stabile in tutto il semipiano Re z < 0
Perché conta. Se il sistema fisico è dissipativo e la soluzione decade. Con EE e troppo grande si ottiene una soluzione numerica che cresce in modo oscillante, fisicamente assurda. Con EI e CN non c'è nessuna restrizione di stabilità: si sceglie solo in base all'accuratezza.
Esempio (, ). Il fattore di EE è : : (decade monotonamente); : (azzera la soluzione al primo passo); : (oscilla smorzata); : (oscillazione permanente di ampiezza ); : (diverge). La soglia è . Con EI il fattore è (: ) e con CN (: ): stabili.
Comportamento per . : l'EI smorza immediatamente le componenti molto veloci (come fa la soluzione vera). : la CN le fa decadere molto lentamente e con segno alternato: per , (): , , . La CN è accurata ma può produrre oscillazioni residue nei problemi stiff con passi grandi.
2. Problemi stiff
Un problema è stiff (rigido) quando contiene scale temporali molto diverse: una parte della soluzione che varia rapidamente (un transitorio che muore in fretta) e una che varia lentamente.
Esempio. , . La soluzione è : dopo s il transitorio è sparito e è liscia, adatta a passi di s. Ma la stabilità di Eulero esplicito richiede per tutta la durata, anche quando il transitorio non c'è più: per 10 s sono passi invece dei che l'accuratezza richiederebbe. Con EI o CN si usa .
Per un sistema lo stiffness ratio è . Esempi in ingegneria: reti di reazioni chimiche con costanti molto diverse, circuiti con molto diversi, un sistema meccanico con molla molto rigida e una massa pesante, il raffreddamento di un pezzo che ha una superficie sottile e un nucleo massiccio.
Rimedi. I metodi impliciti (EI, CN e quelli di ordine più alto) non hanno limiti di stabilità. Il costo è il sistema lineare (o non lineare, con Newton) da risolvere a ogni passo. In MATLAB, ode45 (esplicito) con un problema stiff usa passi minuscoli e va lentissimo; si cambia in ode15s o ode23s. Un segnale pratico di stiffness è proprio questo: il solutore esplicito fa passi molto più piccoli di quanto la soluzione richieda.
3. Sistemi di equazioni e equazioni di ordine superiore
Un sistema , si risolve componente per componente con le stesse formule, trattando come vettore: Consistenza, ordine e convergenza valgono con le norme di vettore (la costante di Lipschitz è calcolata con una norma).
Riduzione all'ordine uno. Un'equazione equivale al sistema per . L'oscillatore smorzato con : Gli autovalori sono .
Sistema lineare .
- EE: .
- EI: : si risolve un sistema lineare; la matrice è sempre la stessa se è costante, quindi si fa una fattorizzazione LU all'inizio e a ogni passo solo due sostituzioni ( operazioni).
- CN: .
Stabilità per sistemi. Se è diagonalizzabile, , il sistema si disaccoppia in equazioni test nelle coordinate . Quindi:
Stabilità per sistemi. Il metodo è assolutamente stabile se per ogni autovalore di .
Per EE con autovalori reali negativi serve : l'autovalore più grande in modulo (cioè la componente più veloce) fissa il passo.
Esempio (sistema stiff). ha autovalori (autovettore ) e (autovettore ). Con la soluzione è : già per resta solo . Stabilità di EE: . Valore di (esatto ):
| EE | EI | CN | |
|---|---|---|---|
| 0,01 | 0,18302 | 0,18486 | 0,18394 |
| 0,02 | 0,68208 | 0,18576 | 0,18393 |
| 0,025 | 0,18622 | 0,18393 | |
| 0,05 | 0,18844 | 0,18390 | |
| 0,1 | 0,19277 | 0,19246 |
Per EE è al limite (): la componente veloce non decade e il risultato è completamente sbagliato. Per esplode. EI è stabile e perde precisione solo gradualmente (ordine 1); CN è molto accurata finché non è troppo grande: a () il fattore della componente veloce non è ancora morto e dà un errore .
4. Oscillatore: ampiezza e energia
Per un moto senza smorzamento, , gli autovalori sono immaginari puri , sull'asse immaginario (bordo del semipiano). La soluzione esatta conserva l'energia . Con :
- EE: per qualunque . L'energia (proporzionale al quadrato dell'ampiezza) cresce di un fattore a ogni passo: instabile sempre. Nessun lo rende accettabile su tempi lunghi (si può solo ridurre il tasso di crescita).
- EI: : l'energia decade di un fattore per passo (smorzamento numerico: l'oscillazione sembra smorzata anche se non lo è).
- CN: esattamente: l'energia è conservata, c'è solo un piccolo errore di fase.
Esempio (, , , ). Rapporto :
| () | EE | EI | CN |
|---|---|---|---|
| 10 (1,0) | 1,1046 | 0,9053 | 1,0000 |
| 63 (6,3) | 1,8717 | 0,5343 | 1,0000 |
| 200 (20) | 7,3160 | 0,1367 | 1,0000 |
(EE: ; EI: .) Dopo un periodo () l'energia con EE è quasi raddoppiata e con EI è dimezzata. In ingegneria questo conta: simulando un sistema meccanico oscillante per molti periodi, Eulero esplicito aggiunge energia (e un sistema può «esplodere»), Eulero implicito ne toglie (e sembra frenato). Per la CN l'errore è solo nella frequenza: l'argomento di è contro del moto esatto, quindi la fase si sposta con errore .
5. Implementazione
import numpy as np
def integra(A, y0, h, n, metodo):
"""y' = A y con Eulero esplicito (ee), implicito (ei) o Crank-Nicolson (cn). Restituisce y_n."""
I = np.eye(len(y0))
if metodo == "ee":
P = I + h * A # y_{n+1} = (I + hA) y_n
elif metodo == "ei":
P = np.linalg.inv(I - h * A) # (I - hA) y_{n+1} = y_n
else:
P = np.linalg.solve(I - h / 2 * A, I + h / 2 * A) # (I - hA/2) y_{n+1} = (I + hA/2) y_n
return np.linalg.matrix_power(P, n) @ y0
# 1) oscillatore x'' + x = 0 -> y = (x, v), y' = A y, energia E = (x^2 + v^2)/2
A = np.array([[0.0, 1.0], [-1.0, 0.0]])
y0 = np.array([1.0, 0.0])
print("oscillatore, h = 0.1, energia E/E0 dopo n passi:")
for n in (10, 63, 200):
E = [np.sum(integra(A, y0, 0.1, n, m) ** 2) / np.sum(y0 ** 2) for m in ("ee", "ei", "cn")]
print(f" n = {n:3d} (t = {0.1 * n:5.1f}): EE {E[0]:.4f} EI {E[1]:.4f} CN {E[2]:.4f}")
# 2) sistema stiff con autovalori -1 e -100
A = np.array([[-50.5, 49.5], [49.5, -50.5]])
y0 = np.array([1.0, 0.0])
esatta = 0.5 * np.exp(-1.0) * np.array([1, 1]) + 0.5 * np.exp(-100.0) * np.array([1, -1])
print("\nsistema stiff, y(1) esatta =", esatta.round(6))
for h in (0.01, 0.02, 0.025, 0.05, 0.1):
n = round(1 / h)
print(f" h = {h:5.3f}:", *[f"{m.upper()} {integra(A, y0, h, n, m)[0]: .4e}" for m in ("ee", "ei", "cn")])Output:
oscillatore, h = 0.1, energia E/E0 dopo n passi:
n = 10 (t = 1.0): EE 1.1046 EI 0.9053 CN 1.0000
n = 63 (t = 6.3): EE 1.8717 EI 0.5343 CN 1.0000
n = 200 (t = 20.0): EE 7.3160 EI 0.1367 CN 1.0000
sistema stiff, y(1) esatta = [0.18394 0.18394]
h = 0.010: EE 1.8302e-01 EI 1.8486e-01 CN 1.8394e-01
h = 0.020: EE 6.8208e-01 EI 1.8576e-01 CN 1.8393e-01
h = 0.025: EE 5.5287e+06 EI 1.8622e-01 CN 1.8393e-01
h = 0.050: EE 5.4976e+11 EI 1.8844e-01 CN 1.8390e-01
h = 0.100: EE 1.7434e+09 EI 1.9277e-01 CN 1.9246e-01(La potenza matrix_power equivale a ripetere il passo volte; in un programma vero si fa un ciclo e si memorizza ogni passo.) Per sistemi non lineari si usa Newton a ogni passo per gli schemi impliciti. Equivalenti MATLAB: ode45 (non stiff, esplicito Runge-Kutta), ode15s, ode23s (stiff), [t,y] = ode15s(@(t,y) A*y, [0 1], [1;0]); i metodi di questa nota si programmano con un ciclo e (eye(2)-h*A)\y.
Errori da evitare
- Scambiare accuratezza e stabilità: un ordine alto non dà stabilità; Eulero esplicito è consistente di ordine 1 ma instabile per .
- Dimenticare di controllare TUTTI gli autovalori: basta uno fuori dalla regione perché la soluzione numerica esploda, anche se la sua componente nella soluzione vera è trascurabile.
- Usare per autovalori complessi: il limite vale solo per reale negativo; per EE è instabile per ogni , e per la condizione è con modulo complesso, cioè .
- Credere che CN risolva tutto nei problemi stiff: per è , quindi con molto grande restano oscillazioni residue; per problemi molto stiff si preferiscono metodi impliciti con (come EI e gli schemi BDF).
- Calcolare l'inversa a ogni passo: si fattorizza una volta e si risolve.
- Pensare che lo smorzamento numerico di EI sia innocuo: sopprime oscillazioni reali (energia dissipata che non c'è).
Esercizi svolti: Esercizio - passo massimo di Eulero esplicito per un'equazione test e confronto con i metodi impliciti, Esercizio - sistema 2x2 stiff con autovalori -1 e -100 e limite di stabilità, Esercizio - oscillatore armonico con Eulero esplicito, implicito e Crank-Nicolson, energia, Esercizio - massa-molla-smorzatore ridotto al primo ordine e passo di stabilità.
Domande d'esame
- Definire la regione di stabilità assoluta e determinarla per Eulero esplicito, implicito e Crank-Nicolson. Traccia. Problema test , ; ; ; .
- Che cosa significa A-stabile? Quali dei tre metodi lo sono? Perché EE non può esserlo? Traccia. ; EI e CN; per EE è un disco limitato.
- Che cos'è un problema stiff? Perché Eulero esplicito è inadatto? Traccia. Scale di tempo molto diverse; imposto dalla componente veloce anche quando è già estinta.
- Per l'oscillatore studiare come variano ampiezza ed energia per i tre metodi. Traccia. , , .
Versione ripasso
(Metodi di Eulero esplicito, implicito e Crank-NicolsonProblema di Cauchy $y'=f(t,y)$, $y(t_0)=y_0$, con $f$ lipschitziana in $y$ (costante $L$): ben posto. Nodi $t_n=t_0+nh$, $u_n\approx y(t_n)$. Eulero esplicito $u_{n+1}=u_n+h,f(t_n,u_n)$; Eulero implicito $u_{n+1}=u_n+h,f(t_{n+1},u_{n+1})$ (equazione da risolvere a ogni passo: punto fisso se $hL<1$, Newton, o formula chiusa se $f$ è lineare); Crank-Nicolson $u_{n+1}=u_n+\frac h2[f(t_n,u_n)+f(t_{n+1},u_{n+1})]$ (regola dei trapezi). Errore di troncamento locale $\tau_n=\frac{y(t_{n+1})-y(t_n)}h-\Phi$: $\frac h2y''$ (EE), $-\frac h2y''$ (EI), $-\frac{h^2}{12}y'''$ (CN). Consistenza + stabilità $\Rightarrow$ convergenza: ordine 1 per EE e EI, ordine 2 per CN, cioè errore globale $O(h)$ e $O(h^2)$; per EE $|e_n|\le\frac{Mh}{2L}\big(e^{L(t_n-t_0)}-1\big)$ con $M=\max|y''|$ (D). Dimezzando $h$ l'errore si divide per 2 (EE, EI) o per 4 (CN).Metodi di Eulero esplicito, implicito e Crank-Nicolson →, Problema di Cauchy per sistemi di equazioni differenzialiUn sistema in forma normale è y' = f(t, y) con y a valori in Rⁿ; il problema di Cauchy aggiunge y(t₀) = y₀. Ogni equazione di ordine n si riduce a un sistema del primo ordine. Peano: f continua ⇒ esiste almeno una soluzione locale (non unica in generale: y' = y^(2/3)). Cauchy-Lipschitz: f e ∂f/∂y continue (o lipschitziana in y) ⇒ esistenza e unicità locali, e una soluzione massimale. Può esplodere in tempo finito (y' = y²); se |f(t,y)| ≤ H + K|y| su una striscia [a,b] × Rⁿ la soluzione è globale.Problema di Cauchy per sistemi di equazioni differenziali →)
Problema test , ; , : EE , EI , CN . Stabile se : regione .
Regioni. EE: disco di centro , raggio ; reale: ; : (es. : ). EI: esterno del disco di centro , raggio . CN: . A-stabile: (EI, CN). : , (oscillazioni residue).
Esempio : EE fattore : per , soglia . , : EE , EI , CN .
Stiff. Scale di tempo molto diverse, grande. : ; EE richiede anche dopo il transitorio ( passi per s contro ). Rimedio: impliciti (ode15s, ode23s; ode45 lento = segnale di stiffness).
Sistemi. Stesse formule con vettori; ordine sistema in . : , . Lineari: EE ; EI ; CN (una LU, poi sostituzioni). Stabile se per ogni .
Esempio stiff , : EE . : EE ; EE ; EE esplode; EI e CN stabili ( CN ).
Oscillatore : (energia per passo), (smorzamento numerico), (energia conservata, fase , errore ). , : .
Passaggi principali.
- EE instabile sempre sull'asse immaginario: .
- CN: perché moduli coniugati.
- Disaccoppiamento: , coordinate .
- Esempio stiff: .
- Perché EI e CN sono A-stabili: (EI); (CN).
- Soluzione di : , transitorio estinto dopo s.
- Energia oscillatore: per EE/EI; fase di CN .
- LU una volta: costante, operazioni per passo; autovalori di : .
- Riduzione: , ; oscillatore sul bordo del semipiano.
- Limite complesso per EE: dà , cioè ; con torna .
- Perché EE al limite sbaglia: con il fattore della componente veloce è , che non decade: .
- CN con passo grande: , : , la componente veloce sopravvive per molti passi (errore in ).
- Esempio : soglia di EE ; con : EI , CN .
Errori tipici.
- Ordine alto preso per stabilità.
- Non controllare tutti gli autovalori.
- per complessi.
- CN considerata perfetta nei problemi stiff.
Esercizi su questo argomento
- Esercizio - Eulero esplicito a mano e confronto con la soluzione esatta del raffreddamento
- Esercizio - massa-molla-smorzatore ridotto al primo ordine e passo di stabilità
- Esercizio - oscillatore armonico con Eulero esplicito, implicito e Crank-Nicolson, energia
- Esercizio - passo massimo di Eulero esplicito per un'equazione test e confronto con i metodi impliciti
- Esercizio - sistema 2x2 stiff con autovalori -1 e -100 e limite di stabilità