You are on page 1of 15

Corso di EQUAZIONI DIFFERENZIALI ORDINARIE

Prima esercitazione di laboratorio MATLAB


1
Clelia Marchionna
(clelia.marchionna@polimi.it)
Simone Pezzuto
(simone.pezzuto@mail.polimi.it)
Versione del: 18 ottobre 2012
1 Introduzione
Matlab `e un software per il calcolo scientico ampiamente utilizzato da scienziati applica-
ti e ingegneri in tutto il mondo. Sviluppato dalla MathWorks (http://www.mathworks.com),
`e un software protetto da copyright e non disponibile gratuitamente. Esistono tuttavia pro-
grammi OpenSource che ne imitano (con successo) il funzionamento, in particolare Octa-
ve (http://www.octave.org), che utilizza comandi di fatto identici per nome e sintassi, e
SciLab (http://www.scilab.org), che seppure direttamente ispirato a Matlab utilizza una
sintassi leggermente diversa. Entrambi questi software riproducono solo le funzionalit`a base
di Matlab. In particolare, per poter utilizzare le funzioni grache di Octave `e necessario
disporre anche del software graco GnuPlot, che `e anche esso disponibile senza restrizioni
(http://www.gnuplot.info).
Lo scopo di questa dispensa `e quello di fornire una prima introduzione agli strumenti presenti
in Matlab per la soluzione di equazioni e sistemi di equazioni dierenziali ordinarie. Si presup-
pone che il lettore gi`a possegga una certa familiarit`a con luso di questo software; per una prima
introduzione si rimanda alle dispense del corso EAMAG e ai Tutorials disponibili in rete. Nellam-
bito di queste esercitazioni si utilizzeranno inne numerosi scripts didattici sviluppati da John
Polking presso la Rice University (USA) e reperibili sul sito http://math.rice.edu/

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 +

5. Bisogna fare attenzione che il comando sym converte la stringa fornita


in argomento in un simbolo, ma `e anche in grado di trovare il simbolo corrispondente ad una
espressione numerica (notare lassenza delle virgolette):
>> c = sym( 1/3)
Ancora una volta, c contiene il simbolo 1/3. Per`o se proviamo con:
>> d = sym(1+sqrt ( 5) )
il toolbox prova a calcolare il numero razionale pi` u vicino, e se ci riesce tratta quello come
simbolo. Se invece non `e in grado di far ci`o, memorizza il numero nella forma oatingpoint
2
.
Per denire stringhe pi` u complesse, la notazione `e sempre la stessa:
>> f = sym( x2 + sin(x))
In questo caso sym interpreta la stringa come la somma di due addendi, dove il primo e il quadrato
delloggetto x, e il secondo `e la funzione sin applicata ad x. Notare invece che il comando:
>> f = sym( x2 + si n ( x ) )
fornisce un errore, in quanto la variabile x non `e stata denita. Per`o si pu`o scrivere:
>> x = 1;
>> f = sym( x2 + si n ( x ) )
e in questo caso f contiene il valore (eventualmente approssimato) di 1 + sin(1).
Ora deniamo due simboli:
>> f = sym( x2 ) ;
>> g = sym( x3 ) ;
e proviamo a scrivere:
>> h = f g
La variabile h contiene il simbolo x
5
, ossia x
2
x
3
. Quindi si possono eseguire molte operazioni
algebriche ai simboli deniti, e automaticamente verr`a creato il simbolo contenente quellespres-
sione. Questo suggerisce unidea: supponiamo di denire il simbolo x, e che per comodit`a venga
memorizzato nella variabile di nome x
>> x = sym( x ) ;
Ora proviamo nuovamente il comando
>> f = x2 + si n ( x)
e questa volta linterpretazione `e quella corretta.
Attenzione: variabile e oggetto corrispondente sono due cose dierenti! Come specicato,
chiamare la variabile contenente il simbolo x con x `e una pura comodit`a, non una necessit`a.
Infatti:
>> x = sym( topolino ) ;
>> f = x2 + si n ( x)
2
Versioni diverse di Matlab potrebbero comportarsi in modo diverso da questo punto di vista.
2
Prima esercitazione di laboratorio MATLAB Richiami sul Symbolic Math Toolbox di MATLAB
restituisce lespressione sin(topolino) + topolino
2
.
Se lespressione contiene molte variabili, pu`o diventare tedioso scrivere ogni volta il comando
sym:
>> x = sym( x ) ;
>> y = sym( y ) ;
>> z = sym( z ) ;
>> w = sym( w ) ;
Per questo il toolbox simbolico mette a disposizione il comando syms:
>> syms x y z w;
che `e lequivalente compatto di quanto scritto prima.
Con i simboli si possono fare un certo numero di operazioni algebriche, come espandere
un prodotto, semplicare lespressione, calcolare derivate ed integrali, trasformate di Laplace o
Fourier, o risolvere equazioni dierenziali.
`
E inoltre possibile usare molti comandi numerici di
Matlab, come calcolare determinante, traccia, autovalori. In questultimo caso `e utile ricordare
che `e possibile denire anche vettori o matrici di oggetti simbolici, in modo del tutto naturale:
>> syms x ;
>> A = [ x , 0; 1x , x ] ;
Per esempio il comando det(A) fornir`a il simbolo x
2
, mentre eig(A) fornisce il vettore [
x
x
].
Proviamo con un esempio pi` u elaborato: data una matrice generica, vogliamo calcolare gli au-
tovalori usando la denizione. Denite le variabili simboliche, costruiamo la matrice e calcoliamo
il polinomio caratteristico:
>> syms a b c d lambda ;
>> A = [ a b ; c d ] ;
>> pol i nomi o = det (A lambdaeye ( 2 ) ) ;
Ora risolviamo il polinomio rispetto a , con il comando:
>> e i g s = s ol ve ( pol i nomi o , lambda ) ;
Il vettore eig contiene gli autovalori, come si pu`o vericare confrontando il risultato con:
>> eig (A) ;
Esercizio 1
Utilizzando la guida di Matlab (comandi help e doc), provare ad utilizzare int, collect,
simplify, expand, pretty, ....
Per valutare una funzione numericamente (per esempio sostituire ad x un valore numerico),
si utilizza il comando subs nel seguente modo:
>> syms x ;
>> y = x si n ( x ) ;
che pu`o essere valutata numericamente con il comando subs nel seguente modo:
>> subs ( y , x , pi /2)
ans =
1. 5708
Se si sostituisce alla variabile indipendente un vettore, il programma eettua il calcolo
dellespressione per ciascuna componente, restituendo un vettore di pari dimensioni:
3
Prima esercitazione di laboratorio MATLAB Risoluzione simbolica di EDO
>> subs ( y , x , 0: 3)
ans =
0 0. 8415 1. 8186 0. 4234
Per visualizzare il graco di una funzione denita come espressione simbolica, si pu`o utilizzare
il comando ezplot, che fornisce direttamente il graco della funzione simbolica per lintervallo
di valori inserito sotto forma di vettore nel secondo argomento.
>> e z pl ot ( y , 4pi [ 1 , 1 ] ) ;
3 Risoluzione simbolica di EDO
Se il comando fondamentale per la soluzione simbolica di equazioni `e solve, quello per la solu-
zione di equazioni dierenziali ordinarie `e dsolve. Tale comando fornisce lintegrale generale di
unequazione dierenziale.
Consideriamo lequazione dierenziale:
dy
dt
= y
2
.
Vi sono due casi: y(t) 0 e y(t) = 0. In questultimo, procedendo per separazione di variabili si
ha:
dy
y
2
= dt
1
y
+ C = t y(t) =
1
t C
Per risolvere la stessa equazione con il Toolbox simbolico di Matlab si pu`o eseguire il seguente
comando:
>> ds ol ve ( Dy = y2)
ans =
0
1/(C3 + t )
Si osservi che, per default, la variabile indipendente viene indicata con la lettera t. Se necessario il
nome della variabile indipendente pu`o essere modicato (purche sia dierente dal nome utilizzato
per indicare la variabile dipendente):
>> ds ol ve ( Dy = y2 , x)
ans =
0
1/(C7 + x)
Si noti, inoltre, come il solutore simbolico sia in grado di individuare anche la soluzione
particolare y 0.
Nota: nelle prime versioni di Matlab (prima della R2009b) il toolbox simbolico non era in
grado di trovare entrambe le soluzioni. Ad esempio nella versione R2007a loutput che si ottiene
`e il seguente:
>> ds ol ve ( Dy = y2)
ans =
1/(C1 + t )
`e quindi necessario controllare quale versione del programma si usa e prestare la dovuta atten-
zione.
4
Prima esercitazione di laboratorio MATLAB Risoluzione simbolica di EDO
Per risolvere invece un problema di Cauchy (ossia unequazione dierenziale ordinaria con
assegnato un valore iniziale), come ad esempio:
_
y

= 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

diviene D3y, e cos` via.


Consideriamo ad esempio lequazione lineare:
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

(t) = f(t, y(t)), t (0, T]


y(0) = y
0
,
con y : [0, T] R, f : (0, T] R R e y
0
R. Lequazione ci dice che geometricamente la
tangente di y(t) `e esattamente f(t, y(t)), per ogni t (0, T]. Quindi, la cosa pi` u ovvia che si
pu`o fare, dato un valore noto di y(t) (per esempio il dato iniziale y(0)), `e procedere passo per
passo lungo la tangente (che fornisce una direzione). Pi` u precisamente, se supponiamo di avere a
disposizione al tempo t
k
il valore approssimato u
k
, possiamo determinare u
k+1
facendo un passo
di dimensione h
k
sommando ad u
k
il valore h
k
f(t
k
, u
k
).
3
Stralcio dellhelp di Matlab
9
Prima esercitazione di laboratorio MATLAB Introduzione alla risoluzione numerica di EDO
In formule, il metodo di Eulero esplicito (o in avanti) si scrive come:
_
u
k+1
= u
k
+ h
k
f(t
k
, u
k
), t
k
(0, T], k = 1, 2, . . .
u
0
= y
0
.
Il vettore
_
u
k
_
k=k
max
k=0
sar`a lapprossimazione numerica di y(t), ossia u
k
approssimer`a y(t
k
)
con un certo margine di errore. Se h
k
= h costante, allora t
k
= h k e k varier`a tra 0 e lintero
pi` u vicino a T/h.
Vogliamo ora implementare lalgoritmo in Matlab: prima per`o apriamo una parentesi sulle
funzioni denite da utente, che torneranno molto utili anche nella prossima esercitazione.
6.1 Script e Funzioni in MATLAB
Fino ad ora abbiamo utilizzato Matlab in modalit`a interattiva, ossia immettendo i comandi
uno alla volta direttamente nellinterfaccia graca (il prompt dei comandi) e aspettando, di volta
in volta, loutput. Matlab ci dice quando `e in attesa di comandi con il simbolo >> nel prompt.
`
E buona norma per`o utilizzare script e funzioni per operazioni pi` u strutturate e complesse
(come, ad esempio, risolvere unequazione dierenziale ordinaria) o anche solo per fare una serie
di comandi ripetitivi. Uno script non `e nientaltro che un le di testo che contiene una sequenza
di operazioni che altrimenti potreste scrivere uno alla volta al prompt dei comandi. Una funzione
invece `e un particolare tipo di script con unintestazione ben precisa (la rma della funzione)
necessaria per essere richiamata.
Script e funzioni possono essere scritti direttamente con leditor di Matlab:
>> e di t
oppure con un qualsiasi editor di testo (come Notepad su sistemi Windows).
Apriamo dunque leditor di script e scriviamo al suo interno:
1 function dy = f unzi one ( t , y)
2
3 % Questa f unzi one c a l c o l a s i n 2( y) + t
4
5 dy = si n ( y ) . 2 + t ;
Listing 1: Funzione che valuta f(t, y) = sin
2
(y) + t.
Salviamo il le con il nome funzione.m (il nome del le che contiene la funzione, suggerito da
Matlab stesso, deve essere identico al nome della funzione).
Ora dal prompt dei comandi digitiamo:
>> f unzi one ( 2 , pi /2)
ans =
3
>> help f unzi one
Questa f unzi one c a l c o l a s i n 2( y) + t
Operativamente Matlab richiama la funzione passando i valori t = 2 e y = pi/2. Le linee di
commento (non obbligatorie ma utili) sono stampate a video come guida della funzione attraverso
il comando help. Come vedremo, molte funzioni di Matlab prendono in ingresso a sua volta
una funzione, la quale per`o deve avere una rma ben precisa.
10
Prima esercitazione di laboratorio MATLAB Introduzione alla risoluzione numerica di EDO
Nota: Nelle ultime versioni di Matlab (superiori alla R2008a), se un parametro deve essere
presente ma non `e utilizzato, `e buona norma sostituirne il nome con il simbolo
4
. Ad esempio
(nel caso della versione R2007a questo non funzioner`a, quindi si inserisca t come nellesempio
precedente):
1 function dy = f un (, y)
2 dy = y.(1 y ) ;
Listing 2: Funzione che valuta f(t, y) = 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
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