Sei sulla pagina 1di 5

Lezione del 22/10

Riprendiamo i concetti di convergenza e di stabilità dei metodi numerici ad un passo per le


risoluzioni delle ODE.
Tutti i metodi per la risoluzione di ODE visti sono dei metodi convergenti, tant’è che abbiamo
potuto definire degli ordine di convergenza (bisogna ricordare gli ordini di convergenza). Abbiamo
verificato la convergenza dei metodi numerici con il seguente problema numerico:
( 0
y (x) = λ y(x)
y(0) = 1

Ove la soluzione abbiamo visto essere y(x) = eλ x .


iNota che la convergenza non è influenzata dalla costanza del passo h.
iNota che la convergenza la si ha per h → 0.
È stato analizzato anche l’intervallo di stabilità di un metodo numerico, che parte dall’analisi di
un problema modello. Osservando la soluzione esatta, ricordiamo aver detto:

lim y(x) = 0 (1)


x→∞

Ricordiamo che:
• Il concetto di convergenza si ha per h → 0;

• Il concetto di stabilità si ha per h ssato.


Noi però applichiamo il nostro metodo numerico per un valore di h fissato, e vogliamo che il
metodo numerico produca una successione di valori

y0 , y1 , ... , yn
Tale che:
lim yn = 0 (2)
n→∞

Se ciò è rispettato, il metodo è detto assolutamente stabile.


Per Eulero esplicito, si è otteneva:

yn+1 = yn + h f (xn , yn ) (3)

Che nel caso del problema modello analizzato nella scorsa lezione, è pari a:

yn+1 = yn + h yn = (1 + h)yn (4)

Iterato n-volte, si ottiene la seguente formula:

yn+1 = (1 + h)n+1 y0 = (1 + h)n+1 (5)

1
Applicando la (2), si ottiene quindi che:
2
lim yn = 0 → |1 + hλ | < 1 → 0 < h < (6)
n→∞ |λ|

Oppure:
−2 < h λ < 0 (7)
Ove con (−2, 0) prende il nome di intervallo di stabilità assoluta del metodo. Più piccolo è h tanto
più grande deve essere il numero dei sottointervalli preso. Tutto ciò riportato fin’ora è il risultato della
lezione scorsa.
Per Eulero implicito invece si otteneva:

yn+1 = yn + h; λ yn+1 (8)

Iterando n volte, si otteneva:


1
yn+1 = y0 (9)
(1 − h λ)n+1
Riapplicando la (2), si ottiene che:
|1 − h λ| > 1 (10)
Quali sono i vincoli sulla scelta di h in questo caso? Non abbiamo nessun vincolo su h, dato che è un
numero positivo!
È possibile estendere il discorso ad una regione di assoluta stabilità. Il problema modello è lo
stesso, solo che adesso λ ∈ C, con Re(λ) < 0.
Si può dimostrare che:

• Il metodo dei trapezi è stabile per ogni h;

• Il metodo di Heun è stabile per −2 < h Re(λ) < 0;

• Il metodo di Runge-Kutta a 4 stadi è stabile per α < h Re(λ) < 0.

Nota che i metodi espliciti NON impongono vincoli sulla scelta del parametro h; i metodi impliciti
invece ci impongono una scelta condizionata, affinché il nostro h ci faccia cadere in un intervallo di
stabilità.

2
Sistemi di equazioni differenziali
Il problema modello sarà preso dall’esercitazione:
 00 0
y − 3y + 2y = 0
 x>0
y(0) = 1
 0

y (0) = 1

Dobbiamo partire dalla forma canonica di Cauchy, dato che tutti i metodi numerici visti si
riconducono a questa forma.
0
z (x) = f (x, z(x))
Ciò che si fa è iniziare con l’introduzione di due nuove funzioni incognite reali di variabili reali:
(
z1 (x) = y(x)
0
z2 (x) = y (x)

Se deriviamo z1 (x) e z2 (x):


0 0
z1 (x) = y (x) = z2 (x)
0 00 0
z2 (x) = y (x) = 3 y (x) − 2y(x) = 3z2 (x) − 2z1 (x)

Dalle condizioni (12) e (13), si ricava che:


 0

 z1 (x) = z2 (x)
z 0 (x) = 3z (x) − 2z (x)

2 2 1


 z1 (0) = 1

z2 (0) = 1

Ciò che si è ottenuto è un sistema di due equazioni differenziali del primo ordine.
In linea generale, partendo da una equazione dierenziale di ordine n è possibile ricondursi
ad un sistema di n equazioni dierenziali del primo ordine.
Ricordiamo però che vogliamo una espressione simile al problema modello di Cauchy, e per farlo
ci avvaliamo della notazione vettoriale, introducendo il vettore incognita #» z:

z (x) = [z1 (x), z2 (x)] (11)
#»0 h 0 0
i
z (x) = z1 (x), z2 (x) (12)

Rimane ora da definire la funzione f del problema di Cauchy. Essenzialmente, dopo avere preso i
primi due termini del sistema a 4 equazioni della pagine precedente, vogliamo eguagliare la prima
matrice ad una seconda matrice, ovvero i termini a destra dell’uguaglianza delle prime due equazioni:

f (x, z1 (x), z2 (x)) = f (x, #»


z (x) = [z2 (x), 3z2 (x) − 2z1 (x)] (13)

Definiamo adesso la condizione iniziale:

z#»0 = [1, 1]
# »
z(0) = z#»0

3
Ecco che otteniamo quindi:
#»0 # »
z = f (x, z(x)) (14)
# »
z(0) = z#»0 (15)

L’espressione sopra riportata è la forma canonica del sistema di equazioni differenziali.


Come facciamo a scrivere il metodo di Eulero esplicito applicato a questa equazione differenziale?
Mi dimentico in un primo momento che ho a che fare con vettori di incognite, scrivendo Eulero
esplicito semplicemente come:
#» #»
z n+1 = z#»n + h f (xn , z#»n )
(


z 0 = [1, 1]

Esplicitiamo Eulero esplicito componente per componente:



z1,n ≈ z1 (xn )

z2,n ≈ z2 (xn )
 #» #»

zn ≈ z (xn )

Esplicitando l’equazione al passo n+1:

z1,n+1 = z1,n + h f1 (xn , z1,n , z2,n )


z2,n = z2,n + h f1 (xn , z1,n , z2,n )
z1,0 =1
z2,0 =1

Ci basta sostituire l’espressione ed ottenere:

f1 (xn , z1,n , x2,n ) = z2,n


f2 (xn , z1,n , z2,n ) = 3z2,n − 3z1,n

Nel caso scalare, l’output y era il vettore:

y = [y0 , y1 , . . . , yn ]

Nel caso specifico, l’output z sarà


 
z z . . . z1,N
z = 0,0 1,1
z2,0 z2,1 . . . z2,N

4
Implementazione MATLAB
Vediamo ora l’implementazione del metodo di Euelero esplicito nel caso sistemi di equazioni
differenziali.
function [x,y] = Eulero-esplicito-sist(f,x0,xN,N,y0)
h = (xN-x0)/N;
x = linspace(x0,xN,N+1);
%Cambia il vettore y, che contiene le incognite della nostra equazione. Nel caso scalare è stato
pensato come un vettore riga contenente tutte le approssimazioni, ma nel caso del sistema
di equazioni sarà una matrice. Di seguito, peraltro, l'implementazione farà forte riferimento
al problema modello, dato che andremo ad inserire "2", ciò signica che risolverà solamente
equazioni dierenziali del secondo ordine. Svincoliamo da ciò inserendo il generico grado "m"
dell'equazione dierenziale, che manderemo noi in input
y = zeros(m, N+1);
% Ove m può essere denito nel seguente modo
m = size(y0,1);
y(:,1) = y0;
for n = 1:N
y(:;n+1) = y(:,n) + h*f(x(n), y(:,n));
end
end

Potrebbero piacerti anche