dfield.
In questa dispensa si utilizzeranno comandi e graca relativi alla versione R2012a. Si noti,
quindi, che nel caso di versioni dierenti gli output e la sintassi potrebbero essere leggermente
dierenti.
2 Richiami sul Symbolic Math Toolbox di MATLAB
Matlab viene generalmente utilizzato come software per la soluzione numerica di problemi
matematici, ed `e uno dei migliori strumenti attualmente disponibili a livello commerciale. Se
si dispone del pacchetto software aggiuntivo Symbolic Math Toolbox, Matlab per`o pu`o essere
anche utilizzato per eseguire calcoli simbolici, sebbene le sue funzionalit`a simboliche siano in
generale meno ecaci di quelle di altri software scientici (vedi Mathematica o Maple).
Per lavorare in modalit`a simbolica si devono dichiarare dei simboli. Per esempio, se in
Matlab scriviamo
>> a = 1/3
1
Contributi: questa dispensa `e unedizione che utilizza il materiale delle esercitazioni degli anni passati.
Ringraziamo LORIS BIONDO, LUCA BONAVENTURA e NAOMI VALENTINA SLAVAZZA per le versioni
precedenti.
Prima esercitazione di laboratorio MATLAB Richiami sul Symbolic Math Toolbox di MATLAB
il software creer`a una variabile di nome a contenente il valore in virgola mobile (oatingpoint)
pi` u vicino ad 1/3 (ma non esattamente). Per dichiarare invece il simbolo 1/3, si pu`o scrivere:
>> a = sym( 1/3)
sym `e un comando specico del toolbox simbolico, e crea una variabile di nome a contenente il
simbolo 1/3, interpretato come tale, e non in virgola mobile.
`
E chiaramente possibile usare il
comando anche per espressioni pi` u complesse, come:
>> b = sym( 1+sqrt (5))
che corrisponde a 1 +
= y
2
y(0) = 1
si pu`o procedere come segue:
>> ds ol ve ( Dy = y2 , y(0)=1)
ans =
1/( t 1)
>> ds ol ve ( Dy = y2 , y(0)=0)
ans =
0
I risultati forniti dal comando dsolve sono a loro volta delle espressioni simboliche che pos-
sono essere assegnate come valore a nuove variabili (non necessariamente gi`a dichiarate) e
successivamente plottate:
>> y = ds ol ve ( Dy = y2 , y(0)=1)
y =
1/( t 1)
>> e z pl ot ( y , [ 0 , 1 ] ) ;
Con il comando dsolve si possono risolvere anche equazioni dierenziali di ordine superiore
al primo. Se y
si traduce in Dy, y
sar`a D2y, y
+ y
+ y
+ y = 0.
Il suo integrale generale si trova eseguendo:
>> y = ds ol ve ( D3y + D2y + Dy + y = 0)
y =
C18exp(t ) + C19si n ( t ) + C20cos ( t )
Per risolvere invece il problema di Cauchy
_
y
+ y
+ y
+ y = 0
y(0) = 0, y
(0) = 1, y
(0) = 2
si pu`o utilizzare il comando
>> y = ds ol ve ( D3y + D2y + Dy + y = 0 , y(0) = 0 , Dy(0) = 1 , D2y (0) = 2)
y =
exp(t ) + 2 si n ( t ) cos ( t )
5
Prima esercitazione di laboratorio MATLAB Risoluzione simbolica di EDO
Esercizio 2
Calcolare con Matlab lintegrale generale delle seguenti equazioni e tracciare il graco delle
soluzioni per alcuni valori a scelta del parametro C
1
:
1 y
+ y
2
= 0 2 y
+ 2ty = 0 3 y
+ 2ty
2
= 0
4 (1 + t)y
4y = 0 5 ty
+ 2y 3t = 0 6 ty
+ y t
2
= 0
7 y
+ 2ty t = 0 8 2ty
3y t
3
= 0 9 y
+ 3y 2te
3t
= 0
Esercizio 3
Risolvere con Matlab i seguenti problemi di Cauchy e rappresentare gracamente le
soluzioni:
1
_
y
+ 3t
2
y = 0
y(0) = 3
2
_
y
y
2
/t = 0
y(1) = 2
3
_
y
+ 2ty = 0
y(0) = 1/2
4
_
y
1 y
2
= 0
y(0) = 0
5
_
y
3 + 2y/t = 0
y(2) = 3
6
_
y
+ y = 0
y(0) = 2
7
_
ty
+ 2y 3t = 0
y(2) = 5
8
_
_
y
+ y
sin(t) = 0
y(0) = 0
y
(0) = 1
9
_
_
y
+ y
t 1 = 0
y(0) = 0
y
(0) = 1
10
_
_
y
+ 2y
+ y
t = 0
y(0) = 0
y
(0) = 1
y
(0) = 2
Esercizio 4
Risolvere con Matlab il problema di Cauchy parametrico
_
y
= ay + b cos(t)
y(0) = c
6
Prima esercitazione di laboratorio MATLAB Risoluzione simbolica di Sistemi di EDO
4 Risoluzione simbolica di Sistemi di EDO
Il comando dsolve pu`o essere utilizzato anche per la risoluzione di sistemi di equazioni dieren-
ziali ordinarie. Si consideri ad esempio il sistema lineare del I ordine
_
x
= y
y
= x
che `e equivalente a
d
dt
_
x
y
_
=
_
0 1
1 0
_ _
x
y
_
la cui soluzione `e x = x(t), y = y(t).
In Matlab si pu`o risolvere nel seguente modo:
>> [ x , y ] = ds ol ve ( Dx = y , Dy = -x)
x =
C21si n ( t ) + C22cos ( t )
y =
C22cos ( t ) C21si n ( t )
Si noti che in questo caso `e fondamentale lassegnazione della soluzione in una coppia di variabili
per il funzionamento del comando.
Se vengono invece assegnate ad esempio le condizioni iniziali x(0) = 0, y(0) = 1 si ha:
>> [ x , y ] = ds ol ve ( Dx = y , Dy = -x , x(0) = 0 , y(0) = 1)
x =
si n ( t )
y =
cos ( t )
Esercizio 5
Calcolare usando Matlab le soluzioni dei seguenti sistemi di equazioni dierenziali ordinarie,
rappresentando poi gracamente le soluzioni. Scrivere inoltre le equazioni in forma matriciale.
1
_
_
x
= 3x 2y
y
= 2x + y
x(0) = 1
y(0) = 0
2
_
_
x
= 2x + 4y + 3e
t
y
= 5x y t
2
x(0) = 0
y(0) = 1
3
_
_
x
= 3x 2y
y
= x + 3y 2z
z
= y + 3z
x(0) = 0
y(0) = 0
z(0) = 4
7
Prima esercitazione di laboratorio MATLAB Limiti dei solutori simbolici di EDO
Esercizio 6
Si trasformi il problema di Cauchy parametrico:
_
_
mx
+ x
+ kx = a cos(t)
x(0) =
x
(0) =
in un sistema di due equazioni e se ne calcoli la soluzione con Matlab.
5 Limiti dei solutori simbolici di EDO
Il fatto che sia possibile calcolare la soluzione esatta di alcune (semplici) equazioni dierenziali
non deve indurre a pensare che per tale tipo di problema possa sempre essere calcolata la
soluzione mediante una formula esplicita.
In generale, `e vero esattamente il contrario. Per la maggior parte delle equazioni dieren-
ziali ordinarie e dei sistemi, anche qualora lesistenza e lunicit`a della soluzione siano garantite
dallapplicabilit`a dei relativi teoremi, non esistono soluzioni facilmente calcolabili ed esprimibili
mediante formule chiuse.
Un esempio tipico di questa situazione `e il seguente problema di Cauchy:
_
y
= e
t
2
, t (0, 3]
y(0) = 1
Lequazione dierenziale associata a questo problema `e concettualmente banale, dato che equivale
ad una semplice integrazione denita e la soluzione non `e altro che
y(t) = 1 +
_
t
0
e
s
2
ds, t [0, 3].
Daltra parte, dato che lintegrale denito della funzione gaussiana non pu`o essere espresso
mediante una semplice formula chiusa, tale formula non `e altro che una rappresentazione della
soluzione che deve poi essere approssimata numericamente qualora si vogliano eettivamente
calcolare i valori della soluzione al variare di t (ci`o non deve spaventare, anche le funzioni sin, cos,
log devono essere approssimate numericamente dal calcolatore, in quando non sono esprimibili
attraverso le operazioni elementari di somma e prodotto).
In eetti in Matlab otteniamo:
>> ds ol ve ( Dy = exp(-t2) , y(0)=1)
ans =
( pi (1/2) erf ( t ) ) /2 + 1
La funzione erf `e un oggetto matematico ben noto in statistica (non a caso si trova anche in
quasi tutte le calcolatrici tascabili).
Dato che questo problema non deriva semplicemente dalla complessit`a del calcolo da eseguire,
ma da un ostacolo concettuale, non sar`a possibile in casi come questo (che, ripetiamo ancora,
costituiscono la regola se si eccettuano particolari classi di equazioni come quelle lineari ed
8
Prima esercitazione di laboratorio MATLAB Introduzione alla risoluzione numerica di EDO
omogenee a coecienti costanti di primo e secondo ordine) non sar`a possibile ottenere una
soluzione neanche con Matlab. Si otterranno invece dei messaggi derrore di svariato tipo, o
delle soluzioni formali in termini di cosidette funzioni speciali, che debbono poi a loro volta essere
calcolate e approssimate numericamente.
Nel caso di equazioni di ordine superiore al primo, pur restringendosi al caso di equazio-
ni lineari, a tali dicolt`a si deve aggiungere quella legata alla determinazione delle radici del
polinomio caratteristico associato alla equazione data.
La determinazione di tali radici `e possibile attraverso la modalit`a simbolica solo per alcuni
polinomi pi` u facilmente trattabili tramite semplici trasformazioni algebriche. In generale, per
una arbitraria equazione di ordine abbastanza alto (ad esempio oltre il quarto), Matlab non
sar`a in grado di determinare una soluzione lavorando in modalit`a simbolica. Considerazioni del
tutto analoghe possono essere fatte per i sistemi, per cui non `e in generale conveniente cercare di
determinare la soluzione di un sistema di pi` u di due equazioni dierenziali lavorando in modalit`a
simbolica.
If no closed-form (explicit) solution is found, an implicit solution is attempted.
When an implicit solution is returned, a warning is given.
If neither an explicit nor implicit solution can be computed, then a warning is given
and the empty sym is returned.
In some cases involving nonlinear equations, the output will be an equivalent lower
order dierential equation or an integral
3
.
6 Introduzione alla risoluzione numerica di EDO
Come si `e visto nella precedente sezione, in generale non `e quasi mai possibile calcolare esatta-
mente la soluzione di una equazione dierenziale ordinaria. Esistono per`o degli algoritmi che ne
forniscono delle soluzioni approssimate e che possono essere implementati (anche) in Matlab.
Lo studio approfondito di tali algoritmi viene svolto nellambito dei corsi di Calcolo Numerico e
Analisi Numerica.
In questa esercitazione ci si limiter` a ad introdurre una semplice implementazione del metodo
di Eulero, mentre nella seguente esercitazione si utilizzeranno metodi numerici pi` u sosticati e
pi` u accurati implementati in funzioni predenite in Matlab.
Consideriamo il generico problema di Cauchy (scalare):
_
y
= y (1 y). Si ottiene:
>> f un ( pi , 2)
ans =
2
solo che questa volta MATLAB non passa alla funzione, guadagnando qualcosa in ecienza.
6.2 Implementazione del metodo di Eulero
Iniziamo introducendo il tipo di problema che vogliamo arontare. Inplementiamo la funzione
function dy = f un ( t , y)
dy = y.(1 y ) ;
ossia nientaltro che il membro a destra dellequazione della logistica: y
= y (1 y). Si ottiene:
>> f un ( pi , 2)
ans =
2
Il metodo di Eulero dipende dai parametri dellequazione e dai parametri di discretizzazione,
come il passo temporale h e il tempo totale T. Fissiamoli dunque una volta per tutti:
1 %% Dati i n i z i a l i
2 t0 = 0;
3 y0 = 0 . 1 ;
4 %% Parametri di di s c r e t i z z a z i o ne
5 T = 1 0 . 0 ; % Tempo t o t a l e s i mul azi one
6 h = 0 . 5 ; % Passo temporal e
Abbiamo poi bisogno di un vettore ove memorizzare la soluzione e i passi temporali:
7 %% Memori zzazi one s ol uz i one
8 t = t0 : h : T;
9 N = si ze ( t , 2 ) ; % Numero di pas s i t empor al i che e f f e t t ue r e mo .
10 % Ri c or dar s i che s i z e ( t ) r e s t i t u i s c e
11 % l e di mens i oni di t i n f ormato ve t t or e
12 % ( [ 1 , N] i n questo caso ) e che s i z e ( t , 2)
13 % f o r ni s c e l a seconda componente ( o s s i a N) .
14 u = zeros ( 1 , N) ; % Vettore cont enente l a s ol uz i one : y( t ( k ) ) u( k)
Procediamo ora con lalgoritmo vero e proprio:
15 %% I n i z i a l i z z a z i o n e
16 u( 1) = y0 ; % Assegno i l dato i n i z i a l e
17 %% Pas s i t empor al i
4
Per digitare il simbolo su tastiere italiane si deve tener premuto il tasto Alt e digitare il numero 126 sul
tastierino numerico. Il simbolo comparir` a una volta rilasciato Alt . Ricordarsi di attivare Num . Su sistemi
UNIX-like, come GNU/Linux, basta tener premulto AltGr e premere il tasto della ` (i accentata, vicino a
).
11
Prima esercitazione di laboratorio MATLAB Introduzione alla risoluzione numerica di EDO
18 for k=1:N1
19 % Suppongo che f un s i a de f i ni t a
20 u( k+1) = u( k) + h f un ( t ( k ) , u( k ) ) ;
21 end
Per convincerci del risultato plottiamo il risultato sovrapponendolo alla soluzione esatta:
22 %% Sol uzi one e s at t a
23 % Scr i vo l e c ondi z i oni i n i z i a l i assembl ando l a s t r i nga c or r i s ponde nt e
24 i ni t c ond = [ y( , num2str( t0 ) , )= , num2str( y0 ) ] ; % Cos t r ui s co y( t0)=y0
25 % Ri s ol vo si mbol i camente con s v a r i a bi l e i ndi pendent e
26 y = ds ol ve ( Dy = y * (1-y) , i ni t cond , s ) ;
27 % So s t i t ui s c o s s i mbol i c a con i l ve t t or e s , e pl ot t o i n t r at t o conti nuo nero
28 s = linspace ( t0 , T, 1000) ; % l i ns pac e ( a , b , N) di vi de i l segmento
29 % [ a , b ] i n N el ement i
30 c l f ;
31 plot ( s , subs ( y , s , s ) , -k ) ;
32 %% Sol uzi one approssi mata
33 hold on ; % Mantengo l a f i n e s t r a g r a f i c a c or r e nt e aper t a
34 plot ( t , u , *-r ) ;
35 grid on ;
36 legend ( Sol. esatta , Sol. numerica ) ;
37 t i t l e ( Metodo di Eulero in avanti ) ;
38 xlabel ( t ) ;
0 1 2 3 4 5 6 7 8 9 10
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
t
y
Metodo di Eulero in avanti
Sol. esatta
Sol. numerica
Figura 1: Soluzione esatta ed approssimata sovrapposte.
Si osserva la classica sigmoide o curva logistica, fondamentale in dinamica delle popolazioni.
Esercizio 7
Studiare la soluzione del problema seguente:
_
y
= y(y 1)(0.5 y)
y(0) = y
0
al variare di y
0
. Questa `e detta equazione bistabile, in quanto vi sono due equilibri stabili (cio`e
verso i quali le traiettorie convergono) e uno instabile a met`a.
`
E unequazione molto importante
in chimica e biochimica (nonche in siologia).
12
Prima esercitazione di laboratorio MATLAB Introduzione alla risoluzione numerica di EDO
Esercizio 8
Risolvere il seguente problema di Cauchy:
_
y
= 100y(y 1)(0.5 y)
y(0) = 0.6
per T = 5.0 al variare di h tra 0.01 e 0.1. Cercare di descrivere come evolve la situazione.
6.3 Funzioni anonime
Pu`o essere utile a volte utilizzare le funzioni anonime, ad esempio nel caso in cui un solutore
(come il nostro programma di Eulero esplicito) richiede sempre una funzione di due argomenti
ma noi ne abbiamo scritta una che dipende anche da parametri aggiuntivi.
Modichiamo la funzione fun nel seguente modo:
function dy = f unpar ( t , y , a , b)
%FUNPAR Funzi one l o g i s t i c a di parametri a e b
%
% FUNPAR( t , y , a , b) c a l c o l a ay( by)
dy = ay . ( by ) ;
Se provassimo ad eseguire nuovamente il solutore di Eulero riceveremmo un errore da parte di
Matlab. In eetti basterebbe modicare la riga 16 mettendo funpar (t(k), u(k), a, b) al
posto di fun (t(k), u(k)). Ma non `e ci`o che vogliamo fare (si immagini la situazione in cui lo
script `e fornito ma non modicabile).
Il trucco che possiamo usare sfrutta lidea seguente:
>> a = 1 . 0 ;
>> b = 1 . 0 ;
>> f un = @( t , y) f unpar ( t , y , a , b ) ;
>> f unpar ( 0 . 0 , 0. 5 , a , b)
ans =
0. 2500
>> f un ( 0 . 0 , 0. 5)
ans =
0. 2500
Allatto pratico, quando chiamo funpar, Matlab chiama fun sostituendo automaticamente il
valore dambiente dei parametri a e b. In questo modo possiamo usare lo script di Eulero senza
modicare nulla: basta ridenire fun.
6.4 Accuratezza del metodo
Una volta deciso il metodo, il passo successivo `e capire quanto questo sia buono. Scelto lo sche-
ma rimangono i parametri di discretizzazione da selezionare. Come si sceglie, dunque, il passo
temporale? C`e quale vincolo? Quanto migliora la soluzione al diminuire di h? Mi avvicino davve-
ro indenitivamente alla soluzione vera? Queste domande portano a tre importantissimi concetti
13
Prima esercitazione di laboratorio MATLAB Introduzione alla risoluzione numerica di EDO
0 1 2 3 4 5 6 7 8 9 10
0
0.2
0.4
0.6
0.8
1
1.2
1.4
Metodo di Eulero in avanti
t
y
Sol. esatta
Sol. numerica
(a) h = 2.0
0 1 2 3 4 5 6 7 8 9 10
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
t
y
Metodo di Eulero in avanti
Sol. esatta
Sol. numerica
(b) h = 1.0
0 1 2 3 4 5 6 7 8 9 10
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
t
y
Metodo di Eulero in avanti
Sol. esatta
Sol. numerica
(c) h = 0.5
0 1 2 3 4 5 6 7 8 9 10
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
t
y
Metodo di Eulero in avanti
Sol. esatta
Sol. numerica
(d) h = 0.1
Figura 2: Approssimazione numerica al variare del passo temporale h.
in Analisi Numerica: stabilit`a, convergenza e consistenza che saranno trattati profusamente in
esami successivi e che qui abbiamo intenzione solo di sorare.
In Figura 2 possiamo vedere come varia lapprossimazione calcolata dal metodo di Eulero al
variare di h: pare che vi sia convergenza (si pu`o mostrare che scala linearmente con h).
Gli errori possono essere calcolati relativamente allistante nale T = t
N
o relativamente a
tutto lintervallo [0, T]. Lerrore assoluto allistante nale pu`o essere denito come
err
abs
(T) = |y(t
N
) u
N
|.
Tenendo conto per`o che i valori numerici della soluzione esatta potrebbero essere molto grandi o
molto piccoli, ci si rende conto che `e pi` u opportuno rapportare la dimensione dellerrore a quella
della soluzione stessa, introducendo quindi il cosidetto errore relativo
err
rel
(T) =
|y(t
N
) u
N
|
|y(t
N
)|
.
Se si vuole considerare invece lerrore compiuto su tutto lintervallo [0, T] si deve tenere
conto anche degli istanti precedenti allultimo. Una possibile denizione `e quella che consiste nel
14
Prima esercitazione di laboratorio MATLAB Introduzione alla risoluzione numerica di EDO
prendere il massimo errore commesso su tutto lintevallo (detto errore in norma
):
err
abs
(0, T) = max
k=0,...,N
|y(t
k
) u
k
|.
Il corrispondente errore relativo `e invece
err
rel
(0, T) =
max
k=0,...,N
|y(t
k
) u
k
|
max
k=0,...,N
|y(t
k
)|
.
Tale misura di errore considera il massimo scarto rilevato tra la soluzione esatta e quella numerica
in tutti gli istanti in cui si `e proceduto a calcolare lapprossimazione u
k
.
Unaltra possibile denizione `e invece quella del cosidetto errore quadratico medio, analogo
a quello che si vede in statistica (detto anche errore in norma
2
):
err
abs
2
(0, T) =
_
N
k=0
h |y(t
k
) u
k
|
2
.
Il corrispondente errore relativo `e invece:
err
rel
2
(0, T) =
N
k=0
h |y(t
k
) u
k
|
2
N
k=0
h |y(t
k
)|
2
.
Si noti che nella denizione dellerrore relativo il termine
N
k=0
|y(t
k
)|
2
h costituisce di fatto una
approssimazione dellintegrale
_
T
0
|y(s)|
2
ds.
Esercizio 9
Calcolare gli errori assoluti e relativi compiuti nellapprossimazione della soluzione del
problema di Cauchy
_
y
+ y = 2 cos(3t)
y(0) = 1
sullintervallo [0, 6] utilizzando il metodo di Eulero con un passo h = 0.1, h = 0.01, h = 0.001.
15