12.07.2015 Views

confronto fattorizzazioni - Università degli studi di Cagliari.

confronto fattorizzazioni - Università degli studi di Cagliari.

confronto fattorizzazioni - Università degli studi di Cagliari.

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

pessimistica in quanto vale per ogni possibile termine noto b.L'errore inerente è in<strong>di</strong>pendente dal metodo utilizzato per la risoluzione.Errore analitico. I meto<strong>di</strong> <strong>di</strong>retti in aritmetica esatta danno soluzione esatta; non siha quin<strong>di</strong> errore analitico.Nel caso dei meto<strong>di</strong> iterativi occorre invece troncare la generazione della successione<strong>di</strong> vettori tramite un opportuno criterio <strong>di</strong> arresto tale da approssimare il limite edando così origine ad un errore analitico.Errore algoritmico. L'errore algoritmico è l'errore indotto sul risultato dall'usodell'aritmetica finita. Anche un'operazione fra due numeri macchina può avere comerisultato un numero non <strong>di</strong> macchina; tale numero risultante necessiterà <strong>di</strong> essereapprossimato con un numero macchina e tale approssimazione avrà ovviamente delleconseguenze sui calcoli successivi. Tale tipo <strong>di</strong> errore è connesso alla cosiddettastabilità del metodo <strong>di</strong> calcolo.Un elemento importante è rappresentato dal costo computazionale.Il costo computazionale si <strong>di</strong>stingue fra il costo <strong>di</strong> memorizzazione e il costo intermini <strong>di</strong> operazioni moltiplicative. Per quanto concerne il costo <strong>di</strong> memorizzazionela <strong>di</strong>fferenza può essere significativa nel caso delle matrici sparse (matrici il cuinumero <strong>di</strong> elementi <strong>di</strong>versi da zero è O(n) anziché n 2 ). Infatti le operazioni <strong>di</strong>fattorizzazione possono far aumentare il numero <strong>di</strong> elementi non nulli, dando luogoalla necessità <strong>di</strong> pre<strong>di</strong>sporre altro spazio <strong>di</strong> memoria per la loro memorizzazione;mentre i meto<strong>di</strong> iterativi visti non alterano la struttura della matrice ed eventualmentepuò essere caricata in memoria una sola riga <strong>di</strong> A per volta. Per quanto concerne ilcosto in termini <strong>di</strong> operazioni <strong>di</strong> tipo moltiplicativo si ha che è dell'or<strong>di</strong>ne <strong>di</strong> n 3 /3 perla fattorizzazione LU e pari a n 2 per ogni iterazione nei meto<strong>di</strong> iterativi. Nel caso <strong>di</strong>convergenza in meno <strong>di</strong> n passi il vantaggio può essere rilevante.1.1.1 La stabilità dei meto<strong>di</strong> <strong>di</strong>retti per sistemi lineariIl con<strong>di</strong>zionamento intrinseco del problema, se valutato in termini <strong>di</strong> errore relativo, èlegato al cosiddetto numero <strong>di</strong> con<strong>di</strong>zionamentok * (A)=||A|| * ||A -1 || * della matrice A rispetto alla norma ||•|| *Se si perturba solo il termine noto b, la soluzione x+δx del sistemaA(x+δx) = b+δb è affetta da una perturbazione relativa∥δx∥⩽K (A)∥δb∥∥x∥ ∥b∥3


Nel caso più generale, si ha una espressione più complessa ma conclusioniqualitativamente simili.La stabilità dei meto<strong>di</strong> <strong>di</strong>retti tipo MEG o fattorizzazione LU aumenta decisamentecon la pivotazione, ed è migliore per meto<strong>di</strong> quali le <strong>fattorizzazioni</strong> QR e <strong>di</strong>Cholesky. E’ comunque <strong>di</strong>fficile risolvere accuratamente sistemi malcon<strong>di</strong>zionati in<strong>di</strong>mensione alta. La valutazione a posteriori della accuratezza tramite il residuo<strong>di</strong>pende anch’essa dal con<strong>di</strong>zionamento del sistemaSistemi <strong>di</strong> gran<strong>di</strong> <strong>di</strong>mensioni, specie se malcon<strong>di</strong>zionati, si risolvono spesso in modopiù efficiente ed accurato con meto<strong>di</strong> iterativi.1.2 FATTORIZZAZIONE DI CHOLESKYSia la matrice A una matrice simmetrica definita positiva 1 (ve<strong>di</strong> Teorema <strong>di</strong> Cholesky).La fattorizzazione per una matrice <strong>di</strong> questo tipo risulta semplificata per due ragioni:non è necessario alcun pivoting ed è possibile operare solo sul triangolo inferioredella matrice, essendo quello superiore il trasposto dell'inferiore, essendo la matrice Asimmetrica. Pertanto, la fattorizzazione della matrice consisterà nel prodotto <strong>di</strong> duematrici R e R T , la prima triangolare inferiore, la seconda trasposta della prima. Ladeterminazione <strong>degli</strong> elementi della matrice R={R ij} avviene nel seguente modo:r ij= 1 i−1(ar ij−∑ r kir kj),ii k =1i< jj−1r jj =(a jj −∑ r kjk =112 )2 , i= j.La matrice deve risultare positiva, altrimenti si darebbe luogo a delle ra<strong>di</strong>ci r jjcomplesse che comporterebbero l' impossibilità <strong>di</strong> realizzazione dell'algoritmo.Una volta calcolato R si procede alla risoluzione dei due sistemi triangolari:Ry=be R T x=y;In matlab la fattorizzazione <strong>di</strong> Cholesky si realizza con il comando chol1Il teorema <strong>di</strong> Cholesky afferma che una matrice simmetrica è definita positiva se e solo se esiste una e una sola matrice Rtriangolare inferiore con elementi <strong>di</strong>agonali positivi tale che A=R T R.4


