You are on page 1of 4

Soluzione di equazioni differenziali

alle derivate ordinarie: Torna


all'indice
generale
Metodo Runge-Kutta
Esporremo due metodi distinti per la soluzione di equazioni differenziali ordinarie al valore iniziale (Problema di
Cauchy)

• Il metodo Runge Kutta, basato sullo sviluppo in polinomi della funzione incognita.

• Il metodo Burlich-Stoer, basato sulla tecnica di estrapolazione di Richardson. Metodo caratterizzato da una
elevata velocità di convergenza per quei problemi che hanno una soluzione "regolare".

Il metodo di Runge Kutta è considerato un metodo "solido" che, anche se non particolarmente veloce, permette di
ottenere un risultato affidabile in tutte le situazioni.
Prima di entrare nel dettaglio della descizione del metodo di Runge Kutta, osserviamo che un generico problema
differenziale di qualsiasi ordine può sempre essere ridotto, tramite opportune sostituzioni, ad un sistema di equazioni
differenziali del primo ordine. Senza quindi perdere in generalità, consideriamo un problema differenziale nella forma
seguente

y' ( x ) f ( x , y) y( a ) b ( 1)
dove y è un vettore e la variabile indipendente x uno scalare. Si osservi che la ricerca della soluzione di questo
problema non è molto diversa dal problema relativo al calcolo di un integrale. Il calcolo della funzione g ( x )
x
g(x) f( t) dt
a
è infatti equivalente alla soluzione del particolare problema differenziale
g' ( x ) f ( x ) g ( a) 0
Per questo motivo tutti i metodi che esporremo in questa sezione, riformulando opportunamente il problema, sono
applicabili anche al calcolo di integrali. Data la possibile dipendenza della funzione f nella ( 1 ) dalla funzione incognita,
non è in generale vero il contrario. Nella determinazione di un algoritmo per la soluzione della ( 1 )procediamo in modo
analogo al caso relativo al calcolo degli integrali con il metodo di Simpson. Assumiamo innanzitutto che la funzione
incognita sia "sufficientemente" derivabile e che sia quindi possibile espanderla in serie in un intorno del punto x a.

2
(x a) . 3
y( x ) y ( a ) (x a ) y' ( x ) x a y'' ( x ) x a O( x a)
2

troncando lo sviluppo al primo ordine e sostituendo x a h si ottiene

h .f ( a , b ) )
2
y( x h ) ( y( a ) O h .

In linea di principio sarebbe possibile estendere il calcolo della funzione su un intervallo macroscopico semplicemente
iterando questa procedura,
yn 1 yn h .f xn , yn
xn 1 xn h

Il metodo cosi' ottenuto è noto come metodo di Eulero Cauchy. Purtroppo il risultato in questo caso è affetto da un
2
errore dell'ordine O h per ciascuna iterazione, e solo O ( h )per l'integrazione dell'equazione su un intervallo fissato.
Per aumentare l'ordine di convergenza osserviamo che è possibile cancellare il termine di errore relativo all'ordine più
h
basso propagando la soluzione prima di un intervallo di lunghezza h, poi di due intervalli di lunghezza ed infine
2
combinando opportunamente le due soluzioni.

29
Indichiamo con y( a h ) la soluzione esatta dell'equazione differenziale nel punto a h. Integrando dal punto a in un
solo passo avremo

E .h
2
y( a h ) y1 ( a h) ..... ( 2)

h
dove y1 ( a h ) y( a ) h .f ( a , y( a ) ) . Calcolando la soluzione in due passi di lunghezza avremo invece
2

h h.
yi a y( a ) f ( a , y( a ) )
2 2

per il primo mezzo passo, e

h h. h h h. h. h h
y2 ( a h ) yi a f a ,y a y( a ) f ( a , y( a ) ) f a ,y a
2 2 2 2 2 2 2 2

per il passo intero. In questo caso


2
h
E.
3
y( a h ) y2 ( a h) O h ( 3)
2
2 2
E Ei
avendo effettuato due passi con errore ed rispettivamente, ed essendo E Ei O ( h ) per la condizione di
4 4
continuità della derivata seconda. Combinando opportunamente la (2) con la (3) possiamo eliminare l'errore al
secondo ordine

2 . y2 ( a
3
y( a h) h) y1 ( a h) O h

ovvero
k1 h .f ( a , y( a ) )
h h
k2 h .f a ,y a
2 2
3
y( a h) y( a ) k2 O h

Se confrontiamo l'espressione precedente con quella relativa al metodo di Eulero, osserviamo che è necessario
valutare la funzione f due volte anzichè una per guadagnare un'unità sull'ordine di convergenza. Combinando
opportunamente quattro valutazioni della funzione si ricava l'algoritmo di Runge-Kutta del 4° ordine (corretto sino al 4°
ordine incluso)

k1 h .f xn , yn

h k1
k2 h .f xn ,y
2 n 2

h k2
k3 h .f xn , yn
2 2

h
k4 h .f xn ,y k3
2 n
k1 k2 k3 k4
5
yn 1 yn O h
6 3 3 6

30
è ovviamente possibile ricavare algoritmi di ordine superiore, ma in questo modo cresce anche il numero di valutazioni
della funzione per passo di integrazione. In particolare proseguendo con questa procedura, ci vogliono più di k
k
valutazioni della funzione per ottenere l'ordine O h quando k > 4 . Per questo motivo l'algoritmo relativo al Runge
Kutta del 4° ordine è in pratica il più vantaggioso e quindi anche il più diffuso nella maggior parte dei problemi
scientifici. Se la lunghezza del passo di integrazione potesse crescere mantenendo invariata l'accuratezza, grazie
all'aumento dell'ordine di convergenza, allora metodi di ordine superiore potrebbero risultare vantaggiosi, tuttavia al
k
d
crescere dell'ordine può crescere anche il coefficiente moltiplicativo dello sviluppo contenente la derivata y( x ) , e
d xk
nella maggior parte dei casi questo annulla i vantaggi relativi ad un incremento di ordine. Una routine che implementa
il metodo Runge Kutta del 4° ordine è la seguente

