Sei sulla pagina 1di 5

Lezione del 19/10

Sia
0
y (x) = f (x, y(x)) x > x0
y(x0 ) = y0

Intervallo di integrazione è [x0 , xN ]. Il metodo dei trapezi prevede di approssimare l’integrale con la
formula dei trapezi: Z xn+1
y(xn+1 ) − y(xn ) = f (x, y(x))dx (1)
xn

Approssimiamo il secondo membro con l’area di un trapezio, come qui in figura:

Quindi si ha che: Z b
g(a) + g(b)
g(x)dx ≈ (b − a) (2)
a 2
Introducendo la notazione a pedice, possiamo riscriver la (1) come:
h
yn+1 = yn + [f (xn , yn ) + f (xn+1 , yn+1 )] (3)
2
iSi tratta di un metodo numerico ancora ad un passo;
iSi tratta di un metodo implicito, perché la soluzione al passo n + 1 appare implicitamente nella
espressione della funzione f , di conseguenza va adattato ogni volta a seconda delle funzioni.

1
Metodo di Heun e di Runge-Kutten a 4 stadi

Richiamando la formula dei trapezi:


h
yn+1 = yn + [f (xn , yn ) + f (xn+1 , yn+1 )]
2
Notiamo che il primo termine nella parentesi quadra coincide con il K1 del metodo di Heun, mentre il
secondo termine differisce: si può pensare che il metodo di Heun infatti sembra essere una modifica
del metodo dei trapezi, riportando una approssimazione di yn+1 mediante l’approssimazione (al passo
n+1) ottenuta con Eulero esplicito.
Essenzialmente, il metodo di Heun rende il metodo dei trapezi ESPLICITO. Questo ci permette di
implementare un codice, valido per ogni ODE.
Passare a Matlab.