%fattorizzazione <strong>di</strong> Cholesky>>n=5;>>A=rand(n);>>R=chol(A);Attraverso il comando chol inoltre si può sapere se A è definita positiva attraverso unflag p che risulta essere a zero:[R,p]=chol(A);Come scritto sopra, se A non è definita positiva e la funzione chol viene richiamatacon un solo argomento in uscita, verrà visualizzato un messaggio <strong>di</strong> errore:>>A=[1 2 3;2 5 4;3 4 8]>>R=chol(A)??? Error using ==> cholMatrix must be positive definite.Usando due argomenti in uscita, non viene segnalato alcun errore ma risulta p=3.>> [R,p]=chol(A)>>p=3Il comando chol rappresentato in precedenza può essere anche sostituito da unalgoritmo che fa uso <strong>di</strong> un'altra funzione anziché della funzione chol <strong>di</strong> matlab. Talealgoritmo può essere implementato per righe o per colonne, a seconda dell'or<strong>di</strong>ne incui vengono memorizzati gli elementi <strong>di</strong> una matrice nel linguaggio <strong>di</strong>programmazione adottato. Io ho scelto <strong>di</strong> implementare l'algoritmo per colonne:function [R] = cholesky(A)% La funzione “cholesky” ha come input la matrice%originaria A e restituisce in output la matrice R%fattorizzata.5


[n,n] = size(A);R = zeros(n,n); %La matrice R è inizialmente una matrice <strong>di</strong> zeri <strong>di</strong> <strong>di</strong>mensione n x n.for j = 1:nif (A(j,j)-sum(R(1:j-1,j).^2)) < 0 % Se l'argomento tra parentesi è minore <strong>di</strong> zero la%matrice A non è definita positiva e si genera un%messaggio d'errore.error ('La matrice A non è definita positiva')elsefor i = 1:j-1R(i,j)= (A(i,j)- sum(R(1:i-1,i).*R(1:i-1,j)))/R(i,i); %Si applica la formula scritta sopra per%ricavare gli elementi della matrice R in%funzione a quelli della matrice AendR(j,j) = sqrt(A(j,j)- sum(R(1:j-1,j).^2));endendPosso confrontare i due algoritmi sopra scritti, quello da me implementato e quello <strong>di</strong>Matlab, applicandoli alla risoluzione <strong>di</strong> un sistema lineare <strong>di</strong> equazioni. Per il loro<strong>confronto</strong> calcolo la norma due dell'errore della <strong>di</strong>fferenza delle due soluzioni, unadata dall'utilizzo del comando Matlab “chol” e l'altra data dall'algoritmoimplementato da me, per verificare il comportamento <strong>di</strong>fferente dei due algoritmi.Lo <strong>stu<strong>di</strong></strong>o è stato effettuato considerando tre <strong>di</strong>verse grandezze <strong>di</strong> matrici, in modo dapoter verificare il comportamento dei due meto<strong>di</strong> al variare della <strong>di</strong>mensionematriciale.%CONFRONTO FATTORIZZAZIONI CHOLESKY: UTILIZZO ALGORITMO MATLAB CHOL E%ALGORITMO IMPLEMENTATO6


for n = 1:10;A = rand(n);A = A'*A;sol = ones(n,1);b = A*sol;%Comando "chol" <strong>di</strong> matlabR = chol(A);y1 = R'\b;x1 = R\y1;% Errore usando usando la funzione "chol" <strong>di</strong> Matlaberrore1(n) = norm(x1 – sol);%Comando "cholesky" implementato attraverso il mio algoritmo personalizzatoR=cholesky(A);y2=R'\b;x2=R\y2;% Errore usando usando la funzione "chol" <strong>di</strong> Matlaberrore2(n) = norm(x2 - sol);end7


Per la <strong>di</strong>mensione matriciale che varia tra 1 e 10 si può notare che i due meto<strong>di</strong> sonoentrambi efficienti e non si <strong>di</strong>scostano in maniera significativa tra loro. L'errore è inscala logaritmica e ha una scala <strong>di</strong> variazione compresa tra 10 -15 e 10 -11 .8


