Sei sulla pagina 1di 3

Lezione del 26/10

Andiamo ora ad estendere la function di Heun per la risoluzione di sistemi di ODE.

Implementazione MATLAB
function [x,y] = Heun-sist(f,x0,xN,N,y0);
h = (xN - x0)/N;
x=linspace(x0,xN,N+1);
m = size(y0,1);
% M si può anche recuperare come m = length(y0)
y = zeros(m,N+1);
y(:,1) = y0;
for n= 1:N
K1 = f(x(n),y(:,n));
K2 = f(x(n+1), y(:,n) + h*K1);
y(:,n+1) = y(:,n) + h/2 * (K1 + K2);
end
end
Applicazione all’esercizio 4.
Sia data l’equazione differenziale:
 00
2 0
y (x) = 0.1(1 − y(x) )y (x) − y(x)

y(0) = 1
 0

y (0) = 1

Trasformiamo la seguente equazione del secondo ordine in un sistema di equazioni diff. del I ordine.
Ricordiamo anzitutto della trasformazione della ODE in due sottovariabili z(x).

z1 (x) = y(x)
0
2 (x) = y (x)
0 0
z1 (x) = y (x) = z2 (x)
0 00
z2 (x) = y (x) = 0.1(1 − z12 (x))z2 (x) − z1 (x)

I dati sono:

z1 (0) = 1
z2 (0) = 1

Ricordando la notazione vettoriale:



z (x) = [z1 (x), z2 (x)] (1)

1
Calcolando la sua derivata invece si ha:
#» 0 0 0
z (x) = [z1 (x), z2 (x)]

Vogliamo scrivere il sistema di eq. differenziali nella forma canonica di Cauchy:


#» #»
z (x) = f (x, #»
0
z (x))

Riscrivendo tutto in forma matriciale, otteniamo:

#» #» f1 (x, #»
 
z (x))
f2 (x, #»
f (x, z (x)) =
z (x))

Questo è uguale a:
#» #»
 
z2 (x)
f (x, z (x)) =
0.1(1 − z12 (x)) z2 (x) − z1 (x)
Riportiamo infine i valori iniziali:  
#» #»
z0 = z0 =
1
1
Passiamo adesso alla solita implementazione matlab, sopra riportata.
Come esercizio, implementare Runge-Kutta.

Risoluzione esercizio 4, mediante funzioni già implementate su Matlab.

2
Generalizzazione del problema "STIFF"
Il problema modello in questo caso è:
( 0
y (x) = A y(x) x > x0
y(x0 ) = y0
Dove A rappresenta una matrice quadrata di ordine n.
Ipotizziamo che A sia una matrice diagonalizzabile, e che i suoi autovalori λ1 , λ2 , ..., λn siano tali che
:
Re(λi ) < 0 (2)
Con i = 1, 2, ..., n.
Denotiamo ora con v1 , v2 , ..., vn gli autovettori associati ai rispettivi autovalori λi . Si può
dimostrare che la soluzione del suddetto problema è:
y(x) = C1 eλ1 (x−x0 ) v1 + C2 eλ2 (x−x0 ) x2 + ... + Cn eλn (x−x0 ) vn (3)
In linea generale, vale:
A vi = λi vi (4)
Quindi, derivando y(x), si ottiene:
0
y (x) = C1 eλ1 (x−x0 ) Av1 + C2 eλ2 (x−x0 ) Av2 + ... + Cn eλn (x−x0 ) Avn (5)
Raggruppando A, rimane:
0
y (x) = A y(x) (6)
Se valutassi y(x0 ), ottengo:
y(x0 ) = C1 v1 + C2 v2 + ... + Cn vn = y0 (7)
Osserviamo che se volessimo calcolare:
lim y(x) = 0
x→∞
Nota bene: è la parte reale che porta a zero il valore, la parte immaginaria la fa solamente oscillare.
Se vogliamo che il metodo numerico che approssimi sempre più la soluzione esatta, allora
richiediamo al metodo numerico la seguente condizione (ricordiamo che h è fissato):
lim yn = 0 (8)
h→∞
Sopra è riportata una successione. Ciò equivale a chiedere che:
h Re(λi ) ∈ IAS per ogni λi (9)
Ove con IAS ci riferiamo all’intervallo di assoluta stabilità del metodo numerico, per ogni autovalore.
Ricordiamo che per Eulero esplicito, l’intervallo di assoluta stabilità è (−2, 0), mentre per Eulero
implicito è (−∞, 0), dato che va bene ogni h.
Richiamando Eulero esplicito, ricordiamo che la condizione è:
2
h< (10)
|Re(λi )|
Un sistema di equazioni differenziali di ordine m è detto STIFF nell’intervallo di integrazione [t0 , t0 +
T ] se:
• Eventuali autovalori con parte reale positiva sono tale che Re(λi )T non è grande;
• Esiste almeno un autovalore con parte reale negativa tale che Re(λi ) T << −1
La quantità T maxRe(λi )<0 |Re(λi )| rappresenta una misura del grado di stiffness del problema.

Potrebbero piacerti anche