Sei sulla pagina 1di 9

Primo elaborato di Calcolo Numerico Mod.

1
Jacopo Soldateschi 3 aprile 2014

Indice
1 Testo 2 Introduzione teorica 3 Commento del codice 4 Problemi test 2 3 5 7

Testo

Assegnato il sistema lineare Ax = b, A Rnn , b Rn , scrivere un sottoprogramma Matlab per il calcolo della sua soluzione usando la fattorizzazione QR della matrice A. Utilizzare il metodo di Gram-Schmidt modicato. Vericarne la correttezza mediante opportuni problemi test.

Introduzione teorica

Dati dei vettori colonna a1 , ..., an Rm linearmente indipendenti, essi formano la matrice A = [a1 , ..., an ] Rmn . Si pu` o facilmente dimostrare la validit` a del seguente: Teorema: dati v1 , ..., vm Rn ortonormali, vm+1 , ..., vn t.c.v1 , ..., vm , vm+1 , ..., vn formano una base ortonormale. Attraverso questo procedimento, chiamato algoritmo di ortonormalizzazione di Gram-Schmidt, otteniamo dalla matrice A la matrice Q = [q1 , ..., qn ] Rmn , con q1 , ..., qn Rm ortonormali, e tali che span{a1 , ..., an } = span{q1 , ..., qn }. Pi` u precisamente, tramite questo algoritmo possiamo scrivere la matrice A come prodotto di una matrice ortogonale Q per una matrice triangolare superiore R. Questa operazione prende il nome di fattorizzazione QR. Cio` e: rij R, i = 1, ..., n, j = i, ..., n t.c. a1 = r11 q1 a2 = r12 q1 + r22 q2 . . . aj = r1j q1 + ... + rjj qj . . . an = r1n q1 + r2n q2 + ... + rnn qn

Gli rij sono gli elementi della matrice R triangolare superiore. Lalgoritmo di Gram-Schmidt ha la seguente forma: 1. for j = 1, 2, ..., n 1. for i = 1, ..., j 1 1. rij =< aj , qi > 2. qj = aj
j 1 i=1 rij qi

3. rjj =< qj , qj >1/2 4. qj =


1 rjj qj

Questo algoritmo ` e tuttavia fortemente instabile, perch e possono esserci grossi errori di cancellazione nella 1.2, il che comporta che i qj vengono calcolati male. Osserviamo che lidea principale dietro lalgoritmo di gram-Schmidt sta nelleliminare dal vettore aj tutte le componenti lungo i vettori ortonormali gi` a 3

calcolati q1 , q2 , ..., qj 1 . Utilizziamo dunque un algoritmo di Gram-Schmidt modicato: 1. for j = 1, 2, ..., n 1. rii =< ai , ai >1/2 2. qi =
1 rii qi

3. for j = i + 1, ..., n 1. rij =< qi , aj > 2. aj = aj rij qi Cio` e, in questo agoritmo di Gram-Schmidt modicato, si calcola prima un singolo qi = ai / < ai , ai >1/2 , ed eliminiamo da ai+1 , ..., an la componente lungo qi . Questo algoritmo ` e stabile, e restituisce ancora la fattorizzazione QR della matrice A. Dunque, se possiamo scrivere A = QR, il generico sistema lineare Ax = b diventa QRx = b, e cio` e x = R1 (Qt b).

Commento del codice

Di seguito ` e riportato lintero codice Matlab del sottoprogramma. f u n c t i o n x=gschmidtmod (A, b ) tic [ n ,m]= s i z e (A ) ; i f n=m e r r o r ( La m a t r i c e non e quadrata . ) end Q=z e r o s ( n , n ) ; R=z e r o s ( n , n ) ; f o r i =1:1:n f o r k =1:1:n R( i , i )=R( i , i )+A( k , i ) *A( k , i ) ; end R( i , i )= s q r t (R( i , i ) ) ; f o r k =1:1:n Q( k , i )=A( k , i ) /R( i , i ) ; end f o r j=i + 1 : 1 : n f o r k =1:1:n R( i , j )=R( i , j )+Q( k , i ) *A( k , j ) ; end f o r k =1:1:n A( k , j )=A( k , j )R( i , j ) *Q( k , i ) ; end end end y=Q * b ; x=z e r o s ( n , 1 ) ; f o r i=n : 1:1 x ( i ,1)= y ( i , 1 ) ; f o r j=i + 1 : 1 : n x ( i ,1)= x ( i ,1) R( i , j ) * x ( j , 1 ) ; end x ( i ,1)= x ( i , 1 ) /R( i , i ) ; end toc disp (x ) ; end Il sottoprogramma gschmidtmod prende in input una matrice A ed un vettore colonna b. La funzione Matlab tic fa partire un cronometro, il quale misura il tempo di esecuzione dellintero sottoprogramma, ovvero no al comando di fermata del cronometro toc. Per prima cosa salviamo le dimensioni della matrice A in un vettore e, nel caso in cui non fosse quadrata, lesecuzione termina 5

