Sei sulla pagina 1di 7

Laboratorio 3

Risoluzione di sistemi di Equazioni Lineari:


Metodi Iterativi
c
°2010 - Questo testo (compresi i quesiti ed il loro svolgimento) è coperto da diritto d’autore. Non può essere sfruttato a fini commerciali
o di pubblicazione editoriale. Non possono essere ricavati lavori derivati. Ogni abuso sarà punito a termine di legge dal titolare del diritto.
This text is licensed to the public under the Creative Commons Attribution-NonCommercial-NoDerivs2.5 License
(http://creativecommons.org/licenses/by-nc-nd/2.5/)

Metodi iterativi lineari


Come visto a lezione, una strategia per implementare un metodo iterativo per la risoluzione
del sistema lineare Ax = b consiste nell’effettuare lo splitting della matrice A, dalla forma

A = P − (P − A)

dove P è una opportuna matrice non singolare detta precondizionatore. Con questa notazione,
risolvere Ax = b è equivalente a risolvere

P x = (P − A)x + b,

identità che suggerisce la definizione del metodo iterativo: assegnato x(0) , ottenere x(k+1) per
k ≥ 0 risolvendo i sistemi

P x(k+1) = (P − A)x(k) + b, k ≥ 0.

La matrice di iterazione per tali metodi risulta quindi essere B = P −1 (P − A) = I − P −1 A.


Il metodo iterativo può anche essere posto nella forma
³ ´
P x(k+1) − x(k) = r(k) (1)

dove r(k) = b − Ax(k) è il residuo alla k-esima iterazione. Questo metodo richiede ad ogni
passo di trovare il cosiddetto residuo precondizionato z(k) dato dalla soluzione del sistema
lineare
P z(k) = r(k) , (2)
di conseguenza, la nuova iterata è definita da x(k+1) = x(k) + z(k) , e la matrice P , oltre ad
essere non singolare, deve essere scelta in modo tale che il costo computazionale richiesto dalla
risoluzione del sistema (2) sia basso.
Si ricorda che la relazione ricorsiva per l’errore e(k) = x − x(k) , al passo k, è:

e(k+1) = Be(k) . (3)

Metodo di Jacobi
Consiste nello scegliere come precondizionatore la matrice diagonale D rappresentata dagli
elementi diagonali di A. Tale matrice è facilmente invertibile, se gli aii 6= 0, i = 1, · · · , n, in

1
quanto:
   
a11 0 0 ··· 0 1/a11 0 0 ··· 0
 0 a22 0 ··· 0  0 1/a22 0 ··· 0 
   
 .. .. .. ..  .. .. .. .. 
D=
 . 0 . .  =⇒ D−1
 . =
 . 0 . . . 

 .. .. .. ..   .. .. .. .. 
 . . . . 0   . . . . 0 
0 0 ··· 0 ann 0 0 ··· 0 1/ann

e il metodo può essere scritto direttamente in forma matriciale:

x(0) assegnato
z(k) = D−1 r(k) , k≥0 (4)
x(k+1) = x(k) + z(k) .

Esplicitando il calcolo di ogni singola componente della soluzione si ottiene:


 
Xn
(k+1) 1  (k) 

xi = bi − aij xj , i = 1, ..., n. (5)
aii  j=1
j6=i

Metodo di Gauss-Seidel
(k+1)
Questo metodo si differenzia dal metodo di Jacobi per il fatto che nel calcolo di xi vengono
(k+1)
utilizzate le nuove componenti già disponibili xj , j = 1, · · · , i − 1. Si modifica allora il
metodo di Jacobi come segue: per k ≥ 0
 
i−1
X X n
(k+1) 1 bi − (k+1) (k)
xi = aij xj − aij xj  , i = 1, . . . , n. (6)
aii
j=1 j=i+1

che equivale ad aver scelto la parte triangolare inferiore L della matrice A come precondizio-
natore.  
a1,1 0 0 ··· 0
 a2,1 a2,2 0 ··· 0 
 
 .. .. .. .. 

L= . a3,2 . . . 

 .. .. .. .. 
 . . . . 0 
an,1 an,2 · · · an,n−1 an,n
La corrispondente forma matriciale

x(0) assegnato
Lz(k) = r(k) , k≥0 (7)
x(k+1) = x(k) + z(k)

evidenzia il fatto che ad ogni iterazione del metodo si risolve un sistema triangolare inferiore.

2
Metodo del gradiente e del gradiente coniugato
Ad ogni sistema lineare Ax¡= b, con ¢ A simmetrica e definita positiva, si può associare una
forma quadratica ϕ(x) = 12 xT Ax − xT b, il cui punto di minimo x∗ è proprio la soluzione
del sistema lineare, cioè Ax∗ = b (che esprime la condizione ∇ϕ = 0).
È possibile quindi costruire dei metodi iterativi che, ad ogni passo, procedano verso il minimo
della forma quadratica secondo il seguente schema:

x(k+1) = x(k) + αk r(k) , k ≥ 0, αk 6= 0, (8)

dove il residuo r(k) rappresenta la direzione di discesa ed αk è un parametro di ªaccelerazione.


© (k)
Lo scopo di αk è migliorare le proprietà di convergenza della successione x .
I metodi iterativi scritti nella forma (8) prendono il nome di metodi di Richardson. Il metodo
si definisce stazionario nel caso in cui αk = α, con α costante assegnata, dinamico nel caso
in cui αk possa cambiare ad ogni iterazione.
Se A è simmetrica e definita positiva è possibile ottenere ad ogni iterazione il minimo locale
nella direzione di discesa scegliendo il parametro αk nel modo seguente:

(r(k) )T r(k)
αk = , ∀k ≥ 0.
(r(k) )T Ar(k)

In questo modo si ottiene il metodo del gradiente, il cui algoritmo è: dato x(0) assegnato, si
ponga r(0) = b − Ax(0) e per k = 0, 1, . . .

(r(k) )T r(k)
αk =
(r(k) )T Ar(k)
x(k+1) = x(k) + αk r(k)
r(k+1) = r(k) − αk Ar(k) .

fino a quando non viene raggiunta una certa tolleranza o un massimo numero di iterazioni.
Si può dimostrare che le direzioni utilizzate dal metodo del gradiente sono ortogonali, ovvero
tali che (r(k+1) )T r(k) = 0. Questa proprietà in generale non è valida per due direzioni non
consecutive (cioè, ad esempio, (r(3) )T r(1) 6= 0), e quindi il metodo del gradiente non è ancora
ottimale.
Si introduce quindi il metodo del gradiente coniugato: in questo metodo si costruiscono itera-
tivamente delle direzioni p(k) in modo che siano tutte A-ortogonali fra loro: (Ap(j) )T p(k+1) =
0, j = 0, 1, ..., k.
Questa proprietà è decisiva, in quanto si può dimostrare che il gradiente coniugato converge
alla soluzione esatta in al più n passi, se A ∈ Rn×n e b ∈ Rn , ed ammesso di riuscire a lavorare
in aritmetica esatta.
L’algoritmo che implementa il metodo del gradiente coniugato è il seguente: dato x(0) asse-

3
gnato, si ponga r(0) = b − Ax(0) e p(0) = r(0) , quindi per k = 0, 1, ...

(p(k) )T r(k)
αk =
(p(k) )T Ap(k)
x(k+1) = x(k) + αk p(k)
r(k+1) = rk − αk Ap(k)
(Ap(k) )T r(k+1)
βk =
(Ap(k) )T Ap(k)
p(k+1) = r(k+1) − βk p(k)

fino a quando non viene raggiunta una certa tolleranza o un massimo numero di iterazioni.

Esercizio 1
Si consideri la seguente matrice pentadiagonale A ∈ R100×100 :
 
4+β −1 −1
 
 −1 4+β −1 −1 
 
 
 −1 −1 4 + β −1 −1 
 
 .. .. .. .. .. 
A=  . . . . . 

 
 −1 −1 4 + β −1 −1 
 
 
 −1 −1 4+β −1 
 
−1 −1 4+β

1. Creare la matrice in Matlabr utilizzando il comando diag, dopo aver posto β = 0.1.
Determinare il numero di elementi non nulli tramite il comando nnz e visualizzare il
pattern di sparsità della matrice con il comando spy.
Convertire la matrice in formato sparso utilizzando il comando sparse e verificare la
differente occupazione di memoria nei due casi (in caso di matrici con struttura a banda
come quella nell’esempio, è possibile creare direttamente la matrice in formato sparso
con il comando spdiags 1 ).

2. Si costruiscano esplicitamente le matrici di iterazione BJ e BGS associate rispettiva-


mente ai metodi di Jacobi e Gauss–Seidel, a partire dallo splitting della matrice A (si
usino i comandi diag, tril e inv).
Si calcolino i relativi raggi spettrali ρ(BJ ) e ρ(BGS ), utilizzando il comando eig. La
condizione necessaria e sufficiente per la convergenza del metodo iterativo è soddisfatta
in entrambi i casi? Commentare, alla luce della teoria, i risultati ottenuti.
1
Il comando spdiags è una versione del comando diag che permette di creare matrici a struttura diagonale
direttamente in formato sparso, e con una sintassi più compatta. Ad esempio, provare a implementare:
b = ones(10,1); a=2*b; c=3*b;
T = spdiags([b a c], -1:1, 10, 10);

4
3. Utilizzare la funzione jacobi che implementa il metodo di Jacobi per un generico sistema
lineare Ax = b. I parametri in ingresso richiesti dalla funzione sono la matrice A, il
termine noto b, la guess iniziale x(0) , la tolleranza per il criterio d’arresto toll e il
numero massimo di iterazioni ammesse nmax.
La funzione restituisce la soluzione calcolata x, il numero di iterazioni effettuate k e un
vettore R contenente i residui normalizzati calcolati durante le iterazioni.
L’intestazione della funzione è:

[x,k,R] = jacobi(A,b,x0,toll,nmax)

Il criterio d’arresto utilizzato all’interno della funzione è basato sul residuo normalizzato,
ovvero l’algoritmo si arresta quando kr(k) k/kbk ≤ toll.
Si utilizzi quindi tale funzione per determinare la soluzione del sistema lineare Ax = b,
con b vettore di dimensione n:

b = [1, 1, · · · , 1]T .

Si ponga x(0) = [0, 0, ..., 0]T , toll = 10−10 e nmax = 1000.


4. Utilizzare la funzione gs che implementa il metodo di Gauss–Seidel nella forma matri-
ciale (7). I parametri in ingresso richiesti dalla funzione sono la matrice A, il termine
noto b, la guess iniziale x(0) , la tolleranza per il criterio d’arresto toll e il numero
massimo di iterazioni ammesse nmax.
La funzione restituisce la soluzione calcolata x, il numero di iterazioni effettuate k e un
vettore R contenente i residui normalizzati calcolati durante le iterazioni.
L’intestazione della funzione è:

[x,k,R] = gs(A,b,x0,toll,nmax).

Il criterio di arresto per l’algoritmo è kr(k) k/kbk ≤ toll.


Si ponga x(0) = [0, 0, ..., 0]T , toll = 10−10 e nmax = 1000. Si calcoli la soluzione tramite
la funzione gs.
5. Si confrontino i risultati ottenuti tramite i due metodi e si commentino i risultati ottenuti
considerando i raggi spettrali delle matrici di iterazione.
6. Si ponga ora β = −0.1 nella matrice A. Si utilizzino nuovamente i metodi di Jacobi
e Gauss-Seidel per risolvere il sistema lineare con i medesimi parametri scelti al punto
3. Si calcolino i raggi spettrali delle matrici di iterazione associate ai due metodi.
Commentare, alla luce della teoria, i risultati ottenuti.
7. Si ponga nuovamente β = 0.1 nella matrice A. Utilizzare le funzioni gradiente e
gradiente_con, che implementano rispettivamente il metodo del gradiente e del gra-
diente coniugato, per risolvere un generico sistema lineare Ax = b. I parametri in
ingresso richiesti dalle funzioni sono la matrice A, il termine noto b, la guess iniziale
x(0) , la tolleranza per il criterio d’arresto toll e il numero massimo di iterazioni am-
messe nmax.
Le funzioni restituiscono la soluzione calcolata x, il numero di iterazioni effettuate k e
un vettore R contenente i residui normalizzati calcolati durante le iterazioni.
Le intestazioni delle funzioni sono:

5
[x,k,R] = gradiente(A,b,x0,toll,nmax)
[x,k,R] = gradiente_con(A,b,x0,toll,nmax)

Il criterio d’arresto utilizzato all’interno delle funzioni è basato sul residuo normalizzato,
ovvero l’algoritmo si arresta quando kr(k) k/kbk ≤ toll.
Si utilizzino gli stessi parametri in ingresso scelti al punto 3 per determinare la soluzione
del sistema lineare Ax = b.

8. Si rappresenti in un unico grafico in scala semilogaritmica l’andamento dei residui nor-


malizzati calcolati durante le iterazioni da ognuno dei 4 metodi utilizzati. Commentare
il risultato ottenuto.

Esercizio per casa 1


Si consideri il seguente sistema di equazioni lineari:

Ax = b,

con:  
9 −3 1
−3 9 −3 1 
 
 1 −3 9 −3 1 
 

A= 1 −3 9 −3 1  (9)

 1 −3 9 −3 1 
 
 1 −3 9 −3
1 −3 9
e termine noto: £ ¤T
b= 7 4 5 5 5 4 7 .

1. Costruire la matrice A e il termine noto b.

2. La matrice A è a dominanza diagonale per righe?

3. La matrice A è simmetrica definita positiva?

4. Si calcoli la soluzione del sistema lineare tramite la funzione gs.

5. Si calcoli la soluzione del sistema anche con il metodo di Jacobi, e si confrontino il nu-
mero di iterazioni necessarie per arrivare a convergenza per i due metodi. Commentare
i risultati e si individui una stima corrispondente al numero di iterazioni necessarie per
l’abbattimento dell’errore in ciascun metodo.

6
Esercizio per casa 2
Si consideri il seguente sistema di equazioni lineari Au = b dove
 α 
2+ −1 0 ··· 0
 (n + 1)2 
 α .. 
 −1 2+ −1 . 
 (n + 1)2 
 
 
 .. 
 .. .. 
A= 0 −1 . . .  (10)
 
 
 
 .. .. .. 
 . . . −1 
 
 
 α 
0 ··· ··· −1 2+
(n + 1)2

e il termine noto b è:  


1
1  1 
 
b=  .. . (11)
(n + 1)2  . 
1

1. Si scelga n = 50, α = 104 e si assegni in Matlabr la matrice A e il termine noto b


corrispondenti alle formule (10) e (11).

2. Utilizzare la funzione gs per calcolare la soluzione u del sistema. Si scelga una tolleranza
toll= 10−8 , un vettore iniziale u(0) = [0, 0, . . . , 0]T e un numero massimo di iterazioni
nmax = 10000. Riportare il numero di iterazioni effettuate.

3. Ripetere i punti 1 e 2 nel caso in cui α = 0. Riportare il numero di iterazioni effettuate.

4. Calcolare il raggio spettrale della matrice di iterazione di Gauss-Seidel per i due valori
di α (indicazione: si utilizzi il comando eig per calcolare gli autovalori di una matrice).
Commentare il risultato in termini di velocità di convergenza, confrontandolo con il
numero di iterazioni ottenuto rispettivamente al punto 2 e al punto 3.

5. Calcolare il raggio spettrale della matrice di iterazione di Jacobi per i due valori di α.
In base alla teoria cosa si può dire sulla velocità di convergenza dei due metodi iterativi,
nel caso in esame?

6. Svolgere i punti 2, 3, 4 dell’esercizio risolvendo il sistema con il metodo di Jacobi (a


questo scopo si utilizzi la funzione jacobi). Commentare i risultati ottenuti in termini
di velocità di convergenza rispetto a quelli generati dal metodo di Gauss–Seidel.