Con una matrice <strong>di</strong> <strong>di</strong>mensioni maggiori (1-50), i due meto<strong>di</strong> rimangono pressochécoincidenti, tuttavia l'errore cresce significativamente, fino a 10 -8 . E' da notare che incorrispondenza circa dell'ascissa 43 gli errori tra i due meto<strong>di</strong> <strong>di</strong>fferiscono per più <strong>di</strong>un or<strong>di</strong>ne <strong>di</strong> grandezza, a vantaggio dell'algoritmo facente uso del comando chol <strong>di</strong>matlab.Con una matrice compresa tra 1 e 100 l'errore cresce fino a raggiungere il valore <strong>di</strong>10 -6 .Valutiamo ora i tempi <strong>di</strong> elaborazione delle soluzioni in funzione delle <strong>di</strong>mensionimatriciali:9


Il metodo <strong>di</strong> Cholesky implementato con la funzione propria <strong>di</strong> Matlab risulta moltopiù efficiente a partire da matrici <strong>di</strong> piccole <strong>di</strong>mensioni. Si vede infatti che vi è una<strong>di</strong>fferenza tra i due algoritmi, che tende ad aumentare con l'aumentare della<strong>di</strong>mensione della matrice. Gli andamenti dei due algoritmi sono pressoché gli stessi,tranne che per un andamento leggermente più lineare dell'algoritmo proprio <strong>di</strong> matlaball'aumentare delle <strong>di</strong>mensioni.Con l'aumento delle <strong>di</strong>mensioni delle matrici, il tempo varia notevolmente tra i duealgoritmi implementati, i quali ad<strong>di</strong>rittura <strong>di</strong>fferiscono <strong>di</strong> due or<strong>di</strong>ni <strong>di</strong> grandezza: 10 -2sec. per l'algoritmo <strong>di</strong> matlab e 10 -4 sec. per l'algoritmo implementato da me.10


Anche per matrici comprese tra 0 e 100 i tempi si mantengono molto bassi tuttavia<strong>di</strong>fferiscono notevolmente per or<strong>di</strong>ne <strong>di</strong> grandezza. In questo caso l'algoritmo <strong>di</strong>Matlab è almeno due or<strong>di</strong>ni <strong>di</strong> grandezza più veloce.11


1.3 LA FATTORIZZAZIONE QRUn'alternativa alla fattorizzazione <strong>di</strong> Cholesky è la fattorizzazione QR.La procedura <strong>di</strong> fattorizzazione QR è una procedura che consiste nella scomposizionedella matrice A in due matrici Q ed R, in cui Q è una matrice ortogonale (ossia taleche QQ T = Q T Q = I) e R è una matrice triangolare superiore.Le relazioni che legano gli elementi <strong>di</strong> A a quelli della matrice prodotto QR sono leseguenti:na ij=∑j=1kq ijr jk=∑ q ijr jkj=1in quanto r jk = 0 per j= k+1,...,n essendo R triangolare superiore.Esistono <strong>di</strong>versi meto<strong>di</strong> per la scomposizione della matrice in forma QR , in questatesina mi occuperò della fattorizzazione <strong>di</strong> Householder e <strong>di</strong> quella <strong>di</strong> Givens,mettendone in relazione i punti in comune e le <strong>di</strong>fferenze fondamentali.Una volta ottenuta la fattorizzazione QR con i meto<strong>di</strong> sopra citati si può passare allarisoluzione del sistema lineareAx=b ,procedendo allo stesso modo della fattorizzazione LU.Più precisamente, si ottiene che si devono risolvere i due sistemi lineariQc=b,Rx=c.Il vantaggio dell'introduzione della matrice Q al posto della matrice A originaria,consiste nel fatto che, essendo Q ortogonale, per unicità dell'inversa, Q -1 = Q t ,cosicché il vettore c = Q -1 b viene ottenuto semplicemente considerando il prodottomatrice-vettore c = Q T b (e non la risoluzione del sistema lineare).Per quanto riguarda il sistema Rx = c, essendo R una matrice triangolare superiore,esso viene risolto con la procedura <strong>di</strong> risoluzione backward, come nel caso dellafattorizzazione LU.12


