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