e compare un messaggio di errore. Con il comando zeros(n,n) creiamo due matrici quadrate di dimensione n, Q ed R, composte da elementi nulli. Parte cos` il primo ciclo for. Fissato lindice i del ciclo esterno, con il primo ciclo annidato f o r k =1:1:n R( i , i )=R( i , i )+A( k , i ) *A( k , i ) ; end R( i , i )= s q r t (R( i , i ) ) ; si esegue il prodotto scalare della colonna i esima di A per se stesso, il quale viene salvato nellelemento i esimo della diagonale di R. Procediamo con il calcolo della norma del suddetto elemento. Con il ciclo f o r k =1:1:n Q( k , i )=A( k , i ) /R( i , i ) ; end salviamo in ciascuna riga di Q (colonna i esima) il corrispondente elemento di A diviso per la sua norma. Con i cicli f o r j=i + 1 : 1 : n f o r k =1:1:n R( i , j )=R( i , j )+Q( k , i ) *A( k , j ) ; end f o r k =1:1:n A( k , j )=A( k , j )R( i , j ) *Q( k , i ) ; end end concludiamo limplementazione dellalgoritmo di ortonormalizzazione di GramSchmidt modicato. Il comando y=Q * b ; x=z e r o s ( n , 1 ) ; f o r i=n : 1:1 x ( i ,1)= y ( i , 1 ) ; f o r j=i + 1 : 1 : n x ( i ,1)= x ( i ,1) R( i , j ) * x ( j , 1 ) ; end x ( i ,1)= x ( i , 1 ) /R( i , i ) ; end toc disp (x ) ; end restituisce in output la soluzione del sistema iniziale Ax = b, tramite un algoritmo di sostituzione allindietro.

Problemi test

Sono di seguito riportati i risultati di problemi test con matrici di dimensione 3, 5. Sono stati eettuati test con matrici di ordine 10, 500 e 1000, dei quali riportiamo esclusivamente i tempi di esecuzione. Nei primi due esempi si ` e confrontato il risultato ottenuto con la funzione Matlab linsolve(A,b), che sfrutta la fattorizzazione LU. >> A=rand ( 3 , 3 ) A = 0.9282 0.2719 0.8459 >> b=rand ( 3 , 1 ) b = 0.7366 0.5187 0.0069 >> gschmidtmod (A, b ) Elapsed time i s 0 . 0 0 0 0 4 9 s e c o n d s . ans = 0.7847 1.4041 0.1689 >> l i n s o l v e (A, b ) ans = 0.7847 1.4041 0.1689 0.9406 0.4279 0.4317 0.8546 0.7773 0.3824

>> A=rand ( 5 , 5 ) A = 0.5992 0.8712 0.6603 0.0459 0.6748 >> b=rand ( 5 , 1 ) b = 0.6709 0.5219 0.8343 0.9071 0.3666 >> gschmidtmod (A, b ) Elapsed time i s 0 . 0 0 0 0 5 3 s e c o n d s . 0.9755 0.3371 0.2636 0.7850 0.7973 0.7604 0.0046 0.7526 0.0292 0.9389 0.5082 0.9521 0.2929 0.3294 0.7395 0.9918 0.6786 0.6576 0.2452 0.6158 0.1086 0.7356 0.7917 0.8312 0.0376

ans = 0.9755 0.3371 0.2636 0.7850 0.7973 >> l i n s o l v e (A, b ) ans = 0.9755 0.3371 0.2636 0.7850 0.7973 8

Riportiamo ora i tempi di esecuzione per i test su matrici di ordine 10, 500 e 1000. Ordine 10: >> gschmidtmod (A, b ) Elapsed time i s 0 . 0 0 0 1 1 8 s e c o n d s . Ordine 500: >> gschmidtmod (A, b ) Elapsed time i s 5 . 2 3 7 2 5 7 s e c o n d s . Ordine 1000: >> gschmidtmod (A, b ) Elapsed time i s 4 5 . 5 3 8 5 6 4 s e c o n d s . Riportiamo inne le norme delle dierenze dei risultati ottenuti con il sottoprogramma gschmidtmod(A,b) e linsolve(A,b), nei casi con n = 10, 500, 1000: n = 10 ans = 2 . 0 1 6 8 e 11 n = 500 ans = 6 . 2 1 9 8 e 09 n = 1000 ans = 1 . 3 7 3 3 e 09 La discrepanza di risultati tra i due metodi ` e dunque minima.

Riferimenti bibliograci
Dispense e appunti dalle lezioni del docente V. Comincioli, Analisi numerica: metodi, modelli, applicazioni www.mathworks.it

Potrebbero piacerti anche