Nota 4. Sistemi di equazioni algebriche lineari - Elettrotecnica
Nota 4. Sistemi di equazioni algebriche lineari - Elettrotecnica
Nota 4. Sistemi di equazioni algebriche lineari - Elettrotecnica
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>4.</strong> <strong>Sistemi</strong> <strong>di</strong> <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong><br />
La soluzione numerica della maggior parte dei problemi <strong>di</strong> interesse nell’ingegneria,<br />
anche molto complessi, si riduce alla soluzione <strong>di</strong> un sistema <strong>di</strong> <strong>equazioni</strong> <strong>algebriche</strong><br />
<strong>lineari</strong>. Ad esempio, i sistemi a parametri concentrati <strong>lineari</strong> in con<strong>di</strong>zioni stazionarie<br />
sono governati da <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong>. Inoltre, se si risolve un sistema <strong>di</strong><br />
<strong>equazioni</strong> <strong>algebriche</strong> non <strong>lineari</strong> con il metodo <strong>di</strong> Newton-Raphson ad ogni passo<br />
bisogna risolvere un sistema <strong>di</strong> <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong> (ve<strong>di</strong> <strong>Nota</strong> 5). Più in<br />
generale, la <strong>di</strong>scretizzazione <strong>di</strong> <strong>equazioni</strong> <strong>di</strong>fferenziali e integrali <strong>lineari</strong> porta alla<br />
soluzione <strong>di</strong> sistemi <strong>di</strong> <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong> (ve<strong>di</strong> <strong>Nota</strong> 2 e <strong>Nota</strong> 3).<br />
In questa <strong>Nota</strong> considereremo il seguente problema. Dato un vettore b !R n e una<br />
matrice A = a ij<br />
( ) , i, j = 1,2,...,n , si cerca un vettore x !R n tale che<br />
In forma compatta si ha<br />
" a11x1 + a12x2 + ... + a1nx n = b1 $ a21x1 + a22x2 + ... + a2nx n = b2 Ax = b ! #<br />
$<br />
..............................................<br />
% $ an1x1 + an2x 2 + ... + annxn = bn .<br />
n<br />
(<strong>4.</strong>1)<br />
! aijx j = bi i = 1,2,...,n . (<strong>4.</strong>2)<br />
j =1<br />
Il problema (<strong>4.</strong>1) è un sistema <strong>di</strong><br />
det( A)<br />
! 0 , si ha<br />
n <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong> in<br />
n incognite 1 . Se<br />
x = A !1 b (<strong>4.</strong>3)<br />
1 In queste Lezioni non considereremo il problema più generale in cui il numero <strong>di</strong> <strong>equazioni</strong> (vincoli) è<br />
<strong>di</strong>verso dal numero <strong>di</strong> incognite (gra<strong>di</strong> <strong>di</strong> libertà).<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
2<br />
( ) in<strong>di</strong>ca il determinante. In<br />
dove A !1 in<strong>di</strong>ca la matrice inversa della matrice A e det A<br />
MATLAB ® det( A)<br />
è l’istruzione per il calcolo del determinante e inv( A)<br />
è l’istruzione<br />
per il calcolo dell’inversa. Pertanto, risolvere il sistema (<strong>4.</strong>1) è, in un certo senso,<br />
equivalente a determinare l’inversa della matrice A .<br />
Esempio <strong>4.</strong>1<br />
La soluzione <strong>di</strong> un circuito resistivo lineare o <strong>di</strong> un circuito <strong>di</strong> impedenze si riduce<br />
alla soluzione <strong>di</strong> un sistema <strong>di</strong> <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong>. Questo è solo un esempio tra<br />
quelli più vicini a uno studente <strong>di</strong> ingegneria.<br />
Figura <strong>4.</strong>1 Un esempio <strong>di</strong> circuito resistivo lineare.<br />
Si consideri il circuito resistivo lineare descritto in Figura <strong>4.</strong>1. Risolviamolo<br />
applicando il metodo dei potenziali nodali. Poniamo uguale a zero il potenziale del nodo<br />
“0”, e 0 = 0 . In questo modo il potenziale del nodo “3” è noto, e 3 = E . Bisogna, allora,<br />
determinare i potenziali e 1 ed e 2 . Applicando la legge <strong>di</strong> Kirchhoff per le correnti ai<br />
no<strong>di</strong> “1” e “2” otteniamo, rispettivamente,<br />
" $ ( G1 + G2 + G3)e 1 ! G3e2 = G1E #<br />
%$ !G3e1 + ( G3 + G4 + G5 )e2 = G5E dove G h = 1 / R h per h = 1,5 . Questo è l’esempio più semplice <strong>di</strong> sistema <strong>di</strong> <strong>equazioni</strong><br />
<strong>algebriche</strong> <strong>lineari</strong>. Il sistema (<strong>4.</strong>4) può essere espresso nella forma matriciale (<strong>4.</strong>1). Si ha<br />
x = e 1 ,e 2<br />
( ) !G3 ( )<br />
A = G1 + G2 + G3 !G3 b = EG 1 ,EG 5<br />
(<strong>4.</strong>4)<br />
T<br />
, (<strong>4.</strong>5)<br />
G 3 + G 4 + G 5<br />
T<br />
, (<strong>4.</strong>6)<br />
. (<strong>4.</strong>7)
Siccome la matrice A è a dominanza <strong>di</strong>agonale stretta 2 si ha che det( A)<br />
! 0 , [<strong>4.</strong>1].<br />
<strong>4.</strong>1 Esistenza e unicità della soluzione<br />
3<br />
Prima <strong>di</strong> cercare <strong>di</strong> risolvere un’equazione bisogna sempre domandarsi se essa<br />
ammette soluzioni, e se la soluzione è unica. Si considerino le matrici A e A,b . Se il<br />
rango della matrice A è uguale al rango della matrice A,b ,<br />
rank( A)<br />
= rank( A,b ), (<strong>4.</strong>8)<br />
il sistema (<strong>4.</strong>1) ammette soluzioni. La soluzione è unica se rank( A)<br />
= n , cioè se la<br />
matrice A ha rango massimo. La matrice quadrata A ha rango massimo se e solo se il<br />
suo determinante è <strong>di</strong>verso da zero,<br />
det( A)<br />
! 0 . (<strong>4.</strong>9)<br />
( ) = rank A<br />
Siccome rank( A)<br />
= n implica rank A,b ( ), la (<strong>4.</strong>9) è con<strong>di</strong>zione necessaria<br />
e sufficiente per l’esistenza e l’unicità della soluzione del sistema <strong>di</strong> <strong>equazioni</strong> (<strong>4.</strong>1).<br />
Invece, se rank( A)<br />
! rank A,b<br />
( ) il sistema (<strong>4.</strong>1) non ammette soluzioni: in questo caso<br />
si <strong>di</strong>ce che il sistema è inconsistente. Ciò può accadere solo se rank A<br />
Assumeremo, salvo avviso contrario, che sia sempre verificata la con<strong>di</strong>zione (<strong>4.</strong>9).<br />
Il sistema (<strong>4.</strong>1) può essere risolto sia attraverso meto<strong>di</strong> <strong>di</strong>retti che attraverso meto<strong>di</strong><br />
iterativi. Esistono due meto<strong>di</strong> <strong>di</strong>retti per la soluzione del sistema (<strong>4.</strong>1): la regola <strong>di</strong><br />
Cramer e il metodo <strong>di</strong> fattorizzazione <strong>di</strong> Gauss. Illustreremo prima i meto<strong>di</strong> <strong>di</strong>retti e poi i<br />
meto<strong>di</strong> iterativi.<br />
<strong>4.</strong>2 Regola <strong>di</strong> Cramer<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
♦<br />
( ) < n .<br />
La soluzione del sistema <strong>di</strong> <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong> (<strong>4.</strong>1) può essere calcolata<br />
tramite la regola <strong>di</strong> Cramer. In<strong>di</strong>chiamo con Ai la matrice ( n ! n)<br />
ottenuta sostituendo<br />
la i ! esima colonna <strong>di</strong> A con il vettore colonna b . La soluzione del sistema (<strong>4.</strong>1) è data<br />
allora da<br />
2 Una matrice<br />
A = a ( ij ) , i, j = 1, 2,..., n , si <strong>di</strong>ce a dominanza <strong>di</strong>agonale stretta per righe se<br />
n<br />
aii > " aij per i = 1, 2,..., n ; la matrice si si <strong>di</strong>ce a dominanza <strong>di</strong>agonale stretta per colonne se<br />
j=1, j!i<br />
aii n<br />
> " a<br />
j=1, j!i ji per i = 1, 2,..., n . La matrice A è a dominanza <strong>di</strong>agonale stretta se è dominanza<br />
<strong>di</strong>agonale stretta sia per righe che per colonne.
( )<br />
( )<br />
xi = det Ai det A<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
4<br />
i = 1,2,...,n . (<strong>4.</strong>10)<br />
Stimiamo, ora, il costo computazionale. Nella regola <strong>di</strong> Cramer, calcolando i<br />
determinanti a partire dalla loro definizione, il costo in termini <strong>di</strong> moltiplicazioni è <strong>di</strong><br />
( n + 1)<br />
( n ! 1)n!,<br />
ovvero dell’or<strong>di</strong>ne <strong>di</strong> n n per n >> 1. Ipotizzando <strong>di</strong> usare una macchina<br />
in grado <strong>di</strong> eseguire 10 9 moltiplicazioni al secondo, per risolvere un sistema <strong>di</strong> n = 20<br />
<strong>equazioni</strong> con la regola <strong>di</strong> Cramer c’è bisogno <strong>di</strong> circa 3.07 ! 10 4 anni. Anche per<br />
sistemi <strong>di</strong> modeste <strong>di</strong>mensioni il metodo <strong>di</strong> Cramer si rivela, quin<strong>di</strong>, impraticabile. Al<br />
contrario, come vedremo, il metodo <strong>di</strong> fattorizzazione <strong>di</strong> Gauss consente <strong>di</strong> risolvere in<br />
tempi ragionevoli sistemi anche <strong>di</strong> grosse <strong>di</strong>mensioni. Vedremo più avanti che il numero<br />
<strong>di</strong> moltiplicazioni in questo metodo è <strong>di</strong> or<strong>di</strong>ne n 3 per n >> 1.<br />
<strong>4.</strong>3 <strong>Sistemi</strong> triangolari<br />
Si tratta <strong>di</strong> un caso particolare molto importante perché, come vedremo tra poco, la<br />
forma triangolare è anche il risultato finale dell’applicazione del metodo <strong>di</strong> eliminazione<br />
per sostituzione <strong>di</strong> Gauss.<br />
Introduciamo, prima, due forme speciali <strong>di</strong> matrici, le matrici triangolari superiori<br />
(che qui in<strong>di</strong>cheremo con U ) e le matrici triangolari inferiori (che qui in<strong>di</strong>cheremo con<br />
L ). Una matrice n ! n<br />
( ) U u ij<br />
( ) si <strong>di</strong>ce triangolare superiore se<br />
u ij = 0 per i > j ! U =<br />
u 11 u 12 ... u 1n"1 u 1n<br />
0 u 22 ... u 2n"1 u 2n<br />
... ... ... ... ...<br />
0 0 ... u n"1n"1 u n"1n<br />
0 0 ... 0 u nn<br />
una matrice ( n ! n)<br />
L( lij ) si <strong>di</strong>ce triangolare inferiore se<br />
l ij = 0 per i < j ! L =<br />
l 11 0 ... 0 0<br />
l 21 l 22 ... 0 0<br />
... ... ... ... ...<br />
l n"11 l n"12 ... l n"1n"1 0<br />
l n1 l n2 ... l nn"1 l nn<br />
; (<strong>4.</strong>11)<br />
. (<strong>4.</strong>12)<br />
Si consideri, ora, un sistema <strong>di</strong> <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong> <strong>di</strong> tipo triangolare<br />
inferiore,
#<br />
%<br />
%<br />
Ly = b ! $<br />
%<br />
%<br />
&%<br />
5<br />
l 11y 1 = b 1<br />
l 21y 1 + l 22y 2 = b 2<br />
..........................................<br />
l n"11 y 1 + n"12 y 2 ...+ l n"1n"1 y n"1 = b n"1<br />
l n1y 1 + l n2y 2 + ...+ l nn"1y n"1 + l nny n = b n.<br />
La soluzione <strong>di</strong> questo sistema è molto semplice. Si ha (eliminazione in avanti)<br />
y1 = 1<br />
b1 ,<br />
l11 yi = 1 # i!1 &<br />
bi ! lijy j<br />
l<br />
% " (<br />
ii $ j =1 '<br />
i = 2, 3,...,n.<br />
(<strong>4.</strong>13)<br />
(<strong>4.</strong>14)<br />
Per calcolare yi sono richieste le seguenti operazioni: ( i ! 1)<br />
prodotti, ( i ! 1)<br />
somme e 1<br />
<strong>di</strong>visione. Pertanto il numero totale <strong>di</strong> operazioni è<br />
n<br />
Noper = ! 1+<br />
2! ( i " 1)<br />
= 2! i " n = n 2 . (<strong>4.</strong>15)<br />
Consideriamo, ora, un sistema <strong>di</strong> tipo triangolare superiore,<br />
i=1<br />
n<br />
i=1<br />
# u11x1 + u12x2 + ... + u1n"1x n"1 + u1nx n = y1 %<br />
u22x2 + ... + u2n"1x n"1 + u2n xn = y2 %<br />
Ux = y ! $ ..........................................<br />
%<br />
un"1n"1x n"1 + un"1nx n = yn"1 %<br />
&%<br />
unnxn = yn .<br />
n<br />
i=1<br />
(<strong>4.</strong>16)<br />
Anche la soluzione <strong>di</strong> questo sistema è molto semplice. Si ha (eliminazione all’in<strong>di</strong>etro)<br />
xn = 1<br />
yn ,<br />
unn xi = 1 # n &<br />
yi ! uijx j<br />
u<br />
% " (<br />
ii $ j =i+1 '<br />
i = n ! 1,n ! 2,...,1.<br />
(<strong>4.</strong>17)<br />
Anche in questo caso bisogna effettuare n 2 operazioni elementari per determinare la<br />
soluzione.<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
Esercizio <strong>4.</strong>1<br />
Implementare in MATLAB gli algoritmi (<strong>4.</strong>14) e (<strong>4.</strong>17).<br />
<strong>4.</strong>4 Il metodo della fattorizzazione <strong>di</strong> Gauss<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
6<br />
Il metodo della fattorizzazione <strong>di</strong> Gauss consiste nel trasformare il sistema (<strong>4.</strong>1) in<br />
un sistema del tipo<br />
LUx = b (<strong>4.</strong>18)<br />
dove L è una matrice triangolare inferiore e U è una matrice triangolare superiore. Ciò<br />
equivale a <strong>di</strong>re che la matrice A può essere espressa come prodotto tra una matrice<br />
triangolare inferiore e una matrice triangolare superiore,<br />
A = LU . (<strong>4.</strong>19)<br />
La rappresentazione della matrice A attraverso la (<strong>4.</strong>19) prende il nome <strong>di</strong><br />
fattorizzazione <strong>di</strong> Gauss o fattorizzazione LU.<br />
Supponiamo, per il momento, che sia possibile esprimere la matrice A attraverso la<br />
(<strong>4.</strong>19) e che siano note le matrici <strong>di</strong> fattorizzazione L ed U . Allora la soluzione del<br />
sistema (<strong>4.</strong>1) è imme<strong>di</strong>ata. Infatti, il sistema (<strong>4.</strong>1) può essere riscritto nella forma (<strong>4.</strong>18).<br />
Posto, allora,<br />
il sistema (<strong>4.</strong>18) è equivalente ai due sistemi triangolari<br />
y ! Ux (<strong>4.</strong>20)<br />
Ly = b , (<strong>4.</strong>21)<br />
Ux = y . (<strong>4.</strong>22)<br />
Il primo sistema è <strong>di</strong> tipo triangolare inferiore e può essere risolto attraverso l’algoritmo<br />
(<strong>4.</strong>14) (eliminazione in avanti). Una volta determinato y , si risolve il sistema (<strong>4.</strong>22)<br />
attraverso l’algoritmo (<strong>4.</strong>17) (eliminazione all’in<strong>di</strong>etro). Una volta effettuata la<br />
decomposizione LU, occorrono 2n 2 operazioni per calcolare al soluzione. E’ evidente,<br />
allora, che il punto centrale <strong>di</strong> questo metodo è nella determinazione (quando possibile)<br />
<strong>di</strong> una fattorizzazione LU della matrice A .<br />
Esempio <strong>4.</strong>2<br />
Prima <strong>di</strong> considerare il problema fattorizzazione nella sua forma più generale,<br />
esemplifichiamo attraverso un sistema <strong>di</strong> due <strong>equazioni</strong> in due incognite,<br />
♦
7<br />
! a11x1 + a12x2 = b1 "<br />
# a21x1 + a22x2 = b2. Moltiplichiamo ambo i membri della prima equazione per !a 21 / a 11 . Otteniamo<br />
!a 21 x 1 ! a 21 a 12<br />
a 11<br />
(<strong>4.</strong>23)<br />
x2 = ! a21 b1 . (<strong>4.</strong>24)<br />
a11 Sommando membro a membro la seconda equazione del sistema (<strong>4.</strong>23) e l’equazione<br />
(<strong>4.</strong>24) abbiamo<br />
"<br />
#<br />
$<br />
a 22 ! a 12a 21<br />
a 11<br />
%<br />
&<br />
' x2 = b2 ! a21 b1 . (<strong>4.</strong>25)<br />
a11 Abbiamo, allora, ricondotto la soluzione del sistema (<strong>4.</strong>23) alla soluzione del sistema<br />
triangolare alto<br />
dove<br />
e<br />
1 ! # a11 "<br />
$#<br />
( ) ( 1)<br />
x1 + a12 x2 = y1 ( 2)<br />
a22 x2 = y2 ( 1)<br />
( 1)<br />
a11 = a11, a12 = a12,<br />
( 1)<br />
( 1)<br />
a21 = a21 , a22 = a22 ,<br />
( 2)<br />
( 2)<br />
1<br />
a21 = 0, a22 = a22<br />
( 1)<br />
( 1)<br />
a21<br />
( ) a12 ! 1<br />
a22 ( ) ,<br />
(<strong>4.</strong>26)<br />
(<strong>4.</strong>27)<br />
y1 = b1 , y2 = b2 ! a21 b1 . (<strong>4.</strong>28)<br />
a22 Questa procedura può essere effettuata solo se a 22 ! 0 . Il sistema (<strong>4.</strong>26) è del tipo (<strong>4.</strong>16)<br />
con<br />
e termine noto<br />
U = a 1<br />
11<br />
1<br />
a12 , (<strong>4.</strong>29)<br />
2<br />
0 a22 y = y 1 , y 2<br />
T<br />
. (<strong>4.</strong>30)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
8<br />
E’ evidente dalle (<strong>4.</strong>28) che il termine noto y è, a sua volta, soluzione <strong>di</strong> un sistema <strong>di</strong><br />
<strong>equazioni</strong> <strong>di</strong> tipo triangolare basso con<br />
e termine noto<br />
L =<br />
1 0<br />
, (<strong>4.</strong>31)<br />
1<br />
1 1<br />
a21 / a11<br />
b = b 1,b 2<br />
T<br />
. (<strong>4.</strong>32)<br />
Ora illustreremo una procedura generale per la determinazione della fattorizzazione<br />
LU. Sia la matrice L che la matrice U hanno, in generale, n( n + 1)<br />
/ 2 elementi <strong>di</strong>versi<br />
da zero. Gli elementi <strong>di</strong> L ed U devono verificare il sistema <strong>di</strong> <strong>equazioni</strong> non <strong>lineari</strong><br />
min( i, j)<br />
! lirurj = aij i, j = 1,2,...,n . (<strong>4.</strong>33)<br />
r =1<br />
Il sistema (<strong>4.</strong>33) è sotto determinato perché il numero <strong>di</strong> <strong>equazioni</strong> in<strong>di</strong>pendenti è n 2 ,<br />
mentre il numero <strong>di</strong> gra<strong>di</strong> <strong>di</strong> libertà è n 2 + n . Di conseguenza se esiste una<br />
fattorizzazione LU, essa non è unica. Se si fissano gli n elementi della <strong>di</strong>agonale<br />
principale della matrice L , ad esempio, uguali a 1, il sistema (<strong>4.</strong>33) <strong>di</strong>venta determinato<br />
e può essere risolto attraverso il seguente algoritmo:<br />
per k = 1,2,...,n ! 1<br />
per i = k + 1,...,n<br />
lik = a ( k)<br />
ik<br />
k<br />
akk ( ) ,<br />
per j = k + 1,...,n<br />
( k+1)<br />
( k)<br />
k<br />
aij = aij ! likakj ( )<br />
♦<br />
(<strong>4.</strong>34)<br />
( 1)<br />
dove aij = aij per i, j = 1,2,...,n . Gli elementi della matrice triangolare superiore U<br />
sono dati da<br />
( i)<br />
uij = aij i ! j = 1,2,...,n . (<strong>4.</strong>35)<br />
L’algoritmo (<strong>4.</strong>34) è valido solo se a kk<br />
k<br />
( ) ! 0 . Per un approfon<strong>di</strong>mento si rimanda alle<br />
referenze [<strong>4.</strong>1] e [<strong>4.</strong>2].
Esercizio <strong>4.</strong>1(bis)<br />
9<br />
Verificare che l’algoritmo (<strong>4.</strong>34) con la (<strong>4.</strong>35) dà la soluzione del sistema (<strong>4.</strong>33) con<br />
l ii = 1 per i = 1,2,...,n .<br />
♦<br />
Il passo k della fattorizzazione LU comporta ( n ! k)<br />
<strong>di</strong>visioni e ( n ! k)<br />
n ! k + 1<br />
moltiplicazioni e ad<strong>di</strong>zioni. Il costo totale dell’algoritmo è, quin<strong>di</strong>,<br />
n!1<br />
"<br />
k =1<br />
( n ! k)<br />
n ! k + 1<br />
( )<br />
( )<br />
= 1<br />
3 n n2 ( ! 1)<br />
. (<strong>4.</strong>36)<br />
( k)<br />
( k)<br />
Gli elementi akk vengono chiamati “pivot”. L’algoritmo (<strong>4.</strong>34) richiede che akk ! 0<br />
per ogni k = 1,2,...,n ! 1 . Allora, la matrice A ha una fattorizzazione LU se i pivot sono<br />
tutti <strong>di</strong>versi da zero. Se almeno un pivot è uguale a zero l’algoritmo (<strong>4.</strong>34) non può<br />
essere implementato e la matrice A non è fattorizzabile.<br />
( k)<br />
Assumiamo che i pivot akk s0no tutti <strong>di</strong>versi da zero e, quin<strong>di</strong>, la matrice A sia<br />
fattorizzabile. Allora, la soluzione del sistema (<strong>4.</strong>1) attraverso il metodo della<br />
fattorizzazione LU consiste nel:<br />
- determinare la fattorizzazione LU della matrice A attraverso l’algoritmo (<strong>4.</strong>34)-<br />
(<strong>4.</strong>35);<br />
- risolvere il sistema triangolare basso (<strong>4.</strong>21) attraverso l’algoritmo (<strong>4.</strong>14) per<br />
determinare l’incognita ausiliaria y ;<br />
- risolvere il sistema triangolare alto (<strong>4.</strong>22) attraverso l’algoritmo (<strong>4.</strong>17).<br />
Il numero <strong>di</strong> moltiplicazioni, <strong>di</strong>visioni e ad<strong>di</strong>zioni richiesto per risolvere il sistema (<strong>4.</strong>1)<br />
con il metodo della fattorizzazione <strong>di</strong> Gauss è n 3 / 3 + 2n 2 ( ! n / 3)<br />
, quin<strong>di</strong> <strong>di</strong> or<strong>di</strong>ne<br />
n 3 / 3 per n >> 1.<br />
Programma <strong>4.</strong>1: Fattorizzazione LU<br />
function [L,U,A]=lu_gauss(A)<br />
% Fattorizzazione LU<br />
n=max(size(A));<br />
for k=1:n-1<br />
for i=k+1:n<br />
A(i,k)=A(i,k)/A(k,k);<br />
for j=k+1:n<br />
A(i,j)=A(i,j)-A(i,k)*A(k,j);<br />
end<br />
end<br />
end<br />
if nargout==2, U=triu(A); L=eye(n)+tril(A,-1);end<br />
return<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
10<br />
Riportiamo nel Programma <strong>4.</strong>1 un’implementazione dell’algoritmo (<strong>4.</strong>34)-(<strong>4.</strong>35)<br />
utilizzando il linguaggio <strong>di</strong> programmazione MATLAB ® , [<strong>4.</strong>3]. Se la chiamata alla<br />
function ha una sola variabile <strong>di</strong> uscita le due matrici L e U sono memorizzate in una<br />
sola matrice, invece se ha due variabili <strong>di</strong> uscita L e U sono memorizzate in due matrici<br />
<strong>di</strong>stinte (il comando “nargout” serve per contare il numero <strong>di</strong> variabili <strong>di</strong> uscita). Si<br />
osservi, inoltre, che nell’implementazione non è necessario memorizzare tutte le matrici<br />
A k ( ) , è sufficiente scrivere <strong>di</strong> volta in volta sugli elementi della matrice <strong>di</strong> partenza A .<br />
Esercizio <strong>4.</strong>2<br />
Si risolva il sistema<br />
1 3 3<br />
3 6 4<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
1<br />
2 2 2 x = 3<br />
2<br />
(<strong>4.</strong>37)<br />
determinando prima la fattorizzazione LU della matrice attraverso il Programma <strong>4.</strong>1 e<br />
applicando, poi, gli algoritmi (<strong>4.</strong>14) e (<strong>4.</strong>17) per risolvere i due sistemi <strong>di</strong> <strong>equazioni</strong><br />
triangolari, implementati nell’Esercizio <strong>4.</strong>1.<br />
♦<br />
La fattorizzazione LU è alla base dei coman<strong>di</strong> MATLAB<br />
L,U [ ] = lu A ( ) , A\b e inv A<br />
( ) .<br />
Il primo comando dà la fattorizzazione LU della matrice A , il secondo comando<br />
consente <strong>di</strong> risolvere <strong>di</strong>rettamente il sistema (<strong>4.</strong>1), il terzo comando dà l’inversa della<br />
matrice A .<br />
<strong>4.</strong><strong>4.</strong>1 Esistenza della fattorizzazione LU<br />
( i)<br />
La fattorizzazione LU esiste solo se nell’algoritmo (<strong>4.</strong>34) aii ! 0 per ogni i . Ora<br />
<strong>di</strong>scuteremo questo aspetto.<br />
Le sottomatrici principali <strong>di</strong> A <strong>di</strong> or<strong>di</strong>ne i = 1,2,...,n ! 1 sono le matrici quadrate<br />
ottenute considerando solo gli elementi delle prime i righe e colonne; in<strong>di</strong>chiamo con<br />
Ai la sottomatrice principale <strong>di</strong> or<strong>di</strong>ne i . Si mostra che (ve<strong>di</strong>, ad esempio, [<strong>4.</strong>1])<br />
da cui<br />
1 ( ) = a11 det A i<br />
( ) ( 2)<br />
( i)<br />
a22 ...aii<br />
(<strong>4.</strong>38)<br />
n<br />
( i)<br />
det( A)<br />
= ! aii . (<strong>4.</strong>39)<br />
i=1
11<br />
Criterio <strong>di</strong> esistenza della fattorizzazione LU Se A e tutte le sue sottomatrici<br />
( i)<br />
principali sono non singolari si ha che aii ! 0 per ogni i e, quin<strong>di</strong>, esiste ed è unica la<br />
decomposizione LU.<br />
Osservazione<br />
Può accadere che una sottomatrice principale Ai con i < n possa essere singolare pur<br />
essendo det( A)<br />
! 0 . Si consideri, ad esempio, una matrice A 2 ! 2 . In questo caso si<br />
1<br />
ha a11 ( ) = a 11<br />
( ) ( 2)<br />
( 1)<br />
( 2)<br />
= a11 , a22 = a22 ! a12a21 / a11 . Può accadere che a11 = 0 e det A a22 ! 0 : in<br />
( ) ( 2)<br />
( 2)<br />
a22 è una forma indeterminata perché a22 = ! . Questa è una<br />
1<br />
questo caso il prodotto a11 k<br />
proprietà generale. Infatti, se akk (<strong>4.</strong>39) <strong>di</strong>venta una forma indeterminata.<br />
Esempio <strong>4.</strong>3<br />
( ) k +1<br />
= 0 dalla (<strong>4.</strong>34) segue che ak<br />
+1k +1<br />
Determiniamo la fattorizzazione LU della matrice<br />
1 3 3<br />
A =<br />
( ) = ! e quin<strong>di</strong> la<br />
2 2 2 . (<strong>4.</strong>40)<br />
3 6 4<br />
La matrice A è non singolare perché det( A)<br />
= 8 e tutte le sottomatrici principali sono<br />
non singolari. Applicando il Programma <strong>4.</strong>1 si ha<br />
1 0 0<br />
3 0.75 1<br />
1 3 3<br />
L = 2 1 0 ,U = 0 !4 !4 . (<strong>4.</strong>41)<br />
0 0 !2<br />
Il criterio che abbiamo appena illustrato non è agevole da applicare a matrici <strong>di</strong> grossa<br />
<strong>di</strong>mensione. Per questa ragione è utile in<strong>di</strong>viduare quelle classi <strong>di</strong> matrici per le quali<br />
esso è certamente verificato. Si <strong>di</strong>mostra che se è verificata almeno una delle seguenti<br />
con<strong>di</strong>zioni:<br />
a) la matrice A è simmetrica e definita positiva (ve<strong>di</strong> Appen<strong>di</strong>ce 1);<br />
b) la matrice A è a dominanza <strong>di</strong>agonale stretta per righe o per colonne;<br />
allora esiste ed è unica la fattorizzazione LU <strong>di</strong> A . Per un approfon<strong>di</strong>mento si rimanda<br />
alle referenze [<strong>4.</strong>1] e [<strong>4.</strong>2].<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
♦<br />
♦
Osservazione: fattorizzazione <strong>di</strong> Cholesky<br />
12<br />
Se la matrice A è simmetrica e definita positiva esiste una matrice triangolare<br />
inferiore H con elementi positivi sulla <strong>di</strong>agonale principale tale che<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
A = HH T . (<strong>4.</strong>42)<br />
La (<strong>4.</strong>42) prende il nome <strong>di</strong> fattorizzazione <strong>di</strong> Cholesky. Gli elementi <strong>di</strong> H possono<br />
essere determinati attraverso l’algoritmo<br />
h ij = 1<br />
h jj<br />
j !1<br />
#<br />
&<br />
aij ! " hikh jk<br />
$<br />
%<br />
'<br />
( j = 1,2,...,i ! 1,<br />
i!1<br />
k =1<br />
2<br />
hii = aii ! " hik i = 1,2,..., N.<br />
k =1<br />
(<strong>4.</strong>43)<br />
La fattorizzazione <strong>di</strong> Cholesky richiede n 3 / 6 operazioni, metà <strong>di</strong> quelle richieste dalla<br />
fattorizzazione LU. La fattorizzazione <strong>di</strong> Cholesky viene richiamata in MATLAB ® con il<br />
comando H = chol A<br />
( ) .<br />
Esercizio <strong>4.</strong>2<br />
Implementare in MATLAB l’algoritmo (<strong>4.</strong>43).<br />
Quando la matrice A non verifica le con<strong>di</strong>zioni a) e/o b) può accadere che, pur<br />
essendo det A<br />
( ) ! 0 , non esista una fattorizzazione LU per A .<br />
Esempio <strong>4.</strong>4<br />
Si consideri, ora, la matrice<br />
A =<br />
1 1 3<br />
2 2 2<br />
3 6 4<br />
Essa è non singolare perché det( A)<br />
= 12 , ma det A2 Programma <strong>4.</strong>1 si ha<br />
♦<br />
♦<br />
. (<strong>4.</strong>44)<br />
1 ( ) = a11 ( ) 2<br />
a22<br />
( ) = 0 . Applicando il
1 0 0<br />
3 Inf 1<br />
13<br />
1 3 3<br />
L = 2 1 0 ,U = 0 0 !4 . (<strong>4.</strong>45)<br />
0 0 Inf<br />
Pur essendo A non singolare, la fattorizzazione <strong>di</strong> Gauss non può essere effettuata in<br />
( 2)<br />
quanto nell’algoritmo (<strong>4.</strong>34) a22 = 0 . Ciò è dovuto al fatto che la seconda sottomatrice<br />
principale <strong>di</strong> A (cioè quella ottenuta da A considerando solo le prime due righe e due<br />
colonne)<br />
1 1<br />
2 2<br />
è singolare.<br />
Questo problema può essere risolto, in generale, permutando tra loro alcune righe (o<br />
colonne) <strong>di</strong> A . Si consideri la matrice ottenuta scambiando la prima riga della (<strong>4.</strong>44) con<br />
la terza<br />
!A =<br />
3 6 4<br />
2 2 2<br />
1 1 3<br />
. (<strong>4.</strong>46)<br />
Tutti le sottomatrici principali <strong>di</strong> ! A sono non singolari. Applicando, ora, il Programma<br />
<strong>4.</strong>1 si ha:<br />
<strong>4.</strong><strong>4.</strong>2 Matrice <strong>di</strong> permutazione<br />
1 0 0<br />
!L = 0.6667 1 0 , ! 3 6 4<br />
U = 0 !2 !0.6667 . (<strong>4.</strong>47)<br />
0.3333 0.5 1<br />
0 0 2<br />
Nell’esempio appena svolto abbiamo fatto vedere che permutando in modo opportuno<br />
le righe della matrice A è possibile costruire una nuova matrice ! A che abbia tutte le<br />
sottomatrici principali non singolari e, quin<strong>di</strong>, abbia una ed una sola fattorizzazione LU.<br />
Siccome lo scambio tra righe comporta un cambiamento dei pivot, questa tecnica viene<br />
chiamata pivoting per righe. La fattorizzazione che si trova dà la matrice <strong>di</strong> partenza a<br />
meno <strong>di</strong> una matrice <strong>di</strong> permutazione fra le righe.<br />
Per una generica matrice A non singolare esiste sempre una matrice <strong>di</strong> permutazione<br />
delle righe P tale che<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
♦
14<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
PA = LU . (<strong>4.</strong>48)<br />
La matrice P è posta uguale alla matrice identità all’inizio del processo <strong>di</strong><br />
fattorizzazione. Se nel corso della fattorizzazione le righe “ r ” e “ s ” <strong>di</strong> A vengono<br />
scambiate a causa della presenza <strong>di</strong> pivot uguali a zero, le corrispondenti colonne <strong>di</strong> P<br />
vengono scambiate. Allora, la soluzione del sistema (<strong>4.</strong>1) si riduce alla soluzione dei due<br />
sistemi triangolari<br />
L!y = Pb (<strong>4.</strong>49)<br />
Ux = !y . (<strong>4.</strong>50)<br />
In MATLAB ® l’istruzione “lu” calcola la fattorizzazione LU con pivoting per righe<br />
Esempio <strong>4.</strong>5<br />
L,U,P [ ] = lu( A)<br />
.<br />
Fattorizziamo la matrice (<strong>4.</strong>44) utilizzando l’istruzione <strong>di</strong> MATLAB ® appena<br />
descritta. Si ottengono le matrici L e U (<strong>4.</strong>47) e la matrice <strong>di</strong> permutazione<br />
P =<br />
0 0 1<br />
0 1 0 . (<strong>4.</strong>51)<br />
1 0 0<br />
La (<strong>4.</strong>51) è la matrice <strong>di</strong> permutazione che scambia la prima riga con la terza riga <strong>di</strong> una<br />
matrice 3 ! 3<br />
( ) .<br />
Esercizio <strong>4.</strong>3<br />
Si risolva il sistema<br />
1 2 2<br />
2 5 1<br />
1<br />
2 4 1 x = 3<br />
2<br />
♦<br />
(<strong>4.</strong>52)<br />
determinando prima la fattorizzazione LU con l’istruzione “lu” <strong>di</strong> MATLAB ® e<br />
applicando, poi, gli algoritmi (<strong>4.</strong>14) e (<strong>4.</strong>17) per risolvere i due sistemi <strong>di</strong> <strong>equazioni</strong><br />
triangolari .<br />
♦
<strong>4.</strong>5 Errori <strong>di</strong> arrotondamento<br />
15<br />
Nel calcolo numerico esistono, almeno in linea <strong>di</strong> principio, due sorgenti <strong>di</strong> errore:<br />
l’errore generato dall’approssimazione introdotta dall’algoritmo utilizzato per la<br />
soluzione del problema; l’errore generato dal fatto che una qualsiasi macchina per il<br />
calcolo può rappresentare solo un numero finito <strong>di</strong> cifre.<br />
Il metodo della fattorizzazione <strong>di</strong> Gauss è un metodo <strong>di</strong>retto, quin<strong>di</strong> il primo errore è<br />
assente. Ora ci occuperemo <strong>di</strong> capire quali sono gli effetti nella soluzione del sistema<br />
(<strong>4.</strong>1) con il metodo della fattorizzazione <strong>di</strong> Gauss degli errori dovuti al numero finito <strong>di</strong><br />
cifre della macchina <strong>di</strong> calcolo.<br />
Un calcolatore numerico è in grado <strong>di</strong> rappresentare soltanto un numero finito <strong>di</strong> cifre.<br />
Ciò dà luogo ad errori che possono essere generati in due mo<strong>di</strong> <strong>di</strong>versi: i numeri<br />
introdotti nel calcolatore sono memorizzati in forma approssimata; le operazioni<br />
elementari (ad<strong>di</strong>zioni, moltiplicazioni, <strong>di</strong>visioni,…) su tali numeri danno numeri non<br />
rappresentabili esattamente sul calcolatore. Pertanto, in un algoritmo implementato sul<br />
calcolatore attraverso una successione <strong>di</strong> operazioni elementari si ha una successiva<br />
creazione e propagazione degli errori. Tali errori sono chiamati errori <strong>di</strong><br />
arrotondamento.<br />
L’entità <strong>di</strong> questi errori <strong>di</strong>pende, ovviamente, dal modo in cui i numeri sono<br />
rappresentati sul calcolatore. Il sistema floating-point è il sistema <strong>di</strong> rappresentazione più<br />
utilizzato per il calcolo scientifico. Esso è caratterizzato dal fatto che permette <strong>di</strong><br />
rappresentare un ampio intervallo della retta reale con una <strong>di</strong>stribuzione uniforme degli<br />
errori relativi.<br />
Il sistema floating point è definito dal numero <strong>di</strong> cifre significative t , dalla base ! e<br />
dagli estremi ( l,u ) dell’intervallo <strong>di</strong> numeri interi <strong>di</strong> variabilità dell’esponente. In<br />
rappresentazione posizionale un numero macchina x ! 0 viene denotato con<br />
x = ±.d 1 d 2 ...d t! p (<strong>4.</strong>53)<br />
dove l ! p ! u . Ad esempio, in MATLAB si utilizza ! = 2 , t = 53 , l = !1021 e<br />
u = 1024 . In effetti 53 cifre significative in base 2 corrispondono alle 15 cifre<br />
significative in base 10 mostrate da MATLAB con il “format long”. In MATLAB con i<br />
coman<strong>di</strong> “realmin” e “realmax” è possibile determinare il numero reale, in valore<br />
assoluto, più piccolo e il numero reale, in valore assoluto, più grande che è possibile<br />
rappresentare. Essi sono, rispettivamente, 2.2250738585072e-308 e<br />
1.79769313486232e+308 . Il numero 0 viene rappresentato a parte. Un numero in valore<br />
assoluto minore <strong>di</strong> “realmin” produce una segnalazione <strong>di</strong> underflow e viene trattato<br />
come 0 (come, ad esempio, in MATLAB). Un numero in modulo maggiore <strong>di</strong> “realmax”<br />
produce invece una segnalazione <strong>di</strong> overflow e viene memorizzato come Inf.<br />
La maggior parte dei calcolatori ha la possibilità <strong>di</strong> operare con lunghezze <strong>di</strong>verse,<br />
ovvero con <strong>di</strong>versi t , a cui corrispondono, ad esempio, la singola e la doppia precisione.<br />
Nell’aritmetica in floating point molte delle proprietà che sono alla base<br />
dell’aritmetica dei numeri reali sono violate: l’unicità dello zero, la proprietà <strong>di</strong>stributiva,<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
16<br />
la proprietà associativa. Qui ci limiteremo a fare qualche considerazione sulle<br />
conseguenze della violazione della proprietà associativa.<br />
Esempio <strong>4.</strong>6 ([<strong>4.</strong>3])<br />
Si considerino i tre numeri a = 1.0e + 308 , b = 1.5e + 308 e c = !1.0e + 308 ed<br />
eseguiamo la loro somma in mo<strong>di</strong> <strong>di</strong>versi. Abbiamo<br />
a + ( b + c)<br />
= 1.5e + 308 , ( a + b)<br />
+ c = Inf .<br />
Questo è un caso particolare <strong>di</strong> un fenomeno che si verifica quando si sommano numeri<br />
dello stesso or<strong>di</strong>ne <strong>di</strong> grandezza in modulo, ma <strong>di</strong>versi <strong>di</strong> segno. In tal caso il risultato<br />
della somma può essere molto impreciso. Quello che accade è un fenomeno <strong>di</strong><br />
cancellazione <strong>di</strong> cifre significative che introduce termini spuri caratterizzati da una<br />
mancanza <strong>di</strong> informazione.<br />
♦<br />
Esempio <strong>4.</strong>7 ([<strong>4.</strong>1])<br />
Si considerino i tre numeri a = 0.23371258 !10 "4 , b = 0.33678429 !10 2 e<br />
c = !0.33677811"10 2 ed eseguiamo la loro somma in mo<strong>di</strong> <strong>di</strong>versi con una aritmetica<br />
floating point con 8 cifre significative. Abbiamo<br />
( a + b)<br />
+ c = 0.64100000 !10 -3 , a + ( b + c)<br />
= 0.64137126 !10 "3 .<br />
Il risultato esatto è dato da a + b + c = 0.64137258 !10 "3 . Il primo risultato ha tre cifre<br />
esatte, quin<strong>di</strong>, un errore relativo <strong>di</strong> ! 5.78 "10 #2 , mentre il secondo ha cinque cifre esatte,<br />
quin<strong>di</strong> è molto più accurato. Nel primo calcolo c’è stato un fenomeno <strong>di</strong> cancellazione<br />
che ha dato origine ad una per<strong>di</strong>ta <strong>di</strong> informazione.<br />
♦<br />
Esempio <strong>4.</strong>8 ([<strong>4.</strong>3])<br />
Consideriamo in MATLAB la seguente operazione ( ( 1 + x)<br />
! 1)<br />
/ x con x ! 0 . Il<br />
risultato in aritmetica esatta è 1 per x ! 0 . Troviamo, invece<br />
>> x = 1.e-15 ; ( ( 1+ x)<br />
! x)<br />
/ x<br />
ans=<br />
1.1102<br />
Il risultato ottenuto non è accurato.<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
♦
17<br />
Il risultato della fattorizzazione LU può essere non accurato se un pivot è “troppo<br />
piccolo”. Innanzitutto il pivot non deve essere inferiore al numero più piccolo<br />
rappresentabile dalla macchina, altrimenti sarebbe considerato come se fosse<br />
identicamente nullo. In realtà, errori consistenti possono generarsi anche per un pivot<br />
molto più grande <strong>di</strong> “realmin”.<br />
Esempio <strong>4.</strong>9 ([<strong>4.</strong>3])<br />
Consideriamo la matrice non singolare<br />
1 1+ 0.5 !10 "15<br />
A =<br />
3<br />
2 2 20 . (<strong>4.</strong>54)<br />
3 6 4<br />
Durante il calcolo della fattorizzazione LU con il Programma <strong>4.</strong>1 non si generano<br />
( ) !15<br />
= 10 , l’algoritmo (<strong>4.</strong>34) dà una<br />
2<br />
elementi <strong>di</strong> pivot nulli. Pur essendo a22 fattorizzazione. Nonostante ciò, il calcolo dei fattori L ed U non è accurato, come si<br />
verifica calcolando A ! LU<br />
( ) ,<br />
A ! LU =<br />
0 0 0<br />
0 0 0 . (<strong>4.</strong>55)<br />
0 0 4<br />
( ) sarebbe uguale alla matrice identicamente nulla. Ciò non<br />
In aritmetica esatta A ! LU<br />
accade nel caso reale a causa del fenomeno della cancellazione <strong>di</strong> cifre significative nelle<br />
operazioni <strong>di</strong> somma.<br />
♦<br />
( 2)<br />
!15<br />
Nell’esempio precedente il pivot a22 = 10 produce numeri molto gran<strong>di</strong><br />
nell’algoritmo <strong>di</strong> fattorizzazione (<strong>4.</strong>34). Ciò è all’origine della cancellazione <strong>di</strong> cifre<br />
significative che dà luogo al risultato (<strong>4.</strong>55). Questo problema può essere risolto<br />
scambiando le righe <strong>di</strong> A in modo tale che ad ogni passo dell’iterazione (<strong>4.</strong>34) i pivot<br />
siano, in valore assoluto, i più gran<strong>di</strong> possibili tra tutti quelli <strong>di</strong>sponibili. Un semplice<br />
algoritmo per realizzare ciò, che generalizza l’algoritmo (<strong>4.</strong>34), è [<strong>4.</strong>3]<br />
per k = 1,2,...,n<br />
per i = k + 1,...,n<br />
cercare mk tale che amk k = max<br />
i= k,...,n a ( k)<br />
ik<br />
scambiare la riga k con la riga mk ,<br />
lik = a ( k)<br />
ik<br />
k<br />
akk ( ) ,<br />
per j = k + 1,...,n<br />
( k +1)<br />
( k)<br />
k<br />
aij = aij ! likakj ( ) .<br />
(<strong>4.</strong>56)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
Esercizio <strong>4.</strong>5<br />
18<br />
Si calcolino i fattori L e U per la matrice (<strong>4.</strong>54) utilizzando il Programma <strong>4.</strong>1 e si<br />
verifichi che il risultato non è accurato.<br />
♦<br />
Esercizio <strong>4.</strong>6<br />
Implementare in MATLAB l’algoritmo (<strong>4.</strong>56) e verificare che la fattorizzazione LU<br />
della matrice (<strong>4.</strong>54) è molto più accurata <strong>di</strong> quella ottenuta con il Programma <strong>4.</strong>1.<br />
♦<br />
Il programma MATLAB “lu”, cui abbiamo in precedenza accennato, si base<br />
sostanzialmente su <strong>di</strong> un algoritmo <strong>di</strong> fattorizzazione con pivoting per righe del tipo<br />
(<strong>4.</strong>56).<br />
<strong>4.</strong>6 Matrici sparse, matrici bandate<br />
Lo strumento matrice è efficace sia per formulare in maniera semplice e sintetica un<br />
sistema <strong>di</strong> <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong>, sia per stu<strong>di</strong>arne le proprietà. Tuttavia, può<br />
capitare che esso si riveli ridondante. Come abbiamo visto nelle Note 2 e 3, esistono<br />
molti modelli caratterizzati da matrici che hanno una buona parte degli elementi uguali a<br />
zero. Una matrice ( n ! n)<br />
con n >> 1 si <strong>di</strong>ce che è sparsa quando il numero <strong>di</strong> elementi<br />
<strong>di</strong>versi da zero è <strong>di</strong> or<strong>di</strong>ne O ( n)<br />
. Avere matrici sparse è molto vantaggioso perché è<br />
sufficiente memorizzare solo gli elementi <strong>di</strong>versi da zero. Ciò comporta un notevole<br />
risparmio <strong>di</strong> memoria e <strong>di</strong> operazioni. Una matrice sparsa può essere memorizzata<br />
attraverso tre vettori: un vettore contiene gli elementi della matrice e gli altri due<br />
contengono i corrispondenti in<strong>di</strong>ci <strong>di</strong> riga e colonna. Pertanto, bisogna memorizzare 3n<br />
variabili (<strong>di</strong> cui 2n sono interi) invece che n 2 variabili reali.<br />
Figura <strong>4.</strong>2 Struttura <strong>di</strong> una matrice a bande.<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
19<br />
Osserviamo subito che la fattorizzazione <strong>di</strong> Gauss può introdurre nuovi elementi<br />
<strong>di</strong>versi da zero. In generale, pur essendo A sparsa, le matrici L ed U possono essere<br />
matrici non sparse. Rior<strong>di</strong>nando la matrice A è possibile ridurre al minimo la<br />
generazione <strong>di</strong> nuovi elementi nelle matrici L ed U. I meto<strong>di</strong> iterativi che in seguito<br />
stu<strong>di</strong>eremo preservano le proprietà <strong>di</strong> sparsità delle matrici.<br />
Le matrici a bande rappresentano un significativo esempio <strong>di</strong> matrice sparsa. Esse si<br />
ottengono quando le <strong>equazioni</strong> del sistema possono essere or<strong>di</strong>nate in maniera che ogni<br />
incognita xi appaia solo in poche <strong>equazioni</strong> vicine alla i ! esima. Esse si incontrano<br />
nell’analisi dei circuiti e nei modelli <strong>di</strong>screti <strong>di</strong> <strong>equazioni</strong> <strong>di</strong>fferenziali.<br />
Si <strong>di</strong>ce che la matrice A = ( aij ) ha una banda superiore q se aij = 0 per j > i + q e<br />
una banda inferiore p se aij = 0 per i > j + p , Figura <strong>4.</strong>2. Una proprietà importante<br />
della fattorizzazione LU è che è preservata la struttura a banda. Si consideri una matrice<br />
a banda superiore q e a banda inferiore p . Si può mostrare che se esiste la<br />
fattorizzazione LU per la matrice A , allora la matrice U è a banda superiore q e la<br />
matrice L è a banda inferiore p . L’algoritmo <strong>di</strong> fattorizzazione LU per le matrici a<br />
banda richiede, pertanto, un numero <strong>di</strong> operazioni notevolmente più basso rispetto al<br />
caso più generale se non è richiesta l’operazione <strong>di</strong> pivoting, ad esempio, per le matrici a<br />
predominanza <strong>di</strong>agonale stretta o le matrici simmetriche e definite positive. Per un<br />
approfon<strong>di</strong>mento si rimanda alla referenze [<strong>4.</strong>1] e [<strong>4.</strong>2].<br />
In molte applicazioni è necessario risolvere un sistema <strong>di</strong> <strong>equazioni</strong> con matrici a<br />
bande n ! n<br />
( ) della forma<br />
A =<br />
a 1 c 1 0<br />
b 2 a 2 ...<br />
... c n!1<br />
0 b n!1 a n<br />
. (<strong>4.</strong>57)<br />
In questo caso la matrice A viene detta tri-<strong>di</strong>agonale. Si verifica facilmente che, se la<br />
fattorizzazione LU esiste, allora L ed U sono due matrici bi-<strong>di</strong>agonali [<strong>4.</strong>3],<br />
L =<br />
1 0 0<br />
l2 1 ...<br />
,U =<br />
... 0<br />
0 l n!1 1<br />
u 1 c 1 0<br />
0 u 2 ...<br />
... c n!1<br />
0 0 u n<br />
. (<strong>4.</strong>58)<br />
I coefficienti l i e u i possono essere determinati imponendo che LU = A . In tal modo si<br />
trova che<br />
u1 = a1, li = bi , ui = ai ! liui!1, i = 2,...,n. (<strong>4.</strong>59)<br />
ui!1 G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
20<br />
L’algoritmo (<strong>4.</strong>59) è noto come algoritmo <strong>di</strong> Thomas ed è una forma particolarmente<br />
conveniente <strong>di</strong> fattorizzazione LU. Per n >> 1il numero <strong>di</strong> operazioni cresce come n al<br />
crescere <strong>di</strong> n .<br />
Esercizio <strong>4.</strong>7<br />
Implementare in MATLAB l’algoritmo (<strong>4.</strong>59).<br />
Esempio <strong>4.</strong>10 ([<strong>4.</strong>3])<br />
In MATALB per costruire una matrice tri-<strong>di</strong>agonale è possibile utilizzare il comando<br />
“sp<strong>di</strong>ags”. Ad esempio, per costruire la matrice tri-<strong>di</strong>agonale ( 20 ! 20)<br />
che ha elementi<br />
pari ad 5 sulla <strong>di</strong>agonale principale, pari a 1 sulla prima sotto<strong>di</strong>agonale e pari a 2 sulla<br />
prima sopra<strong>di</strong>agonale basta scrivere i seguenti coman<strong>di</strong>:<br />
>> a=ones(20,1); b=5*a; c=2*a;<br />
>> A=sp<strong>di</strong>ags([a b c],-1:1, 20, 20);<br />
Si noti che A viene memorizzata in MATLAB in forma sparsa. Quando in MATLAB si<br />
risolve un sistema la cui matrice è memorizzata in tale formato, vengono<br />
automaticamente richiamate delle tecniche <strong>di</strong> risoluzione che consentono <strong>di</strong> ottimizzare i<br />
tempi <strong>di</strong> calcolo e l’occupazione <strong>di</strong> memoria.<br />
♦<br />
<strong>4.</strong>7 Il problema del con<strong>di</strong>zionamento e della stabilità numerica<br />
Come abbiamo già avuto modo <strong>di</strong> notare nel §<strong>4.</strong>4, a causa dell’errore <strong>di</strong><br />
arrotondamento, il prodotto LU non riproduce dà esattamente la matrice A . Abbiano<br />
anche visto che l’uso del pivoting consente <strong>di</strong> risolvere questo problema. Purtroppo ciò<br />
non è sempre possibile come mostra l’esempio che segue.<br />
Esempio <strong>4.</strong>11 ([<strong>4.</strong>3])<br />
Consideriamo come matrice A la matrice <strong>di</strong> Hilbert cui elementi sono definiti come<br />
segue<br />
a ij =<br />
1<br />
i + j ! 1<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
i, j = 1,2,...,n . (<strong>4.</strong>60)<br />
Essa è simmetrica e definita positiva. Scegliamo, inoltre, il termine noto b del sistema<br />
(<strong>4.</strong>1) in modo tale che la soluzione esatta sia x = 1,1,...,1 T ,<br />
♦
21<br />
b = A 1,1,...,1 T . (<strong>4.</strong>61)<br />
In<strong>di</strong>chiamo con ˆx la soluzione del sistema (<strong>4.</strong>1) ottenuta con il comando A\b <strong>di</strong><br />
MATLAB. Se non vi fosse l’errore dovuto all’arrotondamento avremmo x ! ˆx = 0 . In<br />
realtà, a causa <strong>di</strong> questo errore risulta x ! ˆx " 0 . Consideriamo due tipi <strong>di</strong> misura<br />
dell’errore: l’errore relativo<br />
e il residuo relativo<br />
e ! x " ˆx<br />
x<br />
r ! Aˆx " b<br />
b<br />
Tabella <strong>4.</strong>1<br />
n e r<br />
10 6.1!10 "5 1.3!10 "16<br />
20 7.7 1.0 !10 "16<br />
30 23.1 2.3!10 "16<br />
40 80.9 6.8 !10 "16<br />
50 89.2 <strong>4.</strong>5 !10 "16<br />
(<strong>4.</strong>62)<br />
. (<strong>4.</strong>63)<br />
In Tabella <strong>4.</strong>1 sono riportati e ed r per <strong>di</strong>versi valori <strong>di</strong> n . Al crescere <strong>di</strong> n pur<br />
restando il residuo relativo dell’or<strong>di</strong>ne <strong>di</strong> 10 !16 , l’errore relativo cresce in modo<br />
vertiginoso. In questo paragrafo cercheremo <strong>di</strong> stabilire una relazione tra il residuo<br />
relativo e l’errore relativo.<br />
♦<br />
In<strong>di</strong>chiamo con ˆx la soluzione numerica dell’equazione (<strong>4.</strong>1). A causa degli errori <strong>di</strong><br />
arrotondamento si ha<br />
Aˆx = ˆ b (<strong>4.</strong>64)<br />
con ˆ b ! b . Pertanto la soluzione numerica dell’equazione (<strong>4.</strong>1) è equivalente alla<br />
soluzione “esatta” dell’equazione (<strong>4.</strong>64). Posto<br />
e<br />
!b = ˆ b " b (<strong>4.</strong>65)<br />
!x = ˆx " x (<strong>4.</strong>66)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
22<br />
si pone il problema <strong>di</strong> determinare una stima dell’errore !x a partire dalla conoscenza<br />
<strong>di</strong> !b .<br />
Data un’equazione possiamo in linea schematica <strong>di</strong>stinguere, per quanto riguarda la<br />
propagazione dell’errore, il comportamento dell’equazione dal comportamento del<br />
particolare algoritmo utilizzato per risolverla. Supponiamo che sia possibile risolvere<br />
l’equazione esattamente. Ci poniamo la seguente domanda: eventuali perturbazioni sui<br />
dati dell’equazione come influenzano la soluzione? Per caratterizzare un’equazione<br />
rispetto a questo tipo <strong>di</strong> comportamento si utilizza il termine con<strong>di</strong>zionamento.<br />
Un’equazione si <strong>di</strong>ce ben con<strong>di</strong>zionata se eventuali perturbazioni sui dati non<br />
influenzano eccessivamente la soluzione, altrimenti si <strong>di</strong>ce mal con<strong>di</strong>zionata. La<br />
definizione <strong>di</strong> equazione ben con<strong>di</strong>zionata è più restrittiva <strong>di</strong> quella <strong>di</strong> equazione ben<br />
posta secondo Hadamard 3 .<br />
Nel caso <strong>di</strong> un algoritmo, per in<strong>di</strong>care il suo comportamento rispetto alla<br />
propagazione dell’errore si usa il termine stabilità numerica. Un algoritmo si <strong>di</strong>ce stabile<br />
numericamente se l’errore non si amplifica eccessivamente nella successione delle<br />
operazioni, altrimenti si <strong>di</strong>ce numericamente instabile.<br />
<strong>4.</strong>7.1 Con<strong>di</strong>zionamento <strong>di</strong> un sistema lineare<br />
Il problema del con<strong>di</strong>zionamento <strong>di</strong> un sistema <strong>di</strong> <strong>equazioni</strong> <strong>algebriche</strong> <strong>lineari</strong><br />
consiste nel stu<strong>di</strong>are come varia la soluzione del sistema al variare dei dati, cioè della<br />
matrice e del termine noto.<br />
Stu<strong>di</strong>amo dapprima il caso in cui varia solo il termine noto. In<strong>di</strong>chiamo con x e<br />
ˆx = x + !x le soluzioni dell’equazione (<strong>4.</strong>1) con i termini noti b e ˆ b = b + !b ,<br />
rispettivamente,<br />
Sottraendo membro a membro otteniamo<br />
quin<strong>di</strong><br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
Ax = b , A( x + !x)<br />
= b + !b . (<strong>4.</strong>67)<br />
A!x = !b , (<strong>4.</strong>68)<br />
!x = A "1 !b . (<strong>4.</strong>69)<br />
Per misurare l’entità della perturbazione nel termine noto e l’entità della perturbazione<br />
indotta nella soluzione introduciamo una norma ! : !b e !x danno una misura delle<br />
perturbazioni !b e !x . C’è una relazione tra !x e !b ? Dalla (<strong>4.</strong>69) si<br />
!x = A"1 !b . (<strong>4.</strong>70)<br />
Dalla definizione <strong>di</strong> norma <strong>di</strong> una matrice (ve<strong>di</strong> Appen<strong>di</strong>ce 2) abbiamo che<br />
3 Un’equazione è ben posta secondo Hadamard quando ammette una ed una sola soluzione ed inoltre, la<br />
soluzione <strong>di</strong>pende con continuità dai dati.
23<br />
Combinando le (<strong>4.</strong>70) e (<strong>4.</strong>71) otteniamo la relazione cercata<br />
A!1 "b # A !1 "b . (<strong>4.</strong>71)<br />
!x " A#1 !b . (<strong>4.</strong>72)<br />
E’ evidente che sono <strong>di</strong> particolare interesse la misura delle variazioni relative !x / x<br />
e !b / b . Dividendo ambo i membri della (<strong>4.</strong>72) per x abbiamo<br />
!x<br />
x " A#1 !b<br />
x<br />
Dalla prima equazione delle (<strong>4.</strong>67) si ha anche<br />
Allora, combinando le (<strong>4.</strong>73) e (<strong>4.</strong>74)<br />
! " #x<br />
x<br />
. (<strong>4.</strong>73)<br />
b ! A x . (<strong>4.</strong>74)<br />
$ ( A A%1 ) #b<br />
b<br />
. (<strong>4.</strong>75)<br />
Consideriamo, ora, il caso in cui varia la matrice. In<strong>di</strong>chiamo con x e ˆx = x + !x le<br />
soluzioni dell’equazione (<strong>4.</strong>1) con le matrici A e  = A + !A , rispettivamente, (stiamo<br />
implicitamente assumendo che A e  siano invertibili)<br />
Da queste <strong>equazioni</strong> abbiamo<br />
da cui<br />
e quin<strong>di</strong><br />
Essendo<br />
Ax = b , ( A + !A)<br />
( x + !x)<br />
= b . (<strong>4.</strong>76)<br />
Ax = ( A + !A)<br />
( x + !x),<br />
(<strong>4.</strong>77)<br />
!A( x + !x)<br />
+ A!x = 0 , (<strong>4.</strong>78)<br />
!x = A"1 !A( x + !x).<br />
(<strong>4.</strong>79)<br />
A!1 "A( x + "x)<br />
# A !1 "A ( x + "x)<br />
(<strong>4.</strong>80)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
dalla (<strong>4.</strong>79) si ha finalmente<br />
! "<br />
#x<br />
( x + #x)<br />
24<br />
$ ( A A%1 ) #A<br />
A<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
. (<strong>4.</strong>81)<br />
In<strong>di</strong>chiamo con ! l’ampiezza della perturbazione del dato in entrambi i casi: nel primo<br />
caso ! " #b / b , nel secondo caso ! " #A / A . Quin<strong>di</strong>, sia per la perturbazione del<br />
termine noto che per la perturbazione della matrice l’ampiezza relativa della<br />
perturbazione della soluzione ! è legata all’ampiezza della perturbazione del dato !<br />
dalla relazione<br />
! " K ( A)#<br />
, (<strong>4.</strong>82)<br />
dove<br />
K A ( ) ! A A"1 (<strong>4.</strong>83)<br />
è detto con<strong>di</strong>zionamento della matrice A . Essendo A !1 A " 1 (ve<strong>di</strong> Appen<strong>di</strong>ce 2), si<br />
ha che<br />
K ( A)<br />
! 1 (<strong>4.</strong>84)<br />
per ogni matrice A (invertibile). Dunque il con<strong>di</strong>zionamento <strong>di</strong> una matrice è sempre<br />
maggiore <strong>di</strong> 1. Il con<strong>di</strong>zionamento <strong>di</strong> una matrice può essere calcolato in MATLAB<br />
attraverso il comando “cond(A)”. Se il con<strong>di</strong>zionamento <strong>di</strong> A è piccolo, cioè dell’or<strong>di</strong>ne<br />
dell’unità, la matrice A è detta ben con<strong>di</strong>zionata ed a perturbazioni sui dati<br />
corrispondono perturbazioni sulla soluzione al più dello stesso or<strong>di</strong>ne <strong>di</strong> grandezza <strong>di</strong><br />
quelle sui dati. Se invece il con<strong>di</strong>zionamento è grande la matrice si <strong>di</strong>ce mal con<strong>di</strong>zionata<br />
e a piccole perturbazioni sui dati possono corrispondere gran<strong>di</strong> perturbazioni sulla<br />
soluzione.<br />
Esempio <strong>4.</strong>7<br />
La matrice <strong>di</strong> Hilbert definita dalla (<strong>4.</strong>60) è mal con<strong>di</strong>zionata già per n ! 4 . In Tabella<br />
<strong>4.</strong>2 riportiamo il con<strong>di</strong>zionamento per <strong>di</strong>versi valori <strong>di</strong> n . In base a questo risultato non<br />
ci dobbiamo meravigliare <strong>di</strong> quanto abbiamo visto nell’Esempio <strong>4.</strong>6.<br />
n<br />
Tabella <strong>4.</strong>2<br />
K A<br />
( )<br />
10 1.60...!10 13<br />
20 <strong>4.</strong>60...!10 18<br />
30 6.47...!10 18<br />
40 3.13...!10 18<br />
50 2.19...!10 19<br />
♦
25<br />
Alcune proprietà del numero <strong>di</strong> con<strong>di</strong>zionamento sono raccolte nel seguente<br />
enunciato.<br />
<strong>4.</strong>7.2 Proprietà del numero <strong>di</strong> con<strong>di</strong>zionamento<br />
1. K ( !A)<br />
= K ( A)<br />
per ogni matrice A e per ogni scalare ! .<br />
2.<br />
K2 ( A)<br />
= ! max<br />
dove ! max e ! min sono, rispettivamente, il valore singolare più<br />
! min<br />
grande e più piccolo <strong>di</strong> A (ve<strong>di</strong> Appen<strong>di</strong>ci 1 e 2) 4 .<br />
3. Se A è simmetrica K2 ( A)<br />
= ! max dove ! e ! sono, rispettivamente,<br />
max min<br />
! min<br />
l’autovalore della matrice in valore assoluto più grande e più piccolo.<br />
<strong>4.</strong> Se A è simmetrica e definita positiva<br />
K2 ( A)<br />
= ! max<br />
rispettivamente, l’autovalore più grande e più piccolo.<br />
5. K 2 A<br />
( ) = 1 se e solo se A = !I .<br />
! min<br />
dove ! max e ! min sono,<br />
La <strong>di</strong>mostrazione delle proprietà 2. viene data in Appen<strong>di</strong>ce 2. La <strong>di</strong>mostrazione delle<br />
proprietà 3. e <strong>4.</strong> è imme<strong>di</strong>ata se si ricorda che gli autovalori <strong>di</strong> una matrice simmetrica<br />
sono reali e i valori principali sono uguali agli autovalori presi in valore assoluto. Inoltre,<br />
se la matrice è anche definita positiva gli autovalori sono tutti positivi (ve<strong>di</strong> Appen<strong>di</strong>ce<br />
1). Lasciamo al lettore la <strong>di</strong>mostrazione delle altre. In base a queste proprietà abbiamo<br />
che una matrice mal con<strong>di</strong>zionata è caratterizzata da un valore singolare massimo molto<br />
più grande <strong>di</strong> quello minimo. Se la matrice è simmetrica essa è mal con<strong>di</strong>zionata se<br />
l’autovalore in modulo più grande è molto più grande dell’autovalore in modulo più<br />
piccolo. Infine, quando la matrice A è simmetrica e definita positiva essa è mal<br />
con<strong>di</strong>zionata se l’autovalore più grande è molto più grande dell’autovalore più piccolo.<br />
Infine, essendo (ve<strong>di</strong> Appen<strong>di</strong>ce 1)<br />
det( A)<br />
= " ! i ( A)<br />
, (<strong>4.</strong>85)<br />
dove ! i ( A)<br />
per i = 1,2,...,n sono gli autovalori della matrice A , si evince che non c’è,<br />
in generale, alcuna relazione tra il determinante <strong>di</strong> A e il numero <strong>di</strong> con<strong>di</strong>zionamento.<br />
<strong>4.</strong>7.3 Analisi dell’errore<br />
Sappiamo che un algoritmo implementato in aritmetica finita crea errori <strong>di</strong><br />
arrotondamento. La stabilità è una misura <strong>di</strong> come tali errori si propagano.<br />
4<br />
Con K p ( A)<br />
inten<strong>di</strong>amo il con<strong>di</strong>zionamento definito attraverso la p-norma ! .<br />
p<br />
n<br />
i=1<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
26<br />
E’ possibile avere due <strong>di</strong>verse stime dell’errore, una si basa su una stima a posteriori e<br />
l’altra su una stima a priori. In entrambi i casi il numero <strong>di</strong> con<strong>di</strong>zionamento <strong>di</strong> A gioca<br />
un ruolo fondamentale. L’idea <strong>di</strong> base consiste nel cercare <strong>di</strong> valutare la variazione sui<br />
dati necessaria a produrre, quando il problema è risolto esattamente, la stessa variazione<br />
sui risultati ottenuta per effetto degli errori <strong>di</strong> arrotondamento. Una volta valutate queste<br />
variazioni, attraverso le (<strong>4.</strong>75) e (<strong>4.</strong>81) si può avere una stima dell’errore se A non è mal<br />
con<strong>di</strong>zionata.<br />
Consideriamo dapprima una stima a posteriori. A causa degli errori <strong>di</strong> arrotondamento<br />
la soluzione dell’equazione (<strong>4.</strong>1) con il metodo della fattorizzazione <strong>di</strong> Gauss x ! non è<br />
soluzione esatta della (<strong>4.</strong>1) e<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
r ! Ax * " b # 0 . (<strong>4.</strong>86)<br />
Il residuo r sarebbe uguale a zero se non vi fossero errori <strong>di</strong> arrotondamento. Allora, la<br />
soluzione x ! è la soluzione che si avrebbe se il sistema (<strong>4.</strong>1) fosse risolto esattamente<br />
con ˆ b = b + r<br />
( ) al posto del termine noto b . Allora, applicando la (<strong>4.</strong>75) si ha<br />
x ! x "<br />
x<br />
# K ( A)<br />
r<br />
b<br />
. (<strong>4.</strong>87)<br />
Quando la matrice A è ben con<strong>di</strong>zionata, K ( A)<br />
! 1, il residuo relativo r / b<br />
rappresenta una buona stima dell’errore relativo e / x , dove e ! x " x # . Attenzione,<br />
quando la matrice A è mal con<strong>di</strong>zionata r / b non dà alcuna informazione utile<br />
sull’errore, come gli Esempi <strong>4.</strong>6 e <strong>4.</strong>7 evidenziano. La (<strong>4.</strong>87) è una stima a posteriori<br />
perché può essere ottenuta solo dopo che il problema è stato risolto.<br />
Consideriamo, ora una stima a priori. In<strong>di</strong>chiamo sempre con x ! la soluzione ottenuta<br />
con il metodo della fattorizzazione <strong>di</strong> Gauss e con E una matrice tale che<br />
A + E ( )x! = b . (<strong>4.</strong>88)<br />
La soluzione x ! è la soluzione che si avrebbe se il sistema (<strong>4.</strong>1) fosse risolto esattamente<br />
con  = A + E<br />
( ) al posto della matrice A . Allora, applicando la (<strong>4.</strong>81) si ha<br />
x ! x "<br />
x "<br />
# K ( A)<br />
E<br />
A<br />
. (<strong>4.</strong>89)<br />
Come nel caso precedente, quando la matrice A è ben con<strong>di</strong>zionata la quantità E / A<br />
è una buona in<strong>di</strong>cazione della precisione della soluzione. E’ possibile avere una stima<br />
della norma <strong>di</strong> E . Per la fattorizzazione LU con pivoting si <strong>di</strong>mostra che [<strong>4.</strong>2]
27<br />
E ! " # $t A ! (<strong>4.</strong>90)<br />
dove ! è la base e t è il numero <strong>di</strong> cifre significative dell’aritmetica impiegata.<br />
Combinando le (<strong>4.</strong>89) e (<strong>4.</strong>90) si ottiene<br />
x ! x "<br />
x "<br />
#<br />
#<br />
$ % !t K # ( A)<br />
. (<strong>4.</strong>91)<br />
Questa è una stima a priori perché può essere ottenuta senza risolvere il problema. Si<br />
osservi che ! "t
28<br />
In generale, il con<strong>di</strong>zionamento <strong>di</strong> una matrice può essere mo<strong>di</strong>ficato dallo scaling.<br />
Un problema molto interessante, ma <strong>di</strong> <strong>di</strong>fficile soluzione, è la determinazione <strong>di</strong> due<br />
matrici D1 e D2 tali da minimizzare K ( D1AD2 ). Si tratta <strong>di</strong> un problema <strong>di</strong><br />
preprocessing (precon<strong>di</strong>zionamento). Per ulteriori approfon<strong>di</strong>menti si veda in [<strong>4.</strong>2].<br />
<strong>4.</strong>8 Meto<strong>di</strong> iterativi<br />
Il metodo della fattorizzazione <strong>di</strong> Gauss è un metodo <strong>di</strong>retto: la soluzione esatta del<br />
problema è determinata con un numero finito <strong>di</strong> operazioni elementari in assenza <strong>di</strong><br />
errori <strong>di</strong> arrotondamento.<br />
Un metodo iterativo per la soluzione del sistema (<strong>4.</strong>1) consiste nel costruire, a partire<br />
da un dato iniziale x 0 ( ) , una successione<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
x 1 ( ) ,x 2 ( ) ,...,x k ( ) ,... (<strong>4.</strong>96)<br />
convergente alla soluzione x per k ! " attraverso l’iterazione<br />
k +1<br />
x ( ) = Bx k ( ) + g . (<strong>4.</strong>97)<br />
La (<strong>4.</strong>97) ricorda l’iterazione <strong>di</strong> punto fisso descritta nella <strong>Nota</strong> 5: la soluzione del<br />
sistema (<strong>4.</strong>1) è cercata come punto fisso della funzione <strong>di</strong> iterazione<br />
che è, quin<strong>di</strong>, la soluzione dell’equazione<br />
! ( x)<br />
= Bx + b , (<strong>4.</strong>98)<br />
x = Bx + b . (<strong>4.</strong>99)<br />
Come costruire l’iterazione (<strong>4.</strong>97)? Consideriamo la seguente decomposizione della<br />
matrice A :<br />
con det( V)<br />
! 0 . Si ha allora<br />
da cui il proce<strong>di</strong>mento iterativo<br />
A = V + W (<strong>4.</strong>100)<br />
Ax = b ! Vx = "Wx + b (<strong>4.</strong>101)<br />
k +1<br />
Vx ( ) = !Wx k ( ) + b per k ! 0 . (<strong>4.</strong>102)
29<br />
Il punto fisso della (<strong>4.</strong>102) è la soluzione dell’equazione (<strong>4.</strong>101) ovvero del sistema (<strong>4.</strong>1)<br />
. La matrice <strong>di</strong> iterazione B è data da<br />
e g è dato da<br />
B = !V !1 W = V !1 A ! I (<strong>4.</strong>103)<br />
g = V!1 b . (<strong>4.</strong>104)<br />
La decomposizione (<strong>4.</strong>100) deve essere fatta in modo tale da garantire due requisiti:<br />
i) l’iterazione (<strong>4.</strong>97) sia convergente;<br />
ii) il costo computazionale sia più basso <strong>di</strong> quello che si avrebbe con il metodo<br />
della fattorizzazione <strong>di</strong> Gauss.<br />
Quando l’iterazione converge, essa, in generale, dà la soluzione solo per k ! " .<br />
Dunque, come nell’iterazione <strong>di</strong> punto fisso stu<strong>di</strong>ata nella <strong>Nota</strong> 5, anche in questo caso<br />
bisogna introdurre un criterio <strong>di</strong> arresto. Posto<br />
e<br />
!x<br />
k +1 ( ) k +1<br />
" x<br />
per arrestare l’iterazione possiamo utilizzare uno dei due criteri<br />
dove ! è una norma naturale (ve<strong>di</strong> Appen<strong>di</strong>ce 2).<br />
( ) # x k ( ) (<strong>4.</strong>105)<br />
r k ( ) ! b " Ax k ( ) , (<strong>4.</strong>106)<br />
!x M ( ) " # , (<strong>4.</strong>107)<br />
r M ( ) ! " , (<strong>4.</strong>108)<br />
Ora mostreremo che c’è una relazione tra il residuo r k ( ) e l’incremento !x<br />
Essendo<br />
dalla (<strong>4.</strong>102) segue che<br />
quin<strong>di</strong><br />
k +1 ( ) .<br />
k<br />
!Wx ( ) + b = ( V ! A)x<br />
k ( ) + b = Vx k ( ) ! r k ( ) . (<strong>4.</strong>109)<br />
k+1<br />
V x ( ) ! x k ( ) ( ) = !r k<br />
( ) , (<strong>4.</strong>110)<br />
V!x k+1 ( ) = r k ( ) o !x k+1 ( ) = V "1 r k ( ) . (<strong>4.</strong>111)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
30<br />
Tra le norme del residuo e dell’incremento ci sono le relazioni<br />
( ) ! V "x k+1<br />
k<br />
r<br />
( )<br />
o !x k+1<br />
( ) " V #1 r k ( )<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
. (<strong>4.</strong>112)<br />
Per descrivere i vari meto<strong>di</strong> iterativi conviene rappresentare la matrice A come segue<br />
A = D + ! L + ! U (<strong>4.</strong>113)<br />
dove D è la matrice <strong>di</strong>agonale formata dagli elementi della <strong>di</strong>agonale <strong>di</strong> A , ! L è la<br />
matrice triangolare inferiore formata dagli elementi della parte triangolare inferiore <strong>di</strong> A<br />
con elementi nulli sulla <strong>di</strong>agonale e ! U è la matrice triangolare superiore formata dagli<br />
elementi della parte triangolare superiore <strong>di</strong> A con elementi nulli sulla <strong>di</strong>agonale, Figura<br />
<strong>4.</strong>3.<br />
Figura <strong>4.</strong>3<br />
e<br />
<strong>4.</strong>7.1 Metodo <strong>di</strong> Jacobi<br />
Il metodo iterativo <strong>di</strong> Jacobi consiste nello scegliere<br />
La matrice <strong>di</strong> iterazione è<br />
V = D (<strong>4.</strong>114)<br />
W = ! ! U + ! ( L).<br />
(<strong>4.</strong>115)<br />
B = !D!1 ( U ! + L!<br />
) = I ! D !1 A . (<strong>4.</strong>116)<br />
La matrice D è invertibile se a ii ! 0 per i = 1,2,...,n . L’inversa <strong>di</strong> D si calcola<br />
imme<strong>di</strong>atamente, essa è ancora una matrice <strong>di</strong>agonale,<br />
D !1 =<br />
!1<br />
a11 0 0 ... 0<br />
0<br />
!1<br />
a22 0 ... 0<br />
... ... ... ... ...<br />
!1<br />
0 0 0 ... ann . (<strong>4.</strong>117)
31<br />
In forma esplicita l’algoritmo che descrive l’iterazione <strong>di</strong> Jacobi è<br />
( k +1)<br />
1<br />
xi =<br />
aii $ n<br />
& bi ! # aijx j<br />
%<br />
j =1, j "i<br />
( k)<br />
'<br />
)<br />
(<br />
i = 1,2,...,n (<strong>4.</strong>118)<br />
per k = 0,1,... .<br />
Il metodo <strong>di</strong> Jacobi è implementato nel Programma <strong>4.</strong>2, [<strong>4.</strong>3]. I parametri <strong>di</strong> ingresso<br />
sono la matrice A , il termine noto b , il dato iniziale x0 per l’iterazione, il numero<br />
massimo <strong>di</strong> iterazioni consentite e l’errore “toll” del criterio d’arresto dell’iterazione,<br />
err = r k ( )<br />
/ r 0 ( ) ! toll .<br />
Programma <strong>4.</strong>2: Iterazione <strong>di</strong> Jacobi<br />
function [x,iter]=jacobi(A,b,x0,nmax,toll)<br />
% Iterazione <strong>di</strong> Jacobi<br />
[n,n]=size(A);<br />
iter=0;r=b-A*x0;r0=norm(r);x_old=x0;<br />
err=r0;<br />
while err>toll&iter
32<br />
con il metodo <strong>di</strong> Jacobi. La matrice è dominanza <strong>di</strong>agonale stretta per righe. Con x 0 = 0<br />
e toll = 10 !6 dopo 28 iterazioni si ottiene la soluzione x = 0.0714,0.2143,0.5714 T .<br />
Esempio <strong>4.</strong>10<br />
Risolviamo il sistema<br />
1 3 3<br />
3 6 4<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
1<br />
2 2 2 x = 3<br />
2<br />
♦<br />
(<strong>4.</strong>120)<br />
con il metodo <strong>di</strong> Jacobi. L’iterazione <strong>di</strong> Jacobi non converge perché la matrice non è a<br />
dominanza <strong>di</strong>agonale stretta per righe.<br />
♦<br />
Quale è il vantaggio dal punto <strong>di</strong> vista del costo computazionale <strong>di</strong> questo metodo<br />
rispetto a quello della fattorizzazione <strong>di</strong> Gauss? Ad ogni iterazione del metodo <strong>di</strong> Jacobi<br />
bisogna effettuare ( 2n ! 1)n<br />
operazioni (ad<strong>di</strong>zioni, moltiplicazioni e <strong>di</strong>visioni). E’<br />
evidente, allora, che se il numero <strong>di</strong> iterazioni M necessarie per raggiungere la<br />
precisione desiderata è tale che M > 1. Invece nella fattorizzazione <strong>di</strong> Gauss le matrici L e U sono,<br />
in generale, piene anche se A è sparsa.<br />
e<br />
<strong>4.</strong>7.2 Metodo <strong>di</strong> Gauss-Seidel<br />
Il metodo iterativo <strong>di</strong> Gauss-Seidel consiste nello scegliere<br />
La matrice <strong>di</strong> iterazione è<br />
V = D + ! L (<strong>4.</strong>121)<br />
W = ! U . (<strong>4.</strong>122)<br />
B = ! D + ! ( L)<br />
!1 U ! = I ! ( D + L!<br />
) !1<br />
A . (<strong>4.</strong>123)
Ad ogni passo dell’iterazione <strong>di</strong> Gauss-Seidel bisogna risolvere il sistema<br />
33<br />
D + ! k +1 ( L)x<br />
( ) = ! ! Ux k ( ) + b . (<strong>4.</strong>124)<br />
Essendo D + ! L una matrice triangolare bassa il sistema (<strong>4.</strong>124) può essere risolto con<br />
l’algoritmo (<strong>4.</strong>14). Si ottiene lo schema iterativo in forma esplicita<br />
( k +1)<br />
1<br />
x1 =<br />
a11 ( k +1)<br />
1<br />
x2 =<br />
a22 ( k +1)<br />
1<br />
x3 =<br />
a33 e così via. In termini più generali si ha<br />
( k +1)<br />
1<br />
xi =<br />
aii #<br />
$<br />
%<br />
#<br />
$<br />
%<br />
#<br />
$<br />
%<br />
n<br />
k<br />
b1 ! " a1hx h<br />
h=2<br />
( )<br />
&<br />
'<br />
(<br />
n<br />
( k +1)<br />
k<br />
b2 ! a21x1 ! " a2hx h<br />
h= 3<br />
(<strong>4.</strong>125)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
( )<br />
&<br />
'<br />
(<br />
n<br />
( k +1)<br />
( k +1)<br />
k<br />
b3 ! a31x1 ! a31x2 ! " a3hxh h= 4<br />
i!1<br />
#<br />
bi ! " aihxh $<br />
%<br />
h=1<br />
n<br />
( k +1)<br />
k<br />
! aihxh "<br />
h=i+1<br />
( )<br />
&<br />
'<br />
( i = 1,2,...,n (<strong>4.</strong>128)<br />
( )<br />
&<br />
'<br />
(<br />
(<strong>4.</strong>126)<br />
(<strong>4.</strong>127)<br />
per k = 0,1,... ; la prima sommatoria non dà contributo per se i = 1, mentre la seconda<br />
sommatoria non dà contributo se i = n . La (<strong>4.</strong>128) può essere espressa nella forma<br />
compatta<br />
k +1<br />
x ( ) = !D !1 Lx ! ( k +1)<br />
!1<br />
! D Ux ! ( k)<br />
!1<br />
+ D b (<strong>4.</strong>129)<br />
per k = 0,1,... .<br />
Il metodo <strong>di</strong> Gauss-Seidel converge se la matrice A verifica una <strong>di</strong> queste due<br />
con<strong>di</strong>zioni:<br />
i) la matrice A è a dominanza <strong>di</strong>agonale stretta per righe;<br />
ii) la matrice A è simmetrica e definita positiva.<br />
( ) vengono calcolate<br />
k +1<br />
Nel metodo <strong>di</strong> Jacobi le componenti del vettore x<br />
in<strong>di</strong>pendentemente le une dalle altre, invece nel metodo <strong>di</strong> Gauss-Seidel per calcolare<br />
( k +1)<br />
( k +1)<br />
( k +1)<br />
( k +1)<br />
xi si impiegano le componenti xi , x2 ,..., xi!1 calcolate in precedenza. Ciò rende<br />
il metodo <strong>di</strong> Gauss-Seidel più veloce <strong>di</strong> quello <strong>di</strong> Jacobi. Si osservi che il numero <strong>di</strong><br />
operazioni ad ogni iterazione è uguale al numero <strong>di</strong> operazioni richieste dal metodo <strong>di</strong><br />
Jacobi.<br />
Il metodo <strong>di</strong> Gauss-Seidel è implementato nel Programma <strong>4.</strong>3, [<strong>4.</strong>3]. I parametri <strong>di</strong><br />
ingresso sono la matrice A , il termine noto b , il dato iniziale x0 per l’iterazione, il
34<br />
numero massimo <strong>di</strong> iterazioni consentite e l’errore “toll” del criterio d’arresto<br />
dell’iterazione, err = r k ( )<br />
/ r 0 ( ) ! toll .<br />
Esempio <strong>4.</strong>11<br />
Risolviamo il sistema (<strong>4.</strong>119) con il metodo <strong>di</strong> Gauss-Seidel. La matrice è dominanza<br />
<strong>di</strong>agonale stretta per righe. Con x 0 = 0 e toll = 10 !6 dopo 8 iterazioni si ottiene la<br />
soluzione x = 0.0714,0.2143,0.5714 T , 20 iterazioni in meno del metodo <strong>di</strong> Jacobi. ♦<br />
Programma <strong>4.</strong>3: Iterazione <strong>di</strong> Gauss-Seidel<br />
function [x,iter]=gseidel(A,b,x0,nmax,toll)<br />
% Iterazione <strong>di</strong> Gauss-Seidel<br />
[n,n]=size(A);<br />
iter=0;r=b-A*x0;r0=norm(r);x=x0; err=r0;<br />
while err>toll&iter
Esercizio <strong>4.</strong>8<br />
35<br />
k +1<br />
x ( ) = I ! "D !1 ( A)x<br />
k ( ) + "D !1 b . (<strong>4.</strong>132)<br />
Implementare in MATLAB l’algoritmo del rilassamento per il metodo <strong>di</strong> Jacobi.<br />
Invece, partendo dal metodo <strong>di</strong> Gauss-Seidel<br />
k +1/2<br />
x ( ) = I ! ( D + L)<br />
!1 "<br />
#<br />
A$<br />
% x k ( ) + ( D + L)<br />
!1 b (<strong>4.</strong>133)<br />
si ottiene il metodo <strong>di</strong> rilassamento o metodo SOR<br />
Esercizio <strong>4.</strong>9<br />
( ) "1 1" !<br />
k +1<br />
x ( ) = D +!L<br />
k<br />
#$ ( )D " !U%&<br />
x ( ) + ! ( D + L)<br />
"1 b . (<strong>4.</strong>134)<br />
Implementare in MATLAB l’algoritmo del rilassamento per il metodo <strong>di</strong> Gauss-<br />
Seidel.<br />
♦<br />
<strong>4.</strong>9 Il problema della convergenza<br />
Introduciamo il vettore “errore”<br />
e k ( ) ! x k ( ) " x . (<strong>4.</strong>135)<br />
L’iterazione (<strong>4.</strong>96) generata dalla (<strong>4.</strong>97) converge al punto fisso x se e solo se<br />
La legge che governa e k ( ) per k ! 0 è<br />
<strong>4.</strong>9.1 Criterio <strong>di</strong> convergenza<br />
lim e<br />
k!" k ( ) = 0 . (<strong>4.</strong>136)<br />
k +1<br />
e ( ) = Be k<br />
( ) . (<strong>4.</strong>137)<br />
Consideriamo, ora, una norma naturale ! e applichiamola ad ambo i membri della<br />
(<strong>4.</strong>137),<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
♦
Siccome Be k ( ) ! B e k<br />
( )<br />
, si ha<br />
k +1<br />
e<br />
k +1<br />
e<br />
Dalla (<strong>4.</strong>139) segue imme<strong>di</strong>atamente che<br />
Se<br />
k<br />
e ( ) ! ( B ) k<br />
36<br />
( ) = Be k<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
( )<br />
( ) ! B e k<br />
e 0 ( )<br />
( )<br />
. (<strong>4.</strong>138)<br />
. (<strong>4.</strong>139)<br />
k = 1,2,... . (<strong>4.</strong>140)<br />
B < 1 (<strong>4.</strong>141)<br />
la (<strong>4.</strong>140) dà imme<strong>di</strong>atamente la (<strong>4.</strong>136). Pertanto, l’iterazione (<strong>4.</strong>97) converge alla<br />
soluzione x del sistema (<strong>4.</strong>99) se almeno una norma della matrice <strong>di</strong> iterazione è<br />
inferiore ad uno.<br />
Utilizzando la norma euclidea ! si ha che B = ! 2 2 max ( B)<br />
dove ! max ( B)<br />
è il valore<br />
singolare più grande della matrice B . La con<strong>di</strong>zione <strong>di</strong> convergenza (<strong>4.</strong>141) <strong>di</strong>venta<br />
! max B ( ) < 1 . (<strong>4.</strong>142)<br />
Se la matrice <strong>di</strong> iterazione è simmetrica si ha che ! max ( B)<br />
= max " B<br />
i=1,n<br />
( )<br />
( ) dove con ! i B<br />
in<strong>di</strong>chiamo un generico autovalore della matrice B . Quin<strong>di</strong> per matrici <strong>di</strong> iterazioni<br />
simmetriche la con<strong>di</strong>zione <strong>di</strong> convergenza è verifica se l’autovalore <strong>di</strong> B in modulo più<br />
grande ha modulo inferiore ad 1. In realtà, questo risultato ha vali<strong>di</strong>tà più generale.<br />
Per definizione, il raggio spettrale ! B<br />
( ) <strong>di</strong> una generica matrice quadrata B è<br />
! ( B)<br />
" max<br />
i=1,n # i B<br />
Si <strong>di</strong>mostra che per ogni ! > 0 esiste una norma ! " tale che, [<strong>4.</strong>4],<br />
Allora se<br />
B !<br />
( ) . (<strong>4.</strong>143)<br />
" # ( B)<br />
+ $ . (<strong>4.</strong>144)<br />
! ( B)<br />
< 1 (<strong>4.</strong>145)
37<br />
la (<strong>4.</strong>141) è verificata. In realtà, la (<strong>4.</strong>145) è anche una con<strong>di</strong>zione necessaria per la<br />
convergenza dell’iterazione. Infatti se fosse ! ( B)<br />
> 1 , la matrice <strong>di</strong> iterazione B avrebbe<br />
almeno un autovalore ! con ! > 1 e corrispondente autovettore u ! 0 . Essendo<br />
B k u = ! k u , B k u <strong>di</strong>vergerebbe per k ! " .<br />
Osservazione<br />
Il determinante <strong>di</strong> una matrice è uguale al prodotto dei suoi autovalori, (ve<strong>di</strong>, ad<br />
esempio, [<strong>4.</strong>4]). Allora se<br />
det( B)<br />
> 1 (<strong>4.</strong>146)<br />
certamente il raggio spettrale <strong>di</strong> B non verifica la con<strong>di</strong>zione <strong>di</strong> convergenza (<strong>4.</strong>145).<br />
Inoltre, la traccia <strong>di</strong> una matrice è uguale alla somma dei suoi autovalori. Allora, se<br />
tr( B)<br />
> n (<strong>4.</strong>147)<br />
significa che almeno un autovalore è in modulo maggiore <strong>di</strong> 1 e, quin<strong>di</strong> deve essere<br />
necessariamente ! B<br />
( ) > 1 .<br />
Esercizio <strong>4.</strong>10<br />
Considerare i meto<strong>di</strong> <strong>di</strong> Jacobi e Gauss-Seidel per la matrice<br />
A =<br />
1 !2 2<br />
!1 1 !1 . (<strong>4.</strong>148)<br />
!2 !2 1<br />
Determinare i raggi spettrali delle corrispondenti matrici <strong>di</strong> iterazione.<br />
Esercizio <strong>4.</strong>11<br />
Considerare i meto<strong>di</strong> <strong>di</strong> Jacobi e Gauss-Seidel per la matrice<br />
A =<br />
2 !1 1<br />
2 2 2<br />
!1 !1 2<br />
Determinare i raggi spettrali delle corrispondenti matrici <strong>di</strong> iterazione.<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
♦<br />
♦<br />
. (<strong>4.</strong>149)<br />
♦
38<br />
Dal criterio (<strong>4.</strong>145) è possibile ricavare delle con<strong>di</strong>zioni per la matrice A che assicurano<br />
la convergenza.<br />
<strong>4.</strong>9.2 Metodo <strong>di</strong> Jacobi<br />
Se la matrice A è a dominanza <strong>di</strong>agonale stretta per righe si ha B < 1 e, quin<strong>di</strong>,<br />
!<br />
! ( B)<br />
< 1 . La <strong>di</strong>mostrazione è la seguente. La matrice <strong>di</strong> iterazione del metodo <strong>di</strong> Jacobi<br />
ha elementi:<br />
e quin<strong>di</strong><br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
Bii = 0 , Bij = ! aij , i ! j (<strong>4.</strong>150)<br />
aii n<br />
n aij ! Bij =<br />
j =1 j =1, j "i aii Essendo la matrice A a dominanza <strong>di</strong>agonale stretta per righe si ha<br />
per ogni i . Combinando le (<strong>4.</strong>151) e (<strong>4.</strong>152) segue che<br />
Ricordando che<br />
abbiamo che<br />
! . (<strong>4.</strong>151)<br />
n<br />
"<br />
j =1, j !i<br />
aij < aii (<strong>4.</strong>152)<br />
n<br />
! Bij j =1<br />
< 1 per ogni i . (<strong>4.</strong>153)<br />
B ! = max<br />
i=1,n<br />
n<br />
" Bij j =1<br />
(<strong>4.</strong>154)<br />
B < 1. (<strong>4.</strong>155)<br />
!<br />
Essendo ! ( B)<br />
" B (ve<strong>di</strong> Appen<strong>di</strong>ce 2) si ha anche ! ( B)<br />
< 1 .<br />
#<br />
Se la matrice A è a dominanza <strong>di</strong>agonale stretta per righe, il metodo <strong>di</strong> Jacobi con<br />
rilassamento converge con 0 < ! " 1. Lasciamo al lettore la <strong>di</strong>mostrazione <strong>di</strong> questo<br />
criterio.<br />
<strong>4.</strong>9.3 Metodo <strong>di</strong> Gauss-Seidel<br />
Per il metodo <strong>di</strong> Gauss-Seidel ci limiteremo a enunciare dei criteri. Lasciamo la<br />
lettore la <strong>di</strong>mostrazione.
39<br />
Criterio 1. Se la matrice A è a dominanza <strong>di</strong>agonale stretta per righe, allora il raggio<br />
spettrale della corrispondente matrice <strong>di</strong> iterazione B è inferiore a 1 e, quin<strong>di</strong>, il metodo<br />
converge.<br />
Criterio 2. Se la matrice A è simmetrica e definita positiva, allora il raggio spettrale<br />
della corrispondente matrice <strong>di</strong> iterazione B è inferiore a 1 e, quin<strong>di</strong>, il metodo<br />
converge.<br />
Per il metodo <strong>di</strong> Gauss-Seidel con rilassamento esistono i seguenti criteri.<br />
Criterio 3. Per ogni matrice A una con<strong>di</strong>zione necessaria <strong>di</strong> convergenza del metodo <strong>di</strong><br />
rilassamento è 0 < ! < 2 .<br />
Criterio <strong>4.</strong> Se A è una matrice simmetrica e definita positiva con<strong>di</strong>zione necessaria e<br />
sufficiente per la convergenza del metodo <strong>di</strong> rilassamento è 0 < ! < 2 .<br />
<strong>4.</strong>8.2 Velocità <strong>di</strong> convergenza<br />
Consideriamo il rapporto<br />
! k "<br />
( k)<br />
e<br />
e 0 ( )<br />
#<br />
#<br />
(<strong>4.</strong>156)<br />
dove ! " è la norma per cui è verificata la proprietà (<strong>4.</strong>144). Esso esprime l’errore al<br />
passo k riferito all’errore al passo iniziale. Dalle (<strong>4.</strong>139) e (<strong>4.</strong>144) si ha che<br />
quin<strong>di</strong><br />
Scegliendo !
La quantità<br />
40<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
1<br />
M > !<br />
. (<strong>4.</strong>160)<br />
log10 #$ " ( B)<br />
%&<br />
R = ! log10 #$ " ( B)<br />
%& (<strong>4.</strong>161)<br />
costituisce una misura della velocità <strong>di</strong> convergenza e prende il nome <strong>di</strong> tasso asintotico<br />
<strong>di</strong> convergenza.<br />
<strong>4.</strong>9.3 Stima dell’errore<br />
Supponiamo <strong>di</strong> arrestare con un dato criterio <strong>di</strong> arresto l’iterazione al passo M . Per<br />
( )<br />
stimare l’errore e M<br />
Lasciamo al lettore verificare che<br />
( )<br />
possiamo utilizzare o il residuo r M<br />
e M ( )<br />
x<br />
! K ( A)<br />
( M )<br />
r<br />
b<br />
( )<br />
o l’incremento !x M<br />
. (<strong>4.</strong>162)<br />
Il controllo dell’errore attraverso il residuo può essere realizzato solo se la matrice A è<br />
ben con<strong>di</strong>zionata.<br />
( )<br />
Cerchiamo, ora, una relazione tra e M<br />
quin<strong>di</strong><br />
e !x<br />
e M M +1<br />
= e ( ) M +1<br />
! x ( ) ! x M<br />
Applicando la (<strong>4.</strong>139) abbiamo che<br />
quin<strong>di</strong><br />
( M +1)<br />
( )<br />
( ) = e<br />
e M ( ) M +1<br />
! e ( ) + "x<br />
M<br />
e ( ) ! B e M ( ) + "x<br />
e k ( ) 1<br />
!<br />
1" B<br />
. Per ogni k abbiamo l’identità<br />
M +1 ( ) M +1<br />
! "x<br />
( M +1)<br />
( k +1)<br />
#x<br />
( M +1)<br />
( ) , (<strong>4.</strong>163)<br />
. (<strong>4.</strong>164)<br />
, (<strong>4.</strong>165)<br />
.<br />
(<strong>4.</strong>166)
41<br />
se B < 1. Di conseguenza, se B
42<br />
d 2 f<br />
2 ! =0 > 0 .<br />
d!<br />
(<strong>4.</strong>171)<br />
Figura <strong>4.</strong>4 Grafici della forma quadratica f ( x)<br />
. (a) Forma quadratica definita<br />
positiva; il minimo è la soluzione dell’equazione Ax = b ; (b) forma quadratica definita<br />
negativa: il massimo è la soluzione dell’equazione Ax = b ; (c) forma quadratica<br />
semidefinita positiva <strong>di</strong> una matrice singolare: le soluzioni dell’equazione Ax = b sono<br />
tutti i punti della linea sul fondo della superficie; (d) forma quadratica non definita: la<br />
soluzione è un “punto a sella”.<br />
Essendo<br />
df 1<br />
=<br />
d! 2 "ûT A( u + !"û)<br />
+ 1<br />
u + !"û<br />
2 ( )T A"û # "û T b , (<strong>4.</strong>172)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
d 2 f 1<br />
= 2<br />
d! 2 "ûT A"û + 1<br />
2 "ûT A"û , (<strong>4.</strong>173)
dalle (<strong>4.</strong>170) e (<strong>4.</strong>171) segue che<br />
e<br />
43<br />
!u T ( Au " b)<br />
= 0 (<strong>4.</strong>174)<br />
!û T A!û > 0 . (<strong>4.</strong>175)<br />
Per ottenere la (<strong>4.</strong>174) abbiamo utilizzato la simmetria <strong>di</strong> A .<br />
La (<strong>4.</strong>175) è verificata per ogni !û perché A è simmetrica. La (<strong>4.</strong>174) è verificata<br />
per ogni !û se u = x . Se A fosse definita negativa basta moltiplicare ambo i membri<br />
dell’equazione (<strong>4.</strong>167) per !1. In conclusione, il minimo della forma quadratica (<strong>4.</strong>167)<br />
è la soluzione del sistema (<strong>4.</strong>1) se la matrice A è simmetrica e definita positiva.<br />
Posto<br />
e( x)<br />
! x " u (<strong>4.</strong>176)<br />
osserviamo che minimizzare f ( x)<br />
è equivalente a minimizzare la forma quadratica <strong>di</strong><br />
errore definita da<br />
dove, come al solito,<br />
E x ( ) ! eTAe = r T A "1 r > 0 (<strong>4.</strong>177)<br />
r( x)<br />
! b " Ax (<strong>4.</strong>178)<br />
è il residuo. Il minimo <strong>di</strong> E ( x)<br />
è in x = u . Si noti che E ( x)<br />
è definita positiva. Si<br />
osservi che<br />
!Ae = r . (<strong>4.</strong>179)<br />
In base a quanto abbiamo appena <strong>di</strong>mostrato possiamo, dunque, determinare la<br />
soluzione del sistema (<strong>4.</strong>1) cercando il minimo (assoluto) della forma quadratica (<strong>4.</strong>167).<br />
La ricerca <strong>di</strong> questo minimo può essere realizzata attraverso un metodo iterativo.<br />
Osservazione<br />
Se la matrice A è simmetrica e definita negativa la forma quadratica f ( x)<br />
ha un<br />
massimo (assoluto) in corrispondenza della soluzione dell’equazione (<strong>4.</strong>1), Figura <strong>4.</strong>4(b).<br />
In questo caso l’equazione (<strong>4.</strong>1) può essere risolta cercando il massimo della funzione<br />
f x<br />
( ) .<br />
Se la matrice A è simmetrica e semi definita positiva (negativa) essa ha almeno un<br />
autovalore uguale a zero e quin<strong>di</strong> è singolare. In questo caso l’equazione (<strong>4.</strong>1) ha infinite<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
44<br />
soluzioni e la forma quadratica f ( x)<br />
ha infiniti punti <strong>di</strong> minimo (massimo), Figura<br />
<strong>4.</strong>4(c).<br />
Se la matrice A è simmetrica ma non è definita positiva (negativa) la soluzione<br />
dell’equazione (<strong>4.</strong>1) non può essere determinata attraverso la ricerca del minimo<br />
(massimo) assoluto della forma quadratica f x<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
( ) : la soluzione dell’equazione (<strong>4.</strong>1) è<br />
( ) ma non è né un massimo, né un minimo.<br />
ancora un punto estremale della funzione f x<br />
In questo caso la soluzione è un “punto a sella”: muovendosi lungo certe <strong>di</strong> reazioni<br />
appare come un punto <strong>di</strong> minimo, invece muovendosi lungo altre <strong>di</strong>rezioni appare come<br />
se fosse un massimo, Figura <strong>4.</strong>4(d).<br />
<strong>4.</strong>10.2 I meto<strong>di</strong> <strong>di</strong> <strong>di</strong>scesa<br />
Si consideri la soluzione <strong>di</strong> tentativo x k ( ) al generico passo k . I meto<strong>di</strong> del gra<strong>di</strong>ente o<br />
<strong>di</strong> <strong>di</strong>scesa sono meto<strong>di</strong> iterativi nei quali al passo k si sceglie un vettore z k ( ) ! 0 e uno<br />
scalare ! k ( ) tali che<br />
dove<br />
( k +1)<br />
( ) < J x k<br />
J x<br />
k +1<br />
x ( ) = x k ( ) + ! kz k<br />
( ) ( ) (<strong>4.</strong>180)<br />
( ) . (<strong>4.</strong>181)<br />
Per ogni fissato z k ( ) il parametro ! k deve essere scelto in modo tale da minimizzare<br />
! ( k +1)<br />
f ( ! k ) = f ( x ) . La <strong>di</strong>reazione del vettore z k ( ) è la <strong>di</strong>rezione lungo cui ci si muove per<br />
avvicinarsi al minimo. Dunque ! k è scelto in modo tale che<br />
d ! f<br />
d! k<br />
d 2 f!<br />
2<br />
d! k<br />
= 0 , (<strong>4.</strong>182)<br />
> 0 . (<strong>4.</strong>183)<br />
La (<strong>4.</strong>183) è verificata in<strong>di</strong>pendentemente dal valore <strong>di</strong> ! k perché la matrice A è<br />
definita positiva. Essendo A simmetrica si ha che<br />
d ! f<br />
d! k<br />
( ) ( ) " z k<br />
= z k ( )T A x k ( ) + ! kz k<br />
Imponendo, ora, la (<strong>4.</strong>182) si ottiene<br />
( )T b = "z k<br />
( )T k +1<br />
r<br />
( ) . (<strong>4.</strong>184)
dove<br />
Allora per ogni scelta <strong>di</strong> z k ( ) si ha<br />
e<br />
! k =<br />
45<br />
k<br />
z ( )T r k<br />
z k<br />
( )<br />
( )T Az k ( )<br />
(<strong>4.</strong>185)<br />
r k ( ) ! r x k ( ) ( ). (<strong>4.</strong>186)<br />
k +1<br />
r ( ) = r k ( ) ! " kAz k ( ) , (<strong>4.</strong>187)<br />
k +1<br />
r ( )T z k ( ) = 0 . (<strong>4.</strong>188)<br />
k +1<br />
In seguito mostreremo che ! x f ( x)<br />
= "r( x),<br />
quin<strong>di</strong> r<br />
( k +1)<br />
k +1<br />
f ( x)<br />
= f ( x ) nel punto x ( ) . Di conseguenza il vettore z k<br />
superficie nel punto x<br />
k +1 ( ) , Figura <strong>4.</strong>6.<br />
Figura <strong>4.</strong>6 Curve <strong>di</strong> livello della forma quadratica e meto<strong>di</strong> della <strong>di</strong>scesa.<br />
( ) è normale alla superficie<br />
( ) è tangente a questa<br />
Possiamo determinare, ora, anche la legge che governa l’errore E . Dall’espressione<br />
del valore ottimale <strong>di</strong> ! k si ha, [<strong>4.</strong>1],<br />
dove<br />
( ) ( ) = E x k ( )<br />
k +1<br />
E x<br />
! k =<br />
( ) 1 ! " k<br />
z k ( )T r k ( ) ( ) 2<br />
z k ( )T Az k ( ) ( ) r k<br />
( ) (<strong>4.</strong>189)<br />
( )T A "1 r k<br />
. (<strong>4.</strong>190)<br />
( ) ( )<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
46<br />
Lasciamo al lettore la <strong>di</strong>mostrazione. Si noti che ! k > 0 perché la matrice A è definita<br />
positiva (salvo il caso z k ( ) = 0 che abbiamo escluso a priori e il caso r k ( ) = 0 nel quale si<br />
è raggiunta la soluzione del problema).<br />
In<strong>di</strong>chiamo con zsol un vettore <strong>di</strong>retto parallelamente alla retta che congiunge il punto<br />
x k ( ) al punto u (cioè alla soluzione), Figura <strong>4.</strong><strong>4.</strong> Se zsol fosse noto otterremmo in un<br />
solo passo la soluzione per qualunque scelta <strong>di</strong> x k ( ) ,<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
k +1<br />
x ( ) = x k ( ) + ! kz sol = u . (<strong>4.</strong>191)<br />
Ovviamente non conosciamo la soluzione e, quin<strong>di</strong>, non conosciamo z sol .<br />
Come scegliere allora z k ( ) ? Bisogna in<strong>di</strong>viduare tra tutte le possibili <strong>di</strong>rezioni quella<br />
che assicura la convergenza verso la soluzione con il minor numero <strong>di</strong> iterazioni.<br />
<strong>4.</strong>10.3 Il metodo del gra<strong>di</strong>ente<br />
Il metodo del gra<strong>di</strong>ente con <strong>di</strong>scesa rapida, detto comunemente anche metodo del<br />
gra<strong>di</strong>ente, consiste nell’assumere come <strong>di</strong>rezione <strong>di</strong> <strong>di</strong>scesa verso il minimo <strong>di</strong> f quella<br />
che assicura la massima variazione <strong>di</strong> f . Tale <strong>di</strong>rezione è data proprio dal gra<strong>di</strong>ente <strong>di</strong><br />
f x<br />
( ) (nello spazio ! n ). Si consideri la funzione scalare<br />
definita in ! n . Il gra<strong>di</strong>ente <strong>di</strong> g vale<br />
Per il gra<strong>di</strong>ente <strong>di</strong> f , allora, abbiamo<br />
! x f x<br />
g( x)<br />
= c T x = x T c (<strong>4.</strong>192)<br />
! xg( x)<br />
= ! x c T ( x)<br />
= c . (<strong>4.</strong>193)<br />
1<br />
2 xTAx " x T #<br />
&<br />
b<br />
$<br />
%<br />
'<br />
(<br />
= 1<br />
x<br />
2<br />
T ( A)<br />
T<br />
) + Ax+<br />
*<br />
, " b<br />
=Ax " b = "r( x).<br />
( ) = ! x<br />
(<strong>4.</strong>194)<br />
Nel metodo del gra<strong>di</strong>ente con <strong>di</strong>scesa rapida la <strong>di</strong>rezione <strong>di</strong> <strong>di</strong>scesa è, a meno del segno,<br />
proprio quella definita dal residuo dell’equazione, Figure <strong>4.</strong>7 e <strong>4.</strong>8. Poniamo, allora,<br />
nella (<strong>4.</strong>185)
47<br />
z k ( ) = r k ( ) . (<strong>4.</strong>195)<br />
Figura <strong>4.</strong>7 Gra<strong>di</strong>ente della forma quadratica. Per ogni punto il gra<strong>di</strong>ente punta nella <strong>di</strong>rezione<br />
della massima crescita ed è ortogonale alle linee <strong>di</strong> livello.<br />
Figura <strong>4.</strong>8 Metodo del gra<strong>di</strong>ente con <strong>di</strong>scesa rapida.<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
48<br />
Dunque, l’algoritmo del metodo del gra<strong>di</strong>ente con <strong>di</strong>scesa rapida è<br />
per k = 0,1,... , dove r 0 ( ) = b ! Ax 0 ( ) .<br />
! k =<br />
k<br />
r ( )T r k<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
r k<br />
( )<br />
( )T Ar k<br />
( )<br />
k +1<br />
x ( ) = x k ( ) + ! kr k<br />
k +1<br />
r ( ) = b " Ax<br />
( )<br />
( k +1)<br />
(<strong>4.</strong>196)<br />
Riportiamo nel Programma <strong>4.</strong>4 una implementazione dell’algoritmo (<strong>4.</strong>196)<br />
utilizzando il linguaggio <strong>di</strong> programmazione MATLAB ® .<br />
Programma <strong>4.</strong>4: Metodo del gra<strong>di</strong>ente con <strong>di</strong>scesa rapida<br />
function [x,iter]=gra<strong>di</strong>ente(A,b,x0,nmax,toll)<br />
% metodo del gra<strong>di</strong>ente con <strong>di</strong>scesa ripida<br />
[n,n]=size(A);<br />
L=eye(n); U=L;<br />
iter=0; r=b-A*x0; r0=norm(r); err=norm(r);x=x0;<br />
while err>toll&iter
49<br />
1 3 3<br />
3 6 4<br />
1<br />
2 2 2 x = 3<br />
con il metodo del gra<strong>di</strong>ente. Il metodo del gra<strong>di</strong>ente non converge. Perché?<br />
Esercizio <strong>4.</strong>14<br />
Si risolva il sistema<br />
2 1<br />
1 3<br />
x = 1<br />
0<br />
2<br />
(<strong>4.</strong>198)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
♦<br />
(<strong>4.</strong>199)<br />
con il metodo <strong>di</strong> Jacobi, il metodo <strong>di</strong> Gauss-Seidel e il metodo del gra<strong>di</strong>ente. Verificare<br />
che il metodo del gra<strong>di</strong>ente è più veloce.<br />
♦<br />
dove<br />
Per l’errore E x k<br />
( ) ( ) abbiamo<br />
( ) ( ) = E x k ( )<br />
k +1<br />
E x<br />
! k =<br />
r k<br />
4<br />
( )<br />
2<br />
r k ( )T Ar k ( ) ( ) r k<br />
( ) 1 ! " k<br />
( ) (<strong>4.</strong>200)<br />
( )T A "1 r k<br />
. (<strong>4.</strong>201)<br />
( ) ( )<br />
Utilizzando il fatto che A è simmetrica e definita positiva dalla (<strong>4.</strong>201) si ottiene che<br />
[<strong>4.</strong>1]<br />
2<br />
( k +1)<br />
# K ( A)<br />
" 1&<br />
E ( x ) ! % ( E x<br />
$ K ( A)<br />
+ 1'<br />
k ( ) ( ). (<strong>4.</strong>202)<br />
Dalla (<strong>4.</strong>202) si ottiene che il metodo del gra<strong>di</strong>ente con <strong>di</strong>scesa ripida converge alla<br />
soluzione comunque sia il punto iniziale x 0 ( ) . La velocità <strong>di</strong> convergenza è lenta se la<br />
matrice A è mal con<strong>di</strong>zionata. Per ovviare questo problema si può considerare al posto<br />
del problema (<strong>4.</strong>1) il problema<br />
P !1 Ax = P !1 b , (<strong>4.</strong>203)<br />
dove P è una matrice opportuna. La con<strong>di</strong>zione (<strong>4.</strong>202) <strong>di</strong>venta allora,
E x<br />
50<br />
( ) " 1<br />
K P "1 2<br />
#<br />
&<br />
( E x<br />
$ % ( A)<br />
+ 1<br />
'(<br />
k<br />
( k +1)<br />
( ) ! K P"1A %<br />
Allora, la matrice P deve essere scelta in modo tale che K P !1 A<br />
P viene detta matrice <strong>di</strong> precon<strong>di</strong>zionamento.<br />
Programma <strong>4.</strong>5: Metodo del gra<strong>di</strong>ente precon<strong>di</strong>zionato<br />
function [x,iter]=gra<strong>di</strong>ente_prec(A,b,x0,nmax,toll,P)<br />
% metodo del gra<strong>di</strong>ente precon<strong>di</strong>zionato<br />
[n,n]=size(A); if nargin==5<br />
L=eye(n); U=L; P=U;<br />
else<br />
[L,U]=lu[P];<br />
end<br />
iter=0; r=b-A*x0; r0=norm(r); err=norm(r);x=x0;<br />
while err>toll&iter
<strong>4.</strong>11 Il metodo del gra<strong>di</strong>ente coniugato<br />
51<br />
Nel metodo del gra<strong>di</strong>ente con <strong>di</strong>scesa rapida la <strong>di</strong>rezione z k ( ) è scelta secondo la<br />
(<strong>4.</strong>195). Ciò ha come svantaggio il fatto che alcune <strong>di</strong>rezioni possono ripetersi<br />
nell’iterazione come si evince dalla Figura <strong>4.</strong>8. Nel metodo del gra<strong>di</strong>ente coniugato,<br />
invece, le <strong>di</strong>rezioni <strong>di</strong> <strong>di</strong>scesa sono tra loro ortogonali rispetto al prodotto scalare<br />
yTAx 5 . Questa scelta delle <strong>di</strong>rezioni <strong>di</strong> <strong>di</strong>scesa permette <strong>di</strong> ottenere la convergenza alla<br />
soluzione in un numero <strong>di</strong> iterazioni non superiore alla <strong>di</strong>mensione n della matrice A .<br />
Nella presentazione <strong>di</strong> questo metodo seguiremo, almeno in parte, l’approccio illustrato<br />
in [<strong>4.</strong>5].<br />
<strong>4.</strong>11.1 Coniugazione<br />
Consideriamo un insieme <strong>di</strong> n <strong>di</strong>rezioni z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z n!1 ( ) tra loro ortogonali<br />
rispetto al prodotto scalare y T Ax , ovvero A-ortogonali (A-coniugati):<br />
In seguito vedremo come tale insieme si può costruire.<br />
z i ( ) Az j ( ) = 0 per i = j . (<strong>4.</strong>205)<br />
Figura <strong>4.</strong>9 Queste coppie <strong>di</strong> vettori sono A-ortogonali ………. perchè queste coppie sono ortogonali.<br />
5 Essendo A simmetrica e definita positiva, la forma y T Ax definisce un prodotto scalare in ! n . Nello<br />
spazio lineare ! n è definito un prodotto scalare se ad ogni x, y !" n è associato un numero reale,<br />
denotato usualmente con ( x, y)<br />
, tale che: 1. ( x, x)<br />
> 0 se x ! 0 e ( x, x)<br />
= 0 se x = 0 ; 2. ( x, y)<br />
= ( y, x)<br />
;<br />
3. ( !x, y)<br />
= ! ( x, y)<br />
; <strong>4.</strong> ( x + y, z)<br />
= ( x, z)<br />
+ ( y, z)<br />
.<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
52<br />
Cosa significa che due vettori sono A-ortogonali? Si immagini che questa pagina sia<br />
stampata su un pezzo <strong>di</strong> gomma, <strong>di</strong> afferrare la Figura <strong>4.</strong>9(a) ai lembi e <strong>di</strong> stirarla fino a<br />
quando le ellissi non appaiono come circonferenze. Le coppie <strong>di</strong> vettori che sull’ellisse<br />
sono A-coniugati, appariranno sulle circonferenze ortogonali, Figura <strong>4.</strong>9(b). A causa<br />
della proprietà (<strong>4.</strong>205) l’insieme dei vettori z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z n!1 ( ) costituisce una base per<br />
lo spazio vettoriale R n .<br />
k +1<br />
Determinare x ( ) lungo z k ( ) ( k +1)<br />
in modo tale che f x<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
( ) sia minimo equivale ad<br />
k +1<br />
imporre che il residuo r ( ) sia ortogonale a z k ( ) e, quin<strong>di</strong>, che l’errore al passo k + 1,<br />
k +1<br />
e ( ) , sia A -ortogonale rispetto a z k ( ) . Si osservi che non possiamo imporre che l’errore<br />
sia ortogonale rispetto a z k ( ) perchè non lo conosciamo.<br />
Consideriamo ora la <strong>di</strong>namica dell’errore. E’ imme<strong>di</strong>ato verificare che<br />
k "1<br />
e k ( ) = e 0 ( ) + ! jz j ( )<br />
# (<strong>4.</strong>206)<br />
dove i coefficienti ! k sono dati dalla (<strong>4.</strong>185). Possiamo sempre rappresentare e 0 ( )<br />
attraverso una combinazione lineare dei vettori z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z n!1 ( ) . Abbiamo:<br />
e 0<br />
j =0<br />
( ) = ! jz j<br />
n"1<br />
( )<br />
# . (<strong>4.</strong>207)<br />
j =0<br />
Premoltiplicando ambo i membri della (<strong>4.</strong>207) per z i ( )T A si ottiene utilizzando la (<strong>4.</strong>205)<br />
n"1<br />
#<br />
z i ( )T Ae 0 ( ) = ! jz i ( )T Az j<br />
Utilizzando <strong>di</strong> nuovo la (<strong>4.</strong>205) e poi la (<strong>4.</strong>206) si ha<br />
! i =<br />
z i<br />
z i<br />
( )T Ae 0<br />
( )T Az i<br />
( )<br />
( ) =<br />
z i<br />
j =0<br />
( )<br />
( )T A e 0 ( ) + " hz h<br />
i#1<br />
%<br />
( ) (<br />
' $ *<br />
& h=1 )<br />
( )T Az i ( ) =<br />
z i<br />
Utilizzando infine la (<strong>4.</strong>185) si ottiene<br />
n"1<br />
= ! iz i ( )T Az i ( ) . (<strong>4.</strong>208)<br />
( )T Ae i ( )<br />
( )T Az i<br />
i<br />
z<br />
( ) = # ( )T r i ( )<br />
( )T Az i ( ) . (<strong>4.</strong>209)<br />
z i<br />
z i<br />
e k ( ) = ! jz j ( )<br />
# " ! jz j ( )<br />
# . (<strong>4.</strong>210)<br />
j =0<br />
Man mano che si procede nell’iterazione il secondo termine cancella i contributi del<br />
primo termine all’errore lungo le <strong>di</strong>rezioni z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z n!1 ( ) . Per n = k tutti i termini<br />
k "1<br />
j =0<br />
z i
53<br />
sono stati cancellati e e n ( ) = 0 . Dunque, impiegando n <strong>di</strong>rezioni A-coniugate in almeno<br />
n iterazioni si raggiunge la soluzione. Un risultato semplice, elegante e <strong>di</strong> notevole<br />
interesse.<br />
Dall’equazione (<strong>4.</strong>210) si ha che<br />
n"1<br />
e k ( ) = ! jz j ( )<br />
# . (<strong>4.</strong>211)<br />
Consideriamo ora il prodotto tra il vettore z i ( )T e il vettore e k ( ) . Abbiamo:<br />
Dalla (<strong>4.</strong>212) si ha imme<strong>di</strong>atamente che<br />
j = k<br />
n!1<br />
z i ( )T r k ( ) = !z i ( )T Ae k ( ) = " jz i ( )T Az j ( )<br />
# . (<strong>4.</strong>212)<br />
j = k<br />
z i ( )T r k ( ) = 0 per 0 ! i < k , (<strong>4.</strong>213)<br />
quin<strong>di</strong> il residuo al passo k è ortogonale a tutte le <strong>di</strong>rezioni z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z<br />
k !1 ( ) . Ciò<br />
implica anche che l’errore al passo k è A-ortogonale a tutte le <strong>di</strong>rezioni<br />
z 0 ( ) ,z 1 ( ) ,z 2 ( ) k !1<br />
,...,z ( ) . Allora è evidente che, dovendo essere l’errore e n ( ) ortogonale a<br />
tutte le <strong>di</strong>rezioni z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z n!1 ( ) che costituiscono una base per lo spazio R n , deve<br />
essere necessariamente e n ( ) = 0 .i > 0<br />
<strong>4.</strong>11.2 Coniugazione <strong>di</strong> Gram-Schmidt<br />
Un insieme <strong>di</strong> <strong>di</strong>rezioni z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z n!1 ( ) A-ortogonali può essere ottenuto a partire<br />
da un insieme <strong>di</strong> n vettori y 0 ( ) , y 1 ( ) , y 2 ( ) ,..., y n!1 ( ) linearmente in<strong>di</strong>pendenti. Per costruire<br />
z i ( ) si parte da y i ( ) e si elimina quella componente che non è A-ortogonale a<br />
z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z i!1 ( ) . In altre parole, si assume z 0 ( ) = y 0 ( ) , si pone<br />
i"1<br />
z i ( ) = y i ( ) + ! ijz j ( )<br />
# (<strong>4.</strong>214)<br />
e i coefficienti ! ik sono scelti imponendo che z i ( ) sia A-ortogonale a i vettori<br />
z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z i!1 ( ) (i coefficienti ! ik sono definiti solo per i > k ). Imponendo questa<br />
con<strong>di</strong>zione e utilizzando la (<strong>4.</strong>205), si ottiene<br />
! ij = "<br />
i<br />
y ( )T Az j<br />
z j ( )T Az j<br />
( )<br />
j =0<br />
( ) per 0 ! k < i e 1 ! i ! n " 1. (<strong>4.</strong>215)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009
Moltiplicando il trasposto <strong>di</strong> ambo i membri della (<strong>4.</strong>214) per r j ( ) si ottiene:<br />
54<br />
z i ( )T r j ( ) = y i ( )T r j ( ) + ! ikz k ( )T r j ( )<br />
# . (<strong>4.</strong>216)<br />
Siccome per i < j si ha z i ( )T r j ( ) = 0 dalla (<strong>4.</strong>216) segue imme<strong>di</strong>atamente che<br />
Dall’equazione (<strong>4.</strong>216) si ha anche<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
i"1<br />
k =0<br />
y i ( )T r j ( ) = 0 per i < j . (<strong>4.</strong>217)<br />
z i ( )T r i ( ) = y i ( )T r i ( ) (<strong>4.</strong>218).<br />
Le maggiori <strong>di</strong>fficoltà nell’uso della coniugazione <strong>di</strong> Gram-Schmidt sono: la quantità <strong>di</strong><br />
memoria necessaria per conservare tutte le <strong>di</strong>rezioni percedenti necessarie per il calcolo<br />
della <strong>di</strong>rezione z i ( ) ; il numero <strong>di</strong> operazioni necessarie per determinare l’insieme delle<br />
<strong>di</strong>rezioni A-ortogonali scala come O n3<br />
( ) . Infatti se si scelgono come vettori<br />
y 0 ( ) , y 1 ( ) , y 2 ( ) ,..., y n!1 ( ) i versori fondamentali <strong>di</strong> un sistema <strong>di</strong> coor<strong>di</strong>nate rettangolare si<br />
ottiene una procedura equivalente al metodo <strong>di</strong> eliminazione <strong>di</strong> Gauss. Lasciamo al<br />
lettore la verifica <strong>di</strong> questa proprietà.<br />
<strong>4.</strong>11.3 Metodo del gra<strong>di</strong>ente coniugato<br />
Il modo più naturale <strong>di</strong> scegliere l’insieme dei vettori y 0 ( ) , y 1 ( ) , y 2 ( ) ,..., y n!1 ( ) è<br />
Le ragioni sono essenzialmente le seguenti.<br />
1. Dalla relazione (<strong>4.</strong>217) si ha imme<strong>di</strong>atamente che<br />
y k ( ) = r k ( ) per 0 ! k ! n " 1 . (<strong>4.</strong>219)<br />
r i ( )T r j ( ) = 0 per i < j . (<strong>4.</strong>220)<br />
Allora l’insieme dei residui r 0 ( ) ,r 1 ( ) ,r 2 ( ) ,...,r n!1 ( ) è un insieme <strong>di</strong> vettori tra <strong>di</strong> loro<br />
ortogonali. Dunque ciascun residuo è ortogonale sia ai residui che alle <strong>di</strong>rezioni<br />
precedenti. Inoltre dalla relazione (<strong>4.</strong>218) si ha anche<br />
z i ( )T r i ( ) = r i<br />
2<br />
( )<br />
per ogni i . (<strong>4.</strong>221)
2. Dall’equazione (<strong>4.</strong>187) si ha che:<br />
i<br />
r ( )T r<br />
j +1 ( ) = r i<br />
55<br />
( )T r j<br />
( ) ! " kr i<br />
( )T Az j<br />
Utilizzando la proprietà <strong>di</strong> ortogonalità dei residui si ottiene dalla (<strong>4.</strong>222)<br />
( ) (<strong>4.</strong>222)<br />
r i ( )T Az j ( ) = 0 per i < j . (<strong>4.</strong>223)<br />
Dunque z j ( ) è A-ortogonale con i residui precedenti. Da questa proprietà segue<br />
imme<strong>di</strong>atamente che:<br />
Inoltre abbiamo:<br />
! ij = "<br />
i<br />
r ( )T Az j<br />
z j ( )T Az j<br />
! ii = "<br />
In conseguenza <strong>di</strong> ciò la (<strong>4.</strong>214) <strong>di</strong>venta<br />
z k ( ) = r k ( ) + ! kz ( )<br />
( ) = 0 per i < j . (<strong>4.</strong>224)<br />
i<br />
r ( )T Az i<br />
z i ( )T Az i<br />
( )<br />
( ) # ! i . (<strong>4.</strong>225)<br />
k "1 ( ) per k = 1,2,... (<strong>4.</strong>226)<br />
dove z 0 ( ) = r 0 ( ) , r 0 ( ) = b ! Ax 0 ( ) e x 0 ( ) è arbitrario. L’espressione <strong>di</strong> ! k data dalla<br />
(<strong>4.</strong>225) è tale che<br />
( k +1)<br />
E ( x ) = E x k<br />
z<br />
( ) ( ) 1!<br />
k ( )T r k ( ) ( ) 2<br />
z k ( )T Az k ( ) ( ) r k ( )T A !1 r k<br />
"<br />
%<br />
$<br />
'<br />
$<br />
( ) ( ) '<br />
#<br />
&<br />
(<strong>4.</strong>227)<br />
sia minimo per fissato E x k ( ) ( ) al variare <strong>di</strong> z k<br />
ortogonali r k ( ) k !1<br />
e z<br />
( k +1)<br />
E ( x ) equivale a determinare il minimo <strong>di</strong> z k ( )T Az k<br />
( ) nell’iperpiano definito dale <strong>di</strong>rezioni<br />
( ) . In conseguenza della (<strong>4.</strong>221) la determinazione del minimo <strong>di</strong><br />
T<br />
( ) . Essendo<br />
z k ( )T Az k ( ) = r k ( ) k "1<br />
#<br />
( )<br />
$ + ! kz %<br />
& A r k ( ) k "1<br />
#<br />
( )<br />
$ + ! kz %<br />
&<br />
2 ( k "1)T<br />
( k "1)<br />
( k)T<br />
( k "1)<br />
( k)T<br />
k<br />
= ! k z Az + 2!r Az + r Ar<br />
il minimo <strong>di</strong> z k ( )T Az k ( ) si ottiene per il valore <strong>di</strong> ! k dato dalla (<strong>4.</strong>225).<br />
Infine si verifica imme<strong>di</strong>atamente che (se r i ( ) ! 0 per i = 0,1,2,..., k ! 1)<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
( ) ,<br />
(<strong>4.</strong>228)
! k =<br />
2<br />
( k)<br />
r<br />
2<br />
2<br />
k "1<br />
56<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009<br />
r<br />
( )<br />
2<br />
per k = 1,2,... . (<strong>4.</strong>229)<br />
Di seguito è riassunto l’algoritmo del gra<strong>di</strong>ente coniugato: per k = 0,1,2,...<br />
w k ( ) = Az k<br />
! k =<br />
( )<br />
( k)<br />
r<br />
2<br />
2<br />
w k ( )T z k<br />
k +1<br />
x ( ) = x k<br />
( )<br />
( ) + ! k ˆz k<br />
( )<br />
k +1<br />
r ( ) = r k ( ) " ! kw k<br />
# k +1 =<br />
( k +1)<br />
r<br />
r k ( )<br />
2<br />
2<br />
2<br />
2<br />
( )<br />
k +1<br />
z ( ) k +1<br />
= r ( ) + # k +1z k<br />
( )<br />
(<strong>4.</strong>230)<br />
dove z 0 ( ) = r 0 ( ) , r 0 ( ) = b ! Ax 0 ( ) e x 0 ( ) è il valore iniziale <strong>di</strong> tentativo. Come abbiamo<br />
<strong>di</strong>mostrato, il metodo del gra<strong>di</strong>ente coniugato converge alla soluzione in al più n passi.<br />
Se n è troppo grande un criterio <strong>di</strong> arresto può essere r k<br />
2 ! " b dove ! è una<br />
2<br />
tolleranza assegnata.<br />
Il numero <strong>di</strong> operazioni per calcolare Az k ( ) , in particolare delle moltiplicazioni, è<br />
dell’or<strong>di</strong>ne <strong>di</strong> n 2 . Se il numero <strong>di</strong> iterazioni è n , si hanno n 3 moltiplicazioni, un numero<br />
superiore a quello richiesto nella fattorizzazione <strong>di</strong> Cholesky n 3 ( / 3)<br />
. Di conseguenza il<br />
metodo del gra<strong>di</strong>ente coniugato è efficiente solo se la matrice A è sparsa o il numero <strong>di</strong><br />
iterazioni necessarie per ottenere una soluzione adeguata è molto più piccolo <strong>di</strong> n . Con<br />
un opportuno precon<strong>di</strong>zionamento è possibile ridurre il numero <strong>di</strong> iterazioni, [<strong>4.</strong>2].<br />
Per l’errore E x k<br />
Esercizio <strong>4.</strong>16<br />
( ) ( ) si ha<br />
E x k<br />
#<br />
( ) ( ) ! 2 %<br />
$ %<br />
K ( A)<br />
" 1&<br />
( E x<br />
K ( A)<br />
+ 1'(<br />
0<br />
k<br />
( )<br />
( ) ( ) . (<strong>4.</strong>231)<br />
Implementare in MATLAB l’algoritmo del gra<strong>di</strong>ente coniugato. Risolvere il<br />
problema dell’Esercizio <strong>4.</strong>15 con il metodo del gra<strong>di</strong>ente coniugato e confrontare<br />
l’errore e la velocità <strong>di</strong> convergenza ottenuto con questo metodo con quelli ottenuti con<br />
il metodo del gra<strong>di</strong>ente con <strong>di</strong>scesa rapida.<br />
♦
i<br />
Z ( ) e<br />
( i)<br />
R<br />
57<br />
3. In<strong>di</strong>chiamo con i sottospazi generati rispettivamente dall’insieme dei<br />
vettori z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z i!1 ( ) e r 0 ( ) ,r 1 ( ) ,r 2 ( ) ,...,r n!1 ( )<br />
i<br />
Z ( ) = span z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z i!1 ( )<br />
{ } , R i ( ) = span r 0<br />
( ) ,r 1 ( ) ,r 2 ( ) ,...,r i!1 ( )<br />
{ } . (<strong>4.</strong>232)<br />
Siccome le <strong>di</strong>rezioni z 0 ( ) ,z 1 ( ) ,z 2 ( ) ,...,z i!1 ( ) sono costruite attarverso le (<strong>4.</strong>226), il<br />
sottospazio Z i ( ) è uguale al sottospazio R i ( ) . Inoltre dalla relazione (<strong>4.</strong>187) segue che<br />
0<br />
span r<br />
( ) ,r 1 ( ) ,...,r k ( )<br />
( ) = span r 0 ( ) , Ar 0 ( ) ,..., A k r 0 ( )<br />
Essendo Z i ( ) = R i ( ) dalla (<strong>4.</strong>233) segue anche che<br />
Il sottospazio span r 0<br />
0<br />
span z<br />
( ) ,z 1 ( ) ,...,z k ( )<br />
( ) = span r 0 ( ) , Ar 0 ( ) ,..., A k r 0 ( )<br />
( ) . (<strong>4.</strong>233)<br />
( ) . (<strong>4.</strong>234)<br />
( ) , Ar 0 ( ) ,...,A k r 0 ( )<br />
( ) è un esempio <strong>di</strong> sottospazio <strong>di</strong> Krylov 6 .<br />
Riassumendo nel metodo del gra<strong>di</strong>ente coniugato, scegliendo z 0 ( ) = r 0<br />
verificate le seguenti proprietà per k ! 1 e nell’ipotesi che r i ( ) ! 0 per 0 ! i ! k :<br />
Referenze<br />
( ) , sono<br />
r k ( )T z i ( ) = 0 , per i ! k " 1 (<strong>4.</strong>235)<br />
( ) ( ) T<br />
k<br />
z ( )T Az i ( ) = Az k<br />
0<br />
span r<br />
z i ( ) = 0 , per i ! k " 1 (<strong>4.</strong>236)<br />
r k ( )T r i ( ) = 0 , i ! k " 1 (<strong>4.</strong>237)<br />
( ) ,r 1 ( ) ,...,r k<br />
( ( ) ) = span r 0 ( ) , Ar 0 ( ) ,..., A k r 0 ( )<br />
( ) (<strong>4.</strong>238)<br />
( ) ,z 1 ( ) ,...,z k<br />
( ( ) ) = span r 0 ( ) , Ar 0 ( ) ,..., A k r 0 ( )<br />
( ) (<strong>4.</strong>239)<br />
0<br />
span z<br />
[<strong>4.</strong>1] V. Comincioli, Analisi numerica: meto<strong>di</strong> ed applicazioni, McGraw-Hill, Milano<br />
1990.<br />
[<strong>4.</strong>2] G. H. Golub, C.F. van Loan, Matrix Computations, The Johns Hopkins University<br />
Press, Baltimore 1983.<br />
[<strong>4.</strong>3] A. Quarteroni, F. Saleri, Introduzione al Calcolo Scientifico, Springer, Milano<br />
2002.<br />
[<strong>4.</strong>4] J.M. Ortega, W. C. Rheinboldt, Iterative solution of nonlinear equations in several<br />
variables, Academic Press, New York, 1969.<br />
[<strong>4.</strong>5] J. R. Shewchuk, An Introduction to the Conjugate Gra<strong>di</strong>ent Method Without the<br />
Agonizing Pain, School of Computer Science, Carnegie Mellon University, 199<strong>4.</strong><br />
6 Un sottospazio <strong>di</strong> Krylov è ottenuto applicando ripetutamente una matrice a un vettore.<br />
G. Miano, Appunti del Corso <strong>di</strong> Modelli Numerici per i Campi, 2009