Corso di Geometria e Algebra Lineare

Prof. C. Vergara, Dott.ssa N. Franchina, Dr. A. Colombo
Corso di Geometria e Algebra Lineare
Laboratorio 3: sistemi lineari
25 – 29 Maggio 2015
Metodi diretti per sistemi lineari
Si consideri il seguente problema:
Dati una matrice A ∈ Rn×n ed un vettore b ∈ Rn , determinare il vettore
x ∈ Rn tale che
Ax = b.
(1)
La soluzione di tale problema esiste ed è unica se e solo se detA 6= 0 e può
essere ottenuta mediante il metodo di Cramer. Il numero di operazioni richieste da questo metodo per la risoluzione del sistema lineare (1) è asintotico
di (n + 1)! e di conseguenza, risulta non applicabile a problemi di interesse
pratico. Da qui nasce l’esigenza di definire tecniche alternative per la risoluzione del problema (1). In questo laboratorio, vengono trattati algoritmi
per la risoluzione di matrici particolari, ovvero a struttura triangolare, e di
matrici generali.
Matrici particolari
Si consideri il seguente sistema lineare:
Lx = b,
(2)
dove L è una matrice tale per cui lij = 0 se i < j, ovvero una matrice
triangolare inferiore. Il calcolo della prima incognita del sistema richiede
una semplice divisione x1 = b1 /l11 . Il valore appena determinato consente
1
il calcolo della seconda incognita, x2 = (b2 − l21 x1 )/l22 . In generale, ciascuna incognita xj viene determinata in modo esplicito a partire dalle xi ,
i = 1, . . . , j − 1 incognite precedentemente calcolate,
1
b1
l11
i−1
X
1
bi −
lij xj ,
xi =
lii
j=1
x1 =
(3)
i = 2, ..., n.
Questa procedura definisce il metodo delle sostituzioni in avanti.
In modo analogo è possibile effettuare la risoluzione di un sistema lineare
U x = y la cui matrice A sia triangolare superiore U con uij = 0 se i > j,
1
yn
unn
n
X
1
xi =
yi −
uij xj ,
uii
j=i+1
xn =
(4)
i = n − 1, ..., 1.
Questo algoritmo definisce il metodo delle sostituzioni all’indietro.
Risoluzione di sistemi lineari mediante fattorizzazione
LU
Si consideri la soluzione del sistema lineare Ax = b, dove A ∈ Rn×n sia
una matrice generica e b ∈ Rn il vettore dei termini noti. Se i determinanti
delle sottomatrici principali di A, det(Ai ), sono tutti diversi da zero, allora
esistono due matrici triangolari L ed U , inferiore e superiore rispettivamente,
tali che A = LU . In tal caso la risoluzione del sistema Ax = b è equivalente
a risolvere i seguenti sistemi triangolari:
Ly = b,
(5)
U x = y.
La determinazione dei fattori L ed U richiede il calcolo degli n2 +n coefficienti
Lij e Uij , i, j P
= 1, . . . , n. Dal momento che si hanno a disposizione solo le
2
n equazioni nk=1 Lik Ukj = Aij , si impongono le condizioni Lii = 1. Ciò
permette di ottenere un sistema determinato quadrato, che può essere risolto
2
mediante il seguente algoritmo dell’ eliminazione Gaussiana
for k = 1, ..., n − 1
for i = k + 1, ..., n
(k)
lik =
aik
(k)
akk
for j = k + 1, ..., n
(k+1)
(k)
(k)
aij
= aij − lik akj
end
end
end
(6)
Esercizi di implementazione
Implementare il metodo delle sostituzioni in avanti, l’algoritmo dell’eliminazione Gaussiana e validare i codici implementati mediante la risoluzione di
un sistema algebrico la cui soluzione sia nota. In particolare, si definisca una
matrice A ∈ Rn×n , con n = 1000 mediante il comando Matlab rand e un
vettore dei termini noti b tale che la soluzione sia il vettore unitario.
Soluzione
Si riporta una possibile implementazione dei metodi di sostituzione in avanti
e indietro nei file
forward_substitution.m
backward_substitution.m
Si riporta una possibile implementazione dell’algoritmo (6) nel file
lu_gauss.m
Il fattore L è determinato dai valori lij , mentre U = A(n) . Si noti che la
memorizzazione della matrice A(k) viene fatta direttamente sovrascrivendo
nelle corrispondenti posizioni della matrice A, e che gli elementi Lii non
vengono memorizzati, essendo posti uguale ad uno.
Per ricostruire il fattore U memorizzato nella parte superiore di A si
può utilizzare il comando Matlab triu che consente di estrarre la parte
triangolare superiore della matrice A.
3
U = triu(A)
La risoluzione dei sistemi triangolari associati all’equazione (5) viene effettuata con il metodo delle sostituzioni in avanti e indietro precedentemente
descritti.
Si ricorda che il costo computazionale dell’algoritmo di Gauss è pari a
2/3n3 operazioni, mentre il costo dei metodi di sostituzione è pari a un O(n2 )
di operazioni.
La validazione delle funzioni implementate è effettuata mediante la risoluzione di un sistema algebrico la cui soluzione sia nota. Si definisce una
matrice A ∈ Rn×n , con n = 1000 mediante il comando Matlab rand e un vettore dei termini noti b tale che la soluzione sia il vettore unitario. Il codice
è riportato nel file val.m. L’errore commesso può essere calcolato in modo
esatto mediante l’espressione
e = kxes − xk/kxes k,
dove xes è la soluzione esatta. Si osserva un errore pari a 5.3858 · 10−11 .
Esercizio
Si risolva mediante il metodo della fattorizzazione LU il sistema lineare Ax =
b con Aij = 1/(i + j − 1), A ∈ Rn×n , e con b ∈ Rn tale che la soluzione esatta
del problema sia il vettore unitario. La matrice A è nota come matrice di
Hilbert.
Si utilizzi la function predefinita di Matlab lu per eseguire la fattorizzazione LU e il comando \ per la risoluzione dei sistemi triangolari. In particolare
si risolva il sistema proposto per n = 5, 10, 20 e si valuti l’accuratezza della
fattorizzazione LU .
Soluzione
Si ricorda che in caso di pivoting, la fattorizzazione è
P A = LU.
In questo caso, essendo P invertibile, si lavora sul sistema lineare equivalente
P Ax = P b,
4
che può essere risolto con i seguenti sistemi triangolari
Ly = P b,
U x = y.
Si riporta nel file esLU.m la risoluzione del sistema lineare proposto. Il comando [L,U,P]=lu(A) consente di effettuare la fattorizzazione gaussiana
con pivoting (P contiene la matrice di permutazione), mentre il comando \
effettua la risoluzione dei sistemi triangolari. È importante sapere che il comando \ di Matlab richiama uno specifico algoritmo a seconda della tipologia
di matrice a cui è applicato. Si rimanda a tal proposito alla guida in linea di
Matlab.
L’errore k1 − xk/k1k vale 3.4934 · 10−13 , 1.6583 · 10−4 , 18.437 per n =
5, 10, 20, mentre la quantità kLU − P Ak vale 2.7756 · 10−17 , 5.0657 · 10−17 ,
5.7813 · 10−17 per n = 5, 10, 20. Si osservi che la risoluzione del problema
diventa tanto più inaccurata quanto più la dimensione del problema è grande. Questa inaccuratezza si verifica nonostante la fattorizzazione riproduca
in modo fedele la matrice permutata, cioè LU − P A ≈ 0 per ogni valore di
n. Tale comportamento è dovuto al mal-condizionamento della matrice di
Hilbert, calcolato con cond(A) = 2.0383e + 18, e segnalato in fase di esecuzione del codice dal messaggio di warning, “Matrix is close to singular or
badly scaled” ( rcond ≈ 1/cond = 5.444860e − 17). Il mal-condizionamento
della matrice non consente di tenere sotto controllo piccole perturbazioni
numeriche sui dati che tendono ad accumularsi e determinare una soluzione
inaccurata.
5