rk ( f , x , h ) h2 0.5 .h
k 1 h .f x0 , x1

k 2 h .f x0 h2 , x1 0.5 .k 1

k 3 h .f x0 h2 , x1 0.5 .k 2

k 4 h .f x0 h , x1 k 3

x0 h
x k1 k2 k3 k4
x1
6 3 3 6

La soluzione di un problema di Cauchy nella forma (1) non presenta a questo punto particolari problemi, sia in una che
in più dimensioni. Osserviamo che l'errore commesso dipende sia dalla lunghezza del passo che, nel caso di un
Runge Kutta del 4 ordine, dalla derivata quinta della funzione integranda, a priori ignota. Nel valutare la soluzione
potremmo imporre che l'errore commesso in ciascun passo non cambi troppo tra un passo e l'altro, modificandone la
lunghezza in funzione dell'andamento della derivata a cui esso è legato. In questo modo regioni in cui la soluzione ha
un comportamento irregolare e strutturato saranno attraversate con passi piccoli mentre regioni in cui il
comportamento della soluzione è regolare possono essere percorse con pochi lunghi e quindi rapidi, passi di
integrazione. La ricetta con cui valutare la lunghezza del passo da utilizzare è in effetti contenuta nella descrizione del
h
metodo sopra riportata. Osserviamo infatti che, se effettuiamo un passo di lunghezza h e due di lunghezza , la
2
differenza tra le due stime della fuzione rappresentano una valutazione dell'errore commesso all'ordine successivo

( h ) .E
5 6
y( x h) y 1 O h
5
h
2. .E 6
y( x h) y 2 O h
2
6
Sottraendo delle due espressioni l'una dall'altra si ottiene, a parte termini dell'ordine O h

1 5 15
E. 1 E .h .
5
∆ y2 y1 h
4 16
2
Indichiamo con ε l'accuratezza richiesta su un generico passo di integrazione. Se imponiamo che ∆ ε otteniamo una
semplice relazione che fornisce la lunghezza del passo necessaria per mantenere invariato l'errore commesso.
Supponiamo di aver appena effettuato un passo di lunghezza h e di aver ottenuto un valore di ∆ ∆ 0 . Possiamo
effettuare il passo successivo di una lunghezza tale da avere appunto ∆ ε
1
5
ε
h nuovo h . ( 4)
∆0

Nel caso in cui si abbia a che fare con un sistema di equazioni differenziali ε sarebbe un vettore contenente le
accuratezze richieste su ciascun passo per ciascuna variabile, ed il passo di integrazione da utilizzare dovrebbe
31
essere il più piccolo tra quelli ottenuti per ciascuna funzione incognita in base alla relazione (4). Non è ovviamente
opportuno implementare l'espressione (4) cosi come è riportata.

E' necessario infatti cautelarsi ad esempio nei confronti della possibilità che ∆ 0 si annulli, che porterebbe ad una
divergenza nella stima del passo successivo. E' opportuno in pratica prevedere comunque un limite superiore alla
lunghezza del passo di integrazione, onde evitare, attraversando una zona in cui la soluzione manifesta un
comportamento regolare, di scavalcare interamente regioni in cui l'integrazione accurata si otterrebbe solo riducendo il
passo di integrazione. Un'altro fattore di cui tener conto nell'implementazione della (3), è quello relativo alla precisione
numerica con cui sono rappresentati i numeri sulla macchina su cui si sta integrando. Richiedere un'accuratezza
superiore a quella consentita dalla rappresentazione numerica, porta l'algoritmo di stima del passo di integrazione a
ridurre progressivamente il passo sino ad annullarlo, con conseguente dispendio di tempo di calcolo e senza il
raggiungimento di alcuna soluzione. Questo è un errore che a seconda del problema differenziale può capitare,
soprattutto lavorando in singola precisione, magari con solo tre o quattro cifre decimali di precisione a disposizione.
Ecco l'implementazione numerica del metodo RungeKutta con adattamento del passo di integrazione

rk1 ( f , x , h , eps ) ∆ ∞
while ∆ > eps
x1 rk ( f , x , h ) Soluzione ricavata in un passo

h h
x2 rk f , rk f , x , , Soluzione ricavata in due passi
2 2
∆ x11 x21 Confronto tra le soluzioni e stima dell'errore

eps
5 Calcolo del passo di integrazione. E' stato
h min 0.9 . h . 4 .h if ∆ 0 inserito un fattore di sicurezza pari a 0.9 che
∆ riduce il numero di loop nel caso il passo vada
h 4 .h otherwise ridotto sostanzialmente
8
( break) if h < 10 Controllo che il passo non sia troppo piccolo
x20

x21

x
rkad ( f , x , y , H , eps ) xt
y
xt2 H
Itera la procedura descritta sopra sino a che non
while xt0 < x H raggiunge l'ascissa richiesta
xt rk1 f , xt , xt2 , eps

xt

Possiamo provare questa procedura considerando il caso f ( x , y) y con condizione iniziale y 1 in x 0.


H
Sappiamo che la soluzione di questo problema è y e . Per H 2, la soluzione numerica con accuratezza
6
eps 10 è data da sol rkad( f , x , y , H , eps ) . L'errore corrispondente è

sol
sol1 = 1.57 .10
0 7
e
Torna
all'indice
generale

32