METODI ANALITICI E NUMERICI PER L’INGEGNERIA Corso di Laurea in Ingegneria Meccanica Proff. S. Perotto, G. Verzini A.A. 2022 – 2023 Politecnico di Milano Dr. N. Ferro, A. Gerbi, E. Temellini Esercitazione 1B Soluzione di Sistemi di Equazioni Lineari: Metodi Diretti Il metodo di fattorizzazione LU (con pivoting) Data una matrice quadrata A di dimensione n × n non singolare è possibile fattorizzarla con il prodotto di due matrici L ed U , dove L è una matrice triangolare inferiore ed U è una matrice triangolare superiore. Tale fattorizzazione permette di risolvere un sistema lineare del tipo Ax = b, con A = LU. Una volta calcolata la fattorizzazione LU di A si può risolvere il sistema Ax = b risolvendo in sequenza i due sistemi triangolari Ly = b, U x = y. (1) Se necessario, si può ricorrere alla tecnica del pivoting, che consiste nell’effettuare una permutazione delle righe di A. La matrice A viene premoltiplicata per un’oppurtuna matrice di permutazione P . Si ottiene quindi il sistema lineare: P Ax = P b =⇒ LU x = P b. Qualora si utilizzi il pivoting i due sistemi (1) diventano Ly = P b, U x = y. (2) L’algoritmo della fattorizzazione LU con pivoting è il seguente. (1) Posto A(1) = A (in componenti aij = aij , per i, j = 1, . . . , n) e P = I si calcoli: per k = 1, . . . , n − 1 (k) (k) trovare r̄ tale che |ar̄k | = max |ark | r=k,...n scambiare la riga k con la riga r̄ sia in A che in P per i = k + 1, . . . , n (k) lik = aik , (k) akk per j = k + 1, . . . , n (k+1) aij (k) (k) = aij − lik akj . Al termine di questo processo, gli elementi della matrice triangolare U sono ottenuti come: uij = aij per i = 1, . . . , n e j = 1, . . . , i, mentre gli elementi di L sono i coefficienti lik generati dall’algoritmo. In particolare, gli elementi diagonali di L non sono calcolati, perché per l’unicità della fattorizzazione sono posti uguale ad 1. I sistemi (1) (o la variante con pivotazione (2)) risultano più agevoli da risolvere perché, essendo rispettivamente triangolari inferiore e superiore, possono essere risolti efficientemente con gli schemi delle sostituzioni in avanti e all’indietro. In particolare il sistema Ly = b può essere risolto con il seguente algoritmo: 1 y1 = yi = b1 l11 1 lii bi − i−1 X lij yj , (3) i = 2, . . . , n lii ̸= 0, j=1 e in modo analogo U x = y con: xn = xi = yn unn 1 uii yi − n X (4) uij xj , i = n − 1, . . . , 1 uii ̸= 0. j=i+1 La funzione Matlab® lu calcola la fattorizzazione LU con pivoting per righe. La sua sintassi completa è >>[L,U,P]=lu(A); dove P è la matrice di permutazione. Esercizio 1 Una sorgente di fluido refrigerante di portata q0 raffredda n macchine distribuite in parallelo come schematizzato in figura. La caduta di pressione ∆pi in ogni macchina è legata alla portata di fluido qi che la attraversa tramite la relazione: ∆pi = Ri qi , dove Ri rappresenta la resistenza e gli attriti nel passaggio del fluido attraverso l’i-esima macchina. Si vuole determinare la portata qi che raggiunge ciascuna macchina. Il calcolo delle portate qi conduce a un sistema lineare Aq = b, dove q = [q1 . . . , qn ]T è il vettore delle portate incognite, A è la matrice: 1 1 1 1 ··· 1 R1 −R2 0 0 ··· 0 0 R2 −R3 0 ··· 0 , . . . . A= . . . . . . . 0 . .. .. .. . . . . . . . . . 0 0 0 · · · Rn−1 −Rn e b è il vettore di dimensione n: b = [q0 , 0, 0, · · · , 0]T . n X La prima equazione del sistema lineare esprime il fatto che qi = q0 , mentre le altre n − 1 equazioni i si ricavano tenendo conto che le cadute di pressione ∆pi in ogni macchina sono tutte uguali (essendo le macchine in parallelo), quindi per ogni i, con i = 1, . . . , n − 1, possiamo scrivere l’equazione Ri qi − Ri+1 qi+1 = 0. 2 1. Si ponga n = 20, Ri = 1 con i = 1, . . . , n e q0 = 2 e si assegnino in Matlab® la matrice A e il vettore dei termini noti b. 2. Si calcoli la fattorizzazione LU della matrice A, mediante la funzione Matlab® lu. Verificare che la tecnica del pivoting non è stata usata in questo caso. 3. Verificare utilizzando il comando spy che la matrice L è sparsa, mentre la matrice U viene riempita. 4. Implementare gli algoritmi di sostituzione in avanti e all’indietro mediante due funzioni Matlab® la cui interfaccia sarà rispettivamente: function [y] = fwsub(L,b) e function [x] = bksub(U,y) La funzione Matlab® fwsub.m, dati in ingresso una matrice triangolare inferiore L ∈ Rn×n e un vettore b ∈ Rn , restituisce in uscita il vettore y, soluzione del sistema Ly = b, calcolata mediante l’algoritmo della sostituzione in avanti (3). Analogamente, la funzione bksub.m, dati in ingresso una matrice triangolare superiore U ∈ Rn×n e un vettore y ∈ Rn , restituisce in uscita il vettore x, soluzione del sistema U x = y, calcolata mediante l’algoritmo della sostituzione in indietro (4). 5. Risolvere numericamente, utilizzando le funzioni fwsub.m e bksub.m implementate al punto precedente, i due sistemi triangolari necessari per ottenere la soluzione del sistema di partenza Aq = b. 6. Si calcoli la norma 2 dell’errore relativo ∥errrel ∥ = ∥qex − q∥/∥qex ∥ e la norma 2 del residuo normalizzato ∥resnor ∥ = ∥b − Aq∥/∥b∥ sapendo che la soluzione esatta è il vettore q0 qex (i) = , i = 1, . . . , n. Si commenti il risultato ottenuto basandosi sul valore del numero n di condizionamento della matrice A. (Si utilizzino i comandi norm e cond). 7. Si ponga R1 = 103 e si calcoli la nuova distribuzione delle portate. Si calcoli il numero di condizionamento di A e si commenti il risultato ottenuto. 8. È stata effettuata qualche permutazione della righe di A per effettuare la fattorizzazione LU nel punto precedente? Se sı̀, quale? Esercizio 3 Spesso, in applicazioni concrete, ci si trova a dover risolvere sistemi lineari la cui matrice è tridiagonale, cioè del tipo: a1 c1 e1 a2 c2 . . . .. .. .. A= . e a c n−2 n−1 n−1 en−1 an In tale situazione, un algoritmo molto efficiente è l’algoritmo di Thomas: 1. sfrutta la struttura tridiagonale della matrice per calcolare in modo rapido la fattorizzazione LU della matrice A. Le matrici L, U che si ottengono risultano bidiagonali; 3 2. utilizza tali informazioni sulla struttura di L, U per risolvere efficientemente i due sistemi Ly = b e U x = y. In particolare, se A ∈ Rn×n è della forma di cui sopra, allora le matrici L ed U sono date da: 1 α1 c1 δ1 1 α c 2 2 .. .. .. .. L= U = , , . . . . δn−2 1 αn−1 cn−1 δn−1 1 αn con ei−1 , αi = ai − δi−1 ci−1 , i = 2, . . . , n. αi−1 Quindi possiamo risolvere in sequenza i due sistemi bidiagonali tramite le relazioni: α1 = a1 , (Ly = b) δi−1 = y1 = b1 , yi = bi − δi−1 yi−1 , i = 2, . . . , n yn yi − ci xi+1 , xi = , i = n − 1, . . . , 1. αn αi Il costo computazionale complessivo per l’applicazione dell’algoritmo di Thomas è di 8n − 7 operazioni 2 contro le O( n3 ) dell’applicazione della fattorizzazione LU . 3 (U x = y) xn = 1. Si implementi in Matlab® l’algoritmo di Thomas per risolvere un sistema lineare tridiagonale. L’interfaccia dovrà essere: function [L,U,x] = thomas(A,b) 2. Si utilizzi la funzione thomas per risolvere il sistema lineare Ax = b, dove A ∈ Rn×n , x, b ∈ Rn , per n = 1000, con: A = tridiag(−1, 2, −1) e b = [1, 1, . . . , 1]T . Si riportino i valori di xn e Unn = αn cosı̀ ottenuti. Si stimi inoltre il risparmio computazionale garantito dall’utilizzo dell’algoritmo di Thomas rispetto all’applicazione del metodo di fattorizzazione LU completo. Esercizio 4 1 , con i, j = 1, . . . n), i+j−1 classico esempio di matrice mal condizionata: 1 1 1 2 3 1 1 1 3 4 2 1 1 1 H= 3 4 5 .. .. .. . . . 1 1 1 La matrice H, (H(i, j) = n n+1 n+2 è nota come matrice di Hilbert e costituisce un ··· ··· ··· .. . ··· 1 n 1 n+1 1 n+2 .. . 1 2n − 1 . Si ripeta l’Esercizio 2 sostituendo la matrice V con la matrice H. La funzione Matlab® hilb permette di generare la matrice di Hilbert di dimensione n × n. 4 HOMEWORK Esercizio 2 Dato il vettore p = [p1 , p2 , · · · , pn ]T , si definisca la matrice di Vandermonde: n−1 p1 · · · p11 1 pn−1 · · · p1 1 2 2 V (p) = .. .. . . .. . . . . . pn−1 ··· n p1n 1 Fissato n, si costruisca il vettore p = [1/n, 2/n, · · · , 1]T . Si consideri ora il sistema lineare V x = b, e si costruisca il vettore dei termini noti b in modo da avere come soluzione esatta del sistema il vettore xex = [1, 1, . . . , 1]T . Può essere utile utilizzare il comando vander di Matlab® che genera la matrice di Vandermonde dato un vettore in ingresso (vedere help vander). 1. Per n = 5, si calcoli il vettore b e successivamente si risolva numericamente il sistema lineare V x = b utilizzando la fattorizzazione LU della matrice. È stata effettuata qualche permutazione delle righe di V ? Si calcoli la norma 2 dell’errore relativo commesso, la norma 2 del residuo normalizzato e il numero di condizionamento della matrice. Quali considerazioni si possono fare? 2. Si ripetano i punti precedenti per n = 3, 4, 5, . . . , 15. Si rappresentino su un grafico in scala semi-logaritmica gli andamenti dell’errore relativo, del residuo normalizzato e del numero di condizionamento in funzione di n. Commentare il grafico ottenuto. Esercizio 5 Si considerino le matrici 50 1 3 A = 1 6 0 , 3 0 1 50 1 10 B = 3 20 1 , 10 4 70 7 8 9 C = 5 4 3 . 1 2 6 (5) 1. Si verifichi, utilizzando Matlab® o Octave , se le matrici A, B e C soddisfano la condizioni necessaria e sufficiente per l’esistenza della fattorizzazione LU (senza usare pivoting per riga). 2. Utilizzare la funzione lu per fattorizzare le matrici A, B, e C. 3. Supponiamo ora di voler risolvere il sistema Ax = b con A definita in (5). Si utilizzi come termine noto b, un vettore tale che la soluzione esatta del sistema sia xex = [1, 1, 1]T . Si calcoli la soluzione del sistema Ax = b, utilizzando le funzioni bksub.m e fwsub.m. 4. Si calcoli la norma 2 dell’errore relativo ∥xex − x∥2 /∥xex ∥2 e la norma 2 del residuo normalizzato ∥b − Ax∥2 /∥b∥2 conoscendo la soluzione esatta. 5