Prof. L. Brandolini
Dott.ssa N. Franchina
Corso di Calcolo Numerico
Laboratorio 5
Equazioni differenziali ordinarie: metodi espliciti
23 Novembre 2016
Esercizi di implementazione
Un’equazione differenziale ordinaria è un’equazione che contiene derivate rispetto ad un’unica
variabile indipendente. Nel seguito ci limiteremo a considerare equazioni differenziali del
primo ordine, in particolare vengono considerati i cosiddetti problemi di Cauchy, ossia i
problemi definiti come di seguito:
trovare y : I → R tale che
′
y (t) = f (t, y(t))
y(t0 ) = y 0 ,
∀t ∈ I
(1)
′
dove I ⊂ R, f è una funzione assegnata e y = dy/dt. Inoltre t0 è il punto in cui viene
prescritta la condizione iniziale y 0 , ovvero quel dato che consente di individuare una soluzione
tra le infinite soluzioni ammissibili dal problema (1).
Dato il passo di discretizzazione ∆t, il metodo di Eulero in avanti consente di calcolare
una soluzione approssimata del problema di Cauchy nel seguente modo:
un+1 = un + ∆t f (tn , un ),
n = 0, . . . , N − 1.
(2)
′
Tale schema è ottenuto mediante l’applicazione della formula di Eulero in avanti a y (t) in
ogni nodo tn , n = 1, . . . , N .
1. Si implementi il metodo di Eulero in avanti per la risoluzione del seguente problema
modello
′
y (t) = λy(t),
y(t0 ) = 1.
t ∈ (0, Tf )
(3)
I metodi multipasso consentono di ottenere un ordine di accuratezza superiore utilizzando
i valori un , un−1 , . . . , un−p nel calcolo di un+1 .
2. Si implementi il metodo a due passi di Adams-Bashforth (AB1) per la risoluzione del
problema modello (3),
∆t
un+1 = un +
3f (tn , un ) − f (tn−1 , un−1 ) , n = 1, . . . , N − 1.
(4)
2
1
Soluzione
1. Si riporta nel file EA.m l’implementazione del metodo di Eulero in avanti per la risoluzione del problema modello (3) con λ ∈ R− , la cui soluzione esatta è y(t) = eλt .
Applicando lo schema di Eulero in avanti a questo problema si ottiene
un+1 = un + ∆t λ un .
I parametri di ingresso della function EA sono: l’istante iniziale t0 e quello finale tf,
la condizione iniziale u0, il passo di discretizzazione Deltat e il coefficiente lambda.
2. Per quanto riguarda il metodo AB1 si osserva che in tale schema la soluzione approssimata un+1 dipende dalla soluzione approssimata calcolata nei due passi precedenti.
Questo richiede che al passo temporale t1 siano noti i valori della soluzione nei due
istanti precedenti. Essendo noto solo il dato u0 si utilizza il metodo di Eulero in
avanti per il calcolo di u1 . Si riporta nel file AB1.m l’implementazione del metodo di
Adams-Bashforth per la risoluzione del problema modello (3), ovvero
un+1 = un +
∆t
λ 3un − un−1 .
2
I parametri di input della function AB1 coincidono con quelli della function EA.
Esercizi
Si consideri la seguente equazione differenziale:
′
y (t) = −2y(t) t ∈ (0, Tf ]
y(t0 ) = 1.
(5)
1. Risolvere il problema proposto mediante il metodo di Eulero in avanti implementato.
Valutare l’assoluta stabilità della soluzione numerica ottenuta utilizzando ∆t = 0.05,
Tf = 10 mediante confronto con la soluzione esatta. Si esegua la stessa verifica per un
passo di discretizzazione ∆t = 1.2, con Tf = 10.
2. Si risolva il problema proposto nell’ Esercizio 1 mediante il metodo AB1 utilizzando i
medesimi valori di ∆t usati con il metodo di Eulero in avanti. Confrontare la soluzione
calcolata con quella ottenuta nell’Esercizio 1.
3. Calcolare sperimentalmente l’ordine di accuratezza del metodo di Eulero in avanti e di
Adams-Bashforth1.
Soluzione
1. Si riportano nel file Lab5es1.m le istruzioni Matlab necessarie per la risoluzione del
problema modello assegnato (λ = −2) nell’ intervallo I = (0, 10] con ∆t = 0.05 e
nell’intervallo I = (0, 10] con ∆t = 1.2.
2
1
15
0.9
10
0.8
0.7
5
0.6
0.5
0
0.4
−5
0.3
0.2
−10
0.1
0
0
2
4
6
8
−15
10
0
(a) ∆t = 0.05, Tf = 10
2
4
6
8
10
(b) ∆t = 1.2, Tf = 10
Figura 1: Es1: soluzione numerica un calcolata con il metodo di Eulero in avanti (linea
continua), soluzione esatta u (linea tratteggiata).
In Figura (1), in alto, si riporta il confronto tra la soluzione esatta e quella numerica
calcolata per ∆t = 0.05, e in basso quella ottenuta con ∆t = 1.2. Si osserva che la
soluzione calcolata con ∆t = 1.2 non è assolutamente stabile. Tale valore di ∆t viola
infatti la condizione di stabilità dello schema, cioè
∆t < 2/|λ|.
(6)
2. Si riporta nel file Lab5es2.m la risoluzione del problema modello mediante il metodo di Adams-Bashforth1 per ∆t = 0.05 e Tf = 10 e per ∆t = 1.2 e Tf = 10. I
risultati ottenuti, rappresentati in Figura(2), mettono in evidenza che la soluzione calcolata con ∆t = 1.2 non è assolutamente stabile. Infatti anche il metodo AB1 è solo
condizionatamente assolutamente stabile.
3. Si dimostra che il metodo di Eulero in avanti ha ordine di convergenza pari a 1, i.e. |un −
y(tn )| = O(∆t), mentre il metodo di Adams-Bashforth1 ha ordine di convergenza pari
a 2, i.e. |un − y(tn )| = O(∆t)2 . Per verificare numericamente tale risultato si considera
la risoluzione del problema modello per valori di ∆t successivamente dimezzati e si
valuta la riduzione dell’errore come di seguito
E1 (∆t) = O (∆tp ) ,
p ∆t
∆t
=O
,
E2
2
2
E1
≈ 2p ,
E2
(7)
per cui l’ordine di convergenza del metodo è p ≈ log2 (E1 /E2 ).
Si riporta nel file Lab5esStimaOrdine.m una possibile implementazione per il calcolo
dell’ordine di accuratezza di Eulero in avanti e di Adams -Bashforth1 applicati al
3
problema modello (5). Lo script definisce i dati del problema e le grandezze di input
richieste dalle functions EA e AB1. Si pone M come numero di dimezzamenti successivi
del passo di integrazione Deltat che si vogliono utilizzare per stimare l’ordine p.
Per quanto riguarda la stima dell’ordine di convergenza del metodo di Eulero in avanti,
usando M = 10 dimezzamenti successivi di ∆t (con ∆t iniziale pari a 0.05) si ottiene:


1.0314
 1.0154 


 1.0076 


 1.0038 



p=
 1.0019  ,
 1.0009 


 1.0005 


 1.0002 
1.0001
si osserva quindi che il metodo di Eulero risulta accurato al primo ordine come previsto.
La verifica sperimentale dell’ordine di convergenza del metodo AB1 viene svolta uti-
1
3500
0.9
3000
0.8
2500
0.7
2000
0.6
1500
0.5
1000
0.4
500
0.3
0
0.2
−500
0.1
−1000
0
0
1
2
3
4
5
6
7
8
9
−1500
10
(a) ∆t = 0.05, Tf = 10
0
1
2
3
4
5
6
7
8
9
10
(b) ∆t = 1.2, Tf = 10
Figura 2: Es2: soluzione numerica calcolata con il metodo di Adams-Bashforth1 un (linea
continua), soluzione esatta u (linea tratteggiata).
4
lizzando gli stessi parametri, lo stesso valore iniziale di ∆t, e M = 10. Si ottiene


1.9763
 1.9881 


 1.9940 


 1.9970 



p=
 1.9985  ,
 1.9992 


 1.9996 


 1.9998 
1.9999
ovvero un’accuratezza pari al secondo ordine come previsto dalla teoria.
5