1.3.1 FATTORIZZAZIONE DI HOUSEHOLDERLa fattorizzazione <strong>di</strong> Householder consiste nella decomposizione della matrice A indue matrici Q ed R a partire dalle matrici elementari <strong>di</strong> Householder.Una matrice elementare <strong>di</strong> Householder reale ha la seguente forma:H=I−2 w w T ,w∈R n ,∥w∥=1,H è una matrice ortogonale e simmetrica.Questo metodo presenta alcuni vantaggi pratici, in particolare esso non richiede ilcalcolo dell’inversa <strong>di</strong> una matrice triangolare superiore.Poiché ogni trasformazione <strong>di</strong> Householder è ortogonale, ci basta far vedere cheesiste un prodotto <strong>di</strong> matrici del tipo H(x i ; e j ) che trasforma A in una matricetriangolare superiore con entrate sulla <strong>di</strong>agonale principale tutte positive. A questopunto, l’unicità della fattorizzazione garantisce che quanto abbiamo ottenuto siaeffettivamente la decomposizione QR cercata, che è detta matrice <strong>di</strong> Householder(alternativamente riflessione <strong>di</strong> Householder, trasformazione <strong>di</strong> Householder)associata a w.H 1 a 1(1)=k 1 e 1.Dobbiamo creare una successione <strong>di</strong> matrici A (i) , con i=1,...n in modo che A (n) siatriangolare superiore. Moltiplichiamo la matrice <strong>di</strong> Householder H 1 a sinistra dellamatrice A (1) e otteniamo:A (2) =H 1 A (1) =[a 1(2)a 2(2)… a n(2)]in cuia1(2)=k1e1,mentre i restanti elementiaj(2)=H 1 aj(1) con j=2,...,n.La matrice A(2) ha la seguente struttura:A (2) =(k(2) (2)1 a 12 ⋯ a 1n(2) (2)0 a 22⋯ a 2n⋮ ⋮ ⋮(2)0 a n2 ⋯ a nn(2))= (k 10Tv 1 Â , 13


 (2)con 0 vettore colonna e una sottomatrice <strong>di</strong> <strong>di</strong>mensione appropriata cheandremo a sottoporre alle stesse operazioni a cui abbiamo sottoposto H 1 , dopo averla“orlata” con una riga e una colonna <strong>di</strong> una matrice identità per farle raggiungere la<strong>di</strong>mensione n x n e ripetiamo il proce<strong>di</strong>mento come sopra, fino ad arrivare al genericopasso i in cui avremo la matrice nella forma:1• ⋯ ⋯ ⋯ •0 ⋱ ⋱ ⋮A =(k (i) ⋮ ⋱ k i−1 • ⋯ •⋮ 0⋮ ⋮  (i)0 ⋯ 0)=( A (i)11A 12(i)) 0 Âin cui gli elementi in<strong>di</strong>cati con • non verranno più mo<strong>di</strong>ficati e la sottomatrice (i)ha la forma: (i) =[â i(i)(i)a i+1̂⋯ â n (i) ]A questo punto poniamo:Ĥ i â i (i) =k ie 1quin<strong>di</strong> orliamo Ĥ i con i-1 righe e colonne della matrice identità fino ad ottenere:1• ⋯ ⋯ ⋯ •A =(k )0 ⋱ ⋱ ⋮(i+1) ⋮ ⋱ k i • ⋯ •⋮ 0⋮ ⋮  (i+1)0 ⋯ 0In<strong>di</strong>chiamo con(H n H n-1 H 1 )A = R ndove H = (H n H n-1 H 1 ) è una matrice ortogonale, mentre R n è una matrice triangolare14


superiore con valori positive sulla <strong>di</strong>agonale principale.Moltiplicando per Q = H T = H -1 l’uguaglianza <strong>di</strong> cui sopra si giunge ora allafattorizzazioneA= QRQuanto scritto sopra è valido per matrici quadrate, che sono quelle che ho trattato inquesta tesina. Per le matrici rettangolari occorre effettuare un passo in aggiuntivo perazzerare gli elementi della n-esima colonna della matrice A.In matlab la fattorizzazione QR <strong>di</strong> una matrice A me<strong>di</strong>ante l'algoritmo <strong>di</strong> Householdersi ottiene me<strong>di</strong>ante il comando:[Q,R]=qr(A)e attraverso questa è possibile trovare la soluzione <strong>di</strong> un sistema lineare, attraverso iseguenti passi:[Q,R]=qr(A);c=Q'*b;x=R\c;Come già fatto per il caso dell'algoritmo <strong>di</strong> Cholesky, possiamo sviluppare unalgoritmo personale <strong>di</strong> Householder e lo mettiamo in <strong>confronto</strong> con quello proprio <strong>di</strong>matlab. Anche in questo caso consideriamo un sistema <strong>di</strong> equazioni, e valutiamol'errore attraverso il calcolo della norma due della soluzione sia nel casodell'algoritmo personale che nel caso dell'algoritmo implementato da matlab, infunzione della <strong>di</strong>mensione della matrice. Successivamente ne valuteremo i tempi <strong>di</strong>elaborazione.Partiamo da una matrice con n=10. Come si può vedere gli errori sono molto piccoli,compresi in un range tra 10 -15 e 10 -13 , tuttavia l'algoritmo personalizzato è affetto dameno errore, quin<strong>di</strong> è più stabile.15


Nel caso <strong>di</strong> matrici <strong>di</strong> or<strong>di</strong>ne superiore abbiamo che il range <strong>di</strong> errore si mo<strong>di</strong>fica, da10 -16 a 5*10 -11 nel caso <strong>di</strong> n=50 e da 2*10 -15 a 5*10 -9 nel caso <strong>di</strong> matrici con n=100,tuttavia il questi ultimi casi l'algoritmo <strong>di</strong> matlab sembra essere maggiormentestabile, in quanto raggiungono picchi <strong>di</strong> errore minori rispetto al caso dell'algoritmopersonalizzato.16


Circa i tempi mostriamo i seguenti grafici in funzione della <strong>di</strong>mensione n dellamatrice:Per n=10 i tempi sono compresi in un intorno <strong>di</strong> 5*10 -5 sec per l'algoritmo <strong>di</strong> Matlab,mentre variano anche <strong>di</strong> un or<strong>di</strong>ne <strong>di</strong> grandezza per l'algoritmo personalizzato (10 -5,10 -4 )sec.Per n superiori si verifica che l'algoritmo <strong>di</strong> matlab ha dei tempi che rimangonosostanzialmente invarianti rispetto al caso precedente, mentre nel caso dell'algoritmopersonalizzato si ha una variazione <strong>di</strong> circa due or<strong>di</strong>ni <strong>di</strong> grandezza. L'algoritmo <strong>di</strong>matlab è dunque significativamente più veloce.18


Quanto sopra scritto è reso ancora più notevole dall'ulteriore aumento <strong>di</strong> n.Per n=100 infatti si veda come i tempi dell'algoritmo personalizzato siano molto piùlenti.19


1.3.2 Confronto metodo QR e LU per sistemi malcon<strong>di</strong>zionati.Quando si sceglie <strong>di</strong> effettuare una fattorizzazione, si può scegliere sia unafattorizzazione QR che una fattorizzazione LU. In realtà la scelta non è del tuttocasuale, in quanto tra <strong>di</strong> essi cambia notevolmente il con<strong>di</strong>zionamento.Nelle <strong>fattorizzazioni</strong> LU il con<strong>di</strong>zionamento del sistema finale potrebbe esserenotevolmente superiore rispetto al sistema iniziale, mentre nelle <strong>fattorizzazioni</strong> QR,al contrario, il con<strong>di</strong>zionamento non cambia tra sistema iniziale e sistema finale.Questo fatto rende preferibile la scelta <strong>di</strong> una fattorizzazione QR nei sistemi malcon<strong>di</strong>zionati. Un caso in cui un sistema può essere mal con<strong>di</strong>zionato è quando dueequazioni sono quasi identiche. Ovviamente è ancora peggio quando sonocompletamente identiche. Ve<strong>di</strong>amo <strong>di</strong> darne una rappresentazione.Un sistema malcon<strong>di</strong>zionato è rappresentato dalla matrice <strong>di</strong> Hilbert.La matrice <strong>di</strong> Hilbert è una particolare matrice che ha sulle anti-<strong>di</strong>agonali i reciprocidei numeri interi. Questa matrice è fortemente mal con<strong>di</strong>zionata, ossia amplificamolto gli errori al crescere della <strong>di</strong>mensione del sistema.20


Come si evince dai grafici, la fattorizzazione QR è notevolmente più lineare, mentrela fattorizzazione LU è più irregolare. Questo fatto si nota maggiormente nellematrici <strong>di</strong> piccole <strong>di</strong>mensioni, in cui i punti sono ben separati.Tra i grafici non ho inserito quello della matrice <strong>di</strong> <strong>di</strong>mensione n=100, in quantol'elaborazione ha dato dei problemi dovuti al fatto che matlab riconosce la matrice <strong>di</strong>Hilbert come una matrice malcon<strong>di</strong>zionata, pertanto invia messaggi <strong>di</strong> warning cherallentano il processo e non lo fanno ultimare.21


1.3.3 FATTORIZZAZIONE DI GIVENSLa fattorizzazione <strong>di</strong> Givens è incentrata sulla rotazione <strong>di</strong> Givens.Una rotazione <strong>di</strong> Givens, o trasformazione <strong>di</strong> Givens è definita me<strong>di</strong>ante una matriceortonormale G ij∈ R minserisci matricedove c=cos θ e s=sin θ per θ appartenente ai reali e 1


Il risultato che abbiamo ottenuto è effettivamente coerente con quanto scritto sopra.La complessità computazionale tra i due meto<strong>di</strong>, se applicati a matrici quadrate, ènotevolmente <strong>di</strong>fferente. Il metodo <strong>di</strong> Householder richiede O( 2 3 n3)moltiplicazioni, contro le O( 4 3n3) moltiplicazioni nel caso <strong>di</strong> Givens.Questa <strong>di</strong>fferenza è visibile attraverso lo <strong>stu<strong>di</strong></strong>o dei tempi <strong>di</strong> simulazione <strong>di</strong> entrambi imeto<strong>di</strong>:Per matrici <strong>di</strong> piccole <strong>di</strong>mensioni i due meto<strong>di</strong> presentano pressoché gli stessi tempi.Al crescere delle <strong>di</strong>mensioni però accade che l'algoritmo <strong>di</strong> Householder piùefficiente computazionalmente, questo perché richiede la metà delle moltiplicazionirispetto all'algoritmo <strong>di</strong> Givens.26


1.4 L' ALGORITMO QRPer calcolare tutti gli autovalori <strong>di</strong> una matrice A si cerca <strong>di</strong> trasformarla, persimilitu<strong>di</strong>ne, in una <strong>di</strong> forma particolarmente semplice. La forma più desiderabilesarebbe quella <strong>di</strong>agonale (gli autovalori sono gli elementi sulla <strong>di</strong>agonale) ma non èpossibile ridurre per similitu<strong>di</strong>ne ogni matrice in forma <strong>di</strong>agonale in un numero finito<strong>di</strong> passi. Data la matrice quadrata A, si definisceA 0 = A;Se A k = Q k R k, con R k triangolare superiore e Q k ortogonale, allora si costruisce lasuccessione:A k+1 = R k Q kcon k= 0, 1, 2, ….La successione {A 0 , A 1, A 2 ,...} è essenzialmente unica (questo fatto <strong>di</strong>scendedall'unicità della decomposizione QR.Tutte le matrici A k , sono simili fra loro, dato cheA k+1 = R k Q k = (Q T k Q k ) R k Q k = Q T k (Q k R k )Q k = Q T k (A k ) Q ke Q T k = Q -1 .Se la matrice A, ha autovalori <strong>di</strong>stinti, la successione Ak definita attraversol'algoritmo QR converge ad una matrice triangolare superiore sulla cui <strong>di</strong>agonale sitrovano gli autovalori <strong>di</strong> A.T =[λ 1 • ⋯ •λ 2⋱ ⋮n]⋱ •λNegli altri casi tende alla forma seguente:[• • • ⋯ •• • • ⋱ •λ 3 ⋱ ⋮n]⋱ •λ28


in cui la parte sottostante una <strong>di</strong>agonale a blocchi, i cui blocchi sono <strong>di</strong> <strong>di</strong>mensione 1e <strong>di</strong> <strong>di</strong>mensione 2, è composta da zeri . Gli autovalori dei blocchi <strong>di</strong>agonali superstiticonvergono agli autovalori <strong>di</strong> A. Il limite non può essere sempre una matricetriangolare superiore perché, nel caso <strong>di</strong> matrici reali, le trasformazioni <strong>di</strong>Householder e quin<strong>di</strong> le <strong>fattorizzazioni</strong> QR e i prodotti RQ sono ancora reali ad ognipasso della successione. Non si potrebbero quin<strong>di</strong> trovare gli eventuali autovaloricomplessi <strong>di</strong> A. In presenza <strong>di</strong> coppie <strong>di</strong> autovalori complessi coniugati non e infattiverificata l'ipotesi. In tal caso compaiono dei blocchi <strong>di</strong>agonali a coefficienti reali <strong>di</strong><strong>di</strong>mensione 2, i cui autovalori complessi coniugati approssimano quelli <strong>di</strong> A.2Il costo computazionale del metodo QR e notevolmente alto:3 n3 per ognifattorizzazione QR eogni iterazione.n 32per ogni prodotto RQ, complessivamente76 n3 perMostro ora un esempio del modo in cui funziona l'algoritmo QR, attraverso l'uso deicoman<strong>di</strong> <strong>di</strong> matlab.Supponiamo <strong>di</strong> avere una generica matrice A 5x5:A =2.2362 1.7520 1.4943 1.0274 1.04671.7520 1.6695 1.1969 0.6517 0.76811.4943 1.1969 1.7012 0.5591 1.26951.0274 0.6517 0.5591 0.7690 0.58431.0467 0.7681 1.2695 0.5843 1.1218calcoliamo gli autovalori con il comando eig <strong>di</strong> matlab:>> eig(A)ans =0.00190.11050.49920.90395.982229


Applico ora l'algoritmo QR, attraverso la funzione “algqr”, che prende in ingresso lamatrice A e un generico numero <strong>di</strong> iterazioni che stabilisco a piacere, e calcola inuscita la matrice T, nella cui <strong>di</strong>agonale compaiono gli autovalori <strong>di</strong> A, e le matrici Qed R in cui la matrice A viene fattorizzata.[T,Q,R]=algqr(A,niter)T =5.9822 -0.0000 -0.0000 -0.0000 -0.0000-0.0000 0.9039 -0.0000 -0.0000 -0.00000.0000 -0.0000 0.4992 0.0000 -0.00000.0000 -0.0000 -0.0000 0.1105 0.00000.0000 -0.0000 -0.0000 0.0000 0.0019Q =1.0000 0.0000 -0.0000 -0.0000 0.0000-0.0000 1.0000 0.0000 0.0000 -0.00000.0000 -0.0000 1.0000 0.0000 -0.00000.0000 -0.0000 -0.0000 1.0000 -0.00000.0000 -0.0000 -0.0000 0.0000 1.0000R =5.9822 -0.0000 -0.0000 -0.0000 -0.0000-0.0000 0.9039 -0.0000 -0.0000 -0.0000-0.0000 0 0.4992 0.0000 -0.00000.0000 0 0 0.1105 0.0000-0.0000 0 0 0.0000 0.001930


Come si può vedere nella <strong>di</strong>agonale principale T compaiono gli autovalori dellamatrice A, mentre Q ed R sono il risultato della fattorizzazione QR <strong>di</strong> A, comevolevamo <strong>di</strong>mostrare.Supponiamo ora <strong>di</strong> avere una matrice A i cui autovalori non sono tutti reali, ma alcunisono complessi coniugati. Ve<strong>di</strong>amo come si comporta l'algoritmo QR:A =0.8244 0.9814 0.8266 0.8509 0.96490.9915 0.2546 0.8551 0.2461 0.99100.9843 0.3328 0.9510 0.2355 0.74580.5584 0.0367 0.3432 0.9527 0.18090.2175 0.8213 0.8360 0.8074 0.3675Calcolo gli autovalori:>> eig(A)ans =3.2619-0.68870.75250.0123 + 0.2547i0.0123 – 0.2547iStabilisco un numero <strong>di</strong> iterazioni, alto a piacere:niter=150e richiamo la mia funzione:>> [T,Q,R]=algqr(A,niter)31


T =3.2619 0.4170 0.2336 0.0550 -0.5882-0.0000 0.7525 -0.4422 0.0310 -0.1126-0.0000 -0.0000 -0.6887 -0.4476 -0.3323-0.0000 -0.0000 -0.0000 -0.0341 0.16320.0000 -0.0000 -0.0000 -0.4107 0.0587Q =1.0000 0.0000 -0.0000 0.0000 -0.0000-0.0000 1.0000 -0.0000 -0.0000 -0.00000.0000 0.0000 1.0000 0.0000 0.00000.0000 0.0000 0.0000 -0.1414 -0.9900-0.0000 0.0000 0.0000 0.9900 -0.1414R =3.2619 0.4170 0.2336 0.5745 0.13760 0.7525 -0.4422 0.1071 0.04660 -0.0000 -0.6887 0.3922 -0.39610 0.0000 -0.0000 -0.1567 -0.05680 0.0000 0.0000 0 -0.4149Dopo 150 iterazioni ve<strong>di</strong>amo che la matrice T non è perfettamente <strong>di</strong>agonale, tuttaviagli autovalori reali si trovano nella sua <strong>di</strong>agonale, mentre gli autovalori complessiconiugati si trovano considerando il blocco <strong>di</strong>agonale <strong>di</strong> <strong>di</strong>mensione 2x2 dellamatrice T. Infatti considerando tale blocco come una matrice otteniamo:C =-0.0341 0.1632-0.4107 0.058732


Calcolando glia autovalori della matrice C otteniamo :>> eig(C)ans =0.0123 + 0.2547i0.0123 – 0.2547iche sono gli autovalori complessi della matrice A <strong>di</strong> partenza.1.5 FORMA DI HESSENBERGIl metodo <strong>di</strong> fattorizzazione <strong>di</strong> Givens è più efficiente rispetto a quello <strong>di</strong>Householder quando abbiamo a che fare con matrici sparse oppure con matrici informa <strong>di</strong> Hessenberg.Una matrice A può essere trasformata me<strong>di</strong>ante trasformazione <strong>di</strong> similitu<strong>di</strong>ne in unamatrice strutturata, della forma:Ã =[• ⋯ ⋯ ••]• ⋱ ⋮⋱ ⋱ ⋮•che prende il nome <strong>di</strong> struttura <strong>di</strong> Hessenberg, dove ̃ =0 per i


calcolata come prodotto <strong>di</strong> matrici <strong>di</strong> Householder P (1) ...P (n-2) .In ogni passo k-esimo si trasforma A per similitu<strong>di</strong>ne, attraverso la matrice <strong>di</strong>Householder P k , alla quale fa in modo <strong>di</strong> annullare gli elementi in posizione k+2,...ndella colonna k-esima della matrice per k=1,...,(n-2).Il passaggio in forma <strong>di</strong> Hessenberg richiede un costo computazionale dell'or<strong>di</strong>ne <strong>di</strong>n 3 flops.La procedura può essere così schematizzata:[• • • •• • •• • •• • • • • • • • • • • •• • • • (1)→[• P0 • • • (2)→[• 0 • • •• • • •]→P0 • • •]→0 0 • •]dove gli elementi in<strong>di</strong>cati con il simbolo • sono gli elementi non nulli della matrice.Partendo dalla con<strong>di</strong>zione A=A(0) si genera la successione:P T(k )A (k−1) P (k)=(P (1)...P (k )) T A (P (1)... P (k))=Q T (k)AQ (k)k⩾1.L'operazione P T (k)A (k −1) lascia invariate le prime k righe <strong>di</strong> A (k-1) , mentrel'operazione P T (k )A (k−1) P (k) lascia invariate le prime k colonne. Dopo n-2 iterazionisi arriva alla matrice à in forma <strong>di</strong> Hessenberg superiore.1.6 FATTORIZZAZIONE QR DI UNA MATRICE INFORMA DI HESSENBERGIl vantaggio <strong>di</strong> utilizzare la matrice <strong>di</strong> Hessenberg, oltre a quello già citatodell'accelerazione della convergenza è legato al metodo <strong>di</strong> Givens. Infatti per34


calcolare la fattorizzazione QR <strong>di</strong> una matrice in forma <strong>di</strong> Hessenberg è possibileapplicare (n-1) trasformazioni <strong>di</strong> Givens che annullano gli elementi sotto<strong>di</strong>agonali.Partiamo da una matrice in forma <strong>di</strong> Hessenberg T(0)=H(0).Per ogni k>=1 si calcola la fattorizzazione QR <strong>di</strong> H(k-1) con n-1 rotazioni <strong>di</strong> Givens(Q (k ) ) T H (k −1) (k)=(G n−1) T ...(G (k) 1) T H (k−1) =R (k ) ,che richiede 3n 2 flops.Il passo successivo consiste nel completare la trasformazione per similitu<strong>di</strong>neortogonaleH (k) =R (k) Q (k) = R (k) (G (k) (k1...G ) n −1),che richiede 3n 2 operazioni.La matrice Q (k) =(G (k) 1...G (k) n−1) è ortogonale ed è in forma <strong>di</strong> Hessenberg superiore.Si ha infatti cheQ (k) =G 1(k)G 2(k) =[ • • 0• • 01][ 1 0 00 • •0 0•] [ • • •= • • •0 •0 • •]In tutto dunque si ha un costo pari a 6n 2 flops.A questo punto, se proviamo ad applicare le <strong>fattorizzazioni</strong> QR <strong>di</strong> Givens e QR <strong>di</strong>Householder questa volta a una matrice in forma <strong>di</strong> Hessenberg, abbiamo che lafattorizzazione <strong>di</strong> Givens è più efficiente, anche al crescere delle <strong>di</strong>mensioni dellamatrice.In matlab la matrice <strong>di</strong> Hessenberg si ottiene me<strong>di</strong>ante il comandohess(A);35


Facendo una valutazione sui tempi <strong>di</strong> elaborazione, che mettono in risalto le<strong>di</strong>fferenze computazionali tra gli algoritmi, otteniamo i seguenti risultati al variare <strong>di</strong>n:36


Come si nota, l'algoritmo <strong>di</strong> Givens è eccezionalmente più stabile, i tempi sononettamente inferiori rispetto all'algoritmo <strong>di</strong> Householder al crescere della<strong>di</strong>mensione n della matrice in forma <strong>di</strong> Hessenberg.37


1.7 ALGORTIMO QR CON SHIFTSe gli autovalori della matrice A anche se sono tutti <strong>di</strong>stinti tra loro non sono benseparati, è possibile che la convergenza della matrice T potrebbe risultare molto lenta.Per questo motivo è utile implementare la tecnica dello shift.Esistono <strong>di</strong>verse tecniche <strong>di</strong> shift, tuttavia in questa tesina verrà affrontata la tecnicadello shift singolo, che consente <strong>di</strong>a accelerare la convergenza rispetto al metodo <strong>di</strong>base quando A presenta autovalori vicini in modulo.Il metodo QR con shift può essere schematizzato nel modo seguente:1. Si determinano Q (k) , R (k) tali cheQ (k) R (k) = T (k-1) - μI (fattorizzazione QR)2. Si pone T (k) = Q (k) R (k) + μIdove μ∈R viene chiamato shift, k=1,2,...fino alla convergenza eT (0) =(Q (0) ) T AQ (0 ) è una matrice in forma <strong>di</strong> Hessenberg superiore.La matrice T(k) generata è simile alla matrice A <strong>di</strong> partenza per ogni k⩾1.Supponiamo che μ abbia un valore fissato. Or<strong>di</strong>niamo gli autovalori <strong>di</strong> A nel modoseguente:∣λ 1 −μ∣⩾∣λ 2 −μ∣⩾...⩾∣λ n −μ∣.Si può <strong>di</strong>mostrare che per 1


otterranno tutti gli autovalori <strong>di</strong> A.Un metodo per la costruzione dello shift con matlab è il seguente:%QR con singolo shiftfunction[T,iter]=qrshift(A,toll,itmax)n=max(size(A));iter=0[T,Q]=houshess(A);for k=n:1:2I=eye(k);while abs(T(k,k-1))>toll*(abs(T(k,k))+abs(T(k-1,k-1)))iter=iter+1;if(iter>itmax),returnendmu=T(k,k);[Q,R,c,s]=qrgivens(T(1:k,1:k)-mu*I);T(1:k,1:k)=R*Q+mu*I;endT(k,k-1)=0;end39

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!