2
Implementazione Matlab
Ricordiamo che la nostra funzione modello è la seguente:
( 0
y (x) = y(x) x>0
y(1) = 0
Vediamo da prima l’implementazione del metodo dei trapezi. Ricordiamo la formula risolutiva:
h
yn+1 = yn + [f (xn , yn ) + f (xn+1 , yn+1 )]
2
Integrando la equazione generale con il nostro caso particolare, si ottiene:
h
yn+1 = yn + [yn + yn+1 ]
2
Isolando la yn+1 si perviene a:
1 + h/2
yn+1 = yn
1 − h/2
Andiamo ad implementarla:

function [x,y] = trapezi(x0,xN,N,y0)


Questa function non riceve f in entrata (come anche in Eulero implicito)
h = (xN-x0)/N;
x= linspace(x0,xN,N+1);
y = zeros(1,N+1);
Ricorda, N sottointervalli signica N+1 punti
y(1)=y0;
for n =1:N
y(n+1) = y(n)* (1+h/2) /(1-h/2);
end
end
Riportiamo adesso le implementazioni per Heun e Runge-Kutta 4 stadi. Poiché sono metodi
espliciti, non richiedono nuove implementazioni al variare della equazione differenziale in questione:

function [x,y] = Heun(f,x0,xN,N,y0); function [x,y] = Runge-Kutta4(f,x0,xN,N,y0)


h = (xN - x0)/N; h = (xN - x0)/N;
x=linspace(x0,xN,N+1); x = linspace(x0,xN,N+1);
y = zeros(1,N+1); y = zeros (1,N+1);
y(1) = y0; y(1) = y0;
for n= 1:N for n=1:N
K1 = f(x(n),y(n)); K1 = f(x(n),y(n)); K2 = f(x(n) +h/2, y(n)
K2 = f(x(n+1), y(n) + h*K1); + h/2 * K1);
y(n+1) = y(n) + h/2 * (K1 + K2); K3 = f(x(n) +h/2, y(n) + h/2 *K2);
end K4 = f(x(n+1), y(n) + h*K3);
end y(n+1) = y(n) + h/6 *(K1 + 2*K2 + 2*K3
+ K4);
end
end

3
Velocità di convergenza
Il metodo ad un passo si dice convergente in [a, b] se, qualunque sia il problema di Cauchy con f
dotata di derivate parziali prime continue e limitate nella striscia [a, b] ∈ <, per ogni x ∈ [a, b] e
h = (x − a)/N risulta:
lim kyN − y(x)k = 0 (4)
N →∞

Con N → ∞ si ha che n → 0. Ovvero: indicato con h il passo di discretizzazione, vado a fissare un


generico punto x all’interno dell’intervallo [a, b], e vado a valutare l’errore che compio nel valutare
yN , ove yN ≈ y(xN ), a sua volta y(xN ) = y(x). All’infittire della partizione (ovvero con h → 0) il
limite di quella quantità, ovvero dell’errore, tende a 0. Il metodo si dice convergente se è verificata
questa condizione, ovvero se in ogni intervallo l’approssimazione converge alla soluzione. Il metodo
di Heun e Runge-Kutten sono dei metodi convergenti. Si parla di convergenza puntuale, perché si ha
convergenza in ogni punto dell’intervallo [a,b].
Si parla anche di ordine di convergenza: Se qualunque sia f dotata di derivate parziali di ordine
p continue e limitata nella striscia [a, b]x< per ogni x ∈ [a, b] e h = (x − a)/N , allora risulta:

kyN − y(x)k = O(hP ) h→0 (5)

Ove:

• P = 1 per Eulero esplicito;


• P = 1 Per Eulero implicito;
• P = 2 per trapezi;
• P = 2 per Heun;
• P = 4 per Runge-Kutta

Cosa significa? Che per Eulero, l’errore tende a zero linearmente, mentre per Runge-Kutta l’errore
tende a zero molto più velocemente degli altri metodi visti (poiché esponente tende a zero come O(h4 ).
iQuindi l’ordine ci convergenza dipende dal metodo, ma anche dalla funzione.
L’errore decresce al diminuire di h: infatti i nostri codici matlab prevedono che:

N = 2 , 4 , 8 , 16....

Noto quanto vale p per i vari metodi, si ha che:

• Se dimezzo h, per entrambi gli Eulero, l’errore si dimezza

• Se dimezzo h, per trapezi e Heun, l’errore si divide per 4

• Se dimezzo h, per Runge-Kutta, l’errore si divide per 16

I metodi convergono sotto una certa soglia. Ovvero, la convergenza si ha per h → 0, esistono però dei
metodi stiff che se vengono applicati ai problemi cosiddetti stiff, generano un errore che aumenta
col in "raffinare" dell’intervallo! Iniziano a diminuire solamente al di sotto di una certa soglia: tale
soglia dipende dal metodo. Per Eulero esplicito, tale limite è infinitamente grande QUALUNQUE
sia l’equazione differenziale. Quindi i risultati sono accettati solo se h < hlim : per valori di h sotto
questo valore limite, il metodo viene definito metodo stabile. Se invece h è troppo grande, gli errori
si amplificano passo dopo passo, rendendo il metodo un metodo instabile.
I metodi impliciti non hanno vincoli sulla scelta di questo parametro!
iI metodi impliciti sono metodi stabili.

4
iÈ sbagliato scegliere a-priori il metodo di Runge-Kutta, poiché un metodo
esplicito, quindi direttamente influenzato dal valore di h.
Prendiamo il seguente problema modello e facciamo delle considerazioni generali:
( 0
y (x) = λ y(x)
y(0) = 1

Con λ ∈ < e λ < 0. Questo problema modello ha come soluzione:

y(x) = eλ x

Cosa succede se vado a calcolare limx→∞ y(x)? Esso tende a zero, dato che λ è negativo. Cosa
succede se applichiamo il metodo di Eulero esplicito a questo problema?

yn+1 = yn + h f xn , yn = yn + h λ yn = (1 + h λ)2 yn−1 = ... = (1 + h λ)n+1 y0 (6)

Poiché y(0) = 1, si ha:


yn+1 = (1 + hλ)n+1 (7)
Poiché il limite per x che tende ad infinito di y(x) deve essere nullo, allora questo equivale a dire che:

lim yn = 0 (8)
n→∞

La mia successione deve tendere a zero per n che va ad infinito. Ma quale è l’espressione di yn ?
Riscriviamo al (6) nel seguente modo:

lim (1 + h λ)n = 0 (9)


n→∞

La condizione che mi garantisce che questa successione converga a zero è che:

|1 + h λ| < 1 (10)

Per quali valori di h? Per ogni suo valore, dato che λ è negativo.
Per quali valori di λ? Per :
2
h< (11)
|λ|
Infatti, più λ cresce, maggiore è la sua convergenza a zero.

Potrebbero piacerti anche