Sei sulla pagina 1di 8

Esempio di utilizzo del linguaggio C per il calcolo scientico

r.vincelli@campus.unimib.it

Introduzione
Parte dellesame ` consistita nella stesura di un programma per risolvere sistemi e lineari ed autosistemi su matrici date. E stata lasciata libert` di scelta riguardo a limplementazione ma ` stato posto il vincolo di non utilizzare un computer e algebra system (es. Wolfram Mathematica, MathWorks MATLAB...). La mia scelta ` ricaduta sul linguaggio C. Il motivo principale ` stato il desiderio di e e riprenderlo ed approfondirlo ma ` anche vero che ` il linguaggio di scelta per e e programmi realtime e performanti; inoltre il linguaggio C ` da tempo utilizzabile e per la stesura di codice parallelo attraverso dierenti avors (es. MPI) e si presta quindi naturalmente allimplementazione di molti algoritmi numerici in contesti di calcolo ad alte prestazioni (HPC). Mi sono attenuto in particolare allo standard (ANSI C) eccezion fatta ovviamente per ladozione di una libreria scientica specializzata, GNU GSL. GNU Scientic Library ` sicuramente la e libreria libera di riferimento. Qualit` sono, oltre al fatto di essere opensource e a mantenuta da esperti, il grande numero di algoritmi implementati, la presenza di strutture dati accessorie per la gestione di matrici, il che salva dal dovere gestire a mano la memoria, una documentazione chiara ed esaustiva. GNU GSL si basa su di una core library, CBLAS, che ` unimplementazione C dellinterfaccia e applicativa standard di fatto per le operazioni base su matrici, BLAS (Basic Linear Algebra Subprograms). La maggior parte degli algoritmi di algebra lineare implementati in GNU GSL sono presi direttamente da [1].

Sistemi lineari
Un sistema lineare ` un sistema di equazioni lineari di forma: e

$ ' a1,1 x1 a1,2 x2 a1,n xn ' ' a x a x a x & 2,1 1 2,2 2 2,n n . . ' . ' ' %
In forma matriciale si pu` scrivere: o

 b1  b2  bm
 

am,1 x1 am,2 x2 am,n xn a12 a22 . . . am2

a11  a21   .  . . am1 e, in modo pi` compatto: u


.. .

a1n x1 b1 a2n   x2   b2      .  .    .  .  .   .  . . . amn xn bm



Ax  b 1

Algoritmi
Se ` m  n la matrice A ` quadrata ed il sistema ha una ed una sola soluzione e e se e solo se A ` anche nonsingolare/invertibile. A lo ` se esiste una matrice A1 e e tale che AA1  Id. Se A ` quadrata ed invertibile allora esistono sempre tre e matrici P , di permutazione sulle righe, L triangolare inferiore (lower), U triangolare superiore (upper) tali che vale P A  LU . Se vogliamo scambiare le righe i e j della matrice A prendiamo Id e scambiamo in essa queste: chiamata questa nuova matrice P fare P A determina lo scambio di queste righe in A (duale per le colonne facendo AP ). Una matrice triangolare inferiore (superiore) ` una e matrice quadrata che ha tutti gli elementi al di sopra (al di sotto) della diagonale principale a zero. Questo procedimento si chiama LUP decomposizione oppure LU decomposizione con pivoting parziale. Ottenuta la tripla di matrici pP, U, Lq il sistema si pu` riscrivere: o LU x  P b e pu` essere risolto mediante questi due passi: o 1. risolvere Ly  P b 2. risolvere U x  y

