Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
1 Introduzione
Le equazioni differenziali che consideriamo sono del tipo
L[u] = f (1)
dove u(x, y) : Ω → R è la funzione incognita definita sulla chiusura Ω di un
insieme Ω ⊂ R2 aperto e connesso, f (x, y) : Ω → R è una funzione nota e
sufficientemente regolare, L[u] è un operatore differenziale lineare definito da
∂2u ∂2u ∂2u ∂u ∂u
L[u] = A 2
+B +C 2 +D +E + F u, (x, y) ∈ Ω
∂x ∂x∂y ∂y ∂x ∂y
dove A, B, C, D, E, F, f : Ω → R sono funzioni assegnate sufficientemente re-
golari. Con l’espressione “u(x, y) è una funzione sufficientemente regolare” si
intende che la funzione u(x, y) con le sue derivate fino a un certo ordine siano
continue sul dominio di definizione. Nella maggior parte dei casi significativi ci
basta la continuità delle derivate fino al quarto ordine.
L’equazione (1) viene complementata con delle condizioni aggiuntive asse-
gnate sulla frontiera ∂Ω di Ω (dette condizioni al contorno) che verranno spe-
cificate caso per caso e differiscono tra loro a seconda della specificità del pro-
blema. Si assume inoltre che la frontiera ∂Ω sia sufficientemente regolare. Ad
esempio sia formata da una curva di Jordan definita da una applicazione conti-
nua γ(t) : [0, 1] → R2 , chiusa cioè tale che γ(0) = γ(1), e semplice cioè tale che
γ(t1 ) 6= γ(t2 ) per t1 6= t2 a parte il caso dei punti 0, 1. Nei problemi provenienti
dalle applicazioni la frontiera è differenziabile a tratti. Esempi classici sono do-
mini rettangolari, a forma di L, poligoni, domini circolari, ellittici. Ma nessuno
vieta di considerare domini con dei “buchi” come quello in Figura 1
1.1 Classificazione
Premettiamo il seguente lemma che motiva la terminologia usata per la classi-
ficazione delle equazioni differenziali.
Lemma 1 Dati A, B, C ∈ R, l’insieme {(x, y) ∈ R2 : Ax2 + Bxy + Cy 2 = 0}
è una ellisse, parabola o iperbole a seconda che B 2 − 4AC sia minore, uguale o
maggiore di zero.
1
Figura 1: Esempio di dominio Ω
1.2 Esempi
Alcuni esempi classici dalle applicazioni:
Problemi ellittici: Operatore di Laplace L[u] = ∆(u), dove
∂2 ∂2
∆(u) = u(x, y) + u(x, y)
∂x2 ∂y 2
Equazione di Laplace ∆(u) = 0, (x, y) ∈ Ω.
Equazione di Poisson ∆(u) = f (x, y), (x, y) ∈ Ω.
Condizioni al contorno di Dirichlet: u(x, y) = g(x, y), (x, y) ∈ ∂Ω, dove ∂Ω
indica la frontiera di Ω.
Condizioni al contorno di Neumann, dove la frontiera ∂Ω di Ω è costituita da
curve differenziabili a tratti:
∂
u(x, y) = g(x, y), (x, y) ∈ ∂Ω (derivata rispetto alla normale alla frontiera)
∂~n
Condizioni al contorno di Robin
∂
α u(x, y) + βu(x, y) = g(x, y), (x, y) ∈ ∂Ω
∂~n
Esempi di domini, Ω = (0, 1) × (0, 1), oppure Ω = {(x, y) : x2 + y 2 < 1}.
Modello fisico del problema di Poisson con condizioni al bordo di Dirichlet:
Ω: insieme racchiuso da una curva chiusa Γ nel piano; u(x, y) è la quota del
punto di coordinate (x, y) di una membrana elastica, in posizione di equilibrio
vincolata a passare per i punti (x, y, g(x, y)), (x, y) ∈ Γ = ∂Ω (filo chiuso nello
2
spazio con proiezione Γ sul piano (x, y)), e soggetta ad una forza f (x, y). Il
modello è valido per superfici “non troppo sghembe” [?].
Problema della bolla di sapone o di Plateau [?]: minimizzare l’area
s 2 2
Z Z
∂u ∂u
A= 1+ + dx dy
∂x ∂y
di una superficie (x, y, u(x, y)), (x, y) ∈ Ω vincolata su una curva chiusa sghemba
nello spazio (x, y, g(x, y)), (x, y) ∈ Γ, dove Γ è la curva chiusa di R2 che racchiude
il dominio Ω ⊂ R2 . L’equazione variazionale di Eulero-Lagrange la cui soluzione
è la u(x, y) che minimizza la superficie, è non lineare:
2 2
∂2u ∂u ∂u ∂u ∂ 2 u ∂2u ∂u
(1 + ) − 2 + (1 + )=0
∂x2 ∂y ∂x ∂y ∂x∂y ∂y 2 ∂x
∂ ∂2
γ u(x, t) − u(x, t) = 0, 0 < x < `, t ≥ 0
∂t ∂x2
dove γ > 0 e u : [0, `] × [0, +∞) → R, ` > 0. Condizioni aggiuntive:
u(x, 0) = g(x)
u(0, t) = a(t), u(`, t) = b(t)
3
t
0
0 l x
∂f ∂f 1 ∂2f
rs + + σ 2 s2 2 − rf = 0
∂s ∂t 2 ∂s
in cui f (s(t), t) è il prezzo al tempo t dello strumento finanziario, mentre s = s(t)
è il prezzo del “sottostante”, e r, σ sono parametri. Per maggiori dettagli si veda
https://en.wikipedia.org/wiki/Black%E2%80%93Scholes_model
Problemi iperbolici: Equazione delle onde
∂2 ∂2
u(x, t) − λ u(x, t) = 0, 0 < x < `, t > 0
∂t2 ∂x2
dove λ > 0. Condizioni aggiuntive:
u(x, 0) = g(x)
∂
u(x, t)|t=0 = v(x)
∂t
u(0, t) = 0, u(`, t) = 0
4
u(x,t)
0 x l
Figura 3: Corda vibrante: u(x, t) è l’ordinata del punto della corda di ascissa x
al tempo t
5
con condizioni iniziali u(x, 0) = g(x) con g(x) funzione assegnata. Il problema è
dominato dal trasporto se c >> D, mentre è dominato dalla diffusione se D >>
c. Il problema può essere trattato nel caso multidimensionale in cui la derivata
prima rispetto ad x è sostituita da una combinazione lineare delle derivate prime
rispetto a xi e la derivata seconda da una combinazione lineare delle derivate
seconde rispetto a xi . Per maggiori dettagli si rimanda alla pagina https:
//en.wikipedia.org/wiki/Convection%E2%80%93diffusion_equation
6
finita
n
X
vn (x) = αi ϕi (x).
i=1
7
Figura 4: Spline cubica a supporto compatto
rispetto agli αi sia nullo, o trattato con le tecniche gia viste nell’approssi-
mazione di funzioni, imponendo cioè l’ortogonalità, col prodotto scalare in
energia, del resto u − v allo spazio Vn generato dalle funzioni ϕi , conduce
ad un analogo sistema lineare finito con matrice di elementi hϕi , L[ϕj ]i.
Nella tecnica degli elementi finiti il dominio viene discretizzato suddividen-
dolo in elementi che possono essere segmenti di varia ampiezza, o, nel caso
bidimensionale, in triangoli, e imponendo che ciascuna ϕi sia non nulla
solo in pochi di questi elementi in modo che la matrice del sistema sia più
sparsa possibile. Un esempio di scelta delle ϕi (x) è costituito dalle fun-
zioni spline ottenute discretizzando l’intervallo in sotto-intervalli [xi , xi+1 ]
di ampiezza h e traslando, centrandola nei vari punti xi , la particolare
funzione spline cubica a supporto compatto definita da
1
3
6 (2 + t) , −2 < t ≤ −1
1 2 3
6 (4 − 6t − 3t ) −1 < t ≤ 0
1
s(x) = 6 (4 − 6t2 + 3t3 ) 0<t≤1 dove t = x/h.
1 3
− t)
6 (2 1<t<2
0 altrove
8
Listing 1: Script di Matlab per tracciare il grafico della funzione B-Spline
function [s,x]=bspline(n)
% function [s,x]=bspline(n)
% calcola e traccia il grafico della B-spline cubica
% n: numero di punti in cui viene discretizzato ciascuno dei
sottointervalli
% x: valori dei punti in cui la spline viene campionata
% s: valori della spline nei punti x
h = 1/(n+1);
x0 = [-3+h:h:-2];
x1 = x0+1;
x2 = x1+1;
x3 = x2+1;
x4 = x3+1;
x5 = x4+1;
x = [x0,x1,x2,x3,x4,x5];
s0 = x0*0;
s1 = (1/6)*(2+x1).^3;
s2 = (1/6)*(4-6*x2.^2-3*x2.^3);
s3 = (1/6)*(4-6*x3.^2+3*x3.^3);
s4 = (1/6)*(2-x4).^3;
s5 = 0*x5;
s = [s0,s1,s2,s3,s4,s5];
plot(x,s,’LineWidth’,3)
end
9
Figura 5: Copertina e Primo capitolo del libro “Istitutiones Calculi
Differentialis” di Leonardo Eulero pubblicato nel 1787.
base ϕi (x). Si impone che il residuo f − L[v] si annulli in alcuni punti spe-
ciali
Pn del dominio. Cioè si interpola la funzione f con funzioni del tipo
i=1 αi L[ϕi ]. Alla luce delle considerazioni fatte sulle costanti di Lebe-
sgue e sulla relazione che intercorre tra l’errore di interpolazione l’errore
di migliore approssimazione uniforme, nel caso si approssimi con polino-
mi è conveniente scegliere i nodi di collocazione in modo da contenere la
crescita delle corrispondenti costanti di Lebesgue. Ad esempio i nodi di
Chebyshev se il dominio è [−1, 1] sono una scelta adatta.
10
ed è unica. Infatti, integrando l’espressione u00 (x) = f (x) si ha
Z x
u0 (x) = f (t)dt + γ1
0
h4 (4)
f (x + h) + f (x − h) = 2f (x) + h2 f 00 (x) + (f (ξ) + f (4) (η))
24
da cui
1 1
f 00 (x) = (f (x − h) − 2f (x) + f (x + h)) + τ h2 , |τ | ≤ max |f (4) (x)|. (5)
h2 12 x∈[a,b]
11
ed è detta differenza in avanti. Similmente l’espressione
1 1 ˆ ξˆ ∈ (x − h, x)
f 0 (x) = (f (x) − f (x − h)) − hf 00 (ξ),
h 2
ottenuta prendendo −h al posto di h è detta differenza all’indietro. Approssi-
mazioni più precise si possono ottenere se f (x) ha maggior regolarità svolgendo
sviluppi in serie di ordine più elevato.
12
per la quale useremo lo stesso simbolo Ln . Per questo possiamo usare la
notazione Ln u per denotare Ln (u).
Il vettore di componenti L[u]|x=xi − (Ln (u))i = h2 τi è detto errore locale di
dicretizzazione.
In generale, l’approssimazione alle differenze Ln (u) che discretizza l’opera-
tore differenziale L[u] si dice consistente di ordine hp se esiste una costante
γ > 0, indipendente da n, tale che maxi |L[u]|x=xi − (Ln (u))i | ≤ γhp per ogni
n > 1. Per questa definizione l’approssimazione (10) dell’operatore L[u] = u00 è
consistente di ordine h2 .
L’equazione differenziale (3) con condizioni al contorno di Dirichlet, ristretta
ai valori ui = u(xi ) si può allora riscrivere come
u1
f1
τ1
a
2 −1
.. .. u2 f2 τ2 0
1 −1 . . ..
..
2 ..
1
..
− 2 = −h − 2
. . . .
h .. .. h
. .
−1 un−1
fn−1 τn−1 0
−1 2 un fn τn b
13
Per valutare l’accuratezza dell’approssimazione v = (vi ) ottenuta risolvendo
il sistema (13) al posto del sistema (12) che ci fornirebbe la soluzione esatta va-
(n)
lutata nei punti della discetizzazione, si introduce l’errore globale (n) = (i ) ∈
Rn , definito da (n) = v − u.
Ci interessa dimostrare che per n → ∞ la successione k(n) k∞ converge a
zero. In questo modo, scegliendo valori di n arbitrariamente grandi, possiamo
meglio approssimare i valori di u(x) in un insieme di punti sempre più fitti e in
modo sempre più accurato.
Sottraendo la (12) dalla (13) si ha
τ1
2 −1 1
.. 2 τ2
1 −1 2 . ..
2
.. .
− 2 . = h
.
h .. ..
. . −1 τn−1
n−1
−1 2 n τn
cioè
An (n) = h2 τ (n) . (14)
Quindi una espressione esplicita dell’errore globale è data da
(n) = h2 A−1
n τ
(n)
.
14
4.3 Analisi in norma 2
Per il problema modello è abbastanza facile fare una analisi della convergenza
in norma 2. Nel seguito indichiamo con tridn (a, b, c) la matrice tridiagona-
le n × n con elementi uguali a b sulla diagonale principale, uguali a c sulla
sopra-diagonale e uguali ad a sulla sotto-diagonale. Useremo la stessa nota-
zione tridn (A, B, C) per denotare la matrice tridiagonale a blocchi con blocchi
A, B, C di dimensione m × m. Nel caso in cui gli elementi (o i blocchi) lungo le
diagonali non fossero costanti useremo la notazione tridn (ai , bi , ci ) per denotare
che la matrice tridiagonale ha sulla i-esima riga gli elementi ai , bi e ci dove
bi è l’elemento diagonale, ci è elemento sopra-diagonale mentre bi è l’elemento
sotto-diagonale. Similmente definiamo trid(Ai , Bi , Ci ). Indichiamo inoltre con
diagn (d1 , . . . , dn ) o più semplicemente con diag(d1 , . . . , dn ) la matrice diagonale
con elementi diagonali d1 , . . . , dn .
Si ricordano i seguenti risultati che si possono dimostrare utilizzando un pò
di trigonometria
Teorema 5 Vale Sn tridn (1, 0, 1)Sn = diag(2c1 , . . . , 2cn ), dove ci = cos(iπ/(n+
1)),
q e dove Sn = (si,j ) è la matrice ortogonale simmetrica di elementi si,j =
2 π
n+1 sin(ij n+1 ).
(n)T
Inoltre vale RnT (tridn (1, 0, 1) + en en )Rn = diag(2ĉ1 , . . . , 2ĉn ), dove ĉi =
π
cos((2i − 1) 2n+1 ), e dove Rn = (ri,j ) è una matrice ortogonale di elementi
q
4 π (n)T
ri,j = 2n+1 sin(i(2j − 1) 2n+1 ). Infine la matrice tridn (1, 0, 1) + e1 e1 ha gli
(n)T
stessi autovalori di tridn (1, 0, 1) + en en in quanto le due matrici sono simili.
Dim. Cerchiamo autovettori del tipo v = (vi ), vi = sin(iθ) per un opportuno θ.
Posto w = tridn (1, 0, 1)v, si ha w1 = sin(2θ) = 2 cos θ sin θ = (2 cos θ)v1 , mentre
wi = sin((i−1)θ)+sin((i+1)θ) = 2 cos θ sin(iθ) = (2 cos θ)vi , per i = 2, . . . , n−1.
Infine wn = sin((n − 1)θ) = sin(nθ) cos θ − cos(nθ) sin θ. Per cui v è autovettore
corrispondente a λ = 2 cos θ se anche per wn vale wn = (2 cos θ)vn . Imponendo
quest’ultima condizione si ha cos(nθ) sin θ + cos θ sin(nθ) = 0 che è verificata
se e solo se sin((n + 1)θ) = 0 cioè se e solo se θ = πj/(n + 1) con j intero.
Quindi λj = 2 cos(πj/(n + 1)) è autovalore per j = 1, . . . , n corrispondente
(j)
all’autovettore
p v (j) di componenti vi = sin(πij/(n + 1)), j = 1, . . . , n. Il
fattore 2/(n + 1) rende gli autovettori di norma euclidea unitaria.
(n)T
Analogamente si procede per la matrice tridn (1, 0, 1) + en en . In que-
sto caso cambia solo la condizione su wn che diventa sin((n − 1)θ) + sin(nθ) =
2 cos θ sin(nθ), cioè sin(nθ) cos θ −sin θ cos(nθ)+sin(nθ) = 2 cos θ sin(nθ) e quin-
di sin(nθ) = cos θ sin(nθ) + sin θ cos(nθ). Quest’ultima espressione può essere
equivalentemente scritta come sin(nθ) = sin((n + 1)θ). Poichè sin α = sin β se
α + β è multiplo dispari di π, si ottiene θ = (2k − 1)π/(2n + 1).
Segue che per la matrice tridiagonale tridn (−1, 2, −1) vale la relazione
iπ
S tridn (−1, 2, −1) S = diag(2 − 2c1 , . . . , 2 − 2cn ), ci = cos
n+1
15
Da questa proprietà segue che
π
kA−1 2 2
n k2 = h / min(2 − 2ci ) = h /(2 − 2 cos ).
i n+1
Tenendo presente che 1 − cos x = x2 /2 + O(x4 ) si ha
kA−1 2 2
n k2 = 1/π + O(h ).
Cioè kA−1
n k è limitata superiormente da una costante indipendente da n. Più
precisamente, arrestando lo sviluppo di cos x al quarto termine si ha 1 − cos x =
1 4
x2 /2 − 24 x cos ξ con 0 < ξ < x, e poiché 1 > cos x, ne segue
x2 x2
1 − cos x ≥ (1 − ).
2 12
Per cui, posto x = πh, vale anche
h2 1 h2 1 1 1 1 1
kA−1
n k2 = ≤ x2 x2
= ≤ 2 + h2 ,
2 1 − cos x 2 2 (1 − 12 )
π 2 1 − x122 π 6
1
dove per l’ultima maggiorazione si è usata la disuguaglianza 1−t ≤ 1 + 2t valida
se t ≤ 1/2.
Introduciamo ora la norma
n
1 X 1
kuk = √ ( u2i )1/2 = √ kuk2 ,
n + 1 i=1 n+1
e osserviamo che la norma matriciale indotta da questa norma coincide con la
norma 2. Inoltre è facile verificare che
Z 1
lim kuk = ( u(x)2 dx)1/2
n→∞ 0
1
Pn 2
R1
essendo n+1 i=1 ui l’approssimazione di 0 u(x)2 dx mediante la formula dei
rettangoli.
Dalla (9) segue che
√
n 1 1 1
kτ (n) k ≤ √ max |u(4) (x)| < max |u(4) (x)| = max |f 00 (x)|.
n + 1 12 12 12
Si ottiene allora da (15)
1 2
k(n) k < h max |f 00 (x)| + O(h4 ).
12π 2 x∈[0,1]
Cioè l’errore globale valutato nella norma k · k converge a zero come h2 . Questo
(n)
non implica che k√ k∞ converge a zero come h2 . Poiché vale kuk∞ ≤ kuk2 ,
si ha che kuk∞ ≤ n + 1kuk, quindi
1 3
k(n) k∞ < 2
h 2 max |f 00 (x)| + O(h4 ).
12π x∈[0,1]
16
4.4 Analisi in norma ∞
Per valutare la convergenza dello schema alle differenze in norma infinito è
sufficiente valutare la norma infinito della matrice A−1
n . Mostriamo due ana-
lisi diverse ma equivalenti: un’analisi puramente matriciale e una basata sulla
proprietà del massimo.
Osserviamo innanzitutto che la matrice −An può essere scritta come
2 1
−An = (I − Bn ), Bn = tridn (1, 0, 1).
h2 2
Ed essendo gli autovalori di tridn (1, 0, 1) compresi
P∞ tra i 0 e 2, la matrice Bn
ha raggioP spettrale ρ(B) < 1 per cui la serie i=0 B è convergente e vale
∞
−A−1n = i=0 Bn ≥ 0, dove la nonnegatività segue dal fatto che Bn ≥ 0. In
effetti, usando l’irriducibilità di Bn si può dimostrare che −A−1n > 0. Questa
proprietà discende anche dal fatto che la potenza k-esima di tridn (1, 0, 1) ha uni
sulla k-esima sopra e sotto diagonale per k = 1, 2, . . . , n − 1.
La non negatività di −A−1 n è fondamentale per dimostrare la stabilità del
metodo delle differenze finite.
17
essendo le componenti dei tre prodotti date rispettivamente da
1
(1 − 2 + 1) = 0
h2
1
((i − 1) − 2i + (i + 1)) = 0
h
1
[(i − 1)2 − 2i2 + (i + 1)2 ] = 1.
2
Si osservi che la proprietà (17) discende anche dal fatto che l’errore locale di
discretizzazione h2 τi è proporzionale alla derivata quarta della funzione calco-
lata in un opportuno punto ξi , essendo la derivata quarta di ciascuna delle tre
funzioni 1, x, 12 x2 nulla.
Ora denotiamo i tre vettori di Rn costituiti dalla “parte interna” dei tre
vettori f 1 , f 2 , f 3 in (16) con
e = (1, 1, . . . , 1)T ,
p = h(1, 2, 3, . . . , n)T , (18)
1
s = h2 (1, 4, 9, . . . , n2 )T ,
2
e denotiamo en = (0, . . . , 0, 1)T , e1 = (1, T
10, . . . , 0) , il1 primo
e l’ultimo vettore
n
della base canonica di R . Poiché Ln = h2 e1 | An | h2 en , dalla (17) si deduce
che
An e = −(n + 1)2 (e1 + en ),
An p = −(n + 1)2 en , (19)
1
An s = e − (n + 1)2 en ,
2
che dà An s = e + 12 An p. Da cui, moltiplicando per A−1
n si ricava
1
A−1
n e = s − p.
2
Dunque si ha
1 1
kA−1 −1
n k∞ = kAn ek∞ = max |(hi)2 − hi| ≤ (20)
2 i=1:n 8
dove l’uguaglianza vale se n è dispari per i = (n + 1)/2. Da cui si deduce che
1
kA−1
n k∞ ≤ .
8
Per la norma infinito dell’errore globale risulta allora dalla (15) che
1 2 (n) 1 2
k(n) k∞ ≤ h kτ k∞ ≤ h max |u(4) (x)|.
8 96 0≤x≤1
18
Osservazione 6 In questo approccio sono stati cruciali due proprietà: la pri-
ma è che −A−1 n ≥ 0 per cui kA−1 −1
n k∞ = kAn ek∞ ; la seconda è che An e
−1
−A−1 2
n (e1 + en ) = h e. (21)
Un approccio similare per dare limitazioni a k(n) k∞ può essere svolto me-
diante la proprietà del massimo. Lo vediamo nel prossimo paragrafo.
Dim. Sia Ln (v) ≥ 0 e si supponga per assurdo che vk sia il massimo dei vi
e sia vk > v0 , vn+1 . Allora dalla condizione Ln (v) ≥ 0 si ha
inoltre essendo vk ≥ vk−1 , vk+1 risulta vk ≥ 12 (vk−1 + vk+1 ) per cui dalla (22)
segue che vk = 12 (vk−1 + vk+1 ) e quindi vk = vk−1 = vk+1 . Ne segue che anche
vk+1 e vk−1 sono massimi. Ripetendo il ragionamento per vk−1 e per vk+1 si
conclude che vi = v0 = vn+1 per ogni i, che è assurdo. Analogamente si tratta
il caso in cui Ln (v) ≤ 0.
19
Basandoci sulla proprietà del massimo discreto soddisfatta da Ln dimostria-
mo ora la convergenza e la stabilità del metodo delle differenze finite per il
problema modello. Successivamente diamo il risultato in forma più generale.
(n)
Ricordiamo che l’errore globale (n) = (i )i=1:n è tale che An (n) = h2 τ (n) .
(n) (n) (n)
(n) = (b
Inoltre, definendo b i )i=0:n+1 , dove b
i = i per i = 1, . . . , n, e
(n) (n) (n)
0 = n+1 = 0, risulta An (n) = Ln (b
b ).
(n)
Teorema 9 Per l’errore globale (n) = (i )i=1:n vale
1 2 (n)
k(n) k∞ ≤ h kτ k∞
2
Dim. Si è già osservato che la funzione w(x) = 21 x2 è tale che L[w] = 1 e
che questa proprietà è condivisa dalla controparte discreta w = (wi )i=0:n+1 ,
(n) ) =
wi = w(xi ) = 12 (hi)2 . Si vede allora allora che, poiché per la (14) è Ln (b
An ((n) ) = h2 τ (n) , si ha
(n) + h2 kτ (n) k∞ w,
Quindi, per la proprietà del massimo applicata ai vettori ±b
risulta
(n) 1 2 (n)
max(±i + h2 kτ (n) k∞ wi ) ≤ h2 kτ (n) k∞ max(w0 , wn+1 ) = h kτ k∞
i 2
da cui
(n) (n) 1 2 (n)
±i ≤ ±i + h2 kτ (n) k∞ wi ≤ h kτ k∞ , i = 1, . . . , n.
2
(n)
quindi |i | ≤ 21 kτ (n) k∞ h2 .
−ak bk ck bk ck
vk ≤ ( vk−1 + vk+1 ) ≤ vk−1 + vk+1 ,
bk + ck −ak −ak bk + ck bk + ck
20
cioè vk è minore o uguale alla media pesata tra vk−1 e vk+1 con pesi bkb+c k
k
e
ck
bk +ck . D’altra parte, poiché v k è massimo, risulta v k ≥ v , v
k−1 k+1 e quindi v k
è maggiore o uguale alla media pesata di vk+1 e vk−1 , quindi deve essere vk
uguale a vk−1 e a vk+1 per cui induttivamente anche i valori estremi sarebbero
un massimo.
21
a = sparse(eye(n));
d = sparse(ones(n-1,1));
b = diag(d,1);
c = diag(d,-1);
22
Listing 2: Risoluzione del problema modello con condizioni di Dirichlet mediante
differenze finite. Per risolvere il sistema la function usa il risolutore di Matlab
ottenuto col comando backslash \
function [v, x] = problema_modello1(f,alfa,beta)
% function [v, x] = problema_modello1(f,alfa,beta)
% risolve l’equazione differenziale
% u’’(x)=f(x) su [0,1], con u(0)=alfa, u(1)=beta
% col metodo delle differenze finite
% Input: f e’ il vettore dei valori del termine noto nei punti x(i)=i*h
% alfa e beta sono le condizioni al bordo
% Output: v e’ l’approssimazione della soluzione ottenuta
% x e’ il vettore con i punti del reticolo di discretizzazione
% usa il risolutore di Matlab
n = length(f);
h = 1/(n+1);
d = sparse(ones(n-1,1));
A = speye(n);
A = diag(d,1)+diag(d,-1)-2*A;
f(1) = f(1)-alfa/h^2;
f(n) = f(n)-beta/h^2;
v = h^2*(A\f);
x = [0:h:1]’;
v = [alfa; v; beta];
end
23
Figura 6: Soluzione del problema modello con f (x) = 1
24
Listing 3: Risoluzione del problema modello con condizioni di Dirichlet mediante
differenze finite. Per risolvere il sistema la function usa l’eliminazione gaussiana
function [v, x] = problema_modello2(f,alfa,beta)
% function [v, x] = problema_modello1(f,alfa,beta)
% risolve l’equazione differenziale
% u’’(x)=f(x) su [0,1], con u(0)=alfa, u(1)=beta
% col metodo delle differenze finite
% Input: f e’ il vettore dei valori del termine noto nei punti x(i)=i*h
% alfa e beta sono le condizioni al bordo
% Output: v e’ l’approssimazione della soluzione ottenuta
% x e’ il vettore con i punti del reticolo di discretizzazione
% usa l’eliminazione gaussiana per risolvere il sistema tridiagonale
n = length(f);
h = 1/(n+1);
a = 2*ones(n,1);
f(1) = f(1)-alfa/h^2;
f(n) = f(n)-beta/h^2;
for i=1:n-1
a(i+1) = 2-1/a(i);
f(i+1) = f(i+1)+f(i)/a(i);
end
v = zeros(n,1);
v(n) = f(n)/a(n);
for i=n-1:-1:1
v(i) = (f(i)+v(i+1))/a(i);
end
v = -v*h^2;
x = [0:h:1]’;
v = [alfa; v; beta];
end
25
si ottengono i valori
n = 100
Elapsed time is 0.000401 seconds.
n = 1000
Elapsed time is 0.000487 seconds.
n = 10000
Elapsed time is 0.001696 seconds.
n = 100000
Elapsed time is 0.016155 seconds.
n = 1000000
Elapsed time is 0.114713 seconds.
n = 10000000
Elapsed time is 1.007154 seconds.
Si può osservare che la crescita del tempo di calcolo è lineare con n. In-
fatti moltiplicando per 10 la dimensione, il tempo di calcolo viene moltiplicato
all’incirca per 10.
Un’altra sperimentazione interessante è verificare che l’errore di approssima-
zione decresce come h2 se f (x) è di classe C 2 come mostrato nella teoria. Per
questo consideriamo un problema la cui soluzione è nota. Ad esempio sceglia-
mo u(x) = sin2 (πx) per cui u(0) = u(1) = 0 e u00 (x) = 2π 2 (1 − 2 sin(πx)2 ).
Scegliamo allora
x = [h:h:1-h]’;
f = 2*pi^2*(1-2*sin(pi*x).^2);
e valutiamo gli errori, rispetto alla soluzione nota u(x) = sin2 (πx), della soluzio-
ne v ottenuta applicando la function problema modello1. Questa valutazione
26
Listing 4: Risoluzione del problema modello con condizioni di Dirichlet mediante
differenze finite. Controllo degli errori.
function [err1,err2] = check_error(n)
% function [err1,err2] = check_error(n)
% calcola gli errori err1, err2 in norma infinito e in norma 2
% della soluzione ottenuta col metodo delle differenze finite
% applicato all’equazione differenziale
% u’’(x)=f su [0,1], con u(0)=0, u(1)=0
% usando una discretizzazione con n punti interni
% con f=2*pi^2*(1-2*sin(pi*x).^2) la soluzione e’ u(x)=sin(pi*x)
h = 1/(n+1);
x = [h:h:1-h]’;
f = 2*pi^2*(1-2*sin(pi*x).^2);
u = sin(pi*x).^2;
v = problema_modello1(f,0,0);
err1 = norm(v(2:end-1)-u,inf);
err2 = norm(v(2:end-1)-u,2)/sqrt(n+1);
end
√
n k(n) k∞ k(n) k2 / n + 1
100 3.2e-4 2.0e-4
1000 3.3e-6 2.0e-6
10000 3.3e-8 2.0e-8
100000 1.8e-10 1.0e-10
1000000 5.5e-7 3.7 e-7
10000000 1.7e-6 1.1 e-6
viene svolta dalla function check error, riportata nel Listing 4, che valuta sia
l’errore in norma 2 che in norma infinito.
Lanciando questa funzione con diversi valori di n si hanno i risultati riportati
nella tabella 1
Si osserva che moltiplicando n per 10 l’errore sia in norma 2 che in norma
infinito si riduce all’incirca di un fattore 100 finché n non supera il valore di
10000. Per valori maggiori di n l’approssimazione sembra deteriorarsi. Il mo-
tivo di questo fatto è dovuto al numero di condizionamento della matrice del
sistema che in norma 2 vale λmax /λmin dove λmax e λmin sono rispettivamente
il massimo e il minimo autovalore di tridn (−1, 2, −1). Per il teorema 5 il rap-
porto λmax /λmin vale (2 + 2 cos(π/(n + 1))/(2 − 2 cos(π/(n + 1)) che è all’incirca
(4/π 2 )(n + 1)2 . Quindi al crescere di n aumenta il numero di condizionamen-
to della matrice e questo comporta amplificazione degli errori. Non possiamo
27
quindi spingere troppo avanti il valore di n.
Un’altra considerazione è la seguente: la limitazione superiore data all’erro-
re globale in norma infinito è h2 max |u(4) (x)|/96 che nel nostro caso, essendo
|u(4) (x)| ≤ 8π 4 fornisce la limitazione k(n) k∞ ≤ 8.12h2 in linea con i valori
riportati in tabella.
È interessante vedere cosa succede nel caso in cui la funzione f (x) non sia
sufficientemente regolare in modo che la soluzione u(x) non sia di classe C 4 .
Possiamo per questa sperimentazione prendere una funzione f (x) discontinua,
ad esempio la funzione che vale 1 nella prima metà dell’intervallo e vale zero
nella seconda e confrontare le approssimazioni ottenute con vari valori di n. Si
può verificare che la soluzione in questo caso è data da
( 1 2 3 1
2 x − 8 x per x ∈ [0, 2 ]
u(x) =
1
8 (x − 1) per x ∈ [ 21 , 1].
n1=1000-1; n2=10000-1;
h = 1/(n1+1); % risolvo a dimensione n1
x = [h:h:1-h]’; f = x*0; f(1:(n1+1)/2) = 1;
v1 = problema_modello1(f,0,0); v1 = v1(2:end-1);
u1 = v1;
u1(1:(n1+1)/2) = 0.5*x(1:(n1+1)/2).^2-(3/8)*x(1:(n1+1)/2);
u1((n1+1)/2+1:end)=(-1/8)*(1-x((n1+1)/2+1:end));
h = 1/(n2+1); % risolvo a dimensione n2
x = [h:h:1-h]’;
f = x*0; f(1:(n2+1)/2) = 1;
v2 = problema_modello1(f,0,0); v2 = v2(2:end-1);
u2 = v2;
u2(1:(n2+1)/2) = 0.5*x(1:(n2+1)/2).^2-(3/8)*x(1:(n2+1)/2);
u2((n2+1)/2+1:end)=(-1/8)*(1-x((n2+1)/2+1:end));
e1 = u1-v1; e2 =u2-v2;
fprintf(’n = %d, err_inf = %e, err_2 = %e \n’,n1+1, ...
norm(e1,inf), norm(e1,2)/sqrt(n1+1));
fprintf(’n = %d, err_inf = %e, err_2 = %e \n’,n2+1, ...
norm(e2,inf), norm(e2,2)/sqrt(n2+1));
plot(x,u2); figure; plot(x,e2)
28
Figura 8: Soluzione calcolata del problema u00 (x) = f (x) con f (x) discontinua
Figura 9: Errore globale nella risoluzione del problema u00 (x) = f (x) con f (x)
discontinua
29
dove |σ0 |, |σn+1 | ≤ 1
6 max |u000 (x)|. Affiancando le precedenti equazioni alla
condizione
1
(ui−1 − 2ui + ui+1 ) = fi + h2 τi , i = 0, . . . , n + 1,
h2
si ottiene il sistema
h/2 0 −h/2 u−1 a σ0
−1 2 −1 u0 f0 τ0
1 . .. ..
..
..
..
− 2 . = − h2
h . . .
. . .
−1 2 −1 un+1 fn+1 τn+1
h/2 0 −h/2 un+2 b σn+1
Si osservi che nel termine noto compare oltre all’errore locale di discretizzazione
di L, anche l’errore locale dovuto alla discretizzazione delle condizioni al con-
torno di Neumann. Semplifichiamo il sistema precedente effettuando una com-
binazione lineare di righe. Più precisamente, moltiplicando la prima equazione
per 2/h, addizionando con la seconda e dividendo per 2, si ottiene
1 1 1
2
(−u0 + u1 ) = f0 + a/h − h2 τ0 − hσ0
h 2 2
e analogamente moltiplicando l’ultima equazione per −2/h, addizionando con
la penultima e dividendo per 2, si ottiene
1 1 1
(−un+1 + un ) = fn+1 + b/h − h2 τn+1 + hσn+1
h2 2 2
La versione discreta del problema di Neumann diventa allora
1 −1 u0
1
2 f0 + a/h
−1 2 . . . u1 f1
1 .
.
− 2 .. .. .. . = .. − h2 τ (n)
h . . . .
un fn
−1 2 −1
1
−1 1 u n+1 f
2 n+1 − b/h
σ0 + h τ20
0
− h
.
..
0
τn+1
−σn+1 + h 2
(n) (n)
dove τ (n) = (τ0 , . . . , τn+1 )T . Stavolta nel termine di errore compare, oltre
all’errore locale di discretizzazione dell’operatore L[u] anche l’errore dovuto alla
discretizzazione della condizione di Neumann.
Si osservi che la matrice del sistema è singolare. Infatti il vettore e di tutte
componenti uguali a 1 sta nel nucleo della matrice. La cosa non sorprende poiché
30
il problema differenziale, se ha una soluzione, ne ha infinite; infatti le soluzioni
differiscono per una costante additiva, cosı̀ come accade per il problema discreto.
Supponiamo esista una soluzione e fissiamo la costante additiva imponendo
che il valore di u(x) sia assegnato in un estremo. Possiamo quindi ignorare una
delle due condizioni di Neumann visto che che dipende linearmente dalle altre
equazioni. Se imponiamo la condizione u(0) = c e rimuoviamo la condizione di
Neumann nell’estremo destro otteniamo il sistema
−1 1 a 1
2 f0 + h + h2 c
2 −1 u1 1
f1 − h2 c
.
1 . . .
. = f
− 2 −1 2 . 2
h
. .
un .
.
.. . . −1 .
un+1
−1 2 −1 fn
τ1 −σ0 − hτ0 /2
2
h τ2
0
− .. + h
..
2 .
.
τn+1 0
Tn v = b (24)
Si osservi ancora che lo schema alle differenze finite (24) è esplicito cioè la matrice
del sistema è in forma triangolare per cui i valori vi possono essere espressi in
forma esplicita in funzione dei valori vj per j < i.
Per dimostrare la stabilità di questo schema basta dimostrare che kTn−1 k∞
è limitata superiormente da una costante. Posto
0
1 0
Z=
. .. . ..
O 1 0
31
1 1
si osserva che Tn = h2 (I − 2Z + Z 2 ) = h2 (I − Z)2 . Per cui
2
1
1 1
Tn−1 = h2 (I − Z)−2 = h2
.. . . . .
. . .
1 ... 1 1
cioè
1
2 1
Tn−1 2
=h
3 2 1
(25)
.. .. .. ..
. . . .
n+1 n ... 2 1
per cui
1 (n + 2)(n + 1) n+2
kTn−1 k∞ = h2 (1 + 2 + · · · + (n + 1)) = 2
≤ < 1,
(n + 1) 2 2(n + 1)
inoltre (n) = 12 h2 Tn−1 τ (n) + hTn−1 (σ0 − hτ0 /2)e1 . Quindi, poiché
σ0 x1
0 x2
Tn−1 h . = h2 (σ0 − hτ0 /2) . , xi = ih,
. . . .
0 xn+1
l’errore globale rimane di ordine O(h2 ).
32
Quindi la relazione tra errore globale ed errore locale diventa
1
− Kn (n) = h(σ0 − hτ0 /2)e1 + h2 τ (n)
h2
da cui
1 1
(n) = (− 2
Kn )−1 h(σ0 − hτ0 /2)e1 + (− 2 Kn )−1 h2 τ (n) (26)
h h
dove abbiamo indicato con e1 = (1, 0, . . . , 0)T il primo versore della base ca-
nonica di Rn+1 . Per i teoremi di Gerschgorin la matrice Kn è non singolare,
inoltre per il teorema 5 l’autovalore più piccolo di h12 Kn è limitato inferiormen-
te da una costante indipendente da n per cui la norma k( h12 Kn )−1 k2 è limitata
superiormente da una costante. Questo dimostra la stabilità in norma 2.
Per la stabilità in norma infinito si possono seguire diversi approcci.
An e = −(n + 1)2 en
An p = (n + 1)e1 − (n + 1)2 en (27)
1 1
An s = e − e1 − ( (n + 1)2 − 1)en
2 2
Da queste espressioni si ricava
1 1 1 1
An s = e + (1 + )An e − An p.
2 n+1 2n+1
Moltiplicando per A−1 −1
n si ottiene un’espressione di y = An e e si verifica che il
massimo di y è preso sulla prima componente e vale y1 = 12 + h2 .
Si deduce quindi che kA−1 1 h
n k∞ = 2 + 2 . Quindi la parte di errore dovuta alla
discretizzazione della derivata seconda è un O(h2 ). La componente di errore
dovuta alla discretizzazione della derivata prima è hσ0 kA−1 n e1 k∞ = hσ0 khp −
hek∞ che è ancora un O(h2 ).
Una analisi analoga ma forse più semplice può essere fatta sostituendo al
2
vettore p il vettore p s = h2 ((n +
e = h(n + 1, n, . . . , 1) e al vettore s il vettore e
e = − h1 e1 , An e
1)2 , n2 , . . . , 1). Infatti, essendo An p s = e − (n + 23 )e1 si ricava
−1 3 h2
An e = e s − (n + 2 )he p che ha elementi 2 (n + 1 − i)2 − (n + 23 )h2 (n + 1 − i).
La componente più grande in valore assoluto si ottiene per i = 0 e vale 12 + h2 .
Da cui si ricava kA−1 −1
n k∞ = kAn ek∞ = 2 + 2 .
1 h
33
Osservazione 14 Anche in questo caso si può vedere che una perturbazione
dell’ordine di δ nell’ultima componente del termine noto produce una variazione
dell’ordine di δh2 nelle componenti della soluzione del sistema lineare. Infatti
dalla prima delle (27) si ricava che A−1 2
n en = −h e. Inoltre una perturbazione
dell’ordine di δ nella prima componente del termine noto produce una variazione
della soluzione dell’ordine di δh. Infatti dalla seconda delle (27) si ha A−1
n e1 =
hp + (n + 1)2 A−1n e n = h(p + e).
Per cui Kn−1 = L−T L−1 , L−1 è la matrice triangolare inferiore con tutti elementi
uguali a 1, quindi kL−1 k∞ = kL−T k∞ = n + 1. Si deduce allora che
1
k( Kn )−1 k∞ ≤ h2 kL−1 k∞ kL−T k∞ = 1.
h2
Inoltre, per quanto riguarda la parte di errore globale dato dalla condizione di
Neuman, si ha
1 n+1
1 1 n
( 2 Kn )−1 hσ0 e1 = h3 σ0 L−T L−1 e1 = h3 σ0 L−T . = h3 σ0
..
h ..
.
1 1
Da cui
1
k( Kn )−1 )hσ0 e1 k = h3 |σ0 |(n + 1) = h2 |σ0 |.
h2
A = B + UV T
S = Im + V T B −1 U
34
è non singolare e vale la formula di Sherman-Woodbury-Morrison per l’inversa
di A
A−1 = B −1 − B −1 U S −1 V T B −1 .
Per una analisi in norma infinito si usa l’espressione di Kn−1 in termini del-
l’inversa di H = tridn+1 (−1, 2 − 1) data dalla formula di Sherman-Woodbury-
Morrison (SWM). Infatti, poiché Kn = H − e1 eT1 , si ha
1
Kn−1 = H −1 + H −1 e1 eT1 H −1 . (28)
1 − eT1 H −1 e1
Ora esaminiamo separatamente le due quantità (− h12 Kn )−1 hσ0 e1 e (− h12 Kn )−1 h2 τ (n)
che compongono l’errore globale (n) in (26).
Per la prima, usando la formula di SWM (28), si ha
1 eT1 H −1 e1
(− Kn )−1 hσ0 e1 = − h3 σ0 Kn−1 e1 = −h3 σ0 (1 + )H −1 e1
h2 1 − eT1 H −1 e1
1
= − h3 σ0 T
H −1 e1 .
1 − e1 H e1 H −1 e1
−1
Essendo
1
H −1 e1 = (n + 1, n, . . . , 2, 1)T , (29)
n+2
risulta
n+1
eT1 H −1 e1 = , (30)
n+2
da cui (− h12 Kn )−1 hσ0 H −1 e1 = −h3 σ0 (n + 2)H −1 e1 = −h2 σ0 n+1
n+2
e1 , cioè
1 n+2
k(− 2
Kn )−1 hσ0 e1 k∞ ≤ |σ0 |h2 .
h n+1
Per quanto riguarda la seconda quantità vale
1 1
k(− 2
Kn )−1 h2 τ (n) k∞ ≤ k(− 2 Kn )−1 k∞ h2 kτ (n) k∞ .
h h
Inoltre una analisi in norma infinito ci fornisce
1 1 1 1 5
k(− Kn )−1 k∞ = h2 kKn−1 k∞ ≤ h2 (kH −1 k∞ + (n + 1)2 ) ≤ + = ,
h2 2 8 2 8
dove abbiamo usato (28), (29), (30) e (20). Per cui si ha stabilità del metodo,
inoltre anche il secondo addendo è limitato superiormente da una costante per
h2 . Questo dimostra la convergenza dello schema alle differenze con ordine h2 .
35
Listing 5: Risoluzione del problema modello con condizioni al contorno miste
mediante differenze finite
function [v,x] = miste(f,alfa,beta)
% [v,x] = miste(f,alfa,beta)
% risolve l’equazione u’’(x)=f(x), u’(0)=alfa, u(1)=beta
% col metodo delle differenze finite sulla griglia x_i=ih, h=1/(n+1)
% f=(f_1,f_2,...,f_n), f_i=f(x_i),i=1,...,n
% v=(v_0,...,v_{n+1}) approssimazione della funzione u in x_0,...,x_{n+1}
% x=(x_0,...,x_{n+1})
n = length(f);
h = 1/(n+1);
d = sparse(ones(n-1,1));
A = speye(n);
A = diag(d,1)+diag(d,-1)-2*A;
A(1,1) = -1;
f(1) = f(1)+alfa/h;
f(n) = f(n)-beta/h^2;
w = h^2*(A\f);
v = [w;beta];
x = [1:n+1]/(n+1);
end
36
4.11 Implementazione Matlab
La function riportata nel Listing 5 fornisce una implementazione per il metodo
delle differenze finite applicato al problema u00 (x) = f (x) con le condizioni miste
u0 (0) = α, u(1) = β.
La figura 10 riporta il grafico della soluzione calcolata con α = 0, β = 0.2 e
con f (x) = 1 per x < 1/2, f (x) = 0 per x ≥ 1/2.
Si noti la tangente orizzontale nell’estremo sinistro data dalla condizione
u0 (0) = 0.
37
con ξˆ ∈ (x, x + h2 ), η̂ ∈ (x − h2 , x). Componendo le due relazioni cosı̀ ottenute si
ottiene
0 0 1 h u(x + h) − u(x) h u(x) − u(x − h)
(c(x)u (x)) = c(x + ) − c(x − )
h 2 h 2 h (31)
+ h2 τ (x)
dove
1 h h h h 1 000 000
τ (x) = (c(x + )σ(x + ) − c(x − )σ(x − )) + (u (ξ) + u (η))
h 2 2 2 2 48
per cui, essendo c(x)σ(x) derivabile con continuità ne segue che |τ (x)| è limitato
superiormente da una costante indipendente da n.
Quindi, applicando la formula (31) nei punti xi = ih e denotando ci =
c(xi + h/2), si arriva alla discretizzazione
c0 −(c0 + c1 ) c1
1 c1 −(c1 + c2 ) c2
Ln = 2
h . .. . .. . ..
cn−1 −(cn−1 + cn ) cn
−(c0 + c1 ) c1
c1 −(c1 + c2 ) c2
1 .. .. ..
An = 2
h . . .
cn−2 −(cn−2 + cn−1 ) cn−1
cn−1 −(cn−1 + cn )
38
1
Per cui, denotando con An = h2 tridn (ci , −(ci + ci+1 ), ci+1 ) la parte centrale di
Ln e s = (wi )i=1,n , si ha
1
An s = e − cn wn+1 en . (32)
h2
Pi 1
In modo analogo si vede che, posto v = (vi )i=0,n+1 , v0 = 0, vi = h2 j=1 cj−1
per i = 1, . . . , n + 1, vale vi+1 − vi = h2 /ci per i = 0, . . . , n, da cui
1
(Ln v)i = (ci−1 (vi−1 − vi ) + ci (vi+1 − vi )) = 0.
h2
Quindi denotando p la parte centrale di v si ha
1
An p = − cn vn+1 en . (33)
h2
Combinando (32) e (33) si ottiene
wn+1
A−1
n e=s− p.
vn+1
Pn+1 Pn+1
Infine, posto γ = wvn+1
n+1
, si ha γ = ( j=1 j/cj−1 )/( j=1 1/cj−1 ) che è la media
pesata degli interi da 1 a n + 1 per cui γ < n + 1. Quindi prendendo le norme,
si ottiene
i
X j+γ 2
kA−1 2
n ek∞ = max |wi − vi γ| ≤ h max ≤ .
i i
j=1
cj−1 minx c(x)
39
5.3 Analisi mediante fattorizzazione LU
Un modo diverso di studiare kA−1 n k∞ si basa su un’analisi matriciale.
Si verifica facilmente che −An = Bn + h12 cn en eTn , dove
c0 + c1 −c1
−c1 c1 + c2 −c2
1 .. .. ..
Bn = 2
h . . .
−cn−2 cn−2 + cn−1 −cn−1
−cn−1 cn−1
Inoltre, una verifica diretta mostra che Bn si può fattorizzare come
1 −1
c0 1
.. c1 −1 1
1 1 .
Bn = .
h2
..
.. .. ..
. . .
.
−1
1 cn−1 −1 1
(34)
Si osserva infine che, poiché ci > 0, −An e Bn sono M-matrici non singolari
essendo dominanti diagonali e irriducibili. Quindi le loro inverse hanno elementi
positivi. Inoltre, dalla formula di Sherman-Woodbury-Morrison e dalle proprietà
delle M-matrici segue che 0 ≤ −A−1 n ≤ Bn−1 . Quindi per la stabilità basta
dimostrare che kBn k∞ è limitata superiormente da una costante indipendente
da n.
Poiché −1
1 −1 1 1 ... 1
.. .. .. . .
. . . ..
. . =
1 −1 1 1
1 1
2
n 1
si ha che kBn k∞ ≤ (n+1)2 min c < 1/ min ci che è limitato superiormente da una
i
costante indipendente da n.
40
Figura 11: Soluzione del problema (p(x)u0 (x))0 = f (x), u(0) = u(1) = 0 con
f (x) = 1 e p(x) = x + 1/100
h2
vale kBn−1 k2 ≤ min ci kK
−1
k2 dove
2 −1
.. ..
−1 . .
K = tridn (0, 1, −1)tridn (−1, 1, 0) =
..
. 2 −1
−1 1
2π
Per il teorema 5 gli autovalori della matrice K sono 2 − 2 cos(j n+1/2 ), j =
2π
1, . . . , n e corrispondono agli autovettori v j = (sin(ij n+1/2 )). Il più piccolo
2π 4π 2
autovalore è 2 − 2 cos( n+1/2 )= (n+1/2)2 + O(h4 ), per cui
(n + 1/2)2 4 2 4
kK −1 k2 = 2
< 2 + O(h2 ).
(n + 1) π π
41
Listing 6: Risoluzione del problema di Sturm-Liouville
42
6 Il problema agli autovalori
Si consideri il “problema modello”
in cui occorre determinare gli scalari λ e le funzioni u(x) : [0, 1] → R, u(x) non
identicamente nulle, che verifichino (35). Gli scalari λ sono chiamati autovalori
e le corrispondenti funzioni u(x) autofunzioni. In questo caso speciale esiste
una infinità numerabile di soluzioni date da ui (x) = sin(πix) e λi = i2 π 2 ,
i = 1, 2, . . ., per cui il problema della loro approssimazione di fatto non si pone.
Usiamo però questo problema modello come paradigma per descrivere il suo
trattamento numerico.
Discretizzando l’intervallo [0, 1] con i punti xi = ih, i = 0, . . . , n + 1, h =
1/(n + 1), e utilizzando l’operatore discreto Ln si arriva alla seguente relazione
2 −1
..
1 −1 2 . u = λu + h2 τ (n)
(36)
2
h .. ..
. . −1
−1 2
(n) (n) 1
dove τ (n) = (τi ) è tale che |τi | ≤ 12 max |u(4) (x)|, valida nel caso in cui u(x)
sia di classe C 4 [0, 1].
Si considera allora il problema
2 −1
..
1 −1 2 .
v = µv (37)
h2 .. ..
. . −1
−1 2
|λ − µ| ≤ kF k · kSk · kS −1 k
43
Dim. Sia Bu = λu per cui (A − λI)u = −F u. Se λ è autovalore di A allora la
tesi è vera. Se λ non è autovalore di A allora A − λI è non singolare e possiamo
scrivere
u = −(A − λI)−1 F u.
Questo implica che k(A − λI)−1 F k ≥ 1 da cui, poiché (A − λI)−1 = S(D −
λI)−1 S −1 , si ha
1 ≤ kF k · kSk · kS −1 k · k(D − λI)−1 k.
Poiché k · k è una norma assoluta, si ha che k(D − λI)−1 k = 1/|µ − λ| dove µ è
un autovalore di A che ha distanza minima da λ.
|λ − µ| ≤ kF k2
Per quanto riguarda lo studio della distanza tra l’autovettore v della matrice
A e l’autovettore vettore u della matrice B premettiamo la definizione di de-
composizione ai valori singolari (SVD) è la definizione di inversa generalizzata.
Vale il seguente
44
Teorema 19 Dato il sistema Ax = b con A ∈ Rm×n , b ∈ Rm , il vettore x∗ =
A+ b è il vettore di minima norma 2 che minimizza kAx − bk2 .
Dim. Vale
(A + F − λI)u = 0
Av − µv = 0
Sottraendo entrambi i membri delle precedenti equazioni si ottiene
Da cui
(A − µI)(u − v) = −F u + (λ − µ)u.
Quindi F u+(λ−µ)u sta nell’immagine di A−µI e per il teorema 19 la soluzione
u − v di minima norma può essere scritta come
inoltre vale
ku − vk ≤ k(A − µI)+ k(kF k + |λ − µ|)kuk.
Da cui la prima parte della tesi. Se A è simmetrica, con autovalori αi , si ha
kSk2 · kS −1 k2 = 1, per cui la tesi discende dall’osservazione 18; infatti i valori
singolari di (A − µI)+ , per definizione di inversa generalizzata, sono 1/(αi − µ)
se αi − µ 6= 0 e 0 altrimenti.
Siamo pronti per confrontare le soluzioni del problema continuo (35) con
quelle del problema discreto (37). Infatti possiamo riscrivere (36) come
(A + F )u = λu
45
si ha
kτ k
|λ − µ| ≤ h2 . (38)
kuk
1
Poiché τi = 24 (u(4) (ξi ) + u(4) (ηi )) con ξ ∈ (xi , xi+1 ) e ηi ∈ (xi−1 , xi ), se
1 1 1
M = maxx∈[0,1] |u(4) (x)|, allora √n+1 kτ (n) k2 ≤ 12 M , inoltre limn √n+1 kuk2 =
1/2
τ k2 è limitato superiormente da una
R
1
0
u(x)2 dx per cui il quoziente kku k2
costante θ.
Inoltre, poiché gli autovalori di A sono αi = (n + 1)2 (2 − 2 cos πi/(n + 1)) =
i π + O(h2 ), se µ = αj allora 1/ mini6=j |αi − µ| = 1/((2j − 1)π 2 ) + O(h2 ) dove
2 2
kv − uk2 1
≤ γh2 θ
kuk2 (j − 1/2)π 2
per una costante γ > 0. Questo dimostra la convergenza della soluzione del
problema discreto alla soluzione del problema continuo.
7 Il caso multidimensionale
Si consideri il problema di Poisson con condizioni al contorno di Dirichlet su un
dominio quadrato
∂2u ∂2u
+ 2 = f (x, y), (x, y) ∈ Ω = (0, 1) × (0, 1)
∂x2 ∂y (39)
u(x, y) = g(x, y), (x, y) ∈ ∂Ω
46
Listing 7: mediante differenze finite.]Soluzione del problema agli autovalori
(c(x)u0 (x))0 = λu(x) sull’intervallo [0,1] mediante differenze finite.
function [v,lambda]=eig_generale(c)
% [v,lambda]=eig_generale(c)
% risolve il problema agli autovalori (u’(x)c(x))’=lambda u(x), u(0)=u(1)
=0
% col metodo delle differenze finite sulla griglia x_i=ih, h=1/(n+1)
% v matrice le cui colonne approssimano le autofunzioni
% lambda vettore degli autovalori corrispondenti
n = length(c)-1;
h = 1/(n+1);
d0 = sparse(c(1:n)+c(2:n+1));
d1 = sparse(c(2:n));
A = -diag(d0)+diag(d1,1)+diag(d1,-1);
A = A*(1/h^2);
[v,ei] = eig(A);
v = [zeros(1,n);v;zeros(1,n)];
lambda = diag(ei);
end
Figura 12: Autovalori del problema (c(x)u0 (x))0 = λu(x), su [0,1] con u(0) =
u(1) = 0 con e c(x) = x + 1/100
47
Figura 13: Prime 6 autofunzioni di L[x] = (c(x)u0 (x))0 su [0, 1], con c(x) =
x + 1/100, calcolate mediante differenze finite.
48
j y
(xi , y)j
1
Lm,n (U (m,n) ) = (ui−1,j + ui+1,j + ui,j−1 + ui,j+1 − 4ui,j )i=1:m,j=1:n
h2
dove abbiamo indicato U (m,n) = (ui,j )i=0:m+1,j=0:n+1 .
49
Un modo per descrivere sinteticamente questa formula, nota come formula
dei cinque punti, è quello di usare la matrice 3 × 3 dei coefficienti di ui+r,j+s
per r, s = −1, 0, 1 detta stencil
0 −1 0
1
− 2 −1 4 −1
h
0 −1 0
dove abbiamo posto Am = − h12 tridm (−1, 2, −1), An = − h12 tridn (−1, 2, −1),
x y
U = (ui,j )i=1,m, j=1,n , B = F + h12 (g :0 eT1 + g :n+1 eTn ) + h12 (e1 g T0: + em g Tm+1: ),
x y
F = (fi,j )i=1:m,j=1:n , fi,j = f (xi , yj ) e abbiamo denotato g :0 = (g(xi , 0))i=1:m ,
g :1 = (g(xi , 1))i=1:m , g 0: = (g(0, yi ))i=1:n , g 1: = (g(1, yi ))i=1:n .
Rimuovendo la componente dell’errore locale si ottiene il sistema
la cui incognita è V .
È possibile scrivere tale sistema in forma standard Am,n u = b se ordiniamo
le componenti incognite (ui,j ) come un vettore u = u(m,n) di mn componenti.
Per questo utilizziamo l’operatore vec definito nel seguente modo
Definizione 21 Data la matrice A di dimensione m × n, il vettore v = vec(A)
è formato dagli elementi di A ordinati per colonne, cioè v(j−1)m+i = ai,j .
50
Il vettore vec(A) è naturale vederlo come un vettore “a blocchi” dove il
generico blocco in posizione j ha per elementi gli elementi della colonna j-esima
di A. Ad esempio, se
a11 a12 a13
A=
a21 a22 a23
allora
a11
a21
a12
a=
a22
a13
a23
Introduciamo il prodotto di Kronecker. Date la matrice A di dimensione
m × n e la matrice B di dimensione p × q, definiamo la matrice A ⊗ B come
la matrice di dimensioni mp × nq che partizionata in blocchi p × q ha elementi
(ai,j B). In particolare,
Im ⊗ B = diagm (B, B, . . . , B)
mentre
a11 I ... a1,n I
.. ..
A ⊗ Ip = . .
.
am1 I ... am,n I
Formalmente se H = A ⊗ B, allora h(i−1)m+r,(j−1)n+s = ai,j br,s , per i =
1, . . . , m, j = 1, . . . , n, r = 1, . . . , p, s = 1, . . . , q.
Si riportano le principali proprietà del prodotto di Kronecker la cui dimo-
strazione si lascia come esercizio:
vec(AB) = (I ⊗ A)vec(B)
vec(AB) = (B T ⊗ I)vec(A)
(A ⊗ C)(B ⊗ D) = (AB) ⊗ (CD)
det(Am ⊗ Bn ) = (det Am )n (det Bn )m
(45)
(Am ⊗ Bn )−1 = A−1 −1
m ⊗ Bn
51
Denotiamo con Am,n = In ⊗ Am + An ⊗ Im . È facile vedere che la ma-
trice Am,n ha una struttura tridiagonale a blocchi con blocchi tridiagonali.
Precisamente, supponendo per semplicità m = n per cui hx = hy , vale
1
Am,n = − tridn (−Im , Hm , −Im ), Hm = tridm (−1, 4, −1).
h2
Se vi,j fosse un punto di massimo, sarebbe maggiore o uguale ai valori nei punti
contigui e quindi alla loro media, cioè
Le due relazioni danno vi,j = vi−1,j = vi1,j = vi,j−1 = vi,j+1 , cioè i valori di V
nei punti contigui sono anch’essi di massimo. Ripetendo il ragionamento per i
punti contigui si conclude che il massimo è preso sul bordo.
Ci basta ora far vedere che esiste una matrice W = (wi,j )i=0:m+1,j=0:n+1 ≥ 0
tale che Lm,n (W ) ha tutte componenti uguali a 1 per poi procedere come si è
fatto nella dimostrazione del teorema 9. Basta allora scegliere W = weT , dove
w = ( 21 (hm i)2 )i=0:m+1 e e ∈ Rn+2 . Infatti, dalla (43) e dal fatto che Lm (w) = e
e Ln (e) = 0 segue immediatamente la tesi.
Si osservi che la matrice W non è altro che la discretizzazione della funzione
w(x, y) = 21 x2 sul reticolo di punti (xi , yj ).
52
Ora possiamo procedere come nella dimostrazione del teorema 9. Quindi
consideriamo la matrice Y = (yi,j ),
(m,n) (m,n)
yi,j = ±i,j + h2 max |τi,j |wi,j
(m,n)
dove abbiamo denotato τi,j le componenti dell’errore locale di discretizzazio-
(m,n)
ne, e i,jle componenti dell’errore globale estese sul bordo con zeri. Per co-
struzione vale Lm,n (Y ) ≥ 0 per cui maxi,j yi,j = maxi,j (y0,j , ym+1,j , yi,0 , yi,n+1 ).
Si deduce quindi che
(m,n) 1
±i,j ≤ h2 kτ (m,n) k∞ .
2
1 1
−A−1 (e ⊗ e) = e ⊗ ( p − s) − (n + 1)2 A−1 ((e1 + en ) ⊗ (s − p)) (48)
2 2
Poiché 0 ≤ 21 p − s ≤ 18 e e poichè −A−1 ≥ 0 dalla (48) si ottiene
1 1
0 ≤ −A−1 (e ⊗ e) ≤ e ⊗ ( p − s) ≤ e ⊗ e.
2 8
Poiché k − A−1 (e ⊗ e)k∞ = kA−1 k∞ , si deduce che
1
kA−1 k∞ ≤
8
53
da cui la stabilità dello schema alle differenze e la convergenza.
Analogamente a quanto riportato nell’osservazione 7 si può dimostrare che
anche nel caso bidimensionale eventuali perturbazioni del termine noto del si-
stema Am,n x = b relative ai valori sul bordo non si ritrovano amplificate nella
soluzione.
1 h h2
f 0 (x) = (f (x + h) − f (x)) − f 00 (x) − f 000 (ξ). (50)
h 2 6
Dalla (50) applicata a u(x, y) come funzione di x con incremento h = hx e come
funzione di y con incremento h = hy si ottiene
∂2u 1
= (u(x + hx , y + hy ) − u(x + hx , y) − u(x, y + hy ) + u(x, y))
∂x∂y hx hy
(51)
hx ∂ 3 u hy ∂ 3 u
− 2
− + O(h2 ).
2 ∂x∂ y 2 ∂ 2 x∂y
54
E C D
2 1
F B
A
3 4
G H I
Applicando la formula (51) nel punto A con incrementi hx = ±h e hy = ±h,
tenendo conto che l’asse x è verticale, orientato verso il basso mentre l’asse y
è orizzontale orientato verso destra, si ottengono le quattro diverse formule per
∂2u
approssimare la derivata mista ∂x∂y
1 ∂2u h ∂3u ∂3u
1. 2
(−u(D) + u(C) − u(A) + u(B)) = − (− 2
+ 2 ) + O(h2 )
h ∂x∂y 2 ∂x∂y ∂x ∂y
1 ∂2u h ∂3u ∂3u
2. 2
(−u(C) + u(E) − u(F) + u(A)) = + ( 2
+ 2 ) + O(h2 )
h ∂x∂y 2 ∂x∂y ∂x ∂y
1 ∂2u h ∂3u ∂3u
3. (−u(A) + u(F) − u(G) + u(H)) = + (− + ) + O(h2 )
h2 ∂x∂y 2 ∂x∂y 2 ∂x2 ∂y
1 ∂2u h ∂3u ∂3u
4. (−u(B) + u(A) − u(H) + u(I)) = − ( + ) + O(h2 )
h2 ∂x∂y 2 ∂x∂y 2 ∂x2 ∂y
Una qualsiasi combinazione
P lineare delle quattro espressioni con coefficienti
α1 , α2 , α3 , α4 tali che αi = 1, fornisce una formula generale per approssimare
∂2u
la derivata mista ∂x∂y con errore O(h). Scegliendo però in modo opportuno i
coefficienti è possibile annulare la componente O(h) dell’errore e ottenere quindi
un errore locale O(h2 ); questo si realizza scegliendo α1 = α3 , α2 = α4 . La
formula generica con errore locale O(h2 ) può essere descritta con la matrice
3 × 3 dei coefficienti di ui+r,j+s per r, s = −1, 0, 1 (stencil)
0 0 0 α2 α1 − α2 −α1 0 1 0
a b c
2
1 −2 1 + 2 2 α1 − α2 2(α2 − α1 ) α1 − α2 + 2 0 −2 0
h h h
0 0 0 −α1 α1 − α2 α2 0 1 0
55
convergenza con ordine O(h2 ) di questo schema. Per questo è sufficiente deter-
minare una matrice W ≥ 0 tale che Lm,n (W ) ≥ γ > 0, dove γ è indipendente
da m e da n. Basta allora scegliere w(x, y) = 21 x2 , in modo che L[w] = a(x, y),
γ = min a(x, y), e porre W = (wi,j ), wi,j = w(xi , yj ).
Si osservi ancora che se 0 < b < min(a, c) allora b2 < ac ma non viceversa.
56
7.5 Condizioni al contorno di tipo misto
Si consideri il problema di Poisson (39) con le seguenti condizioni al contorno
miste
∂u(x, 1)
u(x, 0) = g1 (x), = g2 (x)
∂~n
∂u(1, y)
u(0, y) = g3 (y), = g4 (y)
∂~n
Si proceda come fatto nel caso monodimensionale e si dimostri che l’operatore
discreto Am,n ha la forma
Am,n = Im ⊗ An + Am ⊗ In
dove Am e An sono le matrici che discretizzano u00 (x) con condizioni al contorno
miste ottenute nel paragrafo 4.6.
57
Ad esempio, nel caso in figura, ordinando le incognite per colonne, la matrice
risulterà ancora tridiagonale a blocchi con blocchi diagonali che sono tridiagonali
con valori (1,-4,1). I primi 5 blocchi diagonali hanno dimensione 14, mentre i
restanti 9 blocchi diagonali hanno dimensione 7; i primi 4 blocchi sopra e sotto
diagonali hanno dimensione 14, il sesto ha dimensione 14 × 7, i rimanenti hanno
dimensione 7.
La stabilità del metodo in norma 2 si ottiene applicando il teorema di
Courant-Fischer e la definita positività di A. Infatti, una volta dimostrato che
gli autovalori di A sono limitati dal basso da una costante positiva indipendente
dalle dimensioni di A, allora per il teorema di Courant-Fischer anche gli auto-
valori di ogni sottomatrice principale A b di A sono limitati dal basso dalla stessa
−1
costante e quindi A ha norma 2 limitata superiormente da una costante.
b
Più in generale possiamo dimostrare una proprietà analoga valida per le
M-matrici. Premettiamo il seguente risultato.
Osserviamo prima che se A1 = I − B1 , A2 = I − B2 sono due M-matrici
n × n e quindi B1 , B2 ≥ 0. Allora vale il seguente risultato
P∞ P∞
Dim. Discende dal fatto che A−1
1 =
i −1
i=0 B1 , A2 =
i k k
i=0 B2 , poiché B1 ≥ B2
per k = 1, 2, . . ..
e ≤ B quindi P∞ B
Vale allora B e i ≤ P∞ B i e la serie P∞ B e i è convergente
i=0 i=0 i=0
e vale
X∞ ∞
X
−1
(I − B) =
e i
B ≤
e B i = A−1 .
i=0 i=0
58
Inoltre per la struttura diagonale a blocchi di B
e risulta
−1
e −1 = (I − B11 )
(I − B)
0
0 (I − B22 )−1
1 2 ∂ 2 u
∂u
u(A) = u(O) + hA + h + O(h3A )
∂x O 2 A ∂x2 O
1 2 ∂ 2 u
∂u
u(E) = u(O) + hE + h + O(h3E )
∂x O 2 E ∂x2 O
∂ 2 u
1 2 2
hE u(A) − hA u(E) = (hE − hA )u(O) + (hE hA − hA hE ) + O(h4 )
2 ∂x2 O
1 2 ∂ 2 u
∂u
u(D) = u(O) + hD + h + O(h3D )
∂y O 2 D ∂y 2 O
1 2 ∂ 2 u
∂u
u(F ) = u(O) + hF + h + O(h3F )
∂y O 2 F ∂y 2 O
∂ 2 u
1 2 2
hF u(A) − hA u(F ) = (hF − hD )u(O) + (hF hD − hD hF ) + O(h4 )
2 ∂y 2 O
59
D
A O E B
F
C
Figura 15: Bordo che non passa per i punti del reticolo: si conoscono i valori di
u(E) e u(F ) ma non quelli di U (B) e u(C) necessari per applicare la formula
dei 5 punti in O.
2 2
pesi si ottiene il laplaciano ∂ u(x,y)
∂x2 + ∂ u(x,y)
∂y 2 nel punto O con errore locale O(h).
Si ottiene una equazione che lega i valori incogniti di u(O), u(A), u(D) ai valori
noti di u(E) e u(F ) con errore locale O(hx + hy ).
Un approccio diverso consiste nel dare una approssimazione dei valori di
u(B) e di u(C) in funzione di u(E), u(F ) e u(O) mediante estrapolazione, e poi
applicare la formula dei 5 punti in O. Ad esempio, per approssimare u(B) con
estrapolazione lineare possiamo costruire la retta che passa per i punti (0, u(O))
e (hE , u(E)) e valutare il valore in hB . Oppure possiamo costruire la parabola
che passa per (hA , u(A)), (0, u(O)), e (hE , u(E)) e valutarne il valore in hB .
Manipolazioni simili possono essere fatte con le condizioni di Neumann.
60
Listing 8: Risoluzione del problema di Poisson ∆u = f su un quadrato mediante
differenze finite utilizzando il comando backslash di Matlab.
function v = poisson(f)
% function v = poisson(f)
% risolve il problema di Poisson su [0,1]x[0,1] con termine noto f(x,y)
% col metodo delle differenze finite
% f e’ matrice (m+2)x(n+2), sulla prima e utima riga e colonna contiene
% le condizioni al bordo, nella parte rimanente contiene i valori di
% f(x,y) nei punti della griglia
% v e’ una matrice (m+2)x(n+2) con i valori della soluzione, bordo
incluso
% Il sistema lineare e’ risolto col backslash \ di Matlab
[mm,nn] = size(f);
g = f(2:mm-1,2:nn-1);
m = mm-2; n = nn-2;
hy = 1/(m+1);
hx = 1/(n+1);
% completo il termine noto con le condizioni al contorno
g(1,:) = g(1,:)-f(1,2:nn-1)/hy^2;
g(m,:) = g(m,:)-f(mm,2:nn-1)/hy^2;
g(:,1) = g(:,1)-f(2:mm-1,1)/hx^2;
g(:,n) = g(:,n)-f(2:mm-1,nn)/hx^2;
% costruisco la matrice
dm = sparse(ones(m,1));
dn = sparse(ones(n,1));
dm1 = sparse(ones(m-1,1));
dn1 = sparse(ones(n-1,1));
Hn = (1/hx^2)*(-2*diag(dn)+diag(dn1,1)+diag(dn1,-1));
Hm = (1/hy^2)*(-2*diag(dm)+diag(dm1,1)+diag(dm1,-1));
A = kron(diag(dn),Hm)+kron(Hn,diag(dm));
% risolvo il sistema
v = A\vec(g);
v = reshape(v,m,n);
% completo alla dimensione originale
v = [f(1,:);f(2:m+1,1),v,f(2:m+1,n+2);f(m+2,:)];
% traccio il grafico
mesh(v);
% per salvare la figura scommentare l’istruzione che segue
% print ’bolla.jpg’ -djpg
end
61
Figura 16: Configurazione di equilibrio ottenuta dall’equazione ∆u = 0 con
valori al contorno dati da tre segmenti di retta sghembi
62
Figura 17: Configurazione di equilibrio ottenuta dall’equazione ∆u = f
f (x, y) = 1 e con valori al contorno nulli.
8.2 Introduzione
I metodi alle differenze finite hanno due difetti:
1. Funzionano bene su griglie quadrate regolari, ma si adattano male a do-
mini di forma più strana, per problemi in 2 o più dimensioni, che invece
spesso capitano nelle applicazioni.
2. Richiedono un’alta regolarità della soluzione: per dimostrarne il funzio-
namento, abbiamo usato sviluppi di
Taylor
fino al IV ordine, richiedendo
quindi che la funzione sia C 4 (e che
u(4)
∞ non sia troppo grossa).
63
dove l’operatore L è definito come
0
L[v] := − [p(x)v 0 (x)] + q(x)v(x)
per due funzioni p(x) > 0, p ∈ C 1 , e q(x) > 0, q ∈ C 0 date. Nel seguito, quando
possibile ometteremo i (x) dalle funzioni: per esempio l’equazione qui sopra sarà
scritta in modo più compatto
L[v] = −[pv 0 ]0 + qv.
Innanzitutto mi tolgo dai piedi le condizioni al contorno, cercando di rim-
piazzarle con u(a) = u(b) = 0: per questo, scelgo una qualunque funzione
l(x) ∈ C 2 che soddisfi l(a) = α, l(b) = β (per esempio c’è un polinomio di grado
1 che va bene), e noto che ũ = u − l soddisfa
L[ũ] = f − L[l]
ũ(a) = 0
ũ(b) = 0
che è un problema dello stesso tipo ma con condizioni al bordo omogenee. Con
qualche altro trucco (che non vediamo) è possibile trattare più o meno tutte le
condizioni al contorno, incluse quelle di Neumann.
64
8.5 Proprietà di L
Su H01 , l’operatore L è simmetrico rispetto al prodotto scalare h·, ·i (ovvio dalla
(55)); possiamo anche provare che è definito positivo (in un certo senso).
Lemma 25 (versione 1D del lemma di Poincaré) Esiste una costante C
(che dipende solo dal dominio [a, b]) tale che per ogni u ∈ H01 si ha
Teorema 26 Esistono costanti m, M che dipendono solo dal dominio tali che
per ogni u ∈ H01 si ha
2 2
m kukN ≤ hL[u], ui ≤ M ku0 kN
Dim. Z b Z b Z b
hL[u], ui = pu02 dx + qu2 dx ≥ (min p) u02 dx
a a a
2 2
≥(min p) ku0 kL2 ≥ (min p)C −2 kukN
Z b Z b
2 2
hL[u], ui = pu02 dx + qu2 dx ≤ (max p) ku0 kL2 dx + (max q) kukL2
a a
2 2
≤(max p) ku0 kL2 dx + (max q)C 2 ku0 kL2
65
8.6 Formulazione variazionale
Teorema 27 Se u soddisfa (54), allora u è un punto di minimo (stretto) in
H01 del funzionale F (v) := hL[v], vi − 2 hf, vi. In particolare, (54) ha al più una
soluzione.
8.7 Discretizzazione
Finora abbiamo dimostrato tante belle proprietà ma non abbiamo enunciato
algoritmi per risolvere la (53). Lo facciamo ora: nella (54), rimpiazziamo H01
con un suo sottospazio S con dim S = n < ∞: cioè, cerchiamo uS ∈ S tale che
ku − uS kN ≤ D ku0 − v 0 kN
per le norme N = 2, N = ∞.
Dim.
m ku − uS kN ≤ hL[u − uS ], u − uS i = hu, L[u]i + F (us )
≤ hu, L[u]i + F (v) = hL[u − v], u − vi ≤ M ku0 − v 0 kN
66
dove nel ≤ a cavallo dell’andata a capo abbiamo usato l’osservazione appena
fatta che uS è il minimo di F su S, e quindi F (uS ) ≤ F (v).
67
8.11 Curiosità: cosa succede in più dimensioni
Tutti i risultati enunciati finora non richiedono particolari proprietà di R, e
infatti funzionano anche quando le funzioni sono definite su un aperto Ω di R2 ,
per ogni operatore L per cui si riesce a dimostrare il teorema 26. Non serve che
L sia simmetrico, ma se non lo è le dimostrazioni si complicano un po’. Nel caso
simmetrico, quasi tutte le dimostrazioni che abbiamo visto funzionano pari pari
(eccezione: lemma di Poincaré).
Sono possibili diverse scelte dello spazio S, a seconda del problema; la più
comune è prendere una triangolazione del dominio, cioè una suddivisione di Ω
in tanti piccoli triangoli, e considerare le funzioni che sono continue globalmente
e lineari su ognuno dei triangoli. Con la base opportuna (le funzioni che valgono
1 in un vertice della triangolazione e 0 altrove), la matrice del sistema non ha
più una struttura particolare come nel caso 1D, ma è comunque molto sparsa.
Le operazioni da fare nella pratica sono:
• Costruire la triangolazione del dominio. Non è difficile, ci sono algoritmi
dedicati, ma talvolta non serve neppure applicarli perché molte applicazio-
ni partono da programmi di progettazione al computer in cui il risultato è
già naturalmente suddiviso in triangoli (o tetraedri nel caso 3D)—se qual-
cuno si interessa di computer-grafica 3D o di CAD ha già capito di cosa
parliamo.
• Costruire la matrice e il termine noto del sistema (58). Qui ci sono molti
integrali da fare. Nella pratica, questi integrali vengono calcolati uti-
lizzando su ogni triangolo (o su ogni segmento [xi , xi+1 ] di suddivisione
dell’intervallo [a, b] nel caso 1D) una formula di quadratura. Solitamente
questa è la parte che porta via più tempo.
• Risolvere il sistema. Visto che di solito la matrice è molto sparsa, si usa
un metodo iterativo (Jacobi, gradiente coniugato, GMRES), spesso ac-
coppiato con precondizionatori sofisticati. Di solito si arresta il metodo
iterativo con un residuo abbastanza alto: = 10−3 , per esempio. Difatti,
spesso, a causa degli errori già commessi “a monte” (nei dati sperimentali,
nel modello, nella quadratura, errore globale nella soluzione dell’equazio-
ne differenziale), la precisione del risultato è già limitata a poche cifre
significative.
9 Equazioni paraboliche
Si consideri l’equazione del calore
∂u ∂ 2 u
γ − = 0, γ > 0. (59)
∂t ∂x2
con condizioni
u(x, 0) = f (x), 0 ≤ x ≤ `,
(60)
u(0, t) = a(t), u(`, t) = b(t), t ≥ 0.
68
Il dominio [0, `] × [0, tmax ], si discretizza con ui,j = u(xi , tj ), xi = i∆x , ∆x =
`/(n + 1), tj = j∆t , ∆t = tmax /(m + 1), i = 0, 1, . . . , n + 1, j = 0, 1, 2, . . . , m + 1.
69
La presenza di T m nel blocco in basso a sinistra ci dice che condizione neces-
saria di stabilità è che ρ(T ) ≤ 1 altrimenti T m divergerebbe esponenzialmente.
Quindi condizione necessaria di stabilità è che gli autovalori di T siano in valore
assoluto minori o uguali a 1. Cioè |1−2r +2r cos iπ/(n+1)| ≤ 1. Ciò è verificato
per ogni n se e solo se r ≤ 1/2, cioè ∆t /∆2x ≤ γ/2. La stabilità e la convergenza
sono subordinate ad una condizione sul rapporto ∆t /∆2x . Si parla per questo di
stabilità condizionata.
È interessante osservare che per avere stabilità il numero di punti della
discretizzazione temporale deve essere dell’ordine del quadrato del numero di
punti della discretizzazione spaziale. Questo conduce a bassi livelli di efficienza
computazionale.
Si osservi che se r ≤ 1/2 la matrice T è non negativa e Am,n è una M-matrice
per cui A−1 −1
m,n ≥ 0. Vale allora kAm,n k∞ = kAm,n e
−1 (n(m+1))
k∞ dove e(n(m+1)) è
il vettore con n(m + 1) componenti uguali a 1. Inoltre vale T e(n) ≤ e(n) per cui
T j e(n) ≤ e(n) quindi
m
X
kA−1 −1 (n(m+1))
m,n k∞ = kAm,n e k∞ ≤ ∆t kT j e(n) k∞ ≤ ∆t (m + 1) = 1
j=0
70
Si arriva quindi alla equazione alle differenze
1 1
(ui,j+1 − ui,j ) = (ui−1,j − 2ui,j + ui+1,j + ui−1,j+1 − 2ui,j+1 + ui+1,j+1 )
∆t 2γ∆2x
+ O(∆2x ) + O(∆2t )
Il sistema lineare ottenuto rimuovendo i termini con gli errori locali è dunque
1 1
((1 + 2r)vi,j+1 − rvi−1,j+1 − rvi+1,j+1 ) = ((1 − 2r)vi,j + rvi−1,j + rvi+1,j )
∆t ∆t
v0,j = a(tj ), vn+1,j = b(tj ), vi,0 = f (xi ).
dove
A
1 −B A
Am,n =
∆t
.. ..
. .
−B A
in cui A = tridm (−r, 1 + 2r, −r), B = tridm (r, 1 − 2r, r).
La convergenza del metodo in qualche norma si studia dando maggiorazioni
alla norma di A−1
m,n . Si osserva che, posto V = A
−1
B, risulta
I
V I
A−1 = ∆ (I ⊗ A−1 ).
m,n t .. .. ..
. . .
Vm ... V I
71
Questa proprietà può essere usata per dimostrare la convergenza incondizio-
nata in norma 2. Infatti, partizionando (n(m+1)) in blocchi i di lunghezza n,
e denotando con c = (ci ) il vettore a destra nel sistema (61), risulta
k−1
X
k = ∆t V i A−1 ck−i .
i=0
k−1
X
kk k ≤ ∆t kV ki2 kA−1 k2 kck−i k
i=0
da cui
∆t
kk k ≤ kA−1 k2 max kci k.
1 − kV k2 i
A−1 e ≤ e
Be ≤ e
A−1 Be ≤ e
Xm
(A−1 B)j A−1 e ≤ (m + 1)e
j=0
da cui kA−1
m,n k∞ ≤ 1.
72
Dal punto di vista implementativo il metodo di Crank-Nicolson conviene
scriverlo nella forma più semplice
9.3 Il metodo θ
Si chiama metodo θ il metodo alle differenze finite che si ottiene combinando
linearmente le approssimazioni della derivata seconda di u rispetto ad x al tempo
tj e tj+1 con peso θ e 1 − θ. Col parametro θ = 1/2 si ottiene il metodo di
Crank-Nicolson, per cui il metodo θ ne costituisce una generalizzazione.
∂u(x, t) 1
= (u(x, t + ∆x ) − u(x, t − ∆t )) + ∆2t σ̂(x, η̂).
∂t 2∆t
Si dimostri che la norma infinito dell’inversa della matrice che discretizza l’ope-
ratore diverge per ∆t → 0 indipendentemente dal valore di r = ∆t /(γ∆2x ).
73
9.5 Caso tridimensionale
Nel modello in cui si studia la propagazione della temeperatura u(x, y, t) dei
punti (x, y) di una piastra Ω di cui si conosce ad ogni istante la temperatura g
sul bordo ∂Ω e i valori iniziali della temperatura della piastra, l’equazione del
calore prende la forma
Anche in questo caso si possono applicare gli analoghi dei metodi alle differenze
finite esaminati nel paragrafo precedente.
Questo sistema può essere risolto numericamente con i metodi numerici classici
per equazioni differenziali ordinarie.
Un approccio particolare può essere applicato nel caso più semplice in cui le
condizioni al bordo sono u(0, t) = u(`, t) = 0. In questo caso il sistema prende
la forma
v 0 = Av, v(0) = f
per cui la soluzione ammette una scrittura esplicita data da
v = eAt f .
74
e di facile implementazione in Matlab mediante la funzione expm che calcola
l’esponenziale di matrici.
Rimane il problema di valutare quanto l’errore locale ∆2x τ influisca sull’er-
rore globale = u − v. È facile verificare che questo errore soddisfa l’equazione
0 = A + ∆2x τ , (0) = 0.
10 Equazioni iperboliche
Consideriamo ora l’equazione delle onde
∂2u ∂2u
2
= γ 2 , 0 < x < 1, 0 < t < tmax , (62)
∂t ∂x
con le condizioni
u(x, 0) = f (x), 0 < x < 1
∂u(x, t)
|t=0 = g(x), 0 < x < 1 (63)
∂t
u(0, t) = 0, u(1, t) = 0.
cioè, F (x) = 12 (f (x) + ĝ(x)), G(x) = 12 (f (x) − ĝ(x)) con ĝ(x)0 = 1c g(x).
Si osserva che il valore u(x∗ , t∗ ) della soluzione (x, t) nel punto (x∗ , t∗ ) di-
pende unicamente dai valori f (x∗ + ct∗ ), f (x∗ − ct∗ ) e dai valori della funzione
75
Figura 18: Dominio di dipendenza della soluzione dell’equazione delle onde
10.2 Discretizzazione
Adottiamo l’equazione (62) come esempio per mostrare la risoluzione alle diffe-
renze finite di un problema iperbolico.
Discretizzando il dominio con i punti (xi , tj ), xi = i∆x , tj = j∆t , i =
0, . . . , n + 1, j = 0, 1, . . . , m + 1, δx = 1/(n + 1), ∆t = tmax /(m + 1) e
approssimando le due derivate seconde con la formula (5) si ottiene
1 1
(ui,j+1 − 2ui,j + ui,j−1 ) = 2 r(ui+1,j − 2ui,j + ui−1,j ) + O(∆2t ) + O(∆2x ).
∆2t ∆t
2
∆t
con r = γ ∆x e con le condizioni al bordo
u0,j = un+1,0 = 0 j = 0, 1, . . . , m + 1
ui,0 = f (xi ), i = 1, . . . , n (64)
∆2t 00 3
ui,1 = f (xi ) + ∆t g(xi ) + 2 γf (xi ) + O(∆t ) i = 1, . . . , n
76
La terza condizione si ottiene nel seguente modo mediante uno sviluppo in serie
essendo ∂u(x, 0)/∂x = g(x):
0 1 0
r 2 − 2r r
0 1 0
e la soluzione nel punto (xi , tj ) dipende dai valori delle soluzioni nei pun-
ti (xi−1 , tj−1 ), (xi , tj−1 ), (xi+1 , tj−1 ) e (xi , tj−2 ). In figura 19 viene riporta-
ta in forma grafica questa dipendenza assieme alpdominio di dipendenza per
l’operatore discreto dove si è posto δ = ∆x /∆t = γ/r.
Si osservi che la soluzione discreta dipende dai valori delle funzioni f (x) e
g(x), che danno le condizioni iniziali, nell’intervallo [xi − δtj , xi + δtj ], mentre la
77
Figura 19: Dominio p
di dipendenza dell’operatore discreto per l’equazione delle
onde, δ = ∆x /∆t = γ/r
soluzione del problema continuo in (xi , tj ) dipende dai valori nell’intervallo [xi −
ctj , xi + ctj ]. Se δ < c il secondo intervallo include strettamente il primo per cui
esistono valori delle condizioni iniziali che alterano la soluzione della equazione
differenziale ma non alterano la soluzione dell’equazione alle differenze. Questo
fatto ci fa capire che se r > 1 non ci può essere convergenza. Infatti dimostriamo
ora che questa condizione è necessaria per la stabilità.
La stabilità e la convergenza dello schema dipendono dalla limitatezza della
norma dell’inversa della matrice Am,n del sistema (65). Supponiamo per sem-
plicità m pari e si partizioni Am,n in blocchi di dimensione 2n × 2n in modo che
risulti bidiagonale a blocchi. Vale allora
I2n
−H I2n
1 In 0 2n
An = 2 Im/2 ⊗ (
∆t −Vn In
. .. . ..
−H2n I2n
dove −1
I 0 I −Vn I −Vn
H2n = =
−Vn I 0 I Vn I − Vn2
n/2−1
Poiché nell’inversa di Am,n compare la matrice H2n , una condizione necessa-
ria di stabilità è ρ(H2n ) ≤ 1. Si ha che ρ(H2n ) ≤ 1 se e solo se gli autovalori λ di
Vn sono tali che −2 ≤ λ ≤ 2. Usando il teorema 5 si deduce che tale condizione
equivale a r(1 − cos(πi/(n + 1))) ≤ 2, per i = 1, . . . , n e per ogni n, cioè r ≤ 1.
Si può verificare che questa condizione di stabilità è anche sufficiente.
78
Un esempio di equazione differenziale classificata come iperbolica è data
dall’equazione di trasporto lineare
∂u ∂u
+a =0
∂t ∂x
dove a è una costante. Si può verificare che
risolve l’equazione di trasporto lineare dove u(x, 0) = g(x). Inoltre ogni soluzio-
ne è di questo tipo.
Si osservi che u(x, t) è costante lungo le rette di equazione x−at = γ. Quindi,
dato il punto (x∗ , t∗ ), vale u(x∗ , t∗ ) = u(x, t) per x − at = x∗ − at∗ . Queste rette
sono dette rette caratteristiche.
I punti di coordinate (x∗ + a(t − t∗ ), t) per 0 ≤ t ≤ t∗ , in cui la funzione vale
u(x∗ , t), formano il dominio di dipendenza continuo di u(x∗ , t∗ ).
La versione non omogenea è data da
∂u ∂u
+a = f (x, t)
∂t ∂x
dove f (x, t) è funzione sufficientemente regolare.
Il problema può essere formulato sul dominio rettangolare [0, `] × [0, T ] con
le condizioni u(x, 0) = α(x) per x ∈ [0, `] e u(0, t) = β(t) per t ∈ [0, T ].
Si possono dare varie discretizzazioni di questa equazione usando per ap-
prossimare le derivate spaziali e temporali differenze in avanti, all’indietro o
centrate in tutte le loro combinazioni. Posto ui,j = u(xi , tj ) dove tj = ∆t j e
xi = i∆x , con ∆x = `/n, ∆t = T /m, per i = 0, . . . , n, j = 0, . . . , m, l’operatore
differenziale può essere discretizzato dai seguenti schemi
a 1
(ui+1,j − ui,j ) + (ui,j+1 − ui,j ),
∆x ∆t
a 1
(ui+1,j − ui,j ) + (ui,j − ui,j−1 ),
∆x ∆t
a 1
(ui+1,j − ui,j ) + (ui,j+1 − ui,j−1 ),
∆x 2∆t
a 1
(ui+1,j − ui−1,j ) + (ui,j+1 − ui,j−1 ),
2∆x ∆t
a 1 1
(ui+1,j − (ui,j+1 + ui,j−1 )) + (ui,j+1 − ui,j−1 ).
∆x 2 2∆t
Questi schemi sono detti rispettivamente forward-forward, forward-backward,
forward-central, central-central o leapfrog. L’ultimo è invece lo schema di Lax-
Friedrichs.
Analizziamo ad esempio il primo schema e assumiamo per semplicità a < 0.
Si ordinano le incognite secondo l’ordinamento lessicografico
79
in modo che il vettore cosı̀ ottenuto può essere partizionato in m blocchi u(j) =
(ui,j )i=1,n per j = 1, . . . , n. Ponendo r = a∆∆x , la matrice del sistema allora
t
diventa
I
−S I
1 −S I
A=
∆t
. . . .
. .
−S I
dove
1+r −r
1+r −r
S=
.. ..
. .
1+r −r
1+r
è una matrice n × n. La matrice inversa è dunque
I
S I
2
−1 S S I
A = ∆t
.. . .. .. ...
.
.
S m−1 ... S2 S I
Se r ∈ (−1, 0), la matrice S è non negativa per cui anche l’inversa A−1 è non
negativa e la sua norma infinito è data da
m
X ∞
X
∆t k S i ek∞ ≤ ∆t k S i ek∞ = ∆t k(I − S)−1 ek∞
i=0 i=0
Ma vale
1 −1
1 −1
I − S = −r
.. ..
. .
1 −1
1
per cui
1 1 ... 1
.. ..
1 . .
(I − S)−1 = −r−1
..
. 1
1
Quindi k(I − S)−1 ek∞ = −r−1 n da cui,
∆x `
kA−1 k∞ ≤ −r−1 n∆t = − ∆t = −`/a
a∆t ∆x
80
essendo r−1 = ∆x /(a∆t ) e n = `/∆x . Cioè la norma dell’inversa è limitata
uniformemente da una costante. Questo garantisce stabilità e convergenza.
Nel caso a > 0 non ci sarebbe stata stabilità.
Lo stencil del caso forward-forward è il seguente dove l’asse orizzontale è
l’asse x, indicizzato da i e quello verticale è quello del tempo indicizzato da j.
Si osservi che, come risulta dallo stencil, il valore di ui,j dipende da ui,j−1
e da ui+1,j−1 cioè da (xi , tj−1 ) e (xi+1 , tj−1 ). Per cui il dominio di dipendenza
discreto per ui,j è formato da (xh , tk ) dove k ≤ j, h = i, . . . , i + k. Il dominio
di dipendenza discreto è mostrato in figura
81
sistema ottenuto rimuovendo l’errore locale e si ha
Si osservi che, come nel caso parabolico, la matrice A ha inversa con norma
limitata e etA ha norma limitata essendo gli autovalori di A numeri immaginari
puri. Questo fatto garantisce la stabilità del metodo.
Il metodo di semi-discretizzazione si applica efficacemente anche in presenza
di attrito viscoso nel modello. In questo caso l’equazione delle onde è del tipo
∂2u ∂2u ∂u
2
=γ 2 −a
∂t ∂x ∂t
dove il termine in cui compare la derivata prima rispetto al tempo esprime
l’azione resistente della forza di attrito di coefficiente a ≥ 0.
Nella versione semi-discreta il sistema di equazioni ordinarie diventa
v 00 = Av − av 0
82
La costruzione della matrice A in matlab si realizza facilmente col comando
AA = [zeros(n), eye(n); A, -a*eye(n)];
dove A è la matrice tridiagonale che discretizza la derivata seconda, su un reti-
colo di n punti, moltiplicata per γ. Nel caso di problemi multidimensionali A è
la matrice che discretizza il laplaciano sul dominio.
Si osserva che, poiché A è diagonalizzabile con autovalori λi negativi, gli
autovalori di A coincidono con l’unione degli autovalori di
0 1
λi −a
x2 + ax − λi = 0.
Queste soluzioni hanno parte reale negativa, per cui la matrice etA ha norma
limitata. Inoltre poiché −1
A−1
aA
A−1 =
I 0
e A ha norma limitata, ne segue che anche A−1 ha norma limitata. Quindi c’è
stabilità.
11 Note computazionali
I sistemi lineari ottenuti discretizzando equazioni differenziali alle derivate par-
ziali col metodo delle differenze finite sono generalmente a banda (a blocchi)
e sparsi. Nel caso in cui tali sistemi non siano triangolari (a blocchi) per cui
un metodo di sostituzione può risolvere in modo efficiente il sistema, è preferi-
bile usare un metodo iterativo. Nel caso delle equazioni di tipo ellittico in cui
la matrice del sistema è una M-matrice simmetrica, e quindi definita positiva,
il metodo iterativo più indicato è il metodo del gradiente coniugato (precon-
dizionato). Tale metodo, cosı̀ come molti altri, richiede ad ogni passo come
operazione più costosa il calcolo del prodotto matrice vettore. Ad esempio, nel
caso della matrice Am,n che discretizza il laplaciano cambiato di segno su un ret-
tangolo, il prodotto y = h2 Am,n x si realizza con le seguenti semplici istruzioni
nella sintassi tipo Matlab.
for i=1:m
for j=1:n
y(i+1,j+1)=4*x(i+1,j+1)-x(i,j+1)-x(i+2,j+1)-x(i+1,j)-x(i+1,j+2);
end
end
Si osservi che nel doppio ciclo for abbiamo dovuto aumentare di 1 i valori
degli indici delle variabili x e y. Infatti, Matlab richiede indici positivi. In
altri termini il valore di ui,j è memorizzato nella variabile x(i + 1, j + 1) per
i = 0, . . . , m + 1, j = 0, . . . , n + 1.
83
Si osservi ancora che nel doppio cilco for intervengono punti che stanno
sul bordo del dominio. Questi possono essere rimossi assegnando il valore zero
alle componenti di bordo di x. Nel caso in cui il metodo iterativo richieda il
calcolo del residuo Am,n x − b è conveniente assegnare ai valori di bordo della
variabile x i valori al contorno del problema. In questo modo il calcolo svolto
nel doppio cilco for non corrisponde alla sola moltiplicazione di hAm,n per il
vettore incognito ma include anche la parte del termine noto che contiene le
condizioni al bordo.
Poiché Matlab è un linguaggio interpretato, l’esecuzione di due cicli for an-
nidati può richiedere un tempo di esecuzione elevato se i valori di m e n sono
“moderatamente grandi”. Un modo per ovviare a questo inconveniente è scrivere
il doppio ciclo in forma “vettoriale” nel modo seguente:
Nel caso in cui il dominio Ω non coincide col rettangolo ma è un suo sottoin-
sieme proprio, ad esempio un dominio di forma ad L o un quadrato con un foro
al suo interno di forma quadrata, è possibile modificare leggermente il program-
ma per il calcolo del prodotto matrice-vettore. Conviene introdurre una nuova
variabile dominio tale che dominio(i+1,j+1) vale 1 se il punto (xi , yj ) sta nel
dominio e vale 0 altrimenti. Il doppio ciclo for si trasforma in modo semplice in
for i=1:m
for j=1:n
if dominio(i+1,j+1)
y(i+1,j+1)=4*x(i+1,j+1)-x(i,j+1)-x(i+2,j+1)-x(i+1,j)-x(i+1,j+2);
end
end
end
84
Figura 20: Configurazione di equilibrio di una membrana elastica (bolla di sa-
pone) calcolata col metodo del gradiente coniugato applicato al sistema linea-
re ottenuto discretizzando l’equazione di Laplace su un dominio “bucato” con
condizioni di Dirichlet
85
Figura 21: Configurazione di equilibrio di una membrana elastica a supporto
quadrato con condizioni nulle su due lati opposti e pari a x(1 − x) sui rimanenti
due lati.
86
Listing 9: Risoluzione del problema ∆u = 0 su un rettangolo mediante differenze
finite utilizzando il metodo iterativo di Richardson.
function v = poisson_richardson(f)
% function v = poisson_richardson(f)
% risolve il problema di Poisson su [0,1]x[0,1] con termine noto f(x,y)
% col metodo delle differenze finite
% f e’ matrice (m+2)x(n+2), sulla prima e utima riga e colonna contiene
% le condizioni al bordo, nella parte rimanente contiene i valori di
% f(x,y) nei punti della griglia
% v e’ una matrice (m+2)x(n+2) con i valori della soluzione, bordo
incluso
% Il sistema lineare Av = f e’ risolto con l’iterazione di
% Richardson: v_{k+1}=v_k-alfa*(Av_k-f) dove 0 < alfa <= 2/||A||
% Il residuo Av-f viene calcolato in ’modo vettoriale’
% Il termine noto appare implicitamente attraverso le condizioni al
% contorno date dalle righe e colonne estreme della matrice di input v
maxit = 2000; epsi = 1.e-6;
m = size(f,1); n = size(f,2);
n = n-2; m = m-2;
hy = 1/(m+1); hx = 1/(n+1);
rhx = 1/hx^2; rhy = 1/hy^2;
alpha = 2/(4*rhy+4*rhx);
v = f;
% risolvo il sistema -A v = -f
f(2:m+1,2:n+1) = -f(2:m+1,2:n+1);
for it=1:maxit
sy = (2*v(2:m+1,2:n+1)-v(1:m,2:n+1)-v(3:m+2,2:n+1))*rhy;
sx = (2*v(2:m+1,2:n+1)-v(2:m+1,1:n)-v(2:m+1,3:n+2))*rhx;
r = sx + sy - f(2:m+1,2:n+1);
r = r*alpha;
err = max(max(abs(r)));
disp([it err]);
v(2:m+1,2:n+1) = v(2:m+1,2:n+1)-r;
if err<epsi
break
end
end
mesh(v); % disegna la posizione di equilibrio della membrana
% per salvare la figura scommentare l’istruzione che segue
% print ’bolla.jpg’ -djpg
end
87
Figura 23: Configurazione di equilibrio di una membrana elastica pesante vin-
colata ad un bordo circolare a quota 0 e ad un bordo circolare interno a quota
più elevata.
problema è individuato dalla matrice dominio i cui elementi valgono 1 nei punti
interni al dominio, valgono 0 altrove. L’iterazione di Richardson si ripete in
modo analogo al caso del dominio rettangolare con la differenza che l’iterazione
non viene aggiornata nei punti fuori dal dominio e che i punti esterni al dominio
non contribuiscono al prodotto matrice vettore se non quelli di bordo. Ciò si
realizza moltipicando
La function riportata nel listing 11 risolve l’equazione del calore col metodo
del paragrafo 9.1 che è stabile se r < 1/2.
Calcolando la soluzione con T = 1, γ = 32.4, u(0, t) = u(1, t) = 1, u(x, 0) =
0, e scegliendo n = 40, m = 100 si ha instabilità essendo r = 0.51883 e si ottiene
la figura 24.
Scegliendo invece γ = 34 si ha r < 1/2 per cui il metodo è stabile. La
soluzione calcolata in questo caso è mostrata in figura 25.
Le function riportate nei listati seguenti sono prive di commento. Il comm-
neto è lo stesso riportato nella function 11.
Il listato 12 riporta lo stesso metodo implementato però in forma vettoriale.
Il codice in questa forma è più efficiente.
La function riportata nel listato 13 risolve l’equazione del calore col metodo
ottenuto discretizzando la derivata prima con una differenza all’indietro. Il
metodo è incondizionatamente stabile.
88
Listing 10: Risoluzione del problema di Poisson ∆u = f in un dominio contenuto
in un quadrato mediante differenze finite e iterazione di Richardson.
function v = poisson_richardson2(f,dominio)
% function v = poisson_richardson2(f)
% risolve il problema di Poisson su un dominio contenuto in [0,1]x[0,1]
con
% termine noto f(x,y) col metodo delle differenze finite
% f e’ matrice (m+2)x(n+2), sul bordo del dominio contiene
% le condizioni al contorno, nella parte rimanente contiene i valori di
% f(x,y) nei punti della griglia
% dominio e’ una matrice (m+2)x(n+2) che vale 1 nei punti interni al
dominio
% vale 0 nei punti esterni o di bordo
% v e’ una matrice (m+2)x(n+2) con i valori della soluzione nei punti del
% dominio, bordo incluso, mentre vale 0 fuori del dominio
% Il sistema lineare Av = f e’ risolto con l’iterazione di
% Richardson: v_{k+1}=v_k-alfa*(Av_k-f) dove 0 < alfa <= 2/||A||
% Il residuo Av-f viene calcolato in ’modo vettoriale’
% Il termine noto appare implicitamente attraverso le condizioni al
% contorno date dalle righe e colonne estreme della matrice di input v
maxit = 2000; epsi = 1.e-6;
m = size(f,1); n = size(f,2);
n = n-2; m = m-2;
hy = 1/(m+1); hx = 1/(n+1);
rhx = 1/hx^2; rhy = 1/hy^2;
alpha = 2/(4*rhy+4*rhx);
v = f;
% risolvo il sistema -A v = -f
f(2:m+1,2:n+1) = -f(2:m+1,2:n+1);
for it=1:maxit
sy = (2*v(2:m+1,2:n+1)-v(1:m,2:n+1)-v(3:m+2,2:n+1))*rhy;
sx = (2*v(2:m+1,2:n+1)-v(2:m+1,1:n)-v(2:m+1,3:n+2))*rhx;
r = sx + sy - f(2:m+1,2:n+1);
r = r*alpha;
r = r.*dominio(2:end-1,2:end-1);
err = max(max(abs(r)));
disp([it err]);
v(2:m+1,2:n+1) = v(2:m+1,2:n+1)-r;
if err<epsi
break
end
end
mesh(v); % disegna la posizione di equilibrio della membrana
% per salvare la figura scommentare l’istruzione che segue
% print ’bolla.jpg’ -djpg
end
89
Listing 11: Risoluzione dell’equazione del calore mediante differenze finite con
la derivata prima approssimata da una differenza in avanti. Il metodo è stabile
se r ≤ 1/2.
function u = calore_fw(a, b, u0, g, T)
% function u = calore_fw(a, b, u0, T)
% calcola la soluzione u(x,t) dell’equazione del calore
% g*u_t-u_xx = 0 su [0,1]x[0:T]
% con valori al bordo u(0,t)=a(t), u(1,t)=b(t), u(x,0) = u0(x)
% la soluzione u(x,t) viene data come matrice (n+2)xm
% dove u_{i,j}=u(x_i,t_j)
% metodo usato: differenze finite con differenza in avanti
n = length(u0); m = length(a);
Dx = 1/(n+1); Dt = T/m;
r = Dt/(g*Dx^2);
u = zeros(n+2,m); u(2:n+1,1) = u0; u(1,:) = a; u(n+2,:) = b;
if r>1/2
disp(’WARNING: il metodo non e’ stabile’)
r
end
% risolvo
for j=1:m-1
for i=2:n+1
u(i,j+1)=r*(u(i+1,j)+u(i-1,j))+(1-2*r)*u(i,j);
end
end
mesh(u);
end
90
Figura 24: Soluzione dell’equazione del calore: caso instabile
91
Listing 12: Risoluzione dell’equazione del calore mediante differenze finite con
la derivata prima approssimata da una differenza in avanti. Versione vettoriale.
function u = calore_fwv(a, b, u0, g, T)
% metodo usato: differenze finite con differenza in avanti
n = length(u0); m = length(a);
Dx = 1/(n+1); Dt = T/m; r = Dt/(g*Dx^2);
u = zeros(n+2,m); u(2:n+1,1) = u0; u(1,:) = a; u(n+2,:) = b;
if r>1/2
disp(’WARNING: il metodo non e’ stabile’); disp(r)
end
% risolvo
for j=1:m-1
u(2:n+1,j+1)=r*(u(3:n+2,j)+u(1:n,j))+(1-2*r)*u(2:n+1,j);
end
mesh(u);
La function riportata nel listato 13 risolve l’equazione del calore col metodo
di Crank-Nicolson.
La function riportata nel listato 15 risolve l’equazione del calore col meto-
do di semi-discretizzazione usando l’esponenziale di matrici. In questo caso le
condizioni al bordo devono essere nulle.
Nella figura 26 si riporta la soluzione ottenuta col metodo di Crank-Nicolson
scegliendo n = m = 400, a = b = 1, g = 1, t = 1/4, con una rappresentazione
data mediante colori.
92
Listing 13: Risoluzione dell’equazione del calore mediante differenze finite con
la derivata prima approssimata da una differenza all’indietro. Il metodo è
incondizionatamente stabile.
function u = calore_bw(a, b, u0, g, T)
% metodo usato: differenze finite con differenza all’indietro
n = length(u0); m = length(a);
Dx = 1/(n+1); Dt = T/m; r = Dt/(g*Dx^2);
u = zeros(n+2,m); u(2:n+1,1) = u0; u(1,:) = a; u(n+2,:) = b;
% costruisco blocco diagonale
vn = sparse(ones(n,1)); vn1 = sparse(ones(n-1,1));
A = (1+2*r)*diag(vn) - r*diag(vn1,1) - r*diag(vn1,-1);
% vettori e1, en della base canonica
e1 = zeros(n,1); en = e1; e1(1) = 1; en(n) = 1;
% risolvo
for j=1:m-1
u(2:n+1,j+1) = A\(u(2:n+1,j) + r*a(j+1)*e1 + r*b(j+1)*en);
end
mesh(u);
Listing 14: Risoluzione dell’equazione del calore mediante differenze finite con
il metodo di Crank-Nicolson.
function u = calore_CN(a, b, u0, g, T)
% metodo usato: Crank-Nicolson
n = length(u0); m = length(a);
Dx = 1/(n+1); Dt = T/m; r = Dt/(2*g*Dx^2);
u = zeros(n+2,m); u(2:n+1,1) = u0; u(1,:) = a; u(n+2,:)=b;
% costruisco matrice diagonale A e sottodiagonale B
vn = sparse(ones(n,1)); vn1 = sparse(ones(n-1,1));
A = (1+2*r)*diag(vn) - r*diag(vn1,1) - r*diag(vn1,-1);
B = (1-2*r)*diag(vn) + r*diag(vn1,1) + r*diag(vn1,-1);
% risolvo
u(2:n+1,2)=A\(B*u(2:n+1,1));
for j=2:m-1
w = r*(a(j+1) + a(j))*e1 + r*(b(j + 1) + b(j))*en;
u(2:n+1,j+1) = A\(B*u(2:n+1,j) + w);
end
mesh(u);
93
Listing 15: Risoluzione dell’equazione del calore mediante semi-discretizzazione
e uso della funzione esponenziale di matrice.
function u = calore_exp(a, b, u0, g, T)
% metodo usato: funzione expm
n = length(u0); m = length(a); dt = T/m;
a = zeros(n,1); a(1)=-2; a(2)=1; a=a*(n+1)^2/g;
A = toeplitz(a); B = expm(dt*A);
u = zeros(n+2,m); u(2:n+1,1) = u0;
for i=2:m
u0 = B*u0; u(2:n+1,i) = u0;
end
Figura 26: Soluzione dell’equazione del calore ottenuta col metodo di Crank-
Nicolson con n = m = 400. I colori danno il livello di temperatura.
94
nei punti di un reticolo, e sostituire alle derivate prime e seconde degli operatori
discreti dati dalle matrici tridiagonali o bidiagonali come già fatto per i problemi
standard.
In questo modo il residuo r(ui,j ) è una applicazione non lineare dallo spazio
delle matrici m × n in sé. E possiamo utilizzare l’iterazione di Richardson nella
forma discreta.
Una trattazione adeguata di questo problema non lineare comporta una ana-
lisi di stabilità, e una analisi di convergenza del metodo di Richardson. Que-
st’ultima in particolare è agevole se lo Jacobiano J di r(ui,j ) è definito positivo
(scegliendo α > 0) o negativo (scegliendo α < 0) con |α| sufficientemente pic-
colo. Infatti in questo caso lo jacobiano dell’iterazione discreta non lineare di
Richardson è I − αJ e ha raggio spettrale minore di 1 per |α| sufficientemente
piccolo ma non zero.
Possiamo provare a implementare questa iterazione e a controllare la conver-
genza. Ottenere una soluzione discreta in cui il residuo ha una norma piccola
ci garantisce una approssimazione della soluzione del problema discreto. Nel
caso ci sia stabilità, questa garantisce una buona approssimazione del probema
continuo.
Le due function che seguono implementano il metodo di Richardson. Nella
prima il residuo è il membro sinistro dell’equazione di Eulero-Lagrange e per
convergere richiede valori numerici di alpha molto piccoli che comportano un
numero elevato di iterazioni.
La seconda function usa come residuo una espressione diversa che ora de-
scriviamo. Riformuliamo l’equazione di Eulero-Lagrange nel modo seguente
2 2 2 2
∂2u ∂2u ∂u ∂ u ∂u ∂ u ∂u ∂u ∂ 2 u
+ = − − + 2 =: f (x, y)
∂x2 ∂y 2 ∂y ∂x2 ∂x ∂y 2 ∂x ∂y ∂x∂y
Denotiamo con v(x, y) la soluzione de problema di Laplace
∆v = f (x, y)
2 2
∂2u ∂2u ∂u ∂u ∂ 2 u
∂u ∂u
(1 + )+ (1 + )=2 =: f (x, y)
∂x2 ∂y ∂y 2 ∂x ∂x ∂y ∂x∂y
definire v la soluzione del problema lineare
2 2
∂2v ∂v ∂2v ∂v
(1 + ) + 2 (1 + ) = f (x, y)
∂x2 ∂y ∂y ∂x
95
Listing 16: Risoluzione dell’equazione di Eulero-Lagrange col metodo di
Richardson: prima versione.
function [u,b,A] = EuleroLagrange1(f, k, alpha)
% risolve equazione uxx(1+uy^2)+uyy(1+ux^2)-2ux*uy*uxy=f(x,y)
% con iterazione di richardson
% u = u +alpha*(uxx(1+uy^2)+uyy(1+ux^2)-2ux*uy*uxy-f(x,y))
% f e’ (m+2)x(n+2) sul bordo ha le condiz al contorno
% nella parte interna il termine noto
[mm,nn] = size(f); m = mm-2; n = nn-2;
% m; n; dimensioni parte interna
hx = 1/(m+1); hy = 1/(n+1);
% costruisco le matrici delle derivate seconde
aux1 = ones (mm-2,1)*[1,-2,1]/hx^2;
D2x = spdiags(aux1,[0,1,2],mm-2,mm);
aux1 = ones (nn-2,1)*[1,-2,1]/hy^2;
D2y = spdiags(aux1,[0,1,2],nn-2,nn);
% costruisco le matrici delle derivate prime
aux1 = ones (mm-2,1)*[-1,0,1]/(2*hx);
Dx = spdiags(aux1,[0,1,2],mm-2,mm);
aux1 = ones (nn-2,1)*[-1,0,1]/(2*hy);
Dy = spdiags(aux1,[0,1,2],nn-2,nn);
% valore iniziale u
u = poisson(f);
% itero
for i = 1 : k
% costruisco residuo
r = -f(2:end-1,2:end-1);
ay = ones(mm-2,nn)+(Dx*u).^2; ay=ay(:,2:nn-1);
ax = ones(mm,nn-2)+(u*Dy’).^2; ax=ax(2:mm-1,:);
sxu = Dx*u; syu = u*Dy’;
sxu = sxu(:,2:end-1); syu =syu(2:end-1,:);
axy = 2*sxu.*syu;
uxy = Dx*u*Dy’;
uxx = D2x*u; uyy = u*D2y’;
uxx = uxx(:,2:end-1); uyy = uyy(2:end-1,:);
r = r-axy.*uxy+uxx.*ay+uyy.*ax;
err = norm(r,inf)
u(2:end-1,2:end-1) = u(2:end-1,2:end-1)+alpha*r;
if err<1.e-13
disp(’numero iterazioni’); i
break
end
end
end
96
Listing 17: Risoluzione dell’equazione di Eulero-Lagrange col metodo di
Richardson: seconda versione.
function [u,b,A] = Eulero-Lagrange2(f, k,alpha)
% risolve equaz uxx(1+uy^2)+uyy(1+ux^2)-2ux*uy*uxy=f(x,y)
% con iterazione u=u-alpha*r
% dove il residuo r e’ dato da r=u-w con
% w= Laplaciano^{-1}( 2ux*uy*uxy-uxx*(uy)^2-uyy*(ux)^2 +f(x,y))
% f e’ (m+2)x(n+2) sul bordo ha le condiz al contorno
% nella parte interna il termine noto
[mm,nn] = size(f); m = mm-2; n = nn-2;
% m; n; dimensioni parte interna
hx = 1/(m+1); hy = 1/(n+1);
% costruisco matrici derivata seconda
aux1 = ones (mm-2,1)*[1,-2,1]/hx^2;
D2x = spdiags(aux1,[0,1,2],mm-2,mm);
aux1 = ones (nn-2,1)*[1,-2,1]/hy^2;
D2y = spdiags(aux1,[0,1,2],nn-2,nn);
% costruisco matrici derivata prima
aux1 = ones (mm-2,1)*[-1,0,1]/(2*hx);
Dx = spdiags(aux1,[0,1,2],mm-2,mm);
aux1 = ones (nn-2,1)*[-1,0,1]/(2*hy);
Dy = spdiags(aux1,[0,1,2],nn-2,nn);
% valore iniziale u
u = poisson(f);
% itero
for i = 1 : k
% costruisco termine noto
B = f;
ay = ones(mm-2,nn)+(Dx*u).^2; ay=ay(:,2:nn-1);
ax = ones(mm,nn-2)+(u*Dy’).^2; ax=ax(2:mm-1,:);
sxu = Dx*u; syu = u*Dy’;
sxu = sxu(:,2:end-1); syu =syu(2:end-1,:);
axy = 2*sxu.*syu; uxy = Dx*u*Dy’;
uxx = D2x*u; uyy = u*D2y’; uxx = uxx(:,2:end-1);
uyy = uyy(2:end-1,:);
B(2:end-1,2:end-1) = B(2:end-1,2:end-1)+axy.*uxy-uxx.*ay-uyy.*ax;
% risolvo problema di Poisson
v = poisson(B);
err = norm(u-v,inf)
res = u-v;
u = u-alpha*res;
if err<1.e-13
disp(’numero iterazioni’); i
break
end
end
end
97
Figura 27: Soluzione dell’equazione non lineare di Eulero-Lagrange.
e porre r(u) = u − v.
Ad esempio, con i dati forniti dallo script seguente
m = 40; n = 40;
f = zeros(m,n);
f(1:end,1) = sin(pi*[0:m-1]’/(m-1));
f(1,1:end) = sin(pi*[0:n-1]/(n-1));
occorrono 41098 iterazioni col primo metodo con α = 1.9 · 10−5 e 65 iterazioni
col secondo metodo con α = 1.4 · 10−1 per avere un residuo di norma inferiore
a 10−10 .
le figure ?? e ?? riportano il grafico della superficie minima e il grafico della
differenza tra la superficie minima e quella fornita dalla linearizzazione ottenuta
col laplaciano.
È abbastanza facile realizzare una function che simula la propagazione di
un’onda in un dominio bidimensionale risolvendo numericamente l’equazione
delle onde con attrito viscoso
∂2u ∂2u ∂u
2
= g 2
−a .
∂t ∂x ∂t
su un dominio rettangolare. La function del listato ?? realizza questo.
Con un po’ più di impegno si riesce a modificare la function per animare
un’onda che si propaga in un dominio arbitrario contenuto in un rettangolo. Un
esempio di function è riportata nel listato ??.
98
Listing 18: Animazione di un’onda che si propaga su un dominio bidimensionale.
function animazione_rettangolo(g, a, p, v, s)
% traccia l’animazione di un’onda su un dominio rettangolare
% risolvendo l’equazione delle onde u_tt = g*u_xx - a*u_x
% mediante l’esponenziale di matrice con Delta_t=1/16000
% In INPUT
% g: rapporto costante elastica/massa (valore costante)
% a: rapporto costante di attrito/massa (valore costante)
% p, v: posizione e velocita’ iniziale
% s: numero di secondi
% costruisco la matrice A
n = size(p,1); n2=n^2;
S = 2*eye(n)- diag(ones(n-1,1),1)-diag(ones(n-1,1),-1);
K = kron(eye(n),S)+kron(S,eye(n)); Dx = 1/(n+1);
K =(1/Dx^2)*K;
A = [zeros(n2),eye(n2); -g*K, -a*eye(n2)];
% formo il vettore delle condizioni iniziali
p=vec(p); v=vec(v); y = [p;v];
% Simulazione
nt = round(s*16000); deltat = 1/16000;
disp(’Calcolo esponenziale di matrice’)
B = expm(deltat*A);
% traccio posizione iniziale
V = zeros(n+2,n+2); V(2:n+1,2:n+1) = reshape(p,n,n);
% traccio il grafico della configurazione iniziale
mesh(V)
axis([0,n+2,0,n+2,-5,5])
disp(’Premere un tasto per iniziare la simulazione’)
pause
for j=1:nt
y = B*y;
w=ones(n^2,1)*1; w = y(1:n2);
V(2:n+1,2:n+1) = reshape(w,n,n);
% traccio il grafico della configurazione all’istante generico
mesh(V)
axis([0,n+2,0,n+2,-5,5])
pause(0.0001)
end
99
Listing 19: Animazione di un’onda che si propaga su un dominio bidimensionale.
function animazione_onda(dom, g, a, p, v, s)
% traccia l’animazione di un’onda su un dominio bidimensionale
% risolvendo l’equazione delle onde u_tt = g*u_xx - a*u_x
% mediante l’esponenziale di matrice con Delta_t=1/16000
% In INPUT
% dom: dominio
% g: rapporto costante elastica/massa (valore costante)
% a: rapporto costante di attrito/massa (valore costante)
% p, v: posizione e velocita’ iniziale
% s: numero di secondi
% costruisco la matrice A
n = size(p,1);
S = 2*eye(n)- diag(ones(n-1,1),1)-diag(ones(n-1,1),-1);
K = kron(eye(n),S)+kron(S,eye(n)); Dx = 1/(n+1); K =(1/Dx^2)*K;
% calcolo la sottomatrice relativa ai punti del dominio
ind = find(dom==1);
n2 = length(ind);
Kd = K(ind,ind);
A = [zeros(n2),eye(n2); -g*Kd, -a*eye(n2)];
% formo il vettore delle condizioni iniziali
p=vec(p); p = p(ind);
v=vec(v); v = v(ind);
y = [p;v];
% Simulazione
nt = round(s*16000);
deltat = 1/16000;
disp(’Calcolo esponenziale di matrice’)
B = expm(deltat*A);
% traccio posizione iniziale
V = zeros(n+2,n+2);
w=ones(n^2,1)*1;
w(ind) = y(1:n2);
V(2:n+1,2:n+1) = reshape(w,n,n);
% traccio il grafico della configurazione iniziale
mesh(V)
axis([0,n+2,0,n+2,-5,5])
disp(’Premere un tasto per iniziare la simulazione’)
pause
for j=1:nt
y = B*y;
w=ones(n^2,1)*1; w(ind) = y(1:n2);
V(2:n+1,2:n+1) = reshape(w,n,n);
% traccio il grafico della configurazione all’istante generico
mesh(V)
axis([0,n+2,0,n+2,-5,5])
pause(0.0001)
end
100
Figura 28: Differenza tra la soluzione dell’equazione non lineare di
Eulero-Lagrange e la soluzione del problema linearizzato mediante laplaciano.
Riferimenti bibliografici
[1] D. Bini, M. Capovani, O. Menchi, Metodi Numerici per l’Algebra Lineare.
Zanichelli, Bologna, 1987.
[2] Garrett Birkhoff and Robert E. Lynch, Numerical Solution of Elliptic
Problems. SIAM, Philadelphia 1984.
[3] J.F. Botha and G.F Pinder, Fundamental Concepts in the Numerical
Solution of Differential Equations, John Wiley & Sons, 1983.
[4] Eugene Isaacson and Herbert Bishop Keller, Analysis of Numerical
Methods. John Wiley & Sons, Inc., New York, 1966.
[5] A. R. Mitchell and D.F. Griffiths, The Finite Difference Method in Partial
Differential Equations. John Wiley & Sons, New York 1980.
101
[9] Richard Barret et Al., Templates For the Solution of Li-
near Systems: Building Blocks For Iterative Methods.
http://www.netlib.org/linalg/html templates/Templates.html
102