Programma 6.4 Crank-Nicolson
6.4 Sistemi di equazioni differenziali lineari
In questo paragrafo estenderemo i metodi introdotti per un’equazione del primo ordine a un sistema di equazioni differenziali lineari del primo ordine a coefficienti costanti.
Il problema che consideriamo è il seguente. Data una funzione b= b t
( )
!Rn e unamatrice quadrata A= a
( )
ij , i, j= 1,2,...,n , si cerca la funzione u= u t( )
!Rn tale chedu
dt = Au + b t
( )
!du1
dt = a11u1+ a12u2 + ...+ a1nun + b1
( )
t du2dt = a21u1+ a22u2 + ...+ a2nun+ b2
( )
t ...dun
dt = an1u1+ an2u2+ ...+ a1nun + bn
( )
t!
"
##
##
$
##
##
(6.176)
con
u t
(
= t0)
= u0 !u1
(
t= t0)
= u1( )0u2
(
t= t0)
= u2( )0...
un
(
t = t0)
= un( )0.!
"
##
$
##
(6.177)
Il sistema di equazioni (6.176) con le condizioni iniziali (6.177) ammette sempre una ed una sola soluzione, [6.1]. Nel prossimo paragrafo analizzeremo la situazione più generale di sistemi di equazioni differenziali del primo ordine tempo varianti e/o non lineari.
Esempio 6.16
Si consideri il circuito dinamico lineare illustrato in Figura 6.9. Esso contiene due condensatori.
Figura 6.9 Un circuito lineare del secondo ordine.
Le equazioni caratteristiche dei condensatori sono C1dv1
dt = i1, (6.178)
C2dv2
dt = i2. (6.179)
Ora bisogna esprimere le due intensità di corrente i1, i2 in funzione delle due tensioni v1, v2 attraverso la parte resistiva del circuito. Per ispezione diretta del circuito si ottiene:
i1 = e t
( )
! v1R1 ! i2, (6.180)
i2 = v1! v2
R2 . (6.181)
Combinando le (6.178)-(6.181) otteniamo dv1
dt = ! 1
R1C1 + 1 R2C1
"
#$
%
&'v1+ v2
R2C1 + e t
( )
R1C1, dv2
dt = v1
R2C2 ! v2
R2C2. (
)
**
+
**
(6.182)
Questo sistema deve essere risolto con assegnate condizioni iniziali per v1 e v2.
♦ La soluzione generale del sistema (6.176) è data dalla sovrapposizione della soluzione generale dell’equazione omogenea associata e di una soluzione particolare che dipende dal forzamento b= b t
( )
.Si supponga (solo per semplicità) che gli autovalori !1,!2,...,!n della matrice A siano tutti distinti. Indichiamo con w1, w2,..., wn i corrispondenti autovettori,
Awk =!kwk per k= 1,2,...,n . (6.183) La soluzione generale dell’equazione omogenea associata è data da
u t
( )
= ckwke!ktk=1
"
n (6.184)dove c1, c2,..., cn sono n costanti arbitrarie. Gli autovalori della matrice A sono reali e/o complessi coniugati. A ciascun autovalore reale !k ="k corrisponde un modo di evoluzione naturale di tipo esponenziale
ckwke!kt, (6.185)
mentre a ciascuna coppia di autovalori complessi coniugati !k ="k ± i#k corrisponde un modo di evoluzione naturale di tipo oscillante,
cke!ktRe w
(
kei"kt)
. (6.186)Se Re
{ }
!k > 0 il modo naturale corrispondente è instabile, se Re{ }
!k = 0 il modo naturale corrispondente è stabile, se Re{ }
!k < 0 il modo naturale corrispondente è asintoticamente stabile.Introduciamo i campioni
u( )0 = u t
( )
0 , u( )1 = u t( )
1 , …, u( )k = u t( )
k , … (6.187)b( )0 = b t
( )
0 , b( )1 = b t( )
1 , …, b( )k = b t( )
k , … . (6.188)La soluzione numerica del sistema (6.176) con la condizione iniziale (6.177) può essere ottenuta adottando le stesse tecniche di approssimazione usate per risolvere una singola equazione differenziale del primo ordine. Ora illustreremo i metodi di Eulero e il metodo di Crank-Nicolson per il sistema (6.176). L’ordine e la consistenza sono una proprietà intrinseche del metodo impiegato per approssimare l’operatore di derivata prima e per interpolare la funzione a secondo membro dell’equazione, quindi non cambiano se al posto di funzioni scalari si considerano funzioni vettoriali. Di conseguenza, per l’ordine e la consistenza valgono tutte le proprietà già illustrate per una singola equazione differenziale del primo ordine.
6.4.1 Metodo di Eulero esplicito
Operando come nel § 6.2 otteniamo per la derivata di u t
( )
all’istante tkdu
dt t=tk = u(k+1)! u( )k
"t + O "t
( )
. (6.189)Combinando le equazioni (6.176), (6.189) e ignorando i termini O !t
( )
2 otteniamo la formula di Eulero esplicito per il sistema (6.176)u(k+1) ! I + "tA
( )
u( )k + "tbk (6.190) dove I è la matrice identità n! n . Nel prossimo paragrafo è descritto un programma in MATLAB che implementa la formula (6.190).6.4.1.1 Il problema della stabilità numerica
Consideriamo, ora, il problema della stabilità numerica. Posto
!u( )k = !u( )k " u( )k , (6.191) dove u( )1, u( )2 ,..., u( )k ,... e !u( )1,!u( )2 ,...,!u( )k ,... sono le sequenze generate a partire dalle condizioni iniziali u( )0 e !u( )0 , rispettivamente, si ha immediatamente che
!u(k+1) = "!u( )k per k = 0,1,... (6.192) dove
! = I + "tA. (6.193)
Indichiamo con WA la matrice le cui colonne sono gli autovettori della matrice A,
WA = w1 w2 ... wn . (6.194)
Essendo, per ipotesi, gli autovalori di A distinti, gli autovettori di A sono linearmente indipendenti, quindi la matrice WA è invertibile. Per definizione di WA abbiamo
WA!1AWA = DA, (6.195)
dove
DA = diag
(
!1, !2,...,!n)
(6.196)è la matrice diagonale degli autovalori di A. Utilizzando la (6.195) la matrice ! può essere così riscritta,
! = WA
(
I+ "tDA)
WA#1. (6.197)Sostituendo la (6.197) otteniamo
WA!1"u(k+1) = I + #tD
(
A)
WA!1"u( )k . (6.198)Posto
!y( )k " WA#1!u( )k , (6.199)
la (6.198) può essere così riscritta
!y(k+1) = I + "tD
(
A)
!y( )k . (6.200)Essendo
!u( )k = WA!y( )k , (6.201)
e det W
( )
A ! 0, le proprietà di stabilità della sequenza !u( )0,!u( )1,... coincidono con quelle della sequenza !y( )0,!y( )1,..., e viceversa.Figura 6.10 Diagramma di stabilità per il metodo di Eulero esplicito.
Dato che DA è una matrice diagonale, la (6.200) si riduce a n equazioni alle differenze per i modi naturali non accoppiate,
!yh(k+1) ="h!yh( )k per h= 1,2,...,n . (6.202) dove
!i = 1+ "t#i. (6.203)
Si consideri il numero complesso
rh( )e =!h + 1
"t =!h # # 1
"t
$%& '
() (6.204)
sul piano delle frequenze naturali !h (piano di Gauss) del sistema di equazioni (6.176).
Questo numero è la differenza tra la frequenza naturale !h e
(
!1 / "t)
. Utilizziamo la rappresentazione vettoriale per i numeri complessi per rappresentare il numero complesso rh( )e . Esso è il vettore che si ottiene dalla differenza tra il vettore !h e il vettore(
!1 / "t)
:è uguale al vettore che ha l’origine coincidente con la punta del vettore
(
!1 / "t)
e lapunta coincidente con la punta del vettore !h, Figura 6.10a. Per assegnato !t, le frequenze naturali !h per cui
rh( )e = !h + 1
"t = 1
"t (6.205)
appartengono alla circonferenza C!t centrata nel punto P! "1 / #t,0
( )
del piano complesso e di raggio 1 /!t, Figura 6.10b. Per queste frequenze naturali si ha !h = 1; per le frequenze naturali che si trovano all’interno della circonferenza C!t si ha rh( )e < 1 / !t , quindi !h < 1; infine, per le frequenze naturali che si trovano all’esterno della circonferenza C!t si ha !h > 1 / "t, quindi !h > 1.Abbiamo trovato un criterio estremamente semplice ed elegante per determinare le proprietà di stabilità della soluzione numerica del sistema (6.176) ottenuta attraverso il metodo di Eulero esplicito. Per un assegnato !t, le soluzioni numeriche per i modi con frequenze naturali all’interno della circonferenza C!t sono asintoticamente stabili, le soluzioni numeriche per i modi con frequenze naturali sulla circonferenza C!t sono stabili e le soluzioni numeriche per i modi con frequenze naturali esterne alla circonferenza C!t sono instabili. E’ evidente, allora, che il metodo di Eulero esplicito preserva la stabilità numerica dei modi instabili per ogni !t > 0. Questo metodo non è in grado di preservare la stabilità numerica dei modi stabili, Re
{ }
!h = 0 comunque si scelga !t > 0; può preservare la stabilità dei modi asintoticamente stabili, Re{ }
!h < 0,scegliendo il passo !t in modo tale che la circonferenza C!t li inglobi tutti al suo interno. Si osservi che per !t " 0 la circonferenza C!t tende a ricoprire l’intero semipiano Re
{ }
!h < 0.6.4.2 Metodo di Eulero implicito
Operando come nel § 6.3 otteniamo per la derivata di u t
( )
all’istante tkdu
dt t=tk+1 = u(k+1)! u( )k
"t + O "t
( )
. (6.206)Combinando le equazioni (6.176), (6.206) e ignorando i termini O !t
( )
2 otteniamo la formula di Eulero implicito per il sistema (6.176)u(k+1)
(
I! "tA)
# "tu( )k + "tbk+1. (6.207) Nel prossimo paragrafo è descritto un programma in MATLAB che implementa la formula (6.207). Osserviamo subito che a differenza del metodo di Eulero esplicito, nel metodo di Eulero implicito ad ogni passo temporale bisogna risolvere un sistema di equazioni lineari. Questa è indubbiamente una limitazione di questo metodo. Tuttavia, ilmetodo di Eulero implicito ha proprietà di stabilità numerica molto più interessanti di quelle del metodo di Eulero esplicito.
6.4.2.1 Il problema della stabilità numerica
Consideriamo, ora, il problema della stabilità numerica. Proseguendo come per il metodo di Eulero esplicito abbiamo per !u( )k l’equazione alle differenze
!"u(k+1) ="u( )k per k = 0,1,... (6.208) dove
! = I " #tA
( )
. (6.209)Utilizzando la (6.195) la matrice ! può essere così riscritta,
! = WA
(
I" #tDA)
WA"1. (6.210)Sostituendo la (6.210) nella (6.208) otteniamo
I ! "tD
(
A)
#y(k+1) =#y( )k (6.211)dove !y( )k è legato a !u( )k attraverso la (6.201). Come nell’analisi della stabilità del metodo di Eulero esplicito, le proprietà di stabilità della sequenza !u( )0,!u( )1,...
coincidono con quelle della sequenza !y( )0,!y( )1,..., e viceversa.
Dato che DA è una matrice diagonale, la (6.211) si riduce alla n equazioni alle differenze non accoppiate per i modi naturali,
!yh(k+1) ="h!yh( )k per h= 1,2,...,n . (6.212) dove in questo caso
!h = 1
1" #t$h . (6.213)
Si consideri, ora, il numero complesso
rh( )i =!h" 1
#t (6.214)
sul piano delle frequenze naturali !h del sistema di equazioni (6.176). Questo numero è la differenza tra la frequenza naturale !h e 1 /!t. Il vettore rh( )i si ottiene dalla differenza tra il vettore !h e il vettore 1 /!t: esso è uguale al vettore che ha l’origine coincidente
con la punta del vettore 1 /!t e la punta coincidente con la punta del vettore !i, Figura 6.11a. Per assegnato !t, le frequenze naturali !h per cui
rh( )i = !h + 1
"t = 1
"t (6.215)
appartengono alla circonferenza C!t( )i centrata nel punto P! 1 / "t,0
( )
del piano complesso e di raggio 1 /!t, Figura 6.11b. Pertanto, per le frequenze naturali che si trovano sulla circonferenza C!t( )i si ha !h = 1; per le frequenze naturali che si trovano all’interno della circonferenza C!t( )i si ha rh( )i < 1 / !t , quindi !h > 1; infine, per le frequenze naturali che si trovano all’esterno della circonferenza C!t si ha !i > 1 / "t, quindi !i < 1.Figura 6.11 Diagramma di stabilità per il metodo di Eulero implicito.
Abbiamo trovato un criterio analogo a quello enunciato per il metodo di Eulero implicito per determinare le proprietà di stabilità delle soluzioni numeriche. Per un assegnato !t, le soluzioni numeriche per i modi con frequenze naturali all’interno della circonferenza C!t sono instabili, le soluzioni numeriche per i modi con frequenze naturali sulla circonferenza C!t sono stabili e le soluzioni numeriche per i modi con frequenze naturali esterne alla circonferenza C!t sono asintoticamente stabili. E’
evidente, allora, che il metodo di Eulero implicito preserva la stabilità numerica dei modi asintoticamente stabili, Re
{ }
!i < 0, per ogni !t > 0; non è in grado di preservare la stabilità numerica dei modi stabili, Re{ }
!i = 0 comunque si scelga !t > 0; può preservare l’instabilità dei modi instabili, Re{ }
!i > 0, scegliendo il passo !t in modotale che la circonferenza C!t( )i li inglobi tutti al suo interno. Si osservi che per !t " 0 la circonferenza C!t tende a ricoprire l’intero semipiano Re
{ }
!i > 0. In conclusione, le proprietà di stabilità del metodo di Eulero implicito sono complementari a quelle del metodo di Eulero esplicito.6.4.3 Metodo di Crank-Nicolson
Operando come nel § 6.2.3 otteniamo per la derivata di u t
( )
all’istante tk dudt t=tk+1/2 = u(k+1) ! u( )k
"t + O "t
( )
2 (6.216)dove tk+1/2 = tk + !t / 2 . Dall’equazione (6.176) abbiamo che du
dt t=tk+1/2 = Au(k+1/2) + b(k+1/2). (6.217)
Operando come nel §6.2.3 possiamo esprimere il secondo termine della (6.217) in funzione di u(k+1) e u( )k ,
Au(k+1/2)+ b(k+1/2) = 1
2!"
(
Au(k+1) + b(k+1))
+ Au(
( )k + b( )k)
#$ + O %t( )
2 . (6.218)Combinando le equazioni (6.216)-(6.218) e ignorando i termini O !t
( )
2 otteniamo la formula di Crank-Nicolson per il sistema (6.176)I! "t 2 A
#$% &
'(u(k+1) ) I +"t 2 A
#$% &
'(u( )k +"t
2
(
bk + bk+1)
. (6.219)Nel prossimo paragrafo è descritto un programma in MATLAB che implementa la formula (6.219). Come nel metodo di Eulero implicito anche in questo caso bisogna ad ogni passo temporale risolvere un sistema di equazioni lineari. Anche il metodo di Crank-Nicolson è un metodo implicito.
6.4.3.1 Il problema della stabilità numerica
Consideriamo, ora, il problema della stabilità numerica. Proseguendo come per i metodi di Eulero abbiamo per !u( )k l’equazione alle differenze
!!"u(k+1) = !#"u( )k per k= 0,1,... (6.220) dove
!! = I " #t 2 A
$%& '
(), (6.221)
e
!! = I + "t 2 A
#$% &
'(. (6.222)
Utilizzando la (6.195) le matrici !! e !! possono essere così riscritte,
!! = WA I" #t 2 DA
$%& '
()WA"1, (6.223)
!! = WA I +"t 2 DA
#$% &
'(WA)1. (6.224)
Sostituendo le (6.223) e (6.224) nella (6.208) otteniamo I!"t
2 DA
#$% &
'( )y(k+1) = I +"t 2 DA
#$% &
'( )y( )k (6.225)
dove !y( )k è legato a !u( )k attraverso la (6.201). Come nell’analisi della stabilità dei metodi di Eulero, le proprietà di stabilità della sequenza !u( )0,!u( )1,... coincidono con quelle della sequenza !y( )0,!y( )1,..., e viceversa.
Dato che DA è una matrice diagonale, la (6.225) si riduce a n equazioni alle differenze non accoppiate per i modi naturali,
!yh(k+1) ="h!yh( )k per h= 1,2,...,n . (6.226) dove in questo caso
!h =1+ "t
2 #h
( )
A 1$ "t2 #h
( )
A . (6.227)Si considerino i numeri complessi
rh( )! ="h ! 2
#t (6.228)
e
rh( )+ =!h + 2
"t (6.229)
sul piano delle frequenze naturali !h del sistema di equazioni (6.176). Il numero rh( )! è la differenza tra la frequenza naturale !h e 2 /!t, invece il numero rh( )+ è la differenza tra la frequenza naturale !h e !2 / "t. Il vettore rh( )! si ottiene dalla differenza tra il vettore
!h e il vettore 2 /!t: esso è uguale al vettore che ha l’origine coincidente con la punta del vettore 2 /!t e la punta coincidente con la punta del vettore !i, Figura 6.12a. Il vettore rh( )+ si ottiene dalla differenza tra il vettore !h e il vettore !2 / "t: esso è uguale al vettore che ha l’origine coincidente con la punta del vettore !2 / "t e la punta coincidente con la punta del vettore !i, Figura 6.13a. Dalla Figura 6.12b è evidente che per ogni !t > 0
!k = rk+
rk" > 1 se Re
{ }
!n > 0, (6.230)!n = rn+
rn" = 1 se Re
{ }
!n = 0, (6.231)!m = rm+
rm" < 1 se Re
{ }
!m < 0. (6.232)Figura 6.12 Diagramma di stabilità per il metodo di Crank-Nicolson.
In conclusione, il metodo di Crank-Nicolson preserva naturalmente, indipendentemente dal valore di !t, le proprietà di stabilità dei modi instabili (6.230), dei modi stabili (6.231) e dei modi asintoticamente stabili (6.232).
Esempio 6.17
Risolviamo il circuito di Figura 6.9 con R1= R2 = 1!, C1 = 1mF , C2 = 1µF e e = 1V . Utilizzando il comando di MATLAB “ eig
( )
! ” calcoliamo le frequenze naturali delcircuito: sono entrambi reali e negative, !1= "1.001#106s"1, !2 = "0.999 #103s"1. Il circuito ha due costanti di tempo, !1 = 1 / "1 e !2 = 1 / "2 .
Il circuito in esame ha un regime stazionario. Per raggiungere il regime la durata della simulazione deve essere molto più grande della costante di tempo più grande, quindi almeno 10!2, ad esempio 10ms .
Se si risolve il problema con il metodo di Eulero esplicito il passo di discretizzazione deve verificare la condizione !t < 2"1. In questo caso abbiamo bisogno almeno di 5!2/!1 passi per raggiungere il regime stazionario garantendo la stabilità numerica. E’
evidente allora che il costo computazionale risulta essere direttamente proporzionale al rapporto tra la costante di tempo più grande e quella più piccola; nel caso in esame c’è bisogno almeno di 5000 iterazioni. In Figura 6.13 è riportato l’andamento della tensione
v1
( )
t ottenuta con il Programma 6.5 (descritto nel prossimo paragrafo).0 0,2 0,4 0,6 0,8 1
0 0,002 0,004 0,006 0,008 0,01
t (s) v
1(t) (V)
Figura 6.13
Il problema che abbiamo appena risolto è un esempio molto semplice di “problema stiff”. Un sistema di equazioni differenziali si dice “stiff” se la costante di tempo più grande (in modulo) è molto più grande della costante di tempo più piccola (sempre in modulo). Risolvere un problema “stiff“ con il metodo di Eulero esplicito può essere molto oneroso. Ad esempio, se non siamo interessati a conoscere la soluzione sulla scala dei tempi della costante di tempo più piccola !1, non possiamo scegliere un passo di discretizzazione molto più grande di !1, altrimenti sarebbe violata la condizione di stabilità numerica. Questa è la limitazione del metodo di Eulero implicito.
Risolviamo ora il circuito con il metodo di Eulero implicito, Programma 6.6. In questo caso l’algoritmo è numericamente stabile per qualsiasi valore di !t. Eseguiamo, ad esempio, il Programma 6.6 con N = 600 , quasi un decimo del numero di iterazioni necessario per la stabilità numerica del metodo di Eulero esplicito. La soluzione è praticamente indistinguibile da quella ottenuta con il metodo di Eulero esplicito sulla scala dei tempi di !2. Con N = 100 c’è una lieve differenza.
Risolviamo, ora, il circuito con il metodo di Crank-Nicolson, Programma 6.8. La soluzione che si ottiene con N= 60 è praticamente indistinguibile da quella ottenuta con N = 6000 applicando il metodo di Eulero esplicito. Ciò è dovuto a due fatti: il metodo di Crank-Nicolson è incondizionatamente numericamente stabile ed è del secondo ordine.
♦ Esercizio 6.11
Risolvere il circuito studiato nel Esempio 6.17 con i tre metodi alle differenze finite che abbiamo illustrato.
♦