Sono principalmente coinvolti quindi due algoritmi: 1. eliminazione gaussiana con pivoting parziale, per trovare pP, U, Lq 2. sostituzione avanti-indietro (forward and backward substitution) per risolvere i due sistemi, essendo che L ed U sono triangolari Lalgoritmo di eliminazione gaussiana con pivoting parziale opera sulla matrice aumentata B e consiste nei seguenti passi: 1. scambiare la prima riga con la riga che ha il primo elemento massimo in modulo della prima colonna, e salvare lo scambio (in caso che ce ne siano di pi` uguali, prendere la riga pi` alta); se tutte le righe hanno il primo u u elemento nullo, andare al punto 3 2. per ogni riga Bi , i 1 con primo elemento non nullo, moltiplicarla per un coeciente ki scelto in maniera tale che la dierenza tra Bi e la prima riga scalata per ki abbia il primo elemento nullo (il coeciente ` perci` e o ki  Bi1 {B11 ); sostituire Bi con la somma appena ricavata ma porre, nella prima posizione, ki invece che 0 3. adesso sulla prima colonna tutte le cifre, eccetto la prima, hanno ki ; a questo punto ritornare al punto 1 considerando la sottomatrice che s ottiene cancellando la prima riga e la prima colonna 4. terminata questa procedura, si scarta lultima colonna e si fa una seconda copia di questa nuova matrice AI ; in una poniamo la diagonale uguale ad sopra di essa 0 e teniamo invariata la parte inferiore, ottenendo 1, L; nellaltra mettiamo a 0 la parte inferiore e lasciamo invariato il resto, ottenendo U 2

5. P ` facilmente costruibile a partire dagli scambi salvati: per ogni coppia e si scambiano le rispettive righe in Id Esempio. Consideriamo il sistema:

$ & x1 2x2 x3

2 4x1 3x2 x3  3 %2x 2x 3x  5 1 2 3


La forma matriciale `: e

1 4 2 e la matrice aumentata:

2 3 2

x1 2 1  x2   3 3 x3 5

 

 

1 2 4 3 2 2

1
1 3

2 3 5

il pivot sarebbe 1 ma il massimo in modulo della prima colonna ` 4 quindi e abbiamo lo scambio p1, 2q ed otteniamo:

4 3 1 2 2 2 il primo coeciente ` k1 e

1 1 3

3 2 5

 1{4 e la matrice diventa:



4 k1 2 3 5{4 2 1 5{4 3 3 5{4 5

e con il secondo k2

 1{2 si ha:

4 k1 k2 3 5{4 1{2 5{4 1{2 1 5{4 5{2

3 5{4 7{2

il che porta a ridurre il problema alla sottomatrice

5{4 5{4 5{2 7{2

per la quale non sono necessari scambi ed il coeciente risulta k3 si ha   5{4 5{4 5{4 k3 3 3 e leliminazione termina; la matrice nale ` e

 2{5 con cui

4 k1 k2

3 5{4 k3

1 5{4 3

3 5{4 3

mentre la triangolare L ` e

1 1{4 1{2 accompagnata dalla triangolare U

0 0 1 0 2{5 1 1 5{4 3 0 0 1

4 3 0 5{4 0 0 ed inne P ` e

Come ci si aspetta vale P A  LU , infatti LU d` a

0 1 0

1 0 0

4 1 2

3 2 2

1 1 3

e calcolare P A signica scambiare la prima con la seconda riga di A. Lalgoritmo di sostituzione avanti-indietro ha nel nome quel che in pratica va fatto per risolvere i due sistemi. Nel risolvere quello su L lincognita y1 ` lunica e non nulla e le successive si ottengono operando una sola sostituzione e svolgendo i calcoli; per quello su U ` duale, ` lincognita xn ad essere isolata, e si sostituie e sce non in avanti ma allindietro. Proseguendo lesempio, il primo sistema da risolvere ` in avanti, Ly  P b e

ed ha soluzione y  p3, 5{4, 3q, mentre il secondo U x  y si concretizza in

1 1{4 1{2

0 1 2{5

y1 0 3 0 y2   2 1 5 y3

 

 

4 0 0

3 5{4 0

1 x1 3 5{4 x2   5{4 3 3 x3

 

che ha soluzione x  p1, 2, 1q, che ` la soluzione nale del sistema. e

Autosistemi
Data una matrice quadrata A risolvere lautosistema (eigensystem) signica trovarne autovettori ed autovalori. v $ 0 ` un autovettore con associato autovalore e per la matrice A se vale la seguente: Av  v La libreria usa due metodi diversi per il calcolo degli autovalori a seconda che si tratti di una matrice reale simmetrica o nonsimmetrica. Se A ` simmetrica la procedura ` incentrata sui seguenti due passi: e e

calcolo di T , la tridiagonalizzazione di A esecuzione dellalgoritmo QR simmetrico su T Se A invece ` nonsimmetrica: e calcolo di H, la forma di Hessenberg superiore di A esecuzione dellalgoritmo QR con passo di Francis Una matrice tridiagonale come suggerisce il nome ` nulla in tutte le posizioni e non appartenenti alla diagonale ed alle diagonali inferiore e superiore. Essa pu` essere ottenuta tramite la trasformazione di Householder. Una matrice si o Hessenberg ` una matrice tridiagonale superiore, nel senso che ` nulla solamene e te al di sotto della diagonale inferiore. Il passaggio a queste forme ha come obiettivo quello di minimizzare linformazione portata avanti, infatti salviamo solo le diagonali, ottenendo per` una matrice dagli stessi autovalori, poich soo e no simili. Due matrici M ed N sono simili se esiste una P invertibile tale che M  P 1 N P ; informalmente due matrici simili sono la stessa trasformazione e gli autovalori coincidono (in generale gli autovettori no). La QR decomposizione di una matrice A ` il calcolo di una coppia di matrici e pQ, Rq con Q ortogonale ed R triangolare superiore tali che A  QR. Una matrice ortogonale ` una dove i vettori colonna e riga sono un insieme di vete tori ortonormali, ossia a norma unitaria e perpendicolari tra loro (due vettori lo sono sse il loro prodotto scalare ` nullo). Poniamo A0  T ; literazione t e dellalgoritmo QR consiste nel porre At  Rt1 Qt1 dove pQt1 , Rt1 q ` la e QR decomposizione di At1 . Ad ogni iterazione la diagonale di At contiene unapprossimazione degli autovalori di A. Questo ` vero poich la successione e e tAt u converge alla forma di Schur di A; essa ` la matrice triangolare superiore e U nellomonima decomposizione assieme alla matrice unitaria S per cui vale A  SU S 1 . Una matrice unitaria ` una che se moltiplicata a destra per la e propria trasposta coniugata d` Id; la trasposta coniugata si ottiene prendendo a come valori i coniugati complessi della trasposta, cio` negando le parti immagie narie ma non reali dei valori. Ora U ` simile ad A e la relazione ` simmetrica e e quindi vale anche U  SAS 1 ; possiamo allora aermare che A ed U hanno gli stessi autovalori e siccome U ` triangolare essi si trovano sulla sua diagonale. e Le implementazioni della libreria non incarnano la versione naive dellalgoritmo QR presentata, ed anzitutto hanno una chiara condizione di terminazione che garantisce stabilit` (vedi dopo) rispetto ad una tolleranza data. Una dierenza a tra la versione simmetrica e nonsimmetrica ` la complessit` computazionale, e a pi` chiaramente determinabile ed inferiore per la prima. Per i dettagli delle u procedure il riferimento sono i capp. 7 ed 8 di [1]. Esempio. I seguenti comandi MATLAB permettono di provare la bont` della a procedura ingenua, in modo diretto e comodo. A=[1 2 -1; 4 3 1; 2 2 3]); creazione matrice (` nonsimmetrica) e H=hess(A) trasformazione di Hessenberg [Q R]=qr(H); H=RQ; iterazione; basta eseguirla pi` volte per proceu dere con lalgoritmo Gi` dopo una ventina di iterazioni si ha la soluzione esatta. a 5

Considerazioni numeriche
Stabilit` a
Consideriamo lalgoritmo una funzione f : X Y che associa ad ogni istanza di un problema x X la sua soluzione y Y ; questa denizione ` di uso comune e in informatica teorica. In analisi numerica identichiamo due tipi di algoritmi, diretti ed iterativi. I primi calcolano f pxq in un numero nito di passi, mentre per i secondi non ci si pu` aspettare la terminazione in un numero nito di o passi, convergono con una certa velocit` alla soluzione esatta, che raggiungono a al limite. Gli algoritmi iterativi sono i pi` diusi. Leliminazione gaussiana ` un u e algoritmo diretto mentre la procedura QR ` iterativa. Per gli algoritmi iterativi e la terminazione si ha raggiunta una certa precisione ossia la garanzia che la soluzione calcolata non si discosta per pi` di un parametro dato dallesatta. La u soluzione calcolata dai metodi diretti ` precisa in un contesto di calcolo ideale, e ma non ` cos` per via di come sono memorizzati i numeri al calcolatore. Daltro e canto per la stessa ragione la convergenza degli algoritmi iterativi pu` arrestarsi o ad un valore che pu` anche essere quello esatto: la dierenza ` inferiore a quanto o e pu` essere precisa la macchina e quindi risultano uguali. o Laritmetica a virgola mobile ` adottata nella stragrande maggioranza dei cale colatori usati per applicazioni scientiche, e per sua stessa natura ` fonte di e imprecisioni negli algoritmi. Le principali cause di queste imprecisioni sono lerrore inerente/di arrotondamento, i numeri periodici ed irrazionali sono forzati ad una rappresentazione nita nel calcolatore, e lerrore di troncamento, una somma innita ` arrestata. Queste imprecisioni sono a loro volta identicabili come e errori commessi dallalgoritmo, determinati appunto da scenari necessari perch e inerenti allinsieme numerico a virgola mobile. In algebra lineare numerica di interesse sono gli errori: in avanti: la dierenza tra il risultato dellalgoritmo e la soluzione vera; chiamando y il primo `  y y (forward stability) e indietro: la minima quantit` da aggiungere allinput perch la soluzione a e calcolata eseguendo lalgoritmo su di esso coincida con la soluzione vera dellalgoritmo eseguito sullinput sommato alla suddetta quantit`; ` il a e minimo x tale che f px xq  y (backward stability)

Essendo x  x x lerrore allindietro ci dice quale istanza del problema x ha soluzione vera y . Queste quantit` sono riferite ad errori assoluti ma, specie a se lesecuzione tipica lavora su numeri molto grandi, si declinano sullerrore relativo; la prima diventa |y y |{|y | e nella seconda sostituiamo a x |x|{|x|. Un algoritmo ` stabile rispetto ad uno od allaltro errore se le rispettive quantit` e a sono piccole. Una richiesta tipica ` che coincida o almeno sia dello stesso ordinee esponente della precisione dellaritmetica a virgola mobile sottostante. Questa quantit` ` comunemente chiamata epsilon della macchina; in ANSI C sono poste ae a 105 e 109 almeno per il tipo float e per il tipo double rispettivamente e sono precalcolate ed accessibili dallintestazione float.h. Nella pratica un algoritmo si dice stabile se ` stabile in unaccezione a met` strada tra le due, se e a esiste un x piccolo tale che f px xq y sia piccolo pure ((mixed) stability), intuitivamente se risolve con suciente precisione da unistanza sucientemente vicina alla desiderata. Questa stabilit` ` implicata dalla stabilit` allindietro. ae a

Stabilit` degli algoritmi adoperati a


Leliminazione gaussiana con pivoting parziale non ` in generale stabile alline dietro. Se per` A ` una matrice simmetrica e denita positiva (le matrici easy, o e bad e verybad nel test) lo `. Daltro canto nelle applicazioni non si incone trano matrici problematiche; in [2] ` presentato un esperimento con il quale si e argomenta che, generato casualmente un miliardo di matrici, la probabilit` che a anche solo una determini unistanza desecuzione instabile ` inferiore a .01. e Per quanto riguarda la procedura di calcolo degli autovalori di una matrice simmetrica, per la tridiagonalizzazione esistono algoritmi stabili (vedi per es. [3]) e lalgoritmo QR ` argomentato essere stabile in [4] poich si basa sulla QR e e decomposizione che ` una trasformazione di similarit` ortogonale. Pi` in dete a u taglio la backward stability di entrambe le varianti dellalgoritmo QR risiede nel fatto che ` per x  A ` calcolata la soluzione esatta dellistanza x  A E e e con ||E ||2  u||A||2 dove u ` lepsilon della macchina e || ||2 ` la p-norma e e euclidea per matrici. Essendo la matrice A quadrata ` chiamata norma spete trale e coincide con lautovalore massimo di A A con A coniugata trasposta di A (gli autovalori di A A sono detti valori singolari di A). Questo valore ` e comunemente molto piccolo e giustica quindi laermazione di stabilit`. a

Bibliograa
[1] Gene H. Golub and Charles F. Van Loan. Matrix Computations. The Johns Hopkins University Press, 3rd edition, 1996. [2] Lloyd N. Trefethen and David Bau. Numerical Linear Algebra. SIAM: Society for Industrial and Applied Mathematics, 1997. [3] Symmetric Matrices Chengshu, Chengshu Guo, and Sanzheng Qiao. A stable lanczos tridiagonalization of complex. In Advanced Signal Processing Algorithms, Architectures, and Implementations XV, Proc. of SPIE, page 591010, 2005. [4] Alston S. Householder and Friedrich L. Bauer. On certain methods for expanding the characteristic polynomial. j-NUM-MATH, 1:2937, 1959.