Metodi Analitici e Numerici Prof.ssa M. Cristina CERUTTI 23 ottobre 2018 1 Parte I Calcolo numerico 1 Risoluzione di sistemi lineari con metodi diretti Si consideri il sistema lineare quadrato di n equazioni in n incognite Ax = b (1) dove A matrice quadrata di ordine n è la matrice dei coefficienti, b è il vettore dei termini noti è x è il vettore delle incognite. Supporremo in tutta la trattazione che la matrice A sia non singolare, e quindi che il sistema ammetta un’unica souzione. Analizziamo alcuni metodi noti di soluzione del sistema. 1.1 Metodo di Cramer Un metodo classico è il metodo di Cramer. T La soluzione v = [x1 , . . . , xn ] del sistema (1) ha componenti: xi = det (Ai ) det (A) dove Ai è ottenuta sostituendo la colonna i-esima di A con il termine noto b Esempio 1. ( x + 2y = 3 3x + 7y = 2 ⇒ A= 1 3 2 7 b= b1 3 2 det det b2 2 7 det (Ax ) = x= = det (A) 1 2 1 det det 3 7 3 1 3 1 det det 3 2 3 det (Ay ) = y= = det (A) 1 2 1 det det 3 7 3 3 2 2 7 = 17 2 7 b1 b2 = −7 2 7 Osservazione 1.1. Se si calcolano i determinanti con la regola di Laplace, il metodo di Cramer ha un costo computazionale molto elevato ' 3 (n + 1)!. Per aver un’idea dell’enormità si pensi che il supercomputer più veloce al mondo di Giugno 2018, il Summit IBM (cfr. https://www.top500.org) che ha una velocità di picco di 122 Pflops (1 Pflop è 1015 flops cioè operazioni al secondo), per risolvere un sistema di 25 equazioni in 25 incognite impiegherebbe circa 300 anni!!! E per le applicazioni spesso ci si trova a dover risolvere sistemi di migiaiai di equazioni ed incognite. Analizziamo quindi metodi più efficienti. 1.2 Risoluzione sistemi triangolari Iniziamo con i sistemi triangolari e osserviamo che se A è triangolare non singolare gli elementi sulla diagonale principale aii 6= 0 ∀ i = 1, . . . , n 2 1.2.1 Forward substitution Un sistema triangolare inferiore è un sistema in cui la matrice dei coefficienti è appunto triangolare inferiore (o bassa) cioè: b1 x1 a11 0 ... 0 a12 a22 . . . 0 x 2 b2 = . .. . .. . . .. .. .. .. . . bn xn an1 an2 . . . ann Per questi sistemi è facile calcolare successivamente le componenti xi , 1 = 1, . . . , n, della soluzione come: x1 = x2 = b1 a11 1 [b2 − a21 x1 ] a22 In generale abbiamo: Algoritmo 1. i−1 X 1 bi − aij xj xi = aii j=1 j = 1, . . . , n (2) Questo algoritmo prende il nome di algoritmo di sostituzione in avanti, conosciuto anche come forward substitution. 1.2.2 Backward substitution Un sistema triangolare superiore, è un sistema in cui la matrice dei coefficienti è triangolare superiore (o alta), cioè: a1 1 a1 2 . . . a1n x1 b1 0 a2 2 . . . a2 n x 2 b2 = . .. .. . . . .. .. .. .. . . 0 0 . . . an n xn bn Il termine xn è immediatamente calcolabile come: xn = bn an n Per quanto riguarda il termine xn−1 l’operazione da eseguire corrisponde a: xn−1 = [bn−1 − an−1,n xn ] 1 an−1,n−1 In generale si ha: Algoritmo 2. Data una matrice U triangolare alta la soluzione del sistema U x = b si trova attraverso il seguente algoritmo: xn = xi = bn an n n X 1 bi − ai j xj ai i j=i+1 i = 1, . . . , n j = i + 1, . . . n Questo algoritmo prende il nome di sostituzione all’indietro, conosciuto anche come backward substitution. 3 Osservazione 1.2. Iniziamo con l’osservare che per simmetria il costo computazionale per il backward substitution è ovviamente uguale a quello del forward substitution, è quindi pari a n2 Osservazione 1.3. Calcoliamo il costo computazionale dell’algoritmo. Cominciamo con l’osservare che, al primo passaggio (calcolo dell’elemento x1 ) si esegue una sola operazione (la divisione), al secondo passaggio le operazioni diventano tre, la divisione per a22 , la moltiplicazione e la sottrazione all’interno della parentesi. All’i-esimo passaggio ho sempre una divisione per aii e, per ognuno degli i − 1 elementi della sommatoria nella parentesi in (2), 2 operazioni (un prodotto ed una somma). Quindi il numero di operazioni elementari (flops) risulta essere: n−1 X 1 + (1 + 2) + · · · + (1 + 2 (i)) + · · · + (1 + 2 (n − 1)) = (1 + 2 (i)) i=0 ⇓ =n+2 n−1 X i = n + A2 i=1 1.3 n (n − 1) = n2 2A Metodo di eliminazione di Gauss Il metodo di eliminazione di Gauss si basa sull’idea di ridurre progressivamente il sistema Ax = b ad un sistema equivalente (avente cioè la stessa soluzione) della forma U x = b̂ dove U è triangolare superiore e b̂ è un nuovo termine noto. Quest’ultimo sistema potrà poi essere risolto con il metodo di sostituzioni all’indietro (o backward substitution visto nel paragrafo precedente. Indicando il sistema originale come A(1) x = b(1) , costruisco successivamente sistemi A(k) x = b(k) tali che la matrice dei coefficienti A(k) ha gli elementi sottodiagonali delle prime k − 1 colonne nulli. Quindi nel passaggio da A(k−1) ad A(k) rendo nulli gli elementi sottodiagonali della colonna (k − 1)-esima. Vediamo come fare questo al primo passaggio: opero sulla matrice completa (cioè la matrice A orlata con il vettore b) che chiamerò B (1) , lascio invariata la prima riga e sostituisco la seconda riga con la differenza tra riga stessa e la prima riga moltiplicata per un’opportuna costante non nulla (in questo modo si ottiene un sistema equivalente a quello di partenza) scelta in modo tale da rendere nullo il secondo elemento della prima colonna. Questo elemento viene detto moltiplicatore ed indicato con m21 (l’indice mi indica che mi permette di rendere nullo l’elemento di posto (1, 2)). Si verifica facilmente che (1) m21 = a21 (1) a11 R2 = R2 − m21 R1 Analogamente sostituisco la terza riga con la differenza tra riga stessa e la prima riga moltiplicata per un’opportuna costante non nulla scelta in modo tale da rendere nullo il terzo elemento della prima colonna. Questa volta il moltiplicatore verrà indicato con m31 . E così via. Analogamente sostituisco la terza riga con la differenza tra riga stessa e la prima riga moltiplicata per un’opportuna costante non nulla scelta in modo tale da rendere nullo il terzo elemento della prima colonna. Questa volta il moltiplicatore verrà indicato con m31 . Ripetendo questo procedimento per tutte le righe successive ottengo, per la prima colonna, un vettore che ha come unico elemento non nullo il primo (che viene detto pivot). (1) (1) (1) (1) (1) (1) (1) (1) a11 a12 . . . a1n b1 b1 a11 a12 . . . a1n (1) (1) (2) (2) (2) (1) (1) a21 a22 . . . a2n 0 b2 a22 . . . a2n b2 . ⇒ .. .. .. .. .. .. .. .. . .. . . . . . . . . . . (1) an1 (1) an2 ... (1) ann (1) 0 bn (2) an2 ... (2) ann (2) bn Al secondo passaggio voglio rendere nulli gli elementi sottodiagonali della seconda colonna, quindi in generale avremo che: (k) aik i = k + 1, . . . , n mik = (k) akk 4 (k) dove l’elemento akk viene detto pivot della rispettiva colonna. Quindi nel caso generale, l’operazione eseguita è: (k+1) aij (k+1) bi (k) (k) = aij − mik ak,j (k) = bi i, j = k + 1, . . . , n (k) (k) i = k + 1, . . . , n − mik bk Si osservi che anche j parte da k + 1 perché la colonna k-esima è uguale a quella di A(k) . Esempio 1. Si consideri il seguente sistema 3x− y + z 2x+ y −2x− 2y + z 3×3 = 2 3 = 1 ⇒ 2 = −2 −2 −1 1 1 0 −2 1 2 1 = B (1) −2 La matrice B (2) ha la prima riga uguale alla matrice B (1) . Per calcolare la seconda riga della matrice B (2) il moltiplicatore è m21 = − 23 [ 2 3 0 2 e quindi calcolo 3 1 0 1 −1 1 2 ] 5 − 23 − 31 3 Analogamente per calcolare la terza riga della matrice B (2) il moltiplicatore è m31 = − 2 3 Ottengo così la matrice [ −2 −2 1 −2 3 −1 1 2 8 5 2 0 3 3 −3 3 = 0 0 B (2) 1 −1 5 3 8 −3 2 e quindi calcolo 3 ] 2 − 13 − 23 − 32 5 3 L’ultimo passaggio consiste nel rendere nullo l’elemento di posto (2, 3) sottraendo dalla terza riga di B (2) la seconda riga (in modo tale che gli elementi nulli nella prima colonna rimangano tali) moltiplicata per il moltiplicatore −8 m32 = 53 = − 85 . Ottengo così 3 2 3 −1 1 5 − 13 − 32 B (3) = 0 3 3 0 0 − 65 5 Risolvendo a questo punto il sistema ottenuto con il backward substitution ottengo z = −2 y = −1 x=1 Algoritmo 3. del MEG per ridurre il sistema a triangolare alto (k) mik = (k) aik (k) akk (k+1) = aij − mik akj (k+1) = bi aij bi (k) (k) (k) (k) − mik bk Poi si risolve il sistema triangolare così ottenuto. Osservazione 1.4. Per il calcolo del costo computazionale si ricordi la formula N X i=1 i2 = (2N + 1) (N + 1) N 6 5 Contributo per il calcolo di m Essendo: (k) mik = aik (k) akk si esegue una sola operazione (la divisione) per ognuno degli elementi della matrice che devono essere resi nulli, cioè n − 1 al primo passaggio, poi n − 2, etc.. n−1 X #flops = (n − 1) + (n − 2) + · · · + 1 = i= i=1 n (n − 1) (n − 1) (n − 1 + 1) = 2 2 Contributo per il calcolo di aij (k+1) Essendo il generico aij (k) (k) = aij − mik akj si ha che per effettuare tale calcolo si devono eseguire due operazioni (k+1) elementari, il prodotto e la sottrazione. Per capire quanti sono gli aij da calcolare si osservi che per k = 1 (cioè per il calcolo della matrice B (2) ) si devono calcolare gli elementi di una sottomatrice quadrata di ordine n − 1 (essendo noti prima riga e prima colonna), cioè (n − 1)2 elementi. In generale per calcolare B (k+1) devo calcolare (n − k)2 elementi. Di conseguenza il numero di operazioni elementari totali (flops) è: n−1 h i X (2n − 1) (n − 1) n (2n − 2 + 1) (n − 1 + 1) (n − 1) 2 2 = #flops = 2 (n − 1) + (n − 2) + · · · + 1 = 2 i2 = 2 6 3 i=1 Contributo per il calcolo di b (k+1) (k) (k) (k) Essendo il generico bi = bi − mik bk , quindi per effettuare tale calcolo si devono eseguire due operazioni (k) (k) elementari: il prodotto mik bk e la sottrazione. Il numero totale dei b da calcolare è pari a quello degli m. Di conseguenza il costo computazionale di tale operazione risulta essere: #flops = 2 [(n − 1) + (n − 2) + · · · + 1] = 2 n−1 X i=2 i=1 n (n − 1) = n (n − 1) 2 Costo computazionale totale In definitiva il costo computazionale totale per la riduzione del sistema è pari a: #flops = n (n − 1) 3 (2n − 1) (n − 1) n n (n − 1) (2n − 1) (n − 1) n + +2 = n (n − 1) + 2 3 2 2 3 (3) A questo va sommato n2 , costo per la soluzione del sistema triangolare e si ottiene: 3 (2n − 1) (n − 1) n 2 n (n − 1) + + n2 ' n3 2 3 3 Di conseguenza per un numero di passaggi n molto grande, il costo computazionale del MEG ha ordine di grandezza 32 n3 #flopstot = Osservazione 2. Il costo computazione per il MEG è molto minore di quello richiesto dal metodo di Cramer: Costo computazionale 1.4 MEG 2 3 3n Cramer 3 (n + 1)! Fattorizzazione LU (di Gauss) Si cerca una fattorizzazione della matrice A in modo tale da avere A = LU con L triangolare inferiore ed U triangolare superiore. 6 Se si trova questa fattorizzazione la risoluzione del sistema Ax = b si riduce alla risoluzione dei due sistemi Ly = b Ux = y Poiché L ed U dipendono dalla sola A e non dal termine noto, la stessa fattorizzazione può essere utilizzata per risolvere diversi sistemi lineari che hanno la stessa matrice dei coefficienti A, ma con termine noto b variabile. Problema: È possibile trovare questa fattorizzazione? Come si trovano le matrici L e U ? Esempio 2. Considerando ad esempio una matrice 2 × 2 : a11 a21 a12 a22 = 0 l11 l21 l22 u11 0 u12 u22 Il sistema presenta quattro equazioni e sei incognite (gli elementi delle matrici L e U ), di conseguenza è un sistema sottodeterminato quindi si possono scegliere arbitrariamente 2 elementi: nella fattorizzazione LU di Gauss si scelgono gli elementi l11 e l22 (gli elementi sulla diagonale principale della matrice L) uguali ad uno. Nell’esempio: a11 a21 a12 a22 = 1 l21 0 1 u11 0 u12 u22 In questo modo se a11 6= 0 la soluzione è univocamente determinata ed è: u11 = a11 u = a 12 12 l21 = aa21 (a11 6= 0) 11 21 21 a12 u22 = a22 − aa11 a12 = a22 a11a−a = detA a11 11 Osservazione 1.5. Se si fosse applicato i l MEG alla matrice A: a21 m21 = = l12 a11 Inoltre la prima riga di U è uguale alla prima riga di A e u22 = a22 − m21 a12 , cioè la stessa operazione che si avrebbe ottenuto applicando il MEG. Proposizione 1. Se ∃ la fattorizzazione LU di Gauss è unica e si ha che: L → Ha gli elementi tutti uguali a 1 sulla diagonale (per scelta arbitraria) e gli elementi sottodiagonali sono i moltiplicatori del MEG U → È la matrice finale del MEG Dimostrazione. Si osservi che la matrice A(2) può essere ottenuta dalla matrice A(1) = A tramite moltiplicazione per una matrice M(1) , cioè come A(2) = M1 A(1) , dove M1 ha la forma: 1 0 0 ... 0 −m21 1 0 . . . 0 M1 = −m31 0 1 . . . 0 .. .. .. . . .. . . . . . 0 −mn1 0 ... 1 Analogamente, la matrice A3 sarà ottenuta come A(3) = M2 A(2) = M2 M1 A, dove la matrice M2 ha la forma: 1 0 0 ... 0 0 1 0 ... 0 0 −m32 1 . . . 0 M2 = .. .. .. . . .. . . . . . 0 −mn 2 0 . . . 1 7 In generale la matrice Mk ha la forma: 1 ... .. . . . . 0 ... Mk = 0 ... . .. 0 0 .. . 0 ... .. . 1 −mk+1,k .. . 0 ... 1 ... .. . . . . 0 ... −mn,k ... dove ek è il k-esimo vettore della base canonica: eTk = 0 0 ee mk è il vettore: 0 .. . 0 = In − mk eTk 0 .. . 1 ··· 0 0 .. . mk = mk+1,k .. . mn,k 1 ··· 0 e risulta A(k+1) = Mk A(k) In definitiva si ottiene la matrice A(n) che è la matrice triangolare alta del MEG e che poniamo = U come: An = U = Mn−1 Mn−2 · · · M2 M1 A Ricordando ora come si calcola l’inversa di un prodotto abbiamo −1 −1 A = M1−1 M2−1 · · · Mn−2 Mn−1 U Le matrici Mk hanno inversa data da Mk−1 = 2In − Mk = In + mk eTk come si verifica facilmente osservando che mi eTi mj eTj uguale alla matrice identicamente nulla per i ≤ j. Di conseguenza si ha che: ! n−1 X T T T A = In + m1 e1 · · · In + mn−1 en−1 U = In + mi ei U i=1 Abbiamo quindi dimostrato il risultato ponendo −1 −1 M1−1 M2−1 · · · Mn−2 Mn−1 =L che è proprio la matrice con la forma cercata. Osservazione 1.6. Il costo computazionale della fattorizzazioe LU è quindi pari a quello del MEG escluso il contributo per il calcolo dei vettori b(k) quindi ∼ 32 n3 . Osservazione 1.7. La fattorizzazione LU di Gauss può servire anche per calcolare il determinante di A con un costo computazionale molto inferiore rispetto a quello della regola di Laplace; infatti si ha che detA = u11 u22 · · · unn = n Y uii i=1 Condizione necessaria e sufficiente per fattorizzazione LU Una condizione necessaria e sufficiente affinchè possa esistere la fattorizzazione LU è che i determinanti delle sottomatrici principali di nord-ovest siano 6= 0 , cioè che non siano singolari. 8 Condizioni sufficienti per fattorizzazione LU Condizioni sufficienti per la fattorizzazione LU sono che: 1. la matrice A sia simmetrica e definita positiva, cioè con autovalori tutti positivi, da cui segue che: xT Ax ≥ λmin kxk2 2. a matrice A sia a dominanza diagonale stretta per righe o per colonne, cioè Definizione 1 (Matrice a dominanza diagonale). Una matrice A quadrata si dice a dominanza diagonale stretta per righe se ha gli elementi sulla diagonale principale maggiori strettamente in valore assoluto della somma dei valori assoluti dei restanti elementi della stessa riga, cioè: Dominanza diagonale stretta → |aii | > n X |aij | j=1,j6=i In modo del tutto analogo si definisce la dominanza diagonale stretta per colonne. |aii | > n X |aji | i=1,j6=i Matlab 1. In Matlab il comando per eseguire la fattorizzazione LU su una matrice A è: [L U P]=lu(A) 1.5 Pivoting (k) Supponiamo che ad un certo passo k si trovi un pivot akk = 0. Si osservi che, essendo per ipotesi A(k) n non singolare n (k) come A, sicuramente ∃ aik Con i > k t.c. aik 6= 0. Se così non fosse, la matrice di elementi Ai,j=k,...,n avrebbe una colonna di elementi tutti nulli e di conseguenza sarebbe detA(k = 0. Il pivoting consiste nello scambiare la riga k-esima con la riga j-esima in modo da avere un pivot diverso da 0 e da poter continuare con l’algoritmo per la fattorizzazione LU (scambiando anche le opportune righe della matrice L). Naturalmente alla fine si otterrà la fattorizzazione LU non di A ma di una matrice in cui sono stata scambiate tra loro alcune righe. Si tiene traccia delle righe scambiate nella matrice di permutazione P che all’inizio è l’identità ed in cui di volta in volta si scambiano le stesse righe che si scambiano nella matrice A. Si osservi che una matrice così fatta è idempotente, cioè P P = I. Se nell’operazione di fattorizzazione avviene il pivoting si avrà che LU = P A e quindi nell’applicazione ai sistemi lineari si dovrà risolvere: ( Ly = P b P Ax = P b ⇒ LU y = P b ⇒ Ux = y Quello qui descritto è detto pivoting parziale ed ha un costo computazionale di n2 É ancheh possibile effettuare i (k) il pivoting totale in cui si va alla ricerca dell’elemento maggiore all’interno della sottomatrice aij ed ha un i,j≥k costo computazionale di 32 n3 (k) Osservazione 3. Poiché inoltre un valore grande di mik generato da un valore piccolo del pivot akk può amplificare (k) gli eventuali errori di arrotondamento presenti negli elementi akj in realtà è utile scegliere come pivot sempre quello maggiore in modulo tra quelli disponibili, cioè se |akr | = maxi≥k |aki | si scambiano la riga k-esima e la riga r-esima. Matlab esegue la fattotizzazione LU in questo modo e quindi restituisce L, U e P . Matlab effettua sempre questo tipodi pivoting. 9 1.6 Fattorizzazione di Cholesky Se la matrice A è simmetrica è possibile applicare la fottorizzazione di Cholesky cioè scrivere la matrice A come: A = QT Q Q → Triangolare superiore Il costo computazionale associato a questo metodo è la metà di quello di LU : #flops ' 1.7 n3 3 Errore e condizionamento Definizione 2. [Errore relativo]Sia x̂ la soluzione numerica calcolata e sia x la soluzione esatta; si definisce errore relativo la quantità: kx − x̂k E= kxk Definizione 3. [Residuo]Sia x̂ la soluzione numerica calcolata per il sistema lineare del tipo Ax = b , si definisce residuo la quantità: r = b − Ax̂ = Ax − Ax̂ = A (x − x̂) (x − x̂) = A−1 r ⇒ Osservazione 1.8. Nell’ambito dell’algebra lineare x̂ e xcoincidono; utilizzando software come Matlab per la risoluzione di sistemi lineari del tipo Ax = b si generano degli errori di approssimazione, tra un passaggio e l’altro, che portano appunto la differenza b − Ax̂ a non essere pari al vettore nullo. 1.7.1 Numero di condizionamento Ricordiamo la seguente definizione Definizione 4. [Norma di una matrice] Data una matrice A quadrata di ordine n si dice norma di A il numero reale positivo kAxk = max kAuk kxk u∈Rn ,kuk=1 kAk = maxn x∈R Definizione 5. [Numero di condizionamento]Si definisce numero di condizionamento K (A) della matrice A , la quantità: K (A) = kAk · kA−1 k • Se il numero di condizionamento è molto grande, si dice che la matrice è malcondizionata. • Se il numero di condizionamento è piccolo (vicino al valore unitario), si dice che la matrice è bencondizionata. Proposizione 2. Vale la seguente stima per l’errore relativo E: E ≤ K (A) krk kbk Dimostrazione. Per definizione di errore relativo (Def: 2) si ha che: E= kx − x̂k kA−1 rk = kxk kxk • Per la definizione di norma di una matrice : E= kA−1 rk kA−1 k · krk ≤ kxk kxk 10 • Si può inoltre notare che: kAxk kAk · kxk ≤ kxk kxk • Quindi si ottiene: E≤ kA−1 rk ⇒ x≥ = kAk · kA−1 k kbk kAk kAxk kbk = kAk kAk krk krk = K (A) kbk kbk (4) Osservazione 1.9. Se A è una matrice simmetrica e definita positiva allora il numero di condizionamento è: K (A) = λmax λmin Dimostrazione. Si ricorda che una matrice simmetrica è diagonalizzabie ed esiste una base ortonormale di autovetn tori, cioè {ui }i=1 dove u1 è autovettore per l’autovalore λi (cioè Aui = λi ui ) e uiT ui = δij cioè = 0 se i 6= j e = 1 se i = j). Pn Ogni vettore x ∈ Rn può quindi essere scritto come x = i=1 xi vi calcoliamo kAxk = (Ax) (Ax) = T 2 A n X !!T i i xv n X A i=1 = n X i=1 !T i x λi v i n X i=1 !! i i xv = i=1 ! i x λi v i = n X n X !T i x Av n X i i=1 x2i λ2i ≤ (λmax ) 2 n X ! i x Av i = i=1 2 x2i = (λmax ) kxk2 i=1 i=1 da cui segue che kAxk ≤ λmax kxk. Si osservi poi che l’uguaglianza vale per x = vmax autovettore associato a λmax . Quindi kAk = λmax . Poiché inoltre gli autovalori della matrice inversa A−1 sono i reciproci degli autovalori della 1 da cui segue la tesi. matrice A, si ha che kA−1 k = λmin Osservazione 1.10. Anche se il residuo krk si mantiene piccolo può capitare che K (A) sia tanto grande da non essere compensato dal residuo. Esempio 3. Prendendo per esempio la matrice di Hilbert di ordine 4: K (H4 ) > 1.5 × 104 e krk ' 10−16 Matlab 2. Il comando Matlab per il numero di condizionamento di una matrice A è: cond (A) 11