Vai al contenuto
Calcolo Numerico

Equazioni differenziali al computer: Eulero, Runge-Kutta e problemi stiff

Metodo di Eulero e suo errore, Heun e Runge-Kutta del quarto ordine, passo adattivo, stabilità e problemi stiff, metodi impliciti in SPICE e metodi simplettici.

Le equazioni differenziali che si risolvono con carta e penna sono poche: quelle lineari a coefficienti costanti, quelle a variabili separabili. Il circuito con un diodo, il pendolo con oscillazioni ampie, un motore con attrito non lineare, l’orbita di un satellite attorno alla Terra schiacciata ai poli richiedono metodi numerici. L’idea è semplice: si parte dalla condizione iniziale e si avanza a piccoli passi nel tempo, seguendo il campo di direzioni. In questa lezione vediamo i metodi di Eulero e di Runge-Kutta, l’ordine di accuratezza e il problema della stabilità.

Il problema

    \[ y' = f(t, y),\qquad y(t_0) = y_0 \]

dove y può essere anche un vettore: ogni equazione di ordine superiore si riscrive come sistema del primo ordine. Il pendolo \theta'' = -\frac gl\sin\theta diventa \theta' = \omega, \omega' = -\frac gl\sin\theta. Si scelgono i tempi t_n = t_0 + nh, con h il passo, e si calcolano approssimazioni y_n \approx y(t_n).

Il metodo di Eulero esplicito

Si segue la tangente per un passo:

    \[ y_{n+1} = y_n + h\,f(t_n, y_n) \]

È la definizione di derivata letta al contrario. A ogni passo si commette un errore locale proporzionale a h^2 (il termine trascurato dello sviluppo di Taylor); dopo N = (T - t_0)/h passi l’errore globale è proporzionale a h. Eulero è un metodo del primo ordine: dimezzando il passo l’errore si dimezza.

Soluzione esatta di y' uguale y confrontata con il metodo di Eulero con due passi diversi
Per y' = y, y(0) = 1, la soluzione esatta è e^t (blu). Eulero con passo h_1 = 0{,}5 (rosso) e h_2 = 0{,}25 (arancione) resta sotto la curva vera, perché la tangente di una funzione convessa sta sotto la curva; dimezzando il passo l’errore si dimezza circa.

Esempio. Con y' = y Eulero dà y_{n+1} = (1 + h)y_n, cioè y_N = (1 + h)^N. Per arrivare a t = 1: con h = 0{,}1, 1{,}1^{10} = 2{,}594 invece di e = 2{,}718 (errore 4,6%); con h = 0{,}01, 1{,}01^{100} = 2{,}705 (errore 0,5%). È la definizione di e come limite di (1 + 1/n)^n.

I metodi di Runge-Kutta

Per avere più precisione senza ridurre troppo il passo, si valuta la pendenza in più punti dentro il passo e se ne fa una media pesata. Il metodo di Heun (Runge-Kutta del secondo ordine) fa un passo di Eulero di prova, calcola la pendenza nel punto d’arrivo e usa la media delle due pendenze:

    \[ k_1 = f(t_n, y_n),\quad k_2 = f(t_n + h, y_n + hk_1),\quad y_{n+1} = y_n + \frac h2(k_1 + k_2) \]

Il metodo più usato è Runge-Kutta del quarto ordine (RK4):

    \[ \begin{aligned} k_1 &= f(t_n, y_n) & k_2 &= f\!\left(t_n + \tfrac h2, y_n + \tfrac h2k_1\right)\\ k_3 &= f\!\left(t_n + \tfrac h2, y_n + \tfrac h2k_2\right) & k_4 &= f(t_n + h, y_n + hk_3) \end{aligned} \]

    \[ y_{n+1} = y_n + \frac h6\big(k_1 + 2k_2 + 2k_3 + k_4\big) \]

Quattro valutazioni di f per passo, errore globale proporzionale a h^4: dimezzando il passo l’errore si riduce di sedici volte. Per y' = y con h = 0{,}1 fino a t = 1, RK4 dà 2{,}7182797 contro e = 2{,}7182818: errore di 2 milionesimi, contro il 4,6% di Eulero con lo stesso passo. La struttura dei pesi 1, 2, 2, 1 è la stessa della regola di Simpson: per f che dipende solo da t, RK4 è Simpson.

Passo adattivo. I programmi moderni (ode45 di MATLAB, solve_ivp di SciPy) calcolano a ogni passo due stime di ordine diverso, ne usano la differenza come stima dell’errore e regolano il passo: grande dove la soluzione è tranquilla, piccolo dove cambia in fretta.

La stabilità e i problemi stiff

Si applichi Eulero all’equazione y' = -\lambda y con \lambda \gt 0, la cui soluzione e^{-\lambda t} decresce. Eulero dà y_{n+1} = (1 - h\lambda)y_n. Se |1 - h\lambda| \gt 1, cioè se

    \[ h \gt \frac{2}{\lambda} \]

i valori calcolati crescono e oscillano con segno alterno, mentre la soluzione vera va a zero. Il metodo è instabile. Non è una questione di precisione: anche se la soluzione dopo un po’ è quasi zero e non serve seguirla con dettaglio, il passo deve restare piccolo.

Un problema è stiff (rigido) quando contiene costanti di tempo molto diverse. Un circuito con una costante di tempo di 1 ns e un’altra di 1 ms, simulato per qualche millisecondo, costringerebbe un metodo esplicito a passi sotto i 2 ns per tutta la durata: milioni di passi, anche dopo che il transitorio veloce si è esaurito.

La soluzione sono i metodi impliciti, come Eulero implicito:

    \[ y_{n+1} = y_n + h\,f(t_{n+1}, y_{n+1}) \]

dove la pendenza si valuta nel punto d’arrivo. Per y' = -\lambda y dà y_{n+1} = \frac{y_n}{1 + h\lambda}, che decresce per qualsiasi passo. Il prezzo è che a ogni passo si deve risolvere un’equazione (o un sistema non lineare, con Newton). SPICE usa proprio metodi impliciti, la regola dei trapezi implicita e le formule di Gear, perché i circuiti elettronici sono quasi sempre stiff. Quando nelle opzioni di simulazione si cambia il metodo di integrazione da “trap” a “gear”, si sta scegliendo tra due metodi impliciti con proprietà di stabilità diverse.

La conservazione dell’energia

Per i sistemi oscillanti senza attrito, come un circuito LC ideale o un’orbita, Eulero esplicito fa crescere l’energia a ogni giro e la traiettoria si allarga a spirale; Eulero implicito la fa diminuire. Esistono metodi, detti simplettici (come il metodo di Verlet, usato nelle simulazioni di dinamica molecolare e nei motori fisici dei videogiochi), che conservano l’energia per tempi lunghissimi anche con passi grandi.

Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
0
Would love your thoughts, please comment.x
()
x