26.12.2014 Views

metode de calcul numeric matriceal. algoritmi fundamentali

metode de calcul numeric matriceal. algoritmi fundamentali

metode de calcul numeric matriceal. algoritmi fundamentali

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

METODE DE CALCUL<br />

NUMERIC MATRICEAL.<br />

ALGORITMI<br />

FUNDAMENTALI<br />

Bogdan Dumitrescu Corneliu Popeea Boris Jora<br />

Partea I


Tuturor stu<strong>de</strong>nţilor, foşti, actuali sau viitori,<br />

precum şi copiilor noştri<br />

Andrei Octavia Monica<br />

Sebastian Corneliu Şerban


i<br />

Cuvânt introductiv<br />

Lucrarea <strong>de</strong> faţă, prima <strong>de</strong> o asemenea amploare în limba română, este construită<br />

pe structura cursului <strong>de</strong> Calcul <strong>numeric</strong>, predat <strong>de</strong> autori la Facultatea<br />

<strong>de</strong> Automatică şi Calculatoare a Universităţii Politehnica din Bucureşti. Lucrarea<br />

expune, în manieră eminamente <strong>algoritmi</strong>că, <strong>meto<strong>de</strong></strong>le <strong>de</strong> rezolvare a problemelor<br />

fundamentale <strong>de</strong> <strong>calcul</strong> din algebra <strong>matriceal</strong>ă, care constituie primele şi, <strong>de</strong> cele<br />

mai multe ori, principalele componente ale celor mai diverse aplicaţii din inginerie,<br />

economie şi numeroase alte ramuri ale ştiinţei.<br />

În afara stu<strong>de</strong>nţilor din facultăţile cu profil tehnic sau economic, lucrarea poate<br />

fi utilă tuturor celor care, fie ei stu<strong>de</strong>nţi, cadre didactice, ingineri sau cercetători,<br />

doresc să utilizeze cele mai mo<strong>de</strong>rne instrumente <strong>de</strong> <strong>calcul</strong> <strong>numeric</strong> <strong>matriceal</strong>. Pentru<br />

înţelegerea noţiunilor prezentate, cititorul trebuie să pose<strong>de</strong> cunoştinţe minime<br />

<strong>de</strong> matematică, la nivelul celor dobândite în liceu sau în primul an <strong>de</strong> facultate.<br />

Pentru orientare, fiecare capitol începe cu o trecere în revistă a bazelor matematice<br />

ale problemelor <strong>de</strong> <strong>calcul</strong> studiate. De asemenea, cititorul ar trebui să fie capabil a<br />

se exprima într-un limbaj <strong>de</strong> programare <strong>de</strong> nivel înalt; această condiţie nu e strict<br />

necesară, dar constituie un avantaj, pentru că îi permite să se concentreze asupra<br />

i<strong>de</strong>ilor şi nu a <strong>de</strong>taliilor <strong>de</strong> implementare ale acestora.<br />

Cartea conţine 7 capitole, <strong>de</strong>scrise în câteva cuvinte mai jos. La început se<br />

află o bibliografie <strong>de</strong> bază, cuprinzând lucrări <strong>de</strong> largă utilizare, referite cu cifre<br />

romane, care oferă o privire <strong>de</strong> perspectivă asupra întregului domeniu. În final<br />

se găseşte o a doua bibliografie, în general formată din articole (referite cu cifre<br />

arabe) privind aspecte specifice ale problemelor tratate şi <strong>de</strong>stinată cititorului care<br />

doreşte să adâncească studiul dincolo <strong>de</strong> textul <strong>de</strong> faţă. Pentru facilitarea lecturii,<br />

recomandăm consultarea listelor <strong>de</strong> notaţii şi <strong>de</strong> prescurtări uzuale, aflate câteva<br />

pagini mai <strong>de</strong>parte.<br />

Capitolul 0, numerotat astfel pentru a sublinia caracterul său <strong>de</strong> iniţiere în domeniu,<br />

prezintă specificul <strong>calcul</strong>ului <strong>numeric</strong> şi justifică necesitatea existenţei cărţii <strong>de</strong><br />

faţă. Este vorba aici <strong>de</strong>spre: reprezentarea numerelor reale în virgulă mobilă, proprietăţile<br />

(uneori neaşteptate ale) operaţiilor cu astfel <strong>de</strong> numere precum şi mecanismele<br />

<strong>de</strong> apariţie inevitabilă a erorilor <strong>numeric</strong>e. Este apoi consi<strong>de</strong>rată perechea<br />

formată din problema <strong>de</strong> <strong>calcul</strong> şi algoritmul <strong>de</strong> rezolvare, relativ la care sunt <strong>de</strong>fi-


ii<br />

nite noţiunile fundamentale <strong>de</strong> condiţionare şi, respectiv, stabilitate <strong>numeric</strong>ă. În<br />

încheiere, este aruncată o privire asupra modului în care arhitectura <strong>calcul</strong>atorului<br />

influenţează concepţia <strong>algoritmi</strong>lor.<br />

Capitolul 1 este <strong>de</strong>dicat expunerii noţiunilor primare ale algebrei <strong>matriceal</strong>e<br />

(vectori, subspaţii, matrice <strong>de</strong> diverse tipuri şi proprietăţile acestora), constituind<br />

totodată o introducere în problematica specifică a capitolelor următoare. Algoritmii<br />

prezentaţi rezolvă unele probleme simple, dar fundamentale, cum ar fi înmulţirea a<br />

două matrice, sau unele cazuri particulare, <strong>de</strong> exemplu cel al matricelor triunghiulare,<br />

ale unor probleme mai dificile (rezolvarea sistemelor liniare, <strong>calcul</strong>ul valorilor<br />

şi vectorilor proprii). Aceşti <strong>algoritmi</strong> sunt larg utilizaţi în continuare, ca elemente<br />

constructive primare.<br />

Capitolul 2 tratează <strong>meto<strong>de</strong></strong>le directe <strong>de</strong> rezolvare a sistemelor liniare Ax = b,<br />

cu matrice A nesingulară, prezentând procedura <strong>de</strong> eliminare gaussiană, inclusiv<br />

strategiile <strong>de</strong> pivotare a<strong>de</strong>cvate, precum şi versiunile compacte ale acestei <strong>meto<strong>de</strong></strong><br />

bazate pe factorizarea LU a matricei A. În afara matricelor <strong>de</strong> formă generală,<br />

sunt studiate şi cazurile, <strong>de</strong>s întâlnite în practică, ale matricelor bandă, simetrice şi<br />

simetric pozitiv <strong>de</strong>finite. De asemenea, sunt abordate probleme conexe, cum ar fi<br />

<strong>calcul</strong>ul inversei şi al <strong>de</strong>terminantului.<br />

Capitolul 3 <strong>de</strong>scrie <strong>meto<strong>de</strong></strong>le <strong>de</strong> rezolvare în sensul celor mai mici pătrate (CMMP)<br />

a sistemelor liniare Ax = b, în care numărul ecuaţiilor diferă <strong>de</strong> cel al necunoscutelor,<br />

<strong>de</strong>ci A este o matrice dreptunghiulară <strong>de</strong> formă generală. În acest caz se utilizează<br />

<strong>meto<strong>de</strong></strong> <strong>de</strong> ”eliminare” specifice, bazate pe aplicarea transformărilor ortogonale (reflectori<br />

Househol<strong>de</strong>r, rotaţii Givens etc.) iar conceptul central este cel <strong>de</strong> factorizare<br />

QR. Dacă matricea A nu este <strong>de</strong> rang maxim, se recomandă utilizarea factorizării<br />

ortogonale complete, care are la bază un algoritm <strong>de</strong> triangularizare cu pivotarea<br />

coloanelor. Sistemele liniare <strong>de</strong> acest tip apar frecvent în prelucrarea datelor experimentale,<br />

statistică, i<strong>de</strong>ntificarea sistemelor etc.<br />

Capitolul 4 expune principalele <strong>meto<strong>de</strong></strong> <strong>de</strong> <strong>calcul</strong> al valorilor şi vectorilor proprii<br />

ai unei matrice A. Este prezentat în <strong>de</strong>taliu algoritmul QR, care aduce matricea A la<br />

forma Schur, reală sau complexă, pornind <strong>de</strong> la forma <strong>de</strong> principiu a algoritmului, ale<br />

cărei proprietăţi matematice sunt uşor <strong>de</strong> analizat, şi ajungând la variantele relativ<br />

sofisticate sub care acesta este implementat în programele profesionale. Alături <strong>de</strong><br />

cazul general este tratat şi cel al matricelor simetrice. Nu sunt uitaţi alţi <strong>algoritmi</strong><br />

importanţi, utili în cazuri particulare, cum ar fi <strong>meto<strong>de</strong></strong>le puterii, puterii inverse,<br />

bisecţiei sau Jacobi. Cunoaşterea valorilor proprii este utilă în analiza stabilităţii<br />

sistemelor dinamice, în studiul vibraţiilor (pentru clădiri, poduri, avioane) şi în<br />

multe alte probleme aplicative majore.<br />

Capitolul 5 prezintă <strong>meto<strong>de</strong></strong>le <strong>de</strong> <strong>calcul</strong> al <strong>de</strong>scompunerii valorilor singulare<br />

(DVS), care constituie instrumentul cel mai sigur <strong>de</strong> rezolvare a numeroase probleme<br />

din algebra <strong>matriceal</strong>ă, cum ar fi <strong>de</strong>terminarea rangului, <strong>calcul</strong>ul unor norme<br />

<strong>matriceal</strong>e, construcţia bazelor pentru diverse subspaţii, rezolvarea în sensul celor<br />

mai mici pătrate a sistemelor cu matrice <strong>de</strong> rang nemaxim. Algoritmul DVS este<br />

o adaptare ingenioasă a algoritmului QR simetric, cunoscut din capitolul anterior.<br />

Utilizarea DVS este ilustrată consi<strong>de</strong>rând unele variante ale problemei CMMP, <strong>de</strong><br />

exemplu CMMP totală sau cu restricţii, frecvent întâlnite în aplicaţii.


Capitolul 6 consi<strong>de</strong>ră <strong>calcul</strong>ul valorilor şi vectorilor proprii generalizaţi ai unei<br />

perechi <strong>de</strong> matrice (A, B). Este prezentat algoritmul QZ, care aduce perechea la<br />

forma Schur generalizată, precum şi problema conexă a <strong>calcul</strong>ului bazelor ortogonale<br />

pentru subspaţii <strong>de</strong> <strong>de</strong>flaţie. Noţiunile şi <strong>algoritmi</strong>i studiaţi aici sunt <strong>de</strong> mare<br />

utilitate în probleme care apar, <strong>de</strong> exemplu, în teoria sistemelor precum şi în analiza<br />

circuitelor electrice sau mecanice cu elemente i<strong>de</strong>ale.<br />

Principalele rezultate ale expunerii sunt concretizate sub formă <strong>de</strong> <strong>algoritmi</strong><br />

<strong>de</strong> <strong>calcul</strong> <strong>de</strong>scrişi într-un pseudocod extrem <strong>de</strong> apropiat <strong>de</strong> implementarea directă<br />

într-un limbaj <strong>de</strong> programare <strong>de</strong> nivel înalt. Algoritmii au fost testaţi <strong>de</strong> autori<br />

în mediul <strong>de</strong> programare MATLAB; cu toate acestea, orice observaţii şi propuneri<br />

din partea cititorilor, care să conducă la eliminarea unor erori sau la îmbunătăţirea<br />

performanţelor, sunt binevenite şi pot fi transmise la adresa menţionată mai jos.<br />

Pentru majoritatea <strong>algoritmi</strong>lor sunt precizate proprietăţile <strong>de</strong> stabilitate <strong>numeric</strong>ă,<br />

<strong>de</strong> obicei într-o secţiune specială <strong>de</strong>dicată acestei teme, în fiecare capitol. Menţionăm<br />

că o altă secţiune expune întot<strong>de</strong>una informaţii <strong>de</strong>spre condiţionarea problemelor <strong>de</strong><br />

<strong>calcul</strong> studiate; în acest fel, cititorul va avea o imagine clară a acurateţii cu care se<br />

pot obţine soluţiile <strong>numeric</strong>e ale diverselor probleme studiate. De asemenea, fiecare<br />

capitol conţine în final o secţiune ce prezintă rutine (funcţii) din biblioteca LA-<br />

PACK (Linear Algebra PACKage) şi din limbajul MATLAB (MATrix LABoratory),<br />

reprezentative pentru problemele <strong>de</strong> <strong>calcul</strong> studiate. LAPACK [XV] implementează<br />

cei mai eficienţi şi siguri <strong>algoritmi</strong> <strong>de</strong> <strong>calcul</strong> <strong>numeric</strong> <strong>matriceal</strong> şi este instrumentul<br />

cel mai utilizat în acest domeniu. MATLAB [XIV] are o componentă didactică<br />

mai pronunţată, îmbinând o interfaţă utilizator simplă cu o calitate remarcabilă a<br />

<strong>algoritmi</strong>lor.<br />

De asemenea, fiecare capitol este însoţit <strong>de</strong> un set <strong>de</strong> probleme, în total peste<br />

200, ale căror rezolvări complete sau parţiale se găsesc în partea finală a lucrării.<br />

Recomandăm cititorului să consulte indicaţiile sau rezolvarea propusă <strong>de</strong> autori<br />

numai pentru verificarea soluţiei personale sau după tentative serioase <strong>de</strong> găsire a<br />

acesteia. În plus, un mare câştig pentru cititor îl poate reprezenta implementarea<br />

<strong>algoritmi</strong>lor (cei <strong>de</strong> bază, din lucrare, şi cei <strong>de</strong>rivaţi, în probleme) precum şi testarea<br />

funcţionării lor pe exemple <strong>numeric</strong>e reprezentative.<br />

Aducem la cunoştinţa cititorilor că Grupul <strong>de</strong> Calcul Numeric din cadrul catedrei<br />

<strong>de</strong> Automatică şi Ingineria Sistemelor <strong>de</strong> la Facultatea <strong>de</strong> Automatică şi Calculatoare,<br />

din care autorii fac parte, dispune <strong>de</strong> o bibliotecă <strong>de</strong> <strong>calcul</strong> <strong>numeric</strong> <strong>matriceal</strong><br />

scrisă în limbajul C, care conţine implementarea tuturor <strong>algoritmi</strong>lor din lucrare.<br />

Cei interesaţi pot contacta autorii la următoarele adrese <strong>de</strong> e-mail<br />

bogdan,popeea,jora@lucky.schur.pub.ro<br />

Autorii mulţumesc colegilor lor prof. Paul Flondor şi conf.dr.ing. Ioan Tăbuş<br />

pentru interesul acordat şi în special pentru comentariile şi observaţiile constructive<br />

făcute pe marginea lucrării. De asemenea, autorii aduc mulţumiri doamnei redactor<br />

Viorica Fătu, <strong>de</strong> la Editura ALL Educational, pentru atenţia acordată acestei cărţi<br />

în drumul către tipar.<br />

iii<br />

Autorii


iv<br />

Bibliografie generală<br />

• Pentru chestiuni teoretice <strong>de</strong> <strong>calcul</strong> <strong>matriceal</strong>:<br />

[ I ] Gantmaher F.R. Teoriia matriţ (ediţia a 2-a), Ed. Nauka, Moscova,<br />

1966. (The Theory of Matrices, vols. 1-2, Chelsea, New York, 1959).<br />

[ II ] Horn R.A., Johnson C.R. Matrix Analysis, Cambridge University<br />

Press, Cambridge UK, 1985.<br />

[ III ] Strang G. Introduction to Linear Algebra, Wellesley-Cambridge<br />

Press, Wellesley, MA, USA, 1993.<br />

• Pentru <strong>algoritmi</strong> <strong>de</strong> <strong>calcul</strong> <strong>matriceal</strong>:<br />

[ IV] Wilkinson J.H. The Algebraic Eigenvalue Problem, Clarendon Press,<br />

Oxford, 1965.<br />

[ V] Stewart G. W. Introduction to Matrix Computations, Aca<strong>de</strong>mic<br />

Press, New York and London, 1973.<br />

[ VI ] Golub G. H., Van Loan Ch. F. Matrix Computations, Second edition,<br />

The John Hopkins University Press, Baltimore, Maryland, 1989.<br />

[ VII ] Lawson C.L., Hanson R.J. Solving Least Squares Problems, SIAM,<br />

Phila<strong>de</strong>lphia, PA, USA, 1995.<br />

• Pentru studiul condiţionării problemelor <strong>de</strong> <strong>calcul</strong> <strong>matriceal</strong> şi al stabilităţii<br />

<strong>numeric</strong>e a <strong>algoritmi</strong>lor aferenţi:<br />

[ VIII ] Stewart G.W., Sun J. Matrix Perturbation Theory, Aca<strong>de</strong>mic<br />

Press, London, 1990.<br />

[ IX] Higham N.J. Accuracy and Stability of Numerical Algorithms,<br />

SIAM, Phila<strong>de</strong>lphia PA, 1996.<br />

• Pentru programe <strong>de</strong> <strong>calcul</strong> şi indicaţii <strong>de</strong> utilizare:<br />

[ X] Wilkinson J.H., Reinsch C. Handbook for Automatic Computation.<br />

Linear Algebra, Springer-Verlag Berlin, 1971.<br />

[ XI ] Smith B.T., Boyle J.M., Ikebe Y., Klema V.C., Moler C.B. Matrix<br />

Eigensystem Routines: EISPACK Gui<strong>de</strong>, 2-nd ed., Springer–Verlag,<br />

New York, 1974.<br />

[ XII ] Garbow B.S., Boyle J.M., Dongarra J.J., Moler C.B. Matrix<br />

Eigensystem Routines: EISPACK Gui<strong>de</strong> Extension, Springer–Verlag,<br />

New York, 1977.<br />

[ XIII ] Dongarra J.J., Bunch J.R., Moler C.B., Stewart G.W. LINPACK<br />

User’s Gui<strong>de</strong>, SIAM Publications, Phila<strong>de</strong>lphia, PA, 1978.<br />

[ XIV] MATLAB User’s Gui<strong>de</strong>, The MathWorks Inc., Natick, MA, USA, 1992.


v<br />

[ XV] An<strong>de</strong>rson E., Bai Z., Bischof C., Demmel J., Dongarra J.,<br />

Du Croz J., Greenbaum A., Hammarling S., McKenney A.,<br />

Ostrouchov S., Sorensen D. LAPACK Users’ Gui<strong>de</strong>, Second Edition,<br />

SIAM, Phila<strong>de</strong>lphia PA, 1995. (http://www.netlib.org/lapack/lug)<br />

• Lucrări în limba română:<br />

[ XVI ] Brânzănescu V., Stănăşilă O. Matematici speciale – teorie,<br />

exemple, aplicaţii, Ed. ALL, Bucureşti, 1994.<br />

[ XVII ] Bucur C.M., Popeea C.A., Simion Gh.Gh. Matematici speciale.<br />

Calcul <strong>numeric</strong>, E.D.P., Bucureşti, 1983.<br />

[ XVIII ] Ionescu V., Varga A. Teoria sistemelor. Sinteza robustă.<br />

Meto<strong>de</strong> <strong>numeric</strong>e <strong>de</strong> <strong>calcul</strong>., Ed. ALL, Bucureşti, 1994.<br />

[ XIX] Iorga V., Jora B., Nicolescu C., Lopătan I., Fătu I., Programare<br />

<strong>numeric</strong>ă, Ed. Teora, Bucureşti, 1996.<br />

Lista <strong>de</strong> notaţii<br />

N – mulţimea numerelor naturale<br />

Z – mulţimea numerelor întregi<br />

R – mulţimea numerelor reale<br />

C – mulţimea numerelor complexe<br />

• Vectori<br />

n i : p : n f – vectorul cu elementele întregi n i , n i + p, n i + 2p, . . . , n f ; dacă p = 1,<br />

vectorul se scrie simplu n i : n f<br />

R n – spaţiul liniar n-dimensional al vectorilor (coloană) x cu n componente reale<br />

x i ∈ R, i = 1 : n<br />

C n – spaţiul liniar n-dimensional al vectorilor (coloană) x cu n componente complexe<br />

x i ∈ C, i = 1 : n<br />

e k , k = 1 : n – baza standard a spaţiului liniar R n , respectiv C n<br />

x i , x(i) – elementul vectorului x aflat în poziţia i<br />

x(i 1 : i 2 ) – vectorul format din elementele din poziţiile <strong>de</strong> la i 1 la i 2 ale vectorului x<br />

(x, y) = y T x = ∑ n<br />

i=1 x iy i – produsul scalar standard a doi vectori x, y ∈ R n ; în<br />

cazul complex produsul scalar este (x, y) = y H x = ∑ n<br />

i=1 x iȳ i<br />

‖x‖ = (x, x) 1/2 = ( ∑ n<br />

i=1 |x i| 2 ) 1/2 – norma euclidiană a vectorului x ∈ R n


vi<br />

‖x‖ p<br />

= ( ∑ n<br />

i=1 |x i| p ) 1/p – p-normele vectorului n-dimensional x, p ≥ 1; în <strong>calcul</strong>e se<br />

utilizează în special ‖x‖ 1<br />

,‖x‖ 2<br />

=‖x‖ şi ‖x‖ ∞<br />

=max i=1:n |x i |<br />

• Matrice<br />

R m×n – spaţiul liniar al matricelor cu m linii şi n coloane cu elemente reale a ij ∈ R,<br />

i = 1 : m, j = 1 : n<br />

C m×n<br />

– spaţiul liniar al matricelor cu m linii şi n coloane cu elemente complexe<br />

a ij ∈ C, i = 1 : m, j = 1 : n 1<br />

I n – matricea unitate <strong>de</strong> ordinul n<br />

a ij , A(i, j) – elementul matricei A situat în linia i, coloana j<br />

A(i 1 : i 2 , j 1 : j 2 ) – blocul matricei A format din liniile <strong>de</strong> la i 1 la i 2 şi coloanele <strong>de</strong><br />

la j 1 la j 2 . Indicele ”:”, fără altă precizare, semnifică luarea tuturor liniilor<br />

sau coloanele<br />

A T – transpusa matricei (reale sau complexe) A<br />

A H – conjugata hermitică a matricei (complexe) A, i.e. A H = ĀT , un<strong>de</strong> Ā este<br />

conjugata complexă a lui A<br />

A −1 – inversa matricei pătrate nesingulare A, i.e. AA −1 = A −1 A = I n<br />

A −T = (A −1 ) T = (A T ) −1<br />

A −H = (A −1 ) H = (A H ) −1<br />

trA – urma matricei pătrate A, i.e. suma elementelor diagonale<br />

<strong>de</strong>tA – <strong>de</strong>terminantul matricei pătrate A<br />

λ i (A), i = 1 : n – valorile proprii ale matricei pătrate A <strong>de</strong> ordin n<br />

λ(A) – spectrul (<strong>de</strong> valori proprii) {λ 1 (A), λ 2 (A), . . . , λ n (A)} al matricei A<br />

ρ(A) = max i=1:n |λ i (A)| – raza spectrală a matricei A<br />

cond(A) = ‖A‖ ‖A −1 ‖ – numărul <strong>de</strong> condiţie la inversare al matricei A (‖ · ‖ este o<br />

normă <strong>matriceal</strong>ă consistentă)<br />

A + – pseudoinversa normală (Moore-Penrose) a matricei A; dacă A este monică<br />

A + =(A T A) −1 A T , dacă A este epică, atunci A + =A T (AA T ) −1<br />

σ i (A), i = 1 : p, p = min(m, n) – valorile singulare ale matricei A ordonate astfel<br />

încât σ 1 ≥ σ 2 ≥ . . . ≥ σ p<br />

1 În <strong>calcul</strong>e, vectorii se i<strong>de</strong>ntifică cu matricele cu o singură coloană, iar scalarii se i<strong>de</strong>ntifică cu<br />

matricele (sau vectorii) cu un singur element.


vii<br />

σ(A) – mulţimea {σ 1 (A), σ 2 (A), . . . , σ p (A)} a valorilor singulare ale matricei A<br />

r = rangA – rangul matricei A, i.e. numărul valorilor singulare nenule<br />

(A, B) = tr(B T A) (tr(B H A)) – produsul scalar a două matrice reale (complexe)<br />

‖A‖ F<br />

= (A, A) 1/2 – norma Frobenius a matricei A,<br />

‖A‖ 2 F = ∑ m ∑ n<br />

i=1 j=1 |a ij| 2 sau ‖A‖ 2 F = ∑ r<br />

i=1 σ i 2<br />

|A| p<br />

= ( ∑ r<br />

i=1 σ i p ) 1/p – p-normele Schatten, p ≥ 1; în <strong>calcul</strong>e se utilizează în special<br />

norma-urmă |A| 1<br />

= ∑ r<br />

i=1 σ i, norma Frobenius |A| 2<br />

= ‖A‖ F şi norma<br />

spectrală |A| ∞<br />

= σ 1 (A)<br />

‖A‖ p<br />

= max ‖x‖p =1‖Ax‖ p<br />

– p-normele induse; în <strong>calcul</strong>e se utilizează în special<br />

norma ‖A‖ 1<br />

= max j=1:n<br />

∑ m<br />

i=1 |a ij|, norma spectrală ‖A‖ 2<br />

= σ 1 (A) şi norma<br />

‖A‖ ∞<br />

= max i=1:m<br />

∑ n<br />

j=1 |a ij|<br />

• Transformări<br />

SAT – transformare <strong>de</strong> echivalenţă (bilaterală) a matricei A ∈ R m×n (S şi T sunt<br />

matrice pătrate nesingulare; transformarea <strong>de</strong> echivalenţă conservă rangul, iar<br />

dacă S, T sunt ortogonale, atunci conservă şi valorile singulare)<br />

T −1 AT – transformare <strong>de</strong> asemănare a matricei A ∈ R n×n (transformarea <strong>de</strong><br />

asemănare conservă valorile proprii)<br />

T T AT – transformare <strong>de</strong> congruenţă a matricei A ∈ R n×n (T este nesingulară; aplicată<br />

unei matrice A simetrice, transformarea <strong>de</strong> congruenţă conservă rangul<br />

şi inerţia i.e. numerele <strong>de</strong> valori proprii negative, nule şi, respectiv, pozitive)<br />

Dacă T este ortogonală, atunci T −1 = T T şi transformarea T T AT se numeşte<br />

transformare <strong>de</strong> asemănare ortogonală<br />

• Prescurtări<br />

i.e. – (id est) adică<br />

e.g. – (exempli gratia) <strong>de</strong> exemplu, bunăoară<br />

DVS – <strong>de</strong>scompunerea valorilor singulare<br />

FSR(G) – forma Schur reală (generalizată)<br />

FSC(G) – forma Schur complexă (generalizată)<br />

FSH – forma (bloc-)superior Hessenberg<br />

FVM – format virgulă mobilă<br />

ITE – matrice inferior triunghiulară elementară


viii<br />

LU – factorizarea LU<br />

PE – matrice <strong>de</strong> permutare elementară<br />

QR – factorizarea QR<br />

• Alfabetul grec<br />

Majuscule Minuscule Denumire Corespon<strong>de</strong>ntul<br />

latin<br />

A α alfa A, a<br />

B β beta B, b<br />

Γ γ gamma G, g<br />

∆ δ <strong>de</strong>lta D, d<br />

E ǫ epsilon E, e<br />

Z ζ zeta Z, z<br />

H η eta E, e<br />

Θ θ theta -<br />

I ι iota I, i<br />

K κ kappa K, k<br />

Λ λ lambda L, l<br />

M µ mü M, m<br />

N ν nü N, n<br />

Ξ ξ xi X, x<br />

O o omicron O, o<br />

Π π pi P, p<br />

P ρ rho R, r<br />

Σ σ sigma S, s<br />

T τ tau T, t<br />

Υ υ upsilon U, u<br />

Φ φ phi F, f<br />

X χ hi H, h<br />

Ψ ψ psi -<br />

Ω ω omega O, o


Cuprins<br />

0 Concepte fundamentale 1<br />

0.1 Reprezentarea în virgulă mobilă . . . . . . . . . . . . . . . . . . . . . 2<br />

0.2 Aritmetica în virgulă mobilă . . . . . . . . . . . . . . . . . . . . . . . 7<br />

0.3 Condiţionarea problemelor <strong>de</strong> <strong>calcul</strong> . . . . . . . . . . . . . . . . . . 10<br />

0.4 Stabilitatea <strong>numeric</strong>ă a <strong>algoritmi</strong>lor . . . . . . . . . . . . . . . . . . 12<br />

0.5 Calităţile unui algoritm <strong>numeric</strong> . . . . . . . . . . . . . . . . . . . . 15<br />

0.6 Implicaţiile arhitecturii <strong>calcul</strong>atoarelor . . . . . . . . . . . . . . . . . 16<br />

0.7 Probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />

1 Algoritmi elementari 19<br />

1.1 Vectori. Spaţiul vectorial R n . . . . . . . . . . . . . . . . . . . . . . 19<br />

1.2 Produs scalar. Norme. Ortogonalitate . . . . . . . . . . . . . . . . . 24<br />

1.3 Matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />

1.4 Înmulţirea matricelor . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />

1.5 Norme <strong>matriceal</strong>e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />

1.6 Matrice structurate . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

1.7 Matrice bloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />

1.8 Matrice normale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46<br />

1.9 Sisteme <strong>de</strong> ecuaţii liniare . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />

1.10 Valori şi vectori proprii . . . . . . . . . . . . . . . . . . . . . . . . . . 59<br />

1.11 Rutinele BLAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />

1.12 Probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67<br />

2 Rezolvarea sistemelor <strong>de</strong> ecuaţii liniare 69<br />

2.1 Transformări elementare . . . . . . . . . . . . . . . . . . . . . . . . . 70<br />

2.2 Triangularizare prin eliminare gaussiană . . . . . . . . . . . . . . . . 72<br />

2.3 Strategii <strong>de</strong> pivotare . . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />

2.3.1 Pivotare parţială . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />

2.3.2 Pivotare completă . . . . . . . . . . . . . . . . . . . . . . . . 78<br />

2.4 Factorizări LU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />

2.4.1 Factorizări LU rezultate din eliminarea gaussiană . . . . . . . 82<br />

2.4.2 Factorizări LU compacte . . . . . . . . . . . . . . . . . . . . . 84<br />

2.4.3 Factorizări LU prin eliminare gaussiană la nivel <strong>de</strong> bloc . . . 86<br />

2.4.4 Factorizări LU compacte la nivel <strong>de</strong> bloc . . . . . . . . . . . . 89<br />

2.5 Rezolvarea sistemelor liniare . . . . . . . . . . . . . . . . . . . . . . . 91


x<br />

CUPRINS<br />

2.6 Calculul inversei şi al <strong>de</strong>terminantului . . . . . . . . . . . . . . . . . 93<br />

2.6.1 Calculul inversei unei matrice . . . . . . . . . . . . . . . . . . 94<br />

2.6.2 Calculul <strong>de</strong>terminantului . . . . . . . . . . . . . . . . . . . . 97<br />

2.7 Condiţionarea sistemelor liniare . . . . . . . . . . . . . . . . . . . . . 97<br />

2.8 Stabilitate <strong>numeric</strong>ă . . . . . . . . . . . . . . . . . . . . . . . . . . . 102<br />

2.8.1 Scalarea sistemelor liniare . . . . . . . . . . . . . . . . . . . . 103<br />

2.8.2 Rafinarea iterativă a soluţiei <strong>calcul</strong>ate . . . . . . . . . . . . . 104<br />

2.9 Sisteme bandă . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105<br />

2.10 Sisteme simetrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109<br />

2.11 Sisteme simetrice pozitiv <strong>de</strong>finite . . . . . . . . . . . . . . . . . . . . 114<br />

2.12 Rutine LAPACK şi MATLAB . . . . . . . . . . . . . . . . . . . . . . 117<br />

2.13 Probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119<br />

3 Problema celor mai mici pătrate 123<br />

3.1 Transformări ortogonale . . . . . . . . . . . . . . . . . . . . . . . . . 125<br />

3.1.1 Reflectori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125<br />

3.1.2 Rotaţii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133<br />

3.2 Transformări unitare . . . . . . . . . . . . . . . . . . . . . . . . . . . 138<br />

3.2.1 Reflectori complecşi . . . . . . . . . . . . . . . . . . . . . . . 138<br />

3.2.2 Rotaţii complexe . . . . . . . . . . . . . . . . . . . . . . . . . 142<br />

3.3 Triangularizarea ortogonală . . . . . . . . . . . . . . . . . . . . . . . 143<br />

3.4 Factorizarea QR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149<br />

3.4.1 Acumularea transformărilor . . . . . . . . . . . . . . . . . . . 153<br />

3.4.2 Aplicarea transformărilor . . . . . . . . . . . . . . . . . . . . 155<br />

3.4.3 Triangularizarea ortogonală la nivel <strong>de</strong> bloc . . . . . . . . . . 156<br />

3.4.4 Alte <strong>meto<strong>de</strong></strong> <strong>de</strong> ortogonalizare . . . . . . . . . . . . . . . . . 160<br />

3.4.5 Factorizarea QL . . . . . . . . . . . . . . . . . . . . . . . . . 162<br />

3.5 Rezolvarea problemei CMMP . . . . . . . . . . . . . . . . . . . . . . 162<br />

3.5.1 Calculul pseudosoluţiei . . . . . . . . . . . . . . . . . . . . . . 164<br />

3.5.2 Calculul proiecţiilor . . . . . . . . . . . . . . . . . . . . . . . 167<br />

3.5.3 Problema CMMP cu membru drept multiplu . . . . . . . . . 168<br />

3.5.4 Calculul pseudoinversei . . . . . . . . . . . . . . . . . . . . . 168<br />

3.5.5 Alte <strong>meto<strong>de</strong></strong> <strong>de</strong> rezolvare a problemei CMMP . . . . . . . . . 169<br />

3.6 Sisteme liniare sub<strong>de</strong>terminate . . . . . . . . . . . . . . . . . . . . . 170<br />

3.6.1 Triangularizarea ortogonală la dreapta . . . . . . . . . . . . . 170<br />

3.6.2 Factorizarea LQ . . . . . . . . . . . . . . . . . . . . . . . . . 172<br />

3.6.3 Rezolvarea sistemelor sub<strong>de</strong>terminate . . . . . . . . . . . . . 174<br />

3.7 Condiţionarea problemelor CMMP . . . . . . . . . . . . . . . . . . . 177<br />

3.7.1 Preliminarii . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177<br />

3.7.2 Sensibilitatea pseudosoluţiei . . . . . . . . . . . . . . . . . . . 180<br />

3.7.3 Sensibilitatea soluţiei normale . . . . . . . . . . . . . . . . . . 182<br />

3.8 Stabilitatea <strong>algoritmi</strong>lor <strong>de</strong> triangularizare . . . . . . . . . . . . . . . 183<br />

3.8.1 Stabilitatea <strong>numeric</strong>ă a <strong>algoritmi</strong>lor <strong>fundamentali</strong> . . . . . . . 184<br />

3.8.2 Acurateţea soluţiilor <strong>calcul</strong>ate . . . . . . . . . . . . . . . . . . 185<br />

3.8.3 Scalarea problemei CMMP . . . . . . . . . . . . . . . . . . . 186<br />

3.8.4 Rafinarea iterativă a soluţiei CMMP . . . . . . . . . . . . . . 187


CUPRINS<br />

xi<br />

3.9 Descompunerea ortogonală completă . . . . . . . . . . . . . . . . . . 189<br />

3.9.1 Triangularizarea ortogonală cu pivotarea coloanelor . . . . . . 190<br />

3.9.2 Determinarea rangului . . . . . . . . . . . . . . . . . . . . . . 193<br />

3.9.3 Triangularizarea ortogonală completă . . . . . . . . . . . . . 195<br />

3.9.4 Descompunerea ortogonală completă . . . . . . . . . . . . . . 197<br />

3.9.5 Problema generală CMMP . . . . . . . . . . . . . . . . . . . 197<br />

3.10 Rutine LAPACK şi MATLAB . . . . . . . . . . . . . . . . . . . . . . 199<br />

3.11 Probleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200


0 CUPRINS


Capitolul 0<br />

Concepte fundamentale ale<br />

<strong>calcul</strong>ului <strong>numeric</strong><br />

Rezolvarea <strong>numeric</strong>ă — cu ajutorul <strong>calcul</strong>atorului – a unei probleme <strong>de</strong> <strong>calcul</strong> se face<br />

întot<strong>de</strong>auna pe baza unui algoritm, i.e. a unei succesiuni finite şi bine precizate <strong>de</strong><br />

operaţii elementare (cum ar fi adunarea, înmulţirea etc.) prin care soluţia problemei<br />

este <strong>calcul</strong>ată în funcţie <strong>de</strong> datele iniţiale. Deşi matematica furnizează <strong>de</strong>seori, în<br />

<strong>de</strong>monstraţiile numite constructive, <strong>algoritmi</strong> <strong>de</strong> rezolvare a problemelor pe care le<br />

tratează, s-a dovedit că <strong>de</strong> multe ori implementările <strong>numeric</strong>e ale acestor <strong>algoritmi</strong><br />

au <strong>de</strong>zavantaje majore care îi fac <strong>de</strong> nefolosit.<br />

Discrepanţa între corectitudinea matematică a unui algoritm şi a<strong>de</strong>cvarea lui la<br />

specificul <strong>calcul</strong>ului <strong>numeric</strong> practic poate proveni din două cauze importante. Una,<br />

evi<strong>de</strong>ntă, constă în (eventuala) complexitate (în ce priveşte numărul operaţiilor <strong>de</strong><br />

executat şi memoria ocupată <strong>de</strong> date), care poate duce fie la timpi <strong>de</strong> execuţie foarte<br />

mari, <strong>de</strong>ci nepractici, fie, pur şi simplu, la imposibilitatea execuţiei programului<br />

care implementează algoritmul. A doua cauză, mai subtilă, o constituie erorile<br />

care însoţesc <strong>calcul</strong>ul <strong>numeric</strong>; prin acumulare, acestea pot periclita acurateţea<br />

rezultatului.<br />

O serie <strong>de</strong> erori sunt inerente, cum ar fi cele care apar la <strong>de</strong>terminarea datelor<br />

din măsurători experimentale. Altele sunt legate <strong>de</strong> algoritmul <strong>de</strong> <strong>calcul</strong> utilizat,<br />

care se poate baza pe simplificări în mo<strong>de</strong>larea unor fenomene fizice sau poate<br />

proveni dintr-o metodă matematică implicând o infinitate <strong>de</strong> operaţii, din care,<br />

prin trunchiere, se reţine doar un număr finit <strong>de</strong> operaţii; în ambele cazuri, prin<br />

natura lucrurilor, algoritmul va furniza o soluţie aproximativă.<br />

În fine, există erori având cauze specifice <strong>calcul</strong>ului <strong>numeric</strong>, care operează cu<br />

numere reale (şi nu doar cu numere întregi); <strong>de</strong> acestea ne vom ocupa mai pe larg.<br />

Desigur, numerele reale sunt reprezentate în memoria <strong>calcul</strong>atorului într-un format<br />

bine precizat şi ocupând un număr relativ mic <strong>de</strong> locaţii <strong>de</strong> memorie, <strong>de</strong> exemplu<br />

4 sau 8 octeţi; astfel, o infinitate <strong>de</strong> numere este reprezentată printr-un număr<br />

finit <strong>de</strong> combinaţii <strong>de</strong> biţi. De aici o primă sursă <strong>de</strong> erori, cele <strong>de</strong> reprezentare.<br />

Apoi, pot apărea erori şi la efectuarea operaţiilor cu numere reale aflate în memoria<br />

<strong>calcul</strong>atorului, erori numite <strong>de</strong> rotunjire; aceasta nu se întâmplă pentru că unitatea


2 CAPITOLUL 0. CONCEPTE FUNDAMENTALE<br />

centrală (microprocesorul, <strong>de</strong> exemplu) ar ”greşi” la <strong>calcul</strong>e, ci, din nou, datorită<br />

faptului că numerele reale sunt reprezentate într-un format finit, atât în memorie,<br />

cât şi în unitatea centrală.<br />

Prin aceasta, <strong>calcul</strong>ul cu numere reale diferă fundamental <strong>de</strong> cel cu întregi. Vom<br />

obţine 1 + 2 = 3 pe orice <strong>calcul</strong>ator, în schimb 0.1 + 0.2 ≠ 0.3 pe orice <strong>calcul</strong>ator<br />

(doar dacă nu se folosesc programe speciale !); <strong>de</strong> exemplu — pe un <strong>calcul</strong>ator şi<br />

într-un limbaj <strong>de</strong> programare pe care nu le precizăm — adunând 0.1+0.2 şi scăzând<br />

din rezultat 0.3 nu obţinem 0, aşa cum ne-am aştepta, ci aproximativ 5.5 · 10 −17 ; e<br />

drept, eroarea este infimă. Pericolul apare în cazul acumulării unor astfel <strong>de</strong> mici<br />

erori, acumulare care poate duce la <strong>de</strong>gradarea — uneori fatală — a rezultatului<br />

produs.<br />

În acest capitol ne vom ocupa <strong>de</strong> aspecte specifice elementare ale <strong>calcul</strong>ului<br />

<strong>numeric</strong>: modul <strong>de</strong> reprezentare a numerelor reale, felul în care se apreciază calitatea<br />

unui algoritm <strong>numeric</strong>, cuantificarea efectului erorilor <strong>de</strong> rotunjire asupra acurateţii<br />

soluţiei <strong>numeric</strong>e a unei probleme; acest ultim scop face obiectul analizei <strong>numeric</strong>e<br />

şi este, în general, dificil <strong>de</strong> atins.<br />

0.1 Reprezentarea în virgulă mobilă<br />

Fie x şi ˆx numere reale, ˆx fiind interpretat ca o aproximare a lui x. Vom prezenta<br />

două măsuri naturale ale calităţii aproximării.<br />

Eroarea absolută (cu care ˆx aproximează x) se <strong>de</strong>fineşte prin<br />

∆ = |x − ˆx|.<br />

Dacă x ≠ 0, atunci eroarea relativă se <strong>de</strong>fineşte prin<br />

ε =<br />

x − ˆx<br />

∣ x ∣ = ∆<br />

|x| .<br />

Dacă x ∈ R n , se înlocuieşte în relaţiile <strong>de</strong> mai sus valoarea absolută | · | cu o<br />

normă vectorială ‖ · ‖ (vom discuta <strong>de</strong>spre norme vectoriale în capitolul 1).<br />

Exemplul 0.1 Fie x = 1.0, şi ˆx = 0.999 o aproximare a sa. Atunci ∆ = 10 −3 şi<br />

ε = 10 −3 . Dacă ŷ = 0.009 este o aproximaţie a lui y = 0.01, atunci eroarea absolută<br />

este aceeaşi ca în cazul prece<strong>de</strong>nt, ∆ = 10 −3 , dar eroarea relativă este <strong>de</strong> o sută <strong>de</strong><br />

ori mai mare: ε = 10 −1 . Raportându-se la valoarea lui x, eroarea relativă este mult<br />

mai a<strong>de</strong>cvată pentru estimarea calităţii aproximării ˆx.<br />

♦<br />

Erorile <strong>de</strong> reprezentare apar datorită memorării în <strong>calcul</strong>ator a numerelor reale<br />

printr-o secvenţă finită <strong>de</strong> simboluri (cifre binare). Pentru a prezenta o estimare<br />

a acestor erori, să reamintim bine cunoscuta reprezentare poziţională a numerelor<br />

reale. Fie<br />

• β ∈ N, β ≥ 2, baza <strong>de</strong> numeraţie;<br />

• C = {0, 1, . . ., β − 1}, mulţimea cifrelor în baza β, adică primele β numere<br />

naturale.


0.1. REPREZENTAREA ÎN VIRGULĂ MOBILĂ 3<br />

Se ştie că orice număr x ∈ R poate fi scris unic sub forma unei secvenţe infinite<br />

x = sa n−1 a n−2 . . . a 0 .a −1 a −2 a −3 . . ., (0.1)<br />

care nu se termină printr-o secvenţă infinită <strong>de</strong> cifre egale cu β −1 şi în care a i ∈ C,<br />

iar s este semnul, s ∈ {+, −}. Valoarea lui x este<br />

( n−1<br />

)<br />

∑ ∞∑<br />

x = s a i β i + a −i β −i . (0.2)<br />

i=0 i=1<br />

Convenim să eliminăm din scriere secvenţa infinită <strong>de</strong> zerouri finale, atunci când<br />

este cazul. Să exemplificăm relaţiile (0.1) şi (0.2).<br />

Exemplul 0.2 Numărul în baza 10<br />

3.25 = 3 · 10 0 + 2 · 10 −1 + 5 · 10 −2<br />

se reprezintă în baza 2 în modul următor (verificaţi egalitatea):<br />

11.01 = 1 · 2 1 + 1 · 2 0 + 0 · 2 −1 + 1 · 2 −2 .<br />

În ambele baze, reprezentările au un număr finit <strong>de</strong> cifre. În schimb, numărul<br />

exprimat simplu în baza 10:<br />

0.1 = 1 · 10 −1<br />

are o reprezentare <strong>de</strong> lungime infinită în baza 2 (verificaţi din nou egalitatea):<br />

0.0001100110011... = (2 −4 + 2 −5 )<br />

În baza 10, următoarele două secvenţe<br />

0.99999 . . .<br />

1.00000 . . .<br />

∞∑<br />

2 −4k .<br />

reprezintă acelaşi număr real. Reprezentările binare corespunzătoare sunt<br />

0.11111 . . .<br />

1.00000 . . .<br />

k=0<br />

În ambele situaţii, reprezentarea acceptată este 1.0000 . . .<br />

Evi<strong>de</strong>nt, reprezentarea numerelor reale pe <strong>calcul</strong>ator poate avea doar un număr<br />

finit <strong>de</strong> cifre şi <strong>de</strong>ci, prin natura ei, este aproximativă. O ”bună” aproximare printr-o<br />

secvenţă finită <strong>de</strong> lungime fixată trebuie să asigure:<br />

• un domeniu suficient <strong>de</strong> mare <strong>de</strong> numere reprezentate;<br />

• o eroare relativă <strong>de</strong> reprezentare suficient <strong>de</strong> mică;<br />

• o distribuţie uniformă a erorii relative <strong>de</strong> reprezentare.<br />


4 CAPITOLUL 0. CONCEPTE FUNDAMENTALE<br />

Un bun compromis în satisfacerea acestor cerinţe este dat <strong>de</strong> aşa numitul Format<br />

Virgulă Mobilă (FVM).<br />

Definiţia 0.1 Un Format Virgulă Mobilă (FVM) este <strong>de</strong>finit <strong>de</strong> trei întregi (β, t, p),<br />

cu următoarea semnificaţie:<br />

β – baza <strong>de</strong> numeraţie (β ≥ 2);<br />

t – precizia, adică numărul <strong>de</strong> cifre semnificative (”lungimea” mantisei);<br />

p – numărul <strong>de</strong> cifre ale exponentului.<br />

Un număr în virgulă mobilă este o pereche (f, e), un<strong>de</strong><br />

f = ±0.f 1 f 2 . . .f t , f 1 ≠ 0, f i ∈ C<br />

este un număr fracţionar cu semn (plus sau minus), normalizat (i.e. f 1 ≠ 0), cu<br />

t cifre, <strong>de</strong>numit mantisă, iar<br />

e = ±e 1 e 2 . . . e p<br />

este un întreg cu semn, cu p cifre, numit exponent. Valoarea reală asociată numărului<br />

în virgulă mobilă (f, e) este<br />

x = f · β e .<br />

Fie L valoarea minimă admisă a exponentului (<strong>de</strong> exemplu L = − ρ . . .ρ, un<strong>de</strong><br />

} {{ }<br />

p<br />

ρ = β − 1) şi U cea maximă (<strong>de</strong> exemplu U = −L). Se observă că toate numerele<br />

în virgulă mobilă x satisfac:<br />

β L−1 = m ≤ |x| ≤ M = β U (1 − β −t )<br />

adică domeniul reprezentării în virgulă mobilă este intervalul R = [−M, M]. Desigur,<br />

pentru majoritatea reprezentărilor pe <strong>calcul</strong>ator, β = 2 (se mai foloseşte, <strong>de</strong><br />

exemplu, β = 16 şi chiar β = 10).<br />

Exemplul 0.3 Să consi<strong>de</strong>răm FVM cu (β, t, p) = (2, 2, 1). Atunci L = −1, U = 1,<br />

m = 2 −2 = 0.25 10 , M = 2(1 − 2 −2 ) = 1.5 10 . Numerele reale care au o reprezentare<br />

exactă în acest FVM sunt:<br />

x 1 = (−0.11, +1) = −1.5 10 x 7 = (+0.10, −1) = 0.25 10<br />

x 2 = (−0.10, +1) = −1.0 10 x 8 = (+0.11, −1) = 0.375 10<br />

x 3 = (−0.11, 0) = −0.75 10 x 9 = (+0.10, 0) = 0.5 10<br />

x 4 = (−0.10, 0) = −0.5 10 x 10 = (+0.11, 0) = 0.75 10<br />

x 5 = (−0.11, −1) = −0.375 10 x 11 = (+0.10, +1) = 1.0 10<br />

x 6 = (−0.10, −1) = −0.25 10 x 12 = (+0.11, +1) = 1.5 10<br />

şi vor fi folosite pentru reprezentarea (aproximativă) a tuturor numerelor reale din<br />

intervalul [−1.5, 1.5]. Reprezentarea geometrică a tuturor acestor numere pe axa<br />

reală este prezentată în figura 0.1. Numerele cu reprezentare exactă în virgulă<br />

mobilă sunt relativ uniform distribuite; mai precis, |x i −x i−1 | / |x i | are aproximativ<br />

aceleaşi valori pentru orice i.<br />

♦<br />

Exemplul 0.4 Un FVM pe 32 biţi poate fi următorul: (β, t, p) = (2, 24, 7). Doi<br />

biţi sunt atribuiţi reprezentării semnelor mantisei şi exponentului; <strong>de</strong>oarece primul


0.1. REPREZENTAREA ÎN VIRGULĂ MOBILĂ 5<br />

-1.5 -1 -0.5<br />

0.5 1 1.5<br />

0<br />

x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 12<br />

x 11<br />

✲<br />

Fig. 0.1: Reprezentarea numerelor în virgulă mobilă din exemplul 0.3<br />

0 1 0 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1<br />

✻✛ exponent (7 biţi) ✲ ✻✛<br />

mantisa (23+1 biţi)<br />

✲<br />

semn exponent<br />

semn număr (mantisă)<br />

Fig. 0.2: Structura unui număr în virgulă mobilă, pentru (β, t, p) = (2, 24, 7)<br />

bit al mantisei are întot<strong>de</strong>auna valoarea 1, semnul mantisei se memorează în locul<br />

acestui bit, economisind astfel un bit al reprezentării. Un exemplu <strong>de</strong> număr în<br />

virgulă mobilă în acest format este prezentat în figura 0.2.<br />

Pentru acest FVM avem: L = −127, U = 127, m = 2 −127 = (2 −10 ) 13 2 3 ≈ 10 −38 ,<br />

M ≈ 10 38 (putem aproxima 2 10 ≈ 10 3 ). Aceasta arată că FVM acoperă un domeniu<br />

larg <strong>de</strong> numere, utilizând un număr relativ mic <strong>de</strong> cifre binare. Acest exemplu este<br />

foarte apropiat <strong>de</strong> formatul standard IEEE pentru numere în virgulă mobilă în<br />

simplă precizie.<br />

În formatul din acest exemplu, numărul real 0.1 are mantisa<br />

0.110011001100110011001100<br />

şi exponentul 10000011 (−3 în baza 10; prima cifră 1 a exponentului reprezintă<br />

semnul). Aşadar numărul 0.1 este reprezentat aproximativ (vezi exemplul 0.2). ♦<br />

Observaţia 0.1 Definiţia 0.1 nu permite reprezentarea exactă a numărului 0,<br />

acesta neputând avea o mantisă normalizată. Practic, pentru a reprezenta 0, precum<br />

şi unele simboluri speciale <strong>de</strong>spre care se va vorbi mai târziu, se folosesc valori<br />

<strong>de</strong>dicate ale exponentului, în afara intervalului [L, U]. De aceea, în standardul<br />

IEEE pentru simplă precizie, L = −126.<br />

♦<br />

Pentru a estima erorile efectuate la reprezentarea unui număr real în virgulă<br />

mobilă, să consi<strong>de</strong>răm un FVM, adică (β, t, p), şi să notăm<br />

F = {x ∈ R | x are reprezentare exactă in VM} ∪ {0}. (0.3)<br />

Desigur, F este o mulţime finită <strong>de</strong> numere raţionale.<br />

Reprezentarea numărului real x ∈ [−M, M] în FVM înseamnă aproximarea lui<br />

cu un număr ˆx ∈ F. Această aproximare poate fi exprimată printr-o funcţie <strong>de</strong><br />

rotunjire.<br />

Definiţia 0.2 Dacă (β, t, p) este un FVM şi F este mulţimea <strong>de</strong>finită în (0.3),<br />

atunci o funcţie<br />

fl : [−M, M] → F


6 CAPITOLUL 0. CONCEPTE FUNDAMENTALE<br />

care asociază fiecărui x ∈ [−M, M] o unică reprezentare în virgulă mobilă<br />

ˆx = fl(x)<br />

este numită funcţie <strong>de</strong> rotunjire. Eroarea relativă <strong>de</strong> aproximare<br />

|x − fl(x)|<br />

|x|<br />

<strong>de</strong>finită pentru orice x ∈ [−M, M] nenul este <strong>de</strong>numită eroare <strong>de</strong> reprezentare.<br />

Deoarece intervalul [−M, M] este o mulţime infinită <strong>de</strong> numere reale, fiecare<br />

ˆx ∈ F constituie ”reprezentarea în VM” a unei mulţimi infinite <strong>de</strong> numere din<br />

[−M, M]; suntem interesaţi să găsim o margine superioară a erorii <strong>de</strong> reprezentare<br />

pentru o funcţie <strong>de</strong> rotunjire dată. Există mai multe funcţii <strong>de</strong> rotunjire. O vom<br />

prezenta doar pe cea mai simplă, <strong>de</strong>numită rotunjire prin tăiere. În acest scop, să<br />

scriem numărul x ∈ [−M, M] în forma (0.1) normalizată:<br />

x = f · β e = ±0.f 1 f 2 . . . f t f t+1 . . . · β e =<br />

= ±0.f 1 f 2 . . . f t · β e ± 0.f t+1 f t+2 . . . · β e−t =<br />

= ˆf · β e + ĝ · β e−t ,<br />

un<strong>de</strong> f i ∈ C, f 1 ≠ 0, ˆf = ±0.f 1 f 2 . . . f t , ĝ = ±0.f t+1 f t+2 . . .<br />

În mod evi<strong>de</strong>nt:<br />

1/β ≤ |f| < 1, 1/β ≤ | ˆf| < 1, 0 ≤ |ĝ| < 1. (0.4)<br />

Funcţia <strong>de</strong> rotunjire prin tăiere<br />

este <strong>de</strong>finită prin<br />

ˆx = fl 1 (x) =<br />

fl 1 : [−M, M] → F<br />

{ ˆf · β e , pentru x ≠ 0,<br />

0, pentru x = 0.<br />

Pe scurt, reprezentarea în VM se obţine prin tăierea cifrelor mantisei normalizate a<br />

numărului x care se află în afara formatului (<strong>de</strong> la poziţia t + 1 încolo).<br />

Utilizând inegalităţile (0.4), este uşor <strong>de</strong> stabilit o margine superioară a erorii<br />

<strong>de</strong> reprezentare introduse <strong>de</strong> fl 1 . Într-a<strong>de</strong>văr, pentru orice x ∈ [−M, M] \ {0} avem<br />

ε = |x − fl 1(x)|<br />

|x|<br />

= |fβe − ˆfβ e |<br />

|f|β e<br />

= |ĝ|βe−t<br />

|f|β e<br />

< β−t<br />

β −1 = β−t+1 .<br />

Această formulă arată că, indiferent <strong>de</strong> valoarea numărului x, o margine pentru<br />

mărimea erorii <strong>de</strong> reprezentare este <strong>de</strong>terminată exclusiv <strong>de</strong> numărul <strong>de</strong> cifre ale<br />

mantisei (în baza <strong>de</strong> numeraţie a FVM) şi acesta este motivul pentru care t este<br />

numit precizia reprezentării în virgulă mobilă. Numărul β −t+1 este numit epsilon<br />

maşină şi reprezintă distanţa dintre 1 şi următorul număr cu reprezentare în FVM<br />

(vezi problema 0.5).


0.2. ARITMETICA ÎN VIRGULĂ MOBILĂ 7<br />

Pe majoritatea <strong>calcul</strong>atoarelor, numerele în virgulă mobilă au o precizie fixată.<br />

Multe <strong>calcul</strong>atoare au, <strong>de</strong> asemenea, posibilitatea <strong>de</strong> a manipula numere în virgulă<br />

mobilă cu aproximativ 2t biţi pentru mantisă; astfel <strong>de</strong> numere sunt numite în<br />

dublă precizie. De exemplu, în standardul IEEE, numerele în dublă precizie sunt<br />

memorate pe 64 biţi, cu t = 53 şi p = 10 (un bit suplimentar este <strong>de</strong>dicat memorării<br />

semnului exponentului).<br />

Pentru toate funcţiile <strong>de</strong> rotunjire folosite, marginea superioară a erorii <strong>de</strong> reprezentare<br />

are forma<br />

ε ≤ µ · β −t , (0.5)<br />

un<strong>de</strong> µ este un număr <strong>de</strong> ordinul unităţii.<br />

Din (0.5) rezultă existenţa unui număr ρ astfel încât<br />

ˆx = fl(x) = x(1 + ρ), |ρ| ≤ µβ −t , (0.6)<br />

ceea ce este un alt mod <strong>de</strong> exprimare a erorii <strong>de</strong> reprezentare.<br />

Cele t cifre ale mantisei sunt numite cifre semnificative ale numărului real reprezentat.<br />

În baza <strong>de</strong> numeraţie zecimală, numerele reprezentate în simplă precizie<br />

conform standardului IEEE (t = 24) au 7 cifre semnificative (numărăm 3 cifre<br />

zecimale pentru 10 cifre binare), iar cele în dublă precizie (t = 53) au 16 cifre semnificative;<br />

în consecinţă, eroarea maximă <strong>de</strong> reprezentare este <strong>de</strong> aproximativ 10 −7 ,<br />

respectiv 10 −16 (anume chiar epsilon maşină). O prezentare <strong>de</strong>taliată a standardului<br />

IEEE poate fi găsită în [].<br />

0.2 Aritmetica în virgulă mobilă<br />

Calculatoarele cu hardware <strong>de</strong>dicat operaţiilor în virgulă mobilă sunt prevăzute cu<br />

un set <strong>de</strong> instrucţiuni pentru implementarea unor operaţii cu numere în virgulă<br />

mobilă ca, <strong>de</strong> exemplu, adunarea, scă<strong>de</strong>rea, înmulţirea sau împărţirea. Trebuie subliniat<br />

că operaţiile menţionate diferă <strong>de</strong> cele matematice corespunzătoare <strong>de</strong>oarece<br />

rezultatul lor aparţine întot<strong>de</strong>auna mulţimii finite F a numerelor în virgulă mobilă.<br />

Aşadar operaţiile aritmetice nu pot fi executate exact. Eroarea introdusă <strong>de</strong><br />

operaţiile aritmetice în virgulă mobilă se numeşte eroare <strong>de</strong> rotunjire. Consecinţele<br />

pot fi foarte importante; există posibilitatea ca erorile <strong>de</strong> rotunjire să se acumuleze<br />

şi, în <strong>calcul</strong>e lungi, valorile finale să fie afectate, chiar până la a le face inutilizabile.<br />

De aceea este <strong>de</strong> dorit ca fiecare algoritm să fie analizat pentru a ve<strong>de</strong>a în ce măsură<br />

erorile <strong>de</strong> rotunjire afectează rezultatele; în general, aceasta este o sarcină dificilă.<br />

Exemplul 0.5 Consi<strong>de</strong>răm FVM cu (β, t, p) = (10, 3, 1). Adunând exact numerele<br />

1.23 şi 20.5, amândouă reprezentabile exact în FVM ales, se obţine 21.73. Rotunjit<br />

prin tăiere, rezultatul în VM este 21.7, <strong>de</strong>ci diferit <strong>de</strong> cel exact.<br />

♦<br />

Analiza erorilor <strong>de</strong> rotunjire se bazează pe cunoaşterea marginilor superioare ale<br />

erorilor ce apar în operaţiile în virgulă mobilă. Pentru majoritatea <strong>calcul</strong>atoarelor<br />

este valabil următorul mo<strong>de</strong>l al erorilor asociate operaţiilor în virgulă mobilă, bazat<br />

pe evaluarea (0.6): notând cu fl(xy), fl(x/y) şi fl(x+y) produsul, câtul, respectiv<br />

suma <strong>calcul</strong>ate ale numerelor în virgulă mobilă x şi y, atunci, într-un FVM cu t cifre<br />

avem<br />

fl(xopy) = (xop y)(1 + ρ), |ρ| ≤ µβ −t , (0.7)


8 CAPITOLUL 0. CONCEPTE FUNDAMENTALE<br />

un<strong>de</strong> op poate fi +, · sau /, iar µ este un număr <strong>de</strong> ordinul unităţii.<br />

Mo<strong>de</strong>lul (0.7) este obţinut presupunând că xop y este <strong>calcul</strong>at exact, apoi rezultatul<br />

este transformat în FVM printr-o funcţie <strong>de</strong> rotunjire. În realitate, lucrurile nu<br />

stau chiar aşa; unităţile specializate pentru <strong>calcul</strong>ul în VM nu obţin rezultatul exact,<br />

dar se comportă ca şi cum l-ar obţine, lucrând pe baza unor <strong>algoritmi</strong> nebanali, a<br />

căror cunoaştere nu este necesară pentru înţelegerea <strong>algoritmi</strong>lor din această lucrare<br />

şi a căror prezentare <strong>de</strong>păşeşte cadrul problematicii propuse.<br />

În completarea relaţiei (0.7), trebuie să menţionăm că, atunci când o operaţie<br />

în virgulă mobilă produce un număr cu un modul prea mare (> M), apare eroarea<br />

numită <strong>de</strong> <strong>de</strong>păşire superioară (overflow). Când rezultatul este prea mic în valoare<br />

absolută (< m, dar nenulă), eroarea se numeşte <strong>de</strong> <strong>de</strong>păşire inferioară (un<strong>de</strong>rflow).<br />

Desigur, orice algoritm bine conceput trebuie să specifice cum se proce<strong>de</strong>ază în<br />

eventualitatea unor <strong>de</strong>păşiri şi, mai ales, să încerce evitarea lor (vom explica în<br />

capitolul următor tehnica folosită — scalarea). Depăşirea inferioară nu constituie<br />

<strong>de</strong> regulă o eroare gravă, <strong>de</strong> aceea majoritatea <strong>calcul</strong>atoarelor atribuie automat<br />

rezultatului valoarea zero. În cazul unei <strong>de</strong>păşiri superioare, <strong>de</strong> obicei <strong>calcul</strong>ele sunt<br />

oprite sau, cel puţin, este afişat un mesaj <strong>de</strong> avertisment. În standardul IEEE pentru<br />

virgulă mobilă, există o valoare specială, numită Inf (infinit), care este atribuită<br />

rezultatului în cazul unei <strong>de</strong>păşiri superioare; <strong>calcul</strong>ele continuă cu această valoare;<br />

rezultatele se obţin conform regulilor uzuale <strong>de</strong> lucru cu infinităţi. O altă valoare<br />

specială – NaN (Not a Number) – este atribuită rezultatelor ne<strong>de</strong>finite, ca 0 · ∞,<br />

0/0, ∞/∞; o operaţie implicând NaN are întot<strong>de</strong>auna ca rezultat NaN.<br />

Relaţia (0.7) garantează că o operaţie aritmetică introduce erori relative mici,<br />

<strong>de</strong> ordinul β −t (adică al lui epsilon maşină). O problemă fundamentală a <strong>calcul</strong>ului<br />

<strong>numeric</strong> este evaluarea mărimii erorii ce afectează rezultatul în cazul unei secvenţe<br />

<strong>de</strong> operaţii.<br />

Pentru a aborda problema, să consi<strong>de</strong>răm două exemple în care apar erori <strong>numeric</strong>e<br />

mari, dar din cauze esenţial diferite. Lucrăm în FVM cu (β, t, p) = (10, 3, 1).<br />

Pentru a evita confuziile, vom nota cu ⊕, ⊖, ⊗ şi ⊘ adunarea, scă<strong>de</strong>rea, înmulţirea,<br />

respectiv împărţirea în VM; <strong>de</strong>ci x + y este suma exactă, iar x ⊕ y = fl(x + y) este<br />

suma <strong>calcul</strong>ată în VM.<br />

Exemplul 0.6 În <strong>calcul</strong>ul rădăcinilor polinomului <strong>de</strong> gradul al doilea ax2 + bx + c,<br />

cu a ≠ 0, este necesar <strong>calcul</strong>ul expresiei b 2 − 4ac. Consi<strong>de</strong>rând b = 3.34, a = 1.22,<br />

c = 2.28, avem b 2 −4ac = 0.0292, în timp ce, rotunjind prin tăiere, b ⊗b = 4 ⊗a⊗c<br />

= 11.1, <strong>de</strong>ci b ⊗ b − 4 ⊗ a ⊗ c = 0. Rezultatul <strong>calcul</strong>at are toate cifrele semnificative<br />

eronate, iar eroarea relativă aferentă este egală cu 1; totuşi, pentru fiecare operaţie<br />

în parte, eroarea relativă este mai mică <strong>de</strong>cât 10 −2 .<br />

♦<br />

Exemplul 0.7 Dacă polinomul <strong>de</strong> gradul II are rădăcini reale, acestea se <strong>calcul</strong>ează<br />

<strong>de</strong> obicei utilizând formulele<br />

x 1 = −b − √ b 2 − 4ac<br />

2a<br />

, x 2 = −b + √ b 2 − 4ac<br />

. (0.8)<br />

2a<br />

Luând b = 10.1, a = 0.0123, c = 32.4, valoarea exactă rotunjită la 3 cifre<br />

semnificative a lui x 2 este −3.22. Efectuând <strong>calcul</strong>ele în formatul ales, obţinem<br />

∆ = b ⊗ b ⊖ 4 ⊗ a ⊗ c = 100 (în loc <strong>de</strong> 100.41, dar eroarea relativă e încă <strong>de</strong> ordinul


0.2. ARITMETICA ÎN VIRGULĂ MOBILĂ 9<br />

10 −3 ); dar −b ⊕ SQRT(∆) = −0.1, în timp ce −b + √ b 2 − 4ac = −0.0792, eroarea<br />

relativă fiind acum 0.26. Valoarea <strong>calcul</strong>ată a rădăcinii x 2 este −4.06, în timp ce<br />

valoarea exactă este −3.22; din nou toate cifrele semnificative ale rezultatului sunt<br />

eronate.<br />

♦<br />

Se observă că, în ambele exemple, erorile mari apar după scă<strong>de</strong>rea a două numere<br />

<strong>de</strong> valori apropiate. Se produce o anulare catastrofală, adică o pier<strong>de</strong>re completă a<br />

cifrelor semnificative ale rezultatului. În primul caz anularea trebuie pusă integral<br />

pe seama operaţiei matematice <strong>de</strong> scă<strong>de</strong>re; problema <strong>calcul</strong>ului b 2 − 4ac este cauza<br />

erorilor, şi nu algoritmul <strong>de</strong> <strong>calcul</strong>. În schimb, în al doilea caz, algoritmul <strong>de</strong> <strong>calcul</strong><br />

al rădăcinilor este <strong>de</strong> vină, <strong>de</strong>oarece nu evită scă<strong>de</strong>rea a două numere apropiate,<br />

<strong>de</strong>şi aceasta este posibil, după cum vom ve<strong>de</strong>a puţin mai târziu. Să studiem întâi<br />

mai amănunţit ce se întâmplă la scă<strong>de</strong>rea a două numere apropiate.<br />

Exemplul 0.8 Consi<strong>de</strong>răm două numere reale, x şi y, <strong>de</strong> acelaşi ordin <strong>de</strong> mărime<br />

(cu x > y, pentru simplitate), ale căror prime k cifre coincid, cu următoarele<br />

reprezentări (exacte) în baza β (d 1 ≠ 0):<br />

x = 0.d 1 d 2 . . . d k d k+1 . . . d t 1 · β e ,<br />

y = 0.d 1 d 2 . . . d k c k+1 . . .c t 0 · β e .<br />

Rotunjind prin tăiere, reprezentările lor într-un FVM cu (β, t, p) sunt<br />

Diferenţa lor, <strong>calcul</strong>ată în VM, este<br />

ˆx = fl(x) = 0.d 1 d 2 . . . d k d k+1 . . . d t · β e ,<br />

ŷ = fl(y) = 0.d 1 d 2 . . .d k c k+1 . . . c t · β e .<br />

ˆx ⊖ ŷ = 0.f 1 . . .f t−k 0 . . .0 · β −k+e .<br />

Observăm că ˆx − ŷ = ˆx ⊖ ŷ, <strong>de</strong>ci scă<strong>de</strong>rea se efectuează fără erori. În schimb,<br />

rezultatul scă<strong>de</strong>rii cu valorile exacte ale operanzilor este<br />

x − y = 0.f 1 . . . f t−k 10 . . .0 · β −k+e ,<br />

iar eroarea relativă asociată lui este<br />

(x − y) − (ˆx − ŷ)<br />

∣ x − y ∣ ≥ β−t+1+e<br />

β −k+e = β −t−1+k .<br />

În concluzie, observăm că operanzii scă<strong>de</strong>rii sunt afectaţi <strong>de</strong> erori relative <strong>de</strong> reprezentare<br />

<strong>de</strong> ordinul β −t−1 , în timp ce rezultatul ei are o eroare relativă <strong>de</strong> ordinul<br />

β −t−1+k ; atunci când x şi y au multe cifre semnificative i<strong>de</strong>ntice, <strong>de</strong>ci k aproape <strong>de</strong><br />

t, (şi acelaşi ordin <strong>de</strong> mărime) eroarea asociată rezultatului scă<strong>de</strong>rii poate <strong>de</strong>veni<br />

uriaşă.<br />

♦<br />

Exemplul 0.8 arată că adunarea (scă<strong>de</strong>rea) nu introduce erori mari prin ea însăşi,<br />

ci potenţează — în anumite cazuri — erorile operanzilor.<br />

De aceea, scă<strong>de</strong>rea numerelor apropiate trebuie evitată. Pentru aceasta, dacă<br />

este posibil, algoritmul <strong>de</strong> <strong>calcul</strong> este cel care trebuie modificat.


10 CAPITOLUL 0. CONCEPTE FUNDAMENTALE<br />

Exemplul 0.9 Am constatat, în exemplul 0.7, că formulele (0.8) nu sunt cele<br />

mai bune din punct <strong>de</strong> ve<strong>de</strong>re <strong>numeric</strong>, mai ales când b 2 ≫ 4ac, şi <strong>de</strong>ci |b| ≈ √ ∆.<br />

Pentru a evita scă<strong>de</strong>rea unor numere apropiate, se pot folosi formulele<br />

x 1 = −b − sgn(b)√ b 2 − 4ac<br />

, x 2 =<br />

2a<br />

−2c<br />

b + sgn(b) √ b 2 − 4ac . (0.9)<br />

Utilizând în (0.9) valorile <strong>numeric</strong>e din exemplul 0.7, se obţine, în FVM <strong>de</strong> lucru,<br />

un rezultat cu toate cifrele semnificative exacte.<br />

♦<br />

0.3 Condiţionarea problemelor <strong>de</strong> <strong>calcul</strong><br />

Orice problemă <strong>de</strong> <strong>calcul</strong> <strong>numeric</strong> impune obţinerea unor rezultate <strong>numeric</strong>e, pornind<br />

<strong>de</strong> la date <strong>de</strong> intrare <strong>numeric</strong>e, astfel încât rezultatele să poată fi interpretate ca o<br />

aproximaţie a soluţiei unei probleme matematice pentru datele <strong>de</strong> intrare respective.<br />

Pentru ca o astfel <strong>de</strong> problemă să fie bine <strong>de</strong>finită, trebuie asigurate existenţa şi<br />

unicitatea soluţiei. În acest caz, o problemă <strong>de</strong> <strong>calcul</strong> <strong>numeric</strong> poate fi întot<strong>de</strong>auna<br />

<strong>de</strong>scrisă ca evaluare a unei funcţii<br />

f : D ⊂ R n −→ R m (0.10)<br />

într-un punct x ∈ D dat. Cele n componente ale argumentului constituie datele<br />

<strong>de</strong> intrare, iar cele m componente ale vectorului f(x) sunt rezultatele sau datele <strong>de</strong><br />

ieşire.<br />

Desigur, aplicaţia f este <strong>de</strong> cele mai multe ori <strong>de</strong>finită implicit iar <strong>de</strong>scoperirea<br />

unei căi prin care <strong>calcul</strong>ul valorii f(x) <strong>de</strong>vine posibil echivalează cu rezolvarea,<br />

printr-un algoritm specific, a problemei <strong>de</strong> <strong>calcul</strong> consi<strong>de</strong>rate.<br />

Exemplul 0.10 a) Fie D o mulţime <strong>de</strong> trei numere reale şi<br />

⎡ ⎤<br />

x =<br />

⎣ a b<br />

c<br />

Rezolvarea ecuaţiei <strong>de</strong> gradul II<br />

⎦ ∈ D = {x ∈ R 3 | a ≠ 0, b 2 − 4ac ≥ 0} ⊂ R 3 .<br />

ay 2 + by + c = 0<br />

este o problemă <strong>numeric</strong>ă bine <strong>de</strong>finită, <strong>de</strong>oarece pentru orice x ∈ D există un unic<br />

vector<br />

⎡<br />

−b − sgn(b) √ b 2 ⎤<br />

− 4ac<br />

[ ]<br />

y1<br />

2a<br />

y = f(x) = = ⎢<br />

⎥<br />

y 2 ⎣ −2c ⎦ ∈ R2 ,<br />

care este soluţia problemei.<br />

b) Calculul integralei<br />

∫ b<br />

a<br />

b + sgn(b) √ b 2 − 4ac<br />

e −t2 dt,


0.3. CONDIŢIONAREA PROBLEMELOR DE CALCUL 11<br />

un<strong>de</strong> a, b ∈ R sunt date (a ≠ b), este <strong>de</strong> asemenea [ ] o problemă <strong>numeric</strong>ă bine <strong>de</strong>finită.<br />

a<br />

Într-a<strong>de</strong>văr, pentru datele <strong>de</strong> intrare x = ∈ D = R<br />

b<br />

2 , există şi este unică<br />

valoarea integralei y ∈ R, <strong>de</strong>şi integrala ne<strong>de</strong>finită ∫ e −t2 dt nu este exprimabilă<br />

prin funcţii elementare.<br />

♦<br />

Abaterea soluţiei <strong>calcul</strong>ate faţă <strong>de</strong> soluţia exactă a unei probleme <strong>numeric</strong>e poate<br />

avea două surse esenţial diferite, legate <strong>de</strong> problemă în sine şi, respectiv, <strong>de</strong> algoritmul<br />

<strong>de</strong> <strong>calcul</strong> utilizat. De prima sursă <strong>de</strong> erori — numită condiţionarea problemei<br />

— ne ocupăm în continuare, <strong>de</strong> cea <strong>de</strong>-a doua — stabilitatea algoritmului — în<br />

paragraful următor.<br />

Condiţionarea problemei caracterizează sensibilitatea soluţiei în raport cu perturbaţiile<br />

datelor <strong>de</strong> intrare. În practică este cunoscută doar o aproximaţie ˆx a datelor<br />

<strong>de</strong> intrare x şi, în cel mai bun caz, presupunând că toate <strong>calcul</strong>ele se efectuează<br />

exact, putem <strong>calcul</strong>a f(ˆx) în loc <strong>de</strong> f(x). Dacă funcţia f <strong>de</strong>finind problema noastră<br />

este prea sensibilă la variaţii ale argumentului, f(ˆx) şi f(x) pot diferi semnificativ<br />

chiar în cazul unei erori relative mici ‖x − ˆx‖ / ‖x‖ a datelor <strong>de</strong> intrare (‖ · ‖ este o<br />

normă a<strong>de</strong>cvată). O astfel <strong>de</strong> problemă este numită rău condiţionată.<br />

Dacă încercăm rezolvarea unei probleme rău condiţionate pornind <strong>de</strong> la date<br />

inexacte, atunci soluţia obţinută va fi însoţită <strong>de</strong> erori mari indiferent <strong>de</strong> felul în<br />

care este <strong>calcul</strong>ată !<br />

Definiţia 0.3 Condiţionarea <strong>numeric</strong>ă sau sensibilitatea locală a unei probleme<br />

f : D ⊂ R n → R m într-un punct x ∈ D este exprimată <strong>de</strong> amplificarea erorii relative<br />

‖f(x) − f(ˆx)‖ ‖x‖<br />

κ(x) =<br />

‖f(x)‖ ‖x − ˆx‖ , (0.11)<br />

pentru x ≠ 0 şi f(x) ≠ 0. Când κ(x) este mic (<strong>de</strong> ordinul unităţii, <strong>de</strong> exemplu)<br />

problema este numită bine condiţionată în punctul x. Altfel, problema este rău<br />

condiţionată.<br />

Observaţia 0.2 Dacă f este Lipschitz continuă, i.e. există L astfel încât<br />

atunci<br />

‖f(x) − f(y)‖ ≤ L‖x − y‖,<br />

κ(x) ≤ L ‖x‖<br />

‖f(x)‖ ,<br />

iar dacă f este <strong>de</strong> clasă C 1 iar x este apropiat <strong>de</strong> y, atunci L se poate lua ‖f ′ (x)‖,<br />

un<strong>de</strong> f ′ este <strong>de</strong>rivata lui f în punctul x.<br />

♦<br />

Subliniem faptul că condiţionarea este o proprietate locală. De obicei, totuşi, o<br />

problemă este numită bine condiţionată dacă este bine condiţionată în orice punct<br />

x ∈ D; <strong>de</strong> asemenea, este numită rău condiţionată, dacă există puncte x ∈ D în<br />

care este rău condiţionată.<br />

Exemplul 0.11 Problema <strong>calcul</strong>ului sumei a două numere x, y ∈ R poate fi<br />

bine sau rău condiţionată funcţie <strong>de</strong> valorile lui x şi y (datele <strong>de</strong> intrare). (Aici


12 CAPITOLUL 0. CONCEPTE FUNDAMENTALE<br />

[ x<br />

f(x, y) = x + y, f : R 2 −→ R; convenim să scriem şi f(x, y) în loc <strong>de</strong> f(<br />

y<br />

cum ar cere (0.10).)<br />

Presupunem că ˆx, ŷ sunt aproximări ale lui x, respectiv y, afectate <strong>de</strong> erori<br />

relative <strong>de</strong> acelaşi ordin <strong>de</strong> mărime, γ; mai precis,<br />

ˆx = x + ε x x, cu |ε x | ≤ γ ≪ 1,<br />

ŷ = y + ε y y, cu |ε y | ≤ γ.<br />

Eroarea relativă asociată sumei este (<strong>calcul</strong>ul sumei se face exact)<br />

ε = |x + ε xx + y + ε y y − (x + y)|<br />

|x + y|<br />

Dacă x şi y au acelaşi semn, atunci<br />

ε ≤ |ε xx| + |ε y y|<br />

|x| + |y|<br />

≤ γ<br />

]<br />

),<br />

= |ε xx + ε y y|<br />

. (0.12)<br />

|x + y|<br />

şi suma este afectată <strong>de</strong> o eroare <strong>de</strong> acelaşi ordin <strong>de</strong> mărime ca şi operanzii; în acest<br />

caz, adunarea este bine condiţionată.<br />

Dacă x şi y au semne diferite, este posibil (atunci când ε x şi ε y au şi ele semne<br />

diferite) ca ε şi<br />

γ · max(|x|, |y|)<br />

θ =<br />

|x + y|<br />

să aibă acelaşi ordin <strong>de</strong> mărime. Dar dacă |x + y| ≪ max(|x|, |y|), ceea ce se<br />

întâmplă atunci când x şi y au valori apropiate, atunci θ ≫ γ. În acest caz,<br />

problema <strong>calcul</strong>ului sumei este rău condiţionată. Exemplele 0.6, 0.7, 0.8 ilustrează<br />

această situaţie. Pentru a ve<strong>de</strong>a câte subtilităţi ascun<strong>de</strong> <strong>calcul</strong>ul aparent simplu al<br />

unei sume, cititorul este invitat să consulte [].<br />

♦<br />

0.4 Stabilitatea <strong>numeric</strong>ă a <strong>algoritmi</strong>lor<br />

Pentru a rezolva o problemă <strong>de</strong> <strong>calcul</strong> <strong>numeric</strong> <strong>de</strong>finită <strong>de</strong> funcţia (0.10), un <strong>calcul</strong>ator<br />

execută o secvenţă (finiţă) bine precizată <strong>de</strong> operaţii <strong>de</strong>numită algoritm. În<br />

general există mai mulţi <strong>algoritmi</strong> pentru rezolvarea unei probleme. Un algoritm<br />

ˆf pentru problema f produce un răspuns unic <strong>de</strong>terminat pentru date <strong>de</strong> intrare<br />

fixate şi <strong>de</strong>ci poate fi exprimat matematic printr-o funcţie<br />

ˆf : D ∩ F ⊂ R n −→ R m .<br />

Deoarece execuţia unui algoritm se face folosind numere în FVM şi <strong>calcul</strong>ele sunt<br />

însoţite <strong>de</strong> erori, este clar că ˆf(x) este <strong>de</strong> regulă diferit <strong>de</strong> f(x). De asemenea, nu ne<br />

putem aştepta ca algoritmul ˆf să <strong>calcul</strong>eze soluţia unei probleme rău condiţionate<br />

mai precis <strong>de</strong>cât o garantează datele <strong>de</strong> intrare. Totuşi, e <strong>de</strong> dorit ca ˆf să nu introducă<br />

erori exagerat <strong>de</strong> mari. Noţiunea <strong>de</strong> stabilitate <strong>numeric</strong>ă exprimă mărimea<br />

erorilor <strong>numeric</strong>e introduse <strong>de</strong> un algoritm, în ipoteza că datele iniţiale sunt exacte.


0.4. STABILITATEA NUMERICĂ A ALGORITMILOR 13<br />

x <br />

✻<br />

Eroare ”înapoi”<br />

❄<br />

ˆx<br />

f<br />

f<br />

ˆf<br />

f(x)<br />

<br />

❅■<br />

❅❅❅ ❅<br />

❅<br />

Eroare ”înainte”<br />

❅<br />

❅❘ ˆf(x) = f(ˆx)<br />

Date <strong>de</strong> intrare<br />

Date <strong>de</strong> ieşire<br />

Fig. 0.3: Erori înainte şi înapoi<br />

Definiţia 0.4 Un algoritm ˆf, <strong>de</strong>stinat rezolvării problemei f, este <strong>numeric</strong> stabil<br />

dacă una dintre următoarele două condiţii alternative este în<strong>de</strong>plinită:<br />

i) ˆf(x) este aproape <strong>de</strong> f(x) pentru orice intrare x, adică soluţia <strong>calcul</strong>ată aproximează<br />

bine soluţia exactă.<br />

ii) pentru orice intrare x, există un ˆx ∈ D apropiat <strong>de</strong> x astfel încât f(ˆx) să fie<br />

egal cu ˆf(x), adică soluţia <strong>calcul</strong>ată <strong>de</strong> algoritmul ˆf cu date <strong>de</strong> intrare exacte este<br />

egală cu soluţia exactă pentru nişte date <strong>de</strong> intrare uşor perturbate.<br />

Altfel, algoritmul este <strong>numeric</strong> instabil.<br />

Cele două condiţii sunt similare, doar că prima se formulează în spaţiul datelor<br />

<strong>de</strong> ieşire, iar a doua în spaţiul datelor <strong>de</strong> intrare, după cum se poate remarca<br />

în figura 0.3; în mod plastic, eroarea (absolută) ˆf(x) − f(x) este numită eroare<br />

”înainte”, <strong>de</strong>oarece corespun<strong>de</strong> sensului <strong>de</strong> <strong>calcul</strong> al algoritmului, iar ˆx − x eroare<br />

”înapoi”, <strong>de</strong>oarece găsirea unui ˆx care să satisfacă ii) înseamnă întoarcerea în<br />

spaţiul datelor <strong>de</strong> intrare, ulterior aplicării algoritmului. Analiza stabilităţii <strong>numeric</strong>e<br />

a unui algoritm înseamnă cuantificarea erorilor din <strong>de</strong>finiţia 0.4; evaluarea<br />

‖ ˆf(x)−f(x)‖ este caracteristică analizei înainte (directe); evaluarea ‖ˆx−x‖ <strong>de</strong>fineşte<br />

analiza înapoi (inversă).<br />

Noţiunea vagă ”aproape” se poate reexprima prin cea <strong>de</strong> eroare relativă mică<br />

(noţiune <strong>de</strong>stul <strong>de</strong> vagă şi ea); în <strong>calcul</strong>ul <strong>numeric</strong> se folosesc <strong>de</strong>seori astfel <strong>de</strong><br />

exprimări. În mod sigur, o eroare relativă <strong>de</strong> ordinul erorii <strong>de</strong> rotunjire (introduse<br />

<strong>de</strong> (0.7)) caracterizează un algoritm <strong>numeric</strong> stabil 1 : soluţia este <strong>calcul</strong>ată cu<br />

precizia intrinsecă a FVM utilizat.<br />

Este uşor <strong>de</strong> arătat că utilizarea unui algoritm stabil la rezolvarea unei probleme<br />

bine condiţionate conduce la un rezultat <strong>de</strong> înaltă acurateţe 2 .<br />

Într-a<strong>de</strong>văr, din <strong>de</strong>finiţia 0.4 varianta ii), pentru intrarea exactă x există ˆx astfel<br />

încât eroarea relativă este (să zicem) <strong>de</strong> ordinul erorii <strong>de</strong> rotunjire<br />

‖x − ˆx‖<br />

‖x‖<br />

≤ µβ −t<br />

1 În continuare, vom spune ”algoritm stabil” în loc <strong>de</strong> ”algoritm <strong>numeric</strong> stabil”.<br />

2 Atragem atenţia asupra sensurilor diferite pe care le au în <strong>calcul</strong>ul <strong>numeric</strong> termenii precizie şi<br />

acurateţe, aproape sinonimi în limbajul uzual. Precizia se referă la numărul <strong>de</strong> cifre semnificative<br />

din FVM, iar acurateţea la mărimea erorii dintre rezultatul <strong>calcul</strong>at <strong>numeric</strong> şi cel exact.


14 CAPITOLUL 0. CONCEPTE FUNDAMENTALE<br />

şi<br />

f(ˆx) = ˆf(x). (0.13)<br />

Problema fiind bine condiţionată, din (0.11) rezultă că<br />

‖f(x) − f(ˆx)‖<br />

‖f(x)‖<br />

‖x − ˆx‖<br />

= κ ≤ κµβ −t , (0.14)<br />

‖x‖<br />

un<strong>de</strong> κ şi µ sunt <strong>de</strong> ordinul unităţii. Deci, din (0.13) şi (0.14),<br />

‖f(x) − ˆf(x)‖<br />

‖f(x)‖<br />

≤ κµβ −t ,<br />

adică un algoritm stabil nu introduce erori suplimentare semnificative în rezolvarea<br />

unei probleme bine condiţionate.<br />

În mod similar, se poate observa că, în alte situaţii (<strong>de</strong> exemplu pentru probleme<br />

rău condiţionate sau pentru <strong>algoritmi</strong> instabili), mărimea erorii asociate rezultatului<br />

nu poate fi apreciată. Când un algoritm stabil este folosit pentru a rezolva<br />

o problemă rău condiţionată, nu există nici o garanţie că f(ˆx) şi f(x) au valori<br />

apropiate şi, <strong>de</strong>şi f(ˆx) este (aproximativ) egal cu ˆf(x), diferenţa dintre f(x) şi ˆf(x)<br />

poate fi semnificativă. Când un algoritm instabil este folosit pentru rezolvarea unei<br />

probleme bine condiţionate, soluţia <strong>calcul</strong>ată ˆf(x) pentru date exacte <strong>de</strong> intrare<br />

este soluţie exactă a problemei cu ˆx <strong>de</strong>parte <strong>de</strong> x, şi tot aşa este f(ˆx) <strong>de</strong> f(x). În<br />

sfârşit, nu e nici o speranţă <strong>de</strong> a obţine erori mici atunci când un algoritm instabil<br />

este utilizat pentru o problemă rău condiţionată.<br />

Exemplul 0.12 Revenim la problema <strong>calcul</strong>ului sumei, f : R 2 −→ R,<br />

f(x, y) = x + y. Problema poate fi bine sau rău condiţionată în funcţie <strong>de</strong> datele<br />

<strong>de</strong> intrare (vezi exemplul 0.11).<br />

”Algoritmul” <strong>de</strong> <strong>calcul</strong> al sumei în virgulă mobilă ˆf : R 2 −→ R este<br />

ˆf(x, y) = x ⊕ y = fl(x + y),<br />

un<strong>de</strong> fl este o funcţie <strong>de</strong> rotunjire care respectă relaţia (0.7), iar x şi y sunt numere<br />

în FVM; <strong>de</strong>ci, în conformitate cu (0.7),<br />

ˆf(x, y) = x(1 + ρ) + y(1 + ρ),<br />

cu |ρ| <strong>de</strong> ordinul β −t , adică suma <strong>calcul</strong>ată este suma exactă a operanzilor uşor<br />

perturbaţi, şi <strong>de</strong>ci algoritmul <strong>de</strong> sumare este stabil.<br />

♦<br />

Exemplul 0.13 Să analizăm acum algoritmul <strong>de</strong> <strong>calcul</strong> al mărimii<br />

f(a, b, c) = b 2 − 4ac. Presupunem că a, b, c sunt numere în FVM. În conformitate<br />

cu (0.7) avem<br />

ˆf(a, b, c) = b ⊗ b ⊖ 4 ⊗ a ⊗ c = [b 2 (1 + ρ 1 ) − 4ac(1 + ρ 2 )](1 + ρ 3 ),<br />

cu |ρ 1 |, |ρ 2 |, |ρ 3 | <strong>de</strong> ordinul β −t ; am presupus că 4 ⊗ a se <strong>calcul</strong>ează fără erori, ceea<br />

ce e a<strong>de</strong>vărat în baza 2, dar nu şi în baza 10.


0.5.<br />

CALITĂŢILE UNUI ALGORITM NUMERIC 15<br />

Definind<br />

â = a(1 + ρ 2 ), ˆb = b<br />

√<br />

(1 + ρ1 )(1 + ρ 3 ), ĉ = c(1 + ρ 3 ),<br />

constatăm că<br />

ˆf(a, b, c) = ˆb 2 − 4âĉ,<br />

şi â, ˆb, ĉ sunt aproape <strong>de</strong> a, b, respectiv c (în sensul |â − a|/|a| <strong>de</strong> ordinul β −t etc.).<br />

Condiţia ii) a <strong>de</strong>finiţiei 0.4 este în<strong>de</strong>plinită, <strong>de</strong>ci algoritmul este stabil. ♦<br />

Exemplul <strong>de</strong> mai sus este o ilustrare foarte simplă a analizei inverse a erorilor<br />

<strong>de</strong> rotunjire ale unui algoritm. În această tehnică se utilizează limitele (0.7) ale<br />

erorilor introduse <strong>de</strong> operaţiile în virgulă mobilă pentru a <strong>de</strong>monstra că soluţia<br />

<strong>calcul</strong>ată a unei probleme este soluţia exactă a problemei cu date <strong>de</strong> intrare uşor<br />

perturbate. O astfel <strong>de</strong> <strong>de</strong>monstraţie garantează că algoritmul este <strong>numeric</strong> stabil şi,<br />

pentru probleme bine condiţionate, sunt asigurate erori relative mici ale rezultatelor<br />

<strong>calcul</strong>ate.<br />

Pentru probleme nebanale, a arăta că un anume algoritm este stabil poate fi<br />

o sarcină dificilă. Există foarte puţini <strong>algoritmi</strong> pentru care există o <strong>de</strong>monstraţie<br />

completă a stabilităţii <strong>numeric</strong>e. Totuşi, mulţi <strong>algoritmi</strong> importanţi au fost validaţi<br />

în practică printr-o experienţă <strong>de</strong> zeci <strong>de</strong> ani. Cum spunea Wilkinson: ”scopul<br />

principal al analizei erorilor nu este <strong>de</strong> a stabili margini precise, ci <strong>de</strong> a evi<strong>de</strong>nţia<br />

instabilităţile potenţiale ale unui algoritm, dacă ele există, şi, prin aceasta, <strong>de</strong> a găsi<br />

o cale <strong>de</strong> îmbunătăţire a algoritmului” [IV].<br />

În această lucrare vom fi interesaţi mai mult <strong>de</strong> prezentarea celor mai buni <strong>algoritmi</strong><br />

care rezolvă o problemă, şi mai puţin <strong>de</strong> <strong>de</strong>monstrarea — aproape întot<strong>de</strong>auna<br />

extrem <strong>de</strong> ”tehnică” — a stabilităţii lor <strong>numeric</strong>e.<br />

0.5 Calităţile unui algoritm <strong>numeric</strong><br />

Pentru a încheia acest capitol, să precizăm criteriile după care se apreciază calitatea<br />

unui algoritm <strong>numeric</strong>.<br />

• Numărul <strong>de</strong> operaţii. Timpul <strong>de</strong> execuţie al unui program — pe un <strong>calcul</strong>ator<br />

precizat — este o caracteristică <strong>de</strong> prim ordin a acestuia. De regulă, un program se<br />

execută <strong>de</strong> mai multe ori, pentru a rezolva o anume problemă pentru diverse date<br />

<strong>de</strong> intrare; timpul <strong>de</strong> execuţie permite aprecierea numărului <strong>de</strong> soluţii care se pot<br />

obţine într-un anumit timp, <strong>de</strong> obicei impus.<br />

Desigur, este <strong>de</strong> dorit a estima timpul <strong>de</strong> execuţie al unui program înainte <strong>de</strong><br />

crearea sa efectivă, numai pe baza algoritmului implementat <strong>de</strong> program. O bună<br />

măsură este numărul <strong>de</strong> operaţii aritmetice efectuate; în <strong>algoritmi</strong>i <strong>numeric</strong>i ele<br />

constituie <strong>de</strong> obicei partea majoritară a operaţiilor, cele cu întregi sau logice având<br />

o pon<strong>de</strong>re mică, atât ca număr, cât şi ca durată <strong>de</strong> execuţie.<br />

Numim flop o operaţie aritmetică elementară (adunare, scă<strong>de</strong>re, înmulţire, împărţire).<br />

Numărul <strong>de</strong> operaţii al unui algoritm este numărul <strong>de</strong> flopi necesari<br />

obţinerii rezultatului. Trebuie precizat că <strong>de</strong>şi numărul <strong>de</strong> operaţii poate indica<br />

doar cu aproximaţie timpul <strong>de</strong> execuţie pe un <strong>calcul</strong>ator dat, în schimb este o foarte<br />

bună măsură pentru compararea a doi <strong>algoritmi</strong>.


16 CAPITOLUL 0. CONCEPTE FUNDAMENTALE<br />

De regulă, numărul <strong>de</strong> operaţii N op al unui algoritm e funcţie <strong>de</strong> dimensiunea<br />

problemei care, <strong>de</strong> multe ori, poate fi apreciată prin numărul datelor <strong>de</strong> intrare,<br />

N op = f(n). În <strong>calcul</strong>ul <strong>numeric</strong>, <strong>de</strong> obicei f este un polinom (<strong>de</strong> grad mic),<br />

f(n) = a 0 n k + a 1 n k−1 + . . . + a k . Pentru că f poate avea o expresie complicată, se<br />

păstrează doar termenul cel mai semnificativ şi se scrie N op ≈ a 0 n k . O astfel <strong>de</strong><br />

aproximare este cu atât mai bună cu cât n este mai mare. Pentru aprecieri pur<br />

calitative, vom omite a 0 şi vom scrie 3 N op = O(n k ).<br />

• Memoria ocupată. Pentru execuţia unui algoritm (program) este necesară<br />

memorarea datelor <strong>de</strong> intrare, rezultatelor, precum şi a altor valori intermediare.<br />

Numărul <strong>de</strong> elemente în FVM necesare în acest scop se numeşte memoria ocupată<br />

<strong>de</strong> algoritm.<br />

În majoritatea cazurilor, datele <strong>de</strong> intrare nu mai sunt necesare la terminarea algoritmului.<br />

Spaţiul <strong>de</strong> memorie ocupat <strong>de</strong> ele poate fi utilizat pe parcursul execuţiei<br />

algoritmului pentru a memora rezultate parţiale şi/sau finale. În acest caz se spune<br />

că efectuăm <strong>calcul</strong>ele pe loc.<br />

• Stabilitatea <strong>numeric</strong>ă, discutată în paragraful anterior, arată acurateţea rezultatelor<br />

obţinute <strong>de</strong> algoritmul <strong>numeric</strong> (în ipoteza că datele iniţiale sunt exacte).<br />

Aceste trei criterii trebuie corelate cu viteza <strong>calcul</strong>atorului, memoria disponibilă,<br />

numărul <strong>de</strong> cifre semnificative al FVM utilizat.<br />

Desigur, nu trebuie uitată nici un moment condiţionarea problemei, care influenţează<br />

şi ea acurateţea rezultatului. Interesează în special performanţele algoritmului<br />

pentru probleme rău condiţionate, adică atunci când erorile datelor <strong>de</strong> intrare sunt<br />

mult amplificate. În orice caz, <strong>calcul</strong>ul soluţiei e bine a fi însoţit <strong>de</strong> <strong>de</strong>terminarea<br />

(sau estimarea) condiţionării problemei, adică <strong>de</strong> <strong>calcul</strong>ul unei cantităţi <strong>de</strong> tip (0.11).<br />

Putem adăuga astfel un al patrulea criteriu <strong>de</strong> apreciere a unui algoritm:<br />

• Siguranţa în funcţionare – capacitatea <strong>de</strong> a semnala situaţiile în care rezultatul<br />

poate fi afectat <strong>de</strong> erori importante datorate relei condiţionări a problemei. Decizia<br />

<strong>de</strong> a utiliza sau nu un astfel <strong>de</strong> rezultat revine utilizatorului sau unui program<br />

expert.<br />

0.6 Implicaţiile arhitecturii <strong>calcul</strong>atoarelor asupra<br />

organizării <strong>algoritmi</strong>lor<br />

În consi<strong>de</strong>raţiile din secţiunea prece<strong>de</strong>ntă am presupus <strong>calcul</strong>atorul pe care se vor<br />

implementa <strong>algoritmi</strong>i ca având arhitectura clasică von Neumann, schiţată în figura<br />

0.4a; pe un astfel <strong>de</strong> <strong>calcul</strong>ator, în principiu, pentru fiecare operaţie aritmetică<br />

se aduc operanzii din memoria M în unitatea centrală UC, se execută operaţia şi<br />

rezultatul este <strong>de</strong>pus înapoi în M. Cu acest mod <strong>de</strong> operare, timpul <strong>de</strong> execuţie<br />

e dictat esenţialmente <strong>de</strong> numărul <strong>de</strong> operaţii în virgulă mobilă, durata traficului<br />

între M şi UC fiind proporţională cu numărul <strong>de</strong> flopi.<br />

În ultimele două <strong>de</strong>cenii au apărut numeroase tipuri <strong>de</strong> arhitecturi pe care timpul<br />

<strong>de</strong> execuţie a unui algoritm nu mai este proporţional cu numărul <strong>de</strong> operaţii în<br />

3 Se scrie f(n) = O(g(n)) dacă există două constante c 1 , c 2 astfel încât c 1 g(n) ≤ f(n) ≤ c 2 g(n).


0.6. IMPLICAŢIILE ARHITECTURII CALCULATOARELOR 17<br />

UC<br />

❄<br />

UC<br />

✻<br />

UCS<br />

❄<br />

UCV<br />

✻<br />

❄<br />

MR<br />

❄<br />

✻<br />

✻<br />

M<br />

M<br />

MP<br />

(a) (b) (c)<br />

Fig. 0.4: Arhitecturi <strong>de</strong> <strong>calcul</strong>atoare: (a) von Neumann; (b) vectorială; (c) cu<br />

memorie ierarhică<br />

virgulă mobilă. Vom exemplifica în continuare cu două arhitecturi larg răspândite,<br />

în special în gama <strong>calcul</strong>atoarelor <strong>de</strong> mare performanţă.<br />

Calculatoarele vectoriale au două (tipuri <strong>de</strong>) unităţi <strong>de</strong> <strong>calcul</strong>, ca în figura<br />

0.4b. Una dintre unităţi – UCS – este obişnuită; ea execută operaţii scalare, adică<br />

operaţiile aritmetice uzuale. Cealaltă – UCV – este <strong>de</strong>dicată operaţiilor vectoriale,<br />

adică unor operaţii aritmetice <strong>de</strong> acelaşi tip repetate pentru mai multe perechi <strong>de</strong><br />

date; <strong>de</strong> exemplu, adunarea a n perechi <strong>de</strong> numere, x i + y i , i ∈ 1 : n. Dacă pe un<br />

<strong>calcul</strong>ator von Neumann nu e nici o diferenţă <strong>de</strong> viteză între astfel <strong>de</strong> operaţii, pe<br />

<strong>calcul</strong>atoarele vectoriale se execută mult mai rapid operaţiile vectoriale; explicaţia e<br />

relativ simplă: UCV e astfel construită încât datele o parcurg ca pe o bandă rulantă<br />

cu mai multe posturi <strong>de</strong> lucru, fiecare pereche <strong>de</strong> date suferind la un moment dat<br />

o altă operaţie intermediară (dacă sunt p posturi <strong>de</strong> lucru, timpul <strong>de</strong> producere a<br />

unui rezultat este <strong>de</strong> aproximativ p ori mai mic). La aceasta se adaugă şi un mod <strong>de</strong><br />

comunicaţie sofisticat între M şi UCV, astfel încât UCV să poată fi în permanenţă<br />

alimentată cu date. În schimb, UCS prelucrează doar o pereche <strong>de</strong> date la un moment<br />

dat. Deci, un algoritm eficient pe un <strong>calcul</strong>ator vectorial va conţine mai ales<br />

operaţii <strong>de</strong> tip vectorial.<br />

Calculatoarele cu memorie ierarhică au structura sugerată în figura 0.4c. Principala<br />

noutate a acestei arhitecturi este organizarea memoriei pe cel puţin două<br />

niveluri. Timpul <strong>de</strong> acces la memorie creşte odată cu distanţa dintre unitatea centrală<br />

şi memoria respectivă; memoria rapidă (MR) are un timp <strong>de</strong> acces sensibil<br />

mai mic <strong>de</strong>cât cel al memoriei principale (MP), dar şi o capacitate mult mai mică;<br />

aceste caracteristici provin mai ales din tehnologia <strong>de</strong> realizare, diferită <strong>de</strong> cea a<br />

memoriei principale (totuşi, în mod natural, o memorie mai mică este mai rapidă).<br />

Transferurile între UC şi MR durează puţin în comparaţie cu timpul <strong>de</strong> execuţie<br />

al unei operaţii în virgulă mobilă; în schimb, transferurile între MR şi MP durează<br />

mai mult. De aceea, un algoritm eficient pe un <strong>calcul</strong>ator cu memorie ierarhică are<br />

un număr cât mai mic <strong>de</strong> transferuri implicând MP, acesta fiind criteriul principal <strong>de</strong>


18 CAPITOLUL 0. CONCEPTE FUNDAMENTALE<br />

apreciere, şi nu numărul <strong>de</strong> operaţii. Caracteristica tipică a unui astfel <strong>de</strong> algoritm<br />

este organizarea <strong>calcul</strong>elor la nivel <strong>de</strong> bloc <strong>de</strong> matrice, operându-se intensiv cu date<br />

aflate într-o aceeaşi zonă <strong>de</strong> memorie, suficient <strong>de</strong> mică pentru a încăpea în MR.<br />

Concluzia care se impune este că utilizarea unui acelaşi algoritm pentru rezolvarea<br />

unei anume probleme pe toate arhitecturile ar fi ineficientă. Vom sugera,<br />

în capitolele următoare, <strong>meto<strong>de</strong></strong> <strong>de</strong> creştere a eficienţei <strong>algoritmi</strong>lor pe <strong>calcul</strong>atoare<br />

vectoriale şi cu memorie ierarhică. De obicei, este necesară doar o reorganizare<br />

a <strong>calcul</strong>elor; alteori, însă, <strong>algoritmi</strong> noi se dove<strong>de</strong>sc mult mai eficienţi pe aceste<br />

arhitecturi.<br />

O altă clasă <strong>de</strong> arhitecturi <strong>de</strong> mare performanţă cuprin<strong>de</strong> <strong>calcul</strong>atoarele paralele.<br />

Acestea au mai multe procesoare i<strong>de</strong>ntice care pot lucra in<strong>de</strong>pen<strong>de</strong>nt şi care<br />

cooperează printr-un mediu <strong>de</strong> comunicaţie (legături directe sau memorie comună).<br />

Algoritmii eficienţi pe arhitecturi paralele au multe caracteristici ce îi diferenţiază<br />

net <strong>de</strong> cei secvenţiali; tratarea lor impune instrumente specifice, <strong>de</strong> aceea nu îi vom<br />

aborda în prezenta lucrare, ci în una următoare, <strong>de</strong>dicată numai lor. Pentru o<br />

introducere în materie, cititorul interesat poate consulta capitolul 6 din [VI].<br />

0.7 Probleme<br />

P 0.1 Următorul exemplu arată că adunarea în virgulă mobilă nu este asociativă. Să<br />

consi<strong>de</strong>răm numerele x 1 = 0.001, x 2 = 1, x 3 = −1, reprezentate într-un FVM cu β = 10,<br />

t = 3. Cât <strong>de</strong> mare este eroarea relativă atunci când se <strong>calcul</strong>ează y = x 1 + x 2 + x 3 <br />

P 0.2 Găsiţi o limită a erorii relative pentru <strong>calcul</strong>ul în virgulă mobilă al sumei<br />

y = x 1 + x 2 + x 3; presupuneţi că x 1, x 2, x 3 sunt numere în virgulă mobilă.<br />

P 0.3 Să consi<strong>de</strong>răm problema <strong>calcul</strong>ului soluţiei ecuaţiei liniare ax + b = 0, cu a, b ∈ R,<br />

a ≠ 0. Pentru ce valori ale datelor <strong>de</strong> intrare a, b este această problemă rău condiţionată <br />

”Algoritmul” pentru <strong>calcul</strong>ul soluţiei este x = −b/a; este acest algoritm <strong>numeric</strong> stabil <br />

P 0.4 Aceeaşi întrebare pentru ecuaţia (a 1 +a 2)x+(b 1+b 2) = 0, în care datele <strong>de</strong> intrare<br />

sunt a 1, a 2, b 1, b 2 ∈ R.<br />

P 0.5 Se consi<strong>de</strong>ră un FVM <strong>de</strong>finit <strong>de</strong> (β, t, p). Care este distanţa între 1 şi cel mai<br />

apropiat număr reprezentabil în virgulă mobilă, mai mare ca 1 <br />

P 0.6 Găsiţi limita (superioară) a erorii relative a funcţiei <strong>de</strong> rotunjire care asociază<br />

fiecărui x ∈ [−M, M] cel mai apropiat număr în virgulă mobilă.<br />

P 0.7 Ce formulă recomandaţi pentru <strong>calcul</strong>ul în virgulă mobilă: x 2 −y 2 sau (x−y)(x+y) <br />

(Se presupune că x şi y sunt numere în FVM.)


Capitolul 1<br />

Algoritmi elementari <strong>de</strong><br />

<strong>calcul</strong> <strong>numeric</strong><br />

Acest capitol este <strong>de</strong>dicat prezentării noţiunilor matematice aflate la baza <strong>de</strong>zvoltărilor<br />

ulterioare, formulării problemelor <strong>de</strong> <strong>calcul</strong> pe care le vom rezolva, în<br />

diverse variante, pe întreg parcursul lucrării, precum şi <strong>de</strong>scrierii unor primi <strong>algoritmi</strong><br />

numiţi ad-hoc elementari, unii folosiţi ca unelte mai târziu, alţii <strong>de</strong>ja rezolvând<br />

probleme sau cazuri particulare ale unor probleme semnificative.<br />

Noţiunile matematice aparţin în mare majoritate algebrei liniare. Am încercat<br />

o prezentare <strong>de</strong> sine stătătoare, dar, <strong>de</strong>sigur, cunoştinţele anterioare ale cititorului<br />

sunt binevenite.<br />

Fiecare secţiune a capitolului are două părţi: prima, cu nuanţă teoretică, <strong>de</strong><br />

parcurgere a unor <strong>de</strong>finiţii şi proprietăţi fundamentale; a doua, <strong>de</strong> ”aspecte <strong>algoritmi</strong>ce”,<br />

în care sunt prezentaţi şi analizaţi <strong>algoritmi</strong> simpli, moduri <strong>de</strong> memorare<br />

a datelor, artificii <strong>numeric</strong>e etc. Subtitlurile acestor din urmă părţi vor începe cu<br />

sigla AA.<br />

Principalii <strong>algoritmi</strong> prezentaţi rezolvă următoarele probleme: produsul <strong>matriceal</strong><br />

(cu diversele lui cazuri particulare: produsul scalar, produsul exterior, produsul<br />

matrice-vector), <strong>calcul</strong>ul normelor vectoriale şi <strong>matriceal</strong>e, rezolvarea sistemelor<br />

liniare triunghiulare şi <strong>calcul</strong>ul valorilor şi vectorilor proprii ai matricelor<br />

triunghiulare. Sunt prezentate modalităţile prin care se măresc performanţele <strong>algoritmi</strong>lor<br />

pe diverse arhitecturi <strong>de</strong> <strong>calcul</strong>atoare. Capitolul se încheie cu prezentarea<br />

rutinelor BLAS, extrem <strong>de</strong> utilizate în <strong>calcul</strong>ul <strong>numeric</strong>.<br />

1.1 Vectori. Spaţiul vectorial R n<br />

În această lucrare vom utiliza <strong>de</strong> regulă entităţi (vectori şi matrice) construite cu<br />

numere reale; majoritatea <strong>de</strong>finiţiilor şi proprietăţilor sunt valabile şi pentru numere<br />

complexe; vom face diferenţierile necesare atunci când va fi cazul. Un număr real<br />

α ∈ R va fi numit şi scalar; scalarii vor fi notaţi <strong>de</strong> obicei cu litere greceşti mici.


20 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

✻<br />

✻<br />

x 3<br />

✏✶<br />

x 2 ✑✥✥✥✥✥✥<br />

✑<br />

✏✑<br />

✏✏✏✏✏✏<br />

✑<br />

✑<br />

✑<br />

✑<br />

✑✰<br />

(a)<br />

x 1<br />

x<br />

✲<br />

1<br />

✻<br />

e 3 ✑<br />

✑<br />

✑<br />

✲<br />

✑ e ✑ 1<br />

1<br />

1<br />

✑<br />

✑✰ e 2<br />

✑✰<br />

(b)<br />

✲<br />

Fig. 1.1: (a) Un vector în R 3 şi coordonatele sale; (b) vectorii unitate în R 3<br />

Vectori. Un vector real x <strong>de</strong> dimensiune n este o colecţie <strong>de</strong> n numere reale<br />

dispuse ordonat într-o coloană<br />

⎡<br />

x = ⎢<br />

⎣<br />

⎤<br />

x 1<br />

x 2<br />

⎥<br />

.<br />

x n<br />

⎦ , (1.1)<br />

numerele x i fiind numite componente (elemente, sau coordonate) ale vectorului x.<br />

În general, vom nota vectorii cu litere latine mici, iar elementele lor cu litera respectivă<br />

şi indicele poziţiei. Pentru economie <strong>de</strong> spaţiu tipografic, vom nota <strong>de</strong>seori<br />

x = [x 1 . . . x n ] T , un<strong>de</strong> x T = [x 1 . . . x n ] este vectorul linie cu aceleaşi elemente ca<br />

în (1.1), iar indicele superior T <strong>de</strong>notă operaţia <strong>de</strong> transpunere.<br />

Mulţimea tuturor vectorilor <strong>de</strong> dimensiune n va fi notată cu R n şi va fi asimilată<br />

cu spaţiul real n-dimensional. În consecinţă, din punct <strong>de</strong> ve<strong>de</strong>re geometric, un<br />

vector reprezintă segmentul orientat care uneşte originea spaţiului real cu n dimensiuni<br />

cu punctul <strong>de</strong> coordonate (x 1 , . . . , x n ), sau chiar numai acest din urmă punct.<br />

Vectorul cu toate componentele nule va fi notat cu 0, dimensiunea sa reieşind din<br />

context; geometric, acesta este originea spaţiului n-dimensional. Pentru o mai bună<br />

înţelegere, vom ilustra unele concepte în R 2 sau R 3 ; figura 1.1a prezintă un vector<br />

şi semnificaţia (<strong>de</strong> coordonate) a elementelor sale.<br />

Vectorii din R n care au un element egal cu 1 şi celelalte nule se numesc vectori<br />

unitate; ei vor fi notaţi<br />

e i = [0 . . . 0<br />

} {{ }<br />

i−1<br />

1 0<br />

}<br />

.<br />

{{<br />

. . 0<br />

}<br />

] T ,<br />

n−i<br />

indicele arătând poziţia valorii 1. Spre exemplu, vectorii unitate din R 3 sunt<br />

prezentaţi în figura 1.1b.<br />

Doi vectori sunt egali când toate componentele lor <strong>de</strong> acelaşi indice sunt egale;<br />

<strong>de</strong>ci, dacă x, y ∈ R n , atunci x = y când x i = y i , ∀i ∈ 1 : n.


1.1. VECTORI. SPAŢIUL VECTORIAL R N 21<br />

✡✣<br />

✡<br />

✘✘ ✡ ✡ ✘✘✘ ✘ ✘✘✘ ✘ ✘ ✘✿<br />

y<br />

x + y<br />

✲✡ ✡<br />

x<br />

(a)<br />

x<br />

✲<br />

αx<br />

(b)<br />

✲<br />

Fig. 1.2: (a) Suma a doi vectori în R 2 ; (b) Produsul cu un scalar<br />

Introducem acum operaţiile elementare cu vectori.<br />

Suma a doi vectori x, y ∈ R n este vectorul z ∈ R n <strong>de</strong>finit prin z i = x i + y i ,<br />

i ∈ 1 : n; aşadar, suma se face pe componente. În acest fel sunt moştenite toate<br />

proprietăţile adunării numerelor reale:<br />

1. asociativitate (u + (v + w) = (u + v) + w);<br />

2. comutativitate (u + v = v + u);<br />

3. elementul neutru este vectorul nul (x + 0 = x);<br />

4. opusul unui vector x este −x, adică vectorul cu elementele −x i , i = 1 : n<br />

(x + (−x) = 0).<br />

Astfel, R n împreună cu operaţia <strong>de</strong> adunare formează un grup comutativ.<br />

Produsul unui vector x ∈ R n cu un scalar α ∈ R este vectorul y = αx ∈ R n<br />

<strong>de</strong>finit <strong>de</strong> y i = αx i , i ∈ 1 : n; <strong>de</strong>ci, produsul se face multiplicând cu α fiecare<br />

componentă a vectorului x. Produsul cu un scalar este o operaţie externă pe R n .<br />

Semnificaţiile geometrice ale celor două operaţii sunt prezentate în figura 1.2;<br />

adunarea se face după regula paralelogramului, iar produsul cu un scalar modifică<br />

doar lungimea vectorului, păstrându-i direcţia.<br />

Mulţimea R n împreună cu operaţiile <strong>de</strong> adunare şi produs cu un scalar are<br />

structura <strong>de</strong> spaţiu vectorial, adică, în afara structurii <strong>de</strong> grup comutativ faţă <strong>de</strong><br />

adunare, mai sunt satisfăcute următoarele proprietăţi ale produsului cu un scalar:<br />

1. 1 · x = x;<br />

2. α(βx) = (αβ)x;<br />

3. (α + β)x = αx + βx;<br />

4. α(x + y) = αx + αy.<br />

Combinaţie liniară. Fie X ⊂ R n o mulţime având ca elemente vectorii 1<br />

x 1 , x 2 , . . . , x p . Vectorul<br />

y <strong>de</strong>f<br />

= α 1 x 1 + α 2 x 2 + . . . + α p x p =<br />

p∑<br />

α i x i (1.2)<br />

se numeşte combinaţie liniară a vectorilor din X cu coeficienţii α 1 , α 2 , . .., α p ∈ R.<br />

Dacă toţi coeficienţii sunt nuli, combinaţia se numeşte trivială.<br />

Vectorii din X sunt liniar in<strong>de</strong>pen<strong>de</strong>nţi dacă nu există o combinaţie liniară netrivială<br />

a elementelor lui X care să fie nulă. Dacă o astfel <strong>de</strong> combinaţie există, vectorii<br />

din X sunt numiţi liniar <strong>de</strong>pen<strong>de</strong>nţi.<br />

1 Se observă că acum x i este un vector şi nu un element <strong>de</strong> vector; aşadar, folosim indicii şi<br />

pentru a numerota vectorii dintr-o mulţime.<br />

i=1


22 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

Dacă vectorii sunt liniar <strong>de</strong>pen<strong>de</strong>nţi, atunci cel puţin unul dintre ei se poate<br />

exprima printr-o combinaţie liniară a celorlalţi; i.e., dacă ∑ p<br />

i=1 α ix i = 0, atunci<br />

există α j ≠ 0, şi <strong>de</strong>ci x j = − ∑ p<br />

i=1,i̸=j (α i/α j )x i .<br />

Evi<strong>de</strong>nt, într-o mulţime <strong>de</strong> vectori in<strong>de</strong>pen<strong>de</strong>nţi, nici unul dintre ei nu se poate<br />

exprima printr-o combinaţie liniară a celorlalţi. De exemplu, vectorii unitate<br />

e 1 , . . . , e n sunt liniar in<strong>de</strong>pen<strong>de</strong>nţi. Dacă X ⊂ R n este o mulţime <strong>de</strong> vectori<br />

liniar in<strong>de</strong>pen<strong>de</strong>nţi şi y = ∑ p<br />

i=1 α ix i ∈ R n este o combinaţie liniară a acestora,<br />

atunci coeficienţii combinaţiei liniare sunt unici (<strong>de</strong>monstraţi).<br />

Subspaţiu liniar. O mulţime S <strong>de</strong> vectori din R n este numită subspaţiu liniar<br />

al spaţiului R n dacă sunt în<strong>de</strong>plinite următoarele două condiţii:<br />

1. x + y ∈ S, ∀x, y ∈ S;<br />

2. αx ∈ S, ∀α ∈ R, ∀x ∈ S.<br />

Aşadar, orice combinaţie liniară a unor vectori din S aparţine tot lui S; altfel spus,<br />

S e invariant la combinaţii liniare. Evi<strong>de</strong>nt, orice subspaţiu liniar conţine vectorul<br />

nul (originea).<br />

Fie X ⊂ R n o mulţime <strong>de</strong> vectori şi S mulţimea tuturor combinaţiilor liniare ale<br />

vectorilor din X. Atunci S e un subspaţiu liniar, numit subspaţiul generat <strong>de</strong> X. De<br />

exemplu, în R 3 doi vectori generează <strong>de</strong> regulă un plan; dacă vectorii sunt coliniari<br />

(adică există scalarul α a.î. y = αx), atunci subspaţiul generat este o dreaptă.<br />

Fie S ⊂ R n un subspaţiu; o mulţime <strong>de</strong> vectori B ⊂ S este bază a subspaţiului<br />

S dacă:<br />

1. elementele lui B sunt liniar in<strong>de</strong>pen<strong>de</strong>nte;<br />

2. S e generat <strong>de</strong> B.<br />

Aşadar o bază conţine numărul minim <strong>de</strong> vectori cu ajutorul cărora se poate genera<br />

subspaţiul.<br />

Dacă B = {b 1 , . . . , b m }, atunci ∀x ∈ S se scrie în mod unic în forma unei<br />

combinaţii liniare a vectorilor din bază, x = ∑ m<br />

i=1 α ib i . Numerele α i se numesc<br />

componentele sau coordonatele, vectorului x în raport cu baza B.<br />

De exemplu, e 1 , . . . , e n formează o bază pentru R n , numită şi baza canonică;<br />

componentele vectorului x, în sensul <strong>de</strong>finiţiei (1.1), sunt componentele în raport<br />

cu această bază, <strong>de</strong>oarece evi<strong>de</strong>nt x = ∑ n<br />

i=1 x ie i .<br />

Un subspaţiu are o infinitate <strong>de</strong> baze, dar toate au acelaşi număr <strong>de</strong> elemente.<br />

Evi<strong>de</strong>nt, un vector x ≠ 0 are coordonate diferite în raport cu aceste baze.<br />

Dimensiunea unui subspaţiu, notată dim S, este numărul vectorilor din bază,<br />

adică numărul maxim <strong>de</strong> vectori din S liniari in<strong>de</strong>pen<strong>de</strong>nţi sau, cum am menţionat<br />

<strong>de</strong>ja, numărul minim <strong>de</strong> vectori care generează S.<br />

De exemplu, R n are dimensiunea n, numărul <strong>de</strong> vectori din baza canonică; un<br />

plan în R 3 are dimensiunea 2.<br />

Două subspaţii S, T ⊂ R n se numesc complementare dacă<br />

1. S ∩ T = {0}.<br />

2. R n este generat <strong>de</strong> S ∪ T .


1.1. VECTORI. SPAŢIUL VECTORIAL R N 23<br />

✜❈<br />

✻<br />

❈❈❈❈❈❈❈❈❈<br />

✜ ✜✜ <br />

T<br />

S ❈<br />

❈❈<br />

❈ ✑ ✑<br />

❈❈❈❈❈❈✜ ✑<br />

✑<br />

✑✰<br />

✑<br />

✜<br />

<br />

✜ ✜<br />

✲<br />

Fig. 1.3: Subspaţii complementare în R 3 : un plan S şi o dreaptă T<br />

În acest caz vom utiliza notaţia R n = S ⊕ T . Fiecare dintre cele două subspaţii este<br />

numit complementul celuilalt. Orice vector x ∈ R n se poate exprima în mod unic<br />

prin x = s + t, cu s ∈ S, t ∈ T . De asemenea, dim S + dim T = n. De exemplu,<br />

în figura 1.3 sunt reprezentate un plan şi o dreaptă în R 3 , care constituie imaginile<br />

geometrice a două subspaţii complementare.<br />

Să observăm că subspaţiul complementar al unui subspaţiu nu este, în general,<br />

unic. În exemplul din figura 1.3, orice dreaptă care nu aparţine planului este complementara<br />

acestuia.<br />

Spaţiul vectorial complex C n se <strong>de</strong>fineşte analog cu spaţiul R n şi are aceleaşi<br />

proprietăţi, <strong>de</strong>oarece proprietăţile corpului numerelor reale folosite mai sus sunt<br />

i<strong>de</strong>ntice cu cele ale corpului numerelor complexe.<br />

Desigur, orice vector x ∈ C n se poate scrie în forma x = u + iv, cu u, v ∈ R n şi<br />

i unitatea imaginară.<br />

AA. Saxpy. Vom <strong>de</strong>scrie acum în termeni <strong>algoritmi</strong>ci o operaţie fundamentală<br />

cu vectori, anume y ← αx + y, cu x, y ∈ R n , α ∈ R, operaţie numită Saxpy 2 .<br />

Notaţia ←, citită ”ia valoarea”, are semnificaţia <strong>de</strong> atribuire. Cu alte cuvinte,<br />

într-un program ce realizează operaţia şi în care vectorii x şi y reprezintă variabile,<br />

vectorul <strong>calcul</strong>at αx + y este <strong>de</strong>pus în variabila y, suprascriind valoarea iniţială a<br />

acesteia. Vom introduce direct şi alte convenţii <strong>de</strong> scriere a <strong>algoritmi</strong>lor, cu premiza<br />

că cititorul are noţiuni elementare <strong>de</strong>spre limbajele <strong>de</strong> programare <strong>de</strong> nivel înalt.<br />

Algoritmul 1.1 (Saxpy) (Se dau x, y ∈ R n . Se <strong>calcul</strong>ează<br />

y ← αx + y ∈ R n .)<br />

1. Pentru i = 1 : n<br />

1. y i ← y i + αx i<br />

2 Notaţia provine din iniţialele variabilelor folosite: αx Plus y; în BLAS, iniţiala S semnifică<br />

faptul că <strong>calcul</strong>ele se efectuează în Simplă precizie; ea este ataşată în mod tradiţional numelui<br />

operaţiei.


24 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

Comentarii. Instrucţiunea Pentru i = 1 : n înseamnă repetarea execuţiei, pentru<br />

toate valorile indicate ale indicelui i, a instrucţiunilor ce îi urmează (până la prima<br />

instrucţiune aflată la acelaşi nivel cu Pentru). Instrucţiunile sunt referite prin<br />

secvenţe <strong>de</strong> numere cuprinzând (<strong>de</strong> la dreapta spre stânga) numărul din algoritm al<br />

instrucţiunii respective şi numerele instrucţiunilor cărora le este subordonată (<strong>de</strong> la<br />

cea mai apropiată la cea mai <strong>de</strong>părtată). În algoritmul Saxpy, prima instrucţiune<br />

este 1, a doua 1.1.<br />

Contorizând operaţiile executate <strong>de</strong> algoritmul 1.1, constatăm că fiecare execuţie<br />

a instrucţiunii 1.1 necesită 2 flopi (o înmulţire şi o adunare), <strong>de</strong>ci, în total, sunt<br />

necesari N op = 2n flopi.<br />

În continuare, Saxpy va fi privită ca operaţie elementară şi va fi apelată prin<br />

Saxpy(α, x, y); ea face parte din grupul operaţiilor <strong>de</strong> nivel 1, împreună cu alte<br />

operaţii, dintre care unele vor fi prezentate ulterior 3 .<br />

Aşa cum este normal, Saxpy şi celelalte operaţii <strong>de</strong> nivel 1 sunt executate<br />

mai eficient pe <strong>calcul</strong>atoare vectoriale. De aceea, pe astfel <strong>de</strong> <strong>calcul</strong>atoare, există<br />

tendinţa <strong>de</strong> a scrie toţi <strong>algoritmi</strong>i în termeni <strong>de</strong> operaţii <strong>de</strong> nivel 1 şi nu prin operaţii<br />

aritmetice elementare.<br />

♦<br />

1.2 Produs scalar. Norme. Ortogonalitate<br />

Produsul scalar este o funcţie f : R n × R n −→ R cu proprietăţile:<br />

1. f(x, y) = f(y, x) (comutativitate);<br />

2. f(x, y + z) = f(x, y) + f(x, z) (distributivitate);<br />

3. f(x, αy) = αf(x, y);<br />

4. f(x, x) ≥ 0 şi f(x, x) = 0 ⇔ x = 0 (pozitivitate).<br />

Produsul scalar standard în R n , cel pe care îl vom utiliza <strong>de</strong> obicei, se <strong>de</strong>fineşte<br />

prin f(x, y) not<br />

= y T x, un<strong>de</strong> y T x <strong>de</strong>f<br />

= ∑ n<br />

i=1 x iy i . Invităm cititorul să verifice satisfacerea<br />

celor patru proprietăţi ale produsului scalar.<br />

Spaţiul R n împreună cu produsul scalar uzual este un spaţiu euclidian (în el este<br />

valabilă o geometrie similară cu cea din R 2 şi R 3 , cunoscută din liceu).<br />

Norme. Prin normă se asociază unui vector o mărime (lungime). O normă<br />

vectorială este o funcţie ν : R n → R + , notată <strong>de</strong> obicei ν(x) = ‖x‖, care satisface<br />

următoarele condiţii:<br />

1. ‖x‖ > 0, ∀x ∈ R n , x ≠ 0 (pozitivitate);<br />

2. ‖αx‖ = |α| · ‖x‖, ∀x ∈ R n , ∀α ∈ R (omogenitate);<br />

3. ‖x + y‖ ≤ ‖x‖ + ‖y‖, ∀x, y ∈ R n (inegalitatea triunghiului).<br />

Se <strong>de</strong>duce imediat că ‖0‖ = 0 şi ‖ − x‖ = ‖x‖.<br />

Cea mai utilizată normă vectorială este cea indusă <strong>de</strong> produsul scalar şi se<br />

numeşte normă euclidiană sau normă 2:<br />

‖x‖ 2 = √ ∑<br />

x T x = √ n x 2 i . (1.3)<br />

3 Numerotarea nivelelor se face după exponentul lui n din expresia numărului <strong>de</strong> flopi necesari<br />

la execuţie; operaţiile <strong>de</strong> nivel 1 necesită O(n) flopi, cele <strong>de</strong> nivel 2 necesită O(n 2 ) flopi etc.<br />

i=1


1.2. PRODUS SCALAR. NORME. ORTOGONALITATE 25<br />

∞<br />

✻<br />

✬✩<br />

<br />

<br />

❅<br />

❅ ❅ ✟ 1<br />

✫✪<br />

❅ ❜ 2<br />

✲<br />

Fig. 1.4: Cercuri <strong>de</strong> rază 1 în R 2 , în normele 1, 2, ∞<br />

Denumirea <strong>de</strong> normă 2 este justificată <strong>de</strong> faptul că (1.3) este un caz particular<br />

<strong>de</strong> normă p (sau normă Höl<strong>de</strong>r). Pentru p ≥ 1, norma p se <strong>de</strong>fineşte prin<br />

( n<br />

) 1/p<br />

∑<br />

‖x‖ p = |x i | p .<br />

i=1<br />

Alte cazuri particulare <strong>de</strong> normă p folosite curent sunt normele 1 şi infinit,<br />

<strong>de</strong>finite, în ordine, prin<br />

n∑<br />

‖x‖ 1 = |x i |,<br />

i=1<br />

‖x‖ ∞ = max<br />

i=1:n |x i|.<br />

Pentru a ilustra geometric cele trei norme <strong>de</strong> mai sus, figura 1.4 prezintă ”cercurile”<br />

<strong>de</strong> rază 1 în R 2 , adică locul geometric al punctelor x ∈ R 2 pentru care<br />

‖x‖ p = 1, pentru p = 1, 2, ∞.<br />

Două norme pe R n , să zicem ‖ · ‖ q şi ‖ · ‖ r , se numesc echivalente dacă există<br />

γ 1 , γ 2 > 0 astfel încât pentru orice x ∈ R n avem<br />

γ 1 ‖x‖ q ≤ ‖x‖ r ≤ γ 2 ‖x‖ q . (1.4)<br />

Oricare două norme p sunt echivalente. De exemplu (<strong>de</strong>monstraţi !):<br />

‖x‖ ∞ ≤ ‖x‖ 1 ≤ n‖x‖ ∞ ;<br />

‖x‖ ∞ ≤ ‖x‖ 2 ≤ √ n‖x‖ ∞ ;<br />

‖x‖ 2 ≤ ‖x‖ 1 ≤ √ n‖x‖ 2 .<br />

Ortogonalitate. Unghiul α a doi vectori nenuli x, y ∈ R n se <strong>de</strong>fineşte prin<br />

α = arccos(y T x/(‖x‖ · ‖y‖)); geometric, acesta este chiar unghiul format <strong>de</strong> cei doi<br />

vectori în planul generat <strong>de</strong> ei.<br />

Doi vectori x, y ∈ R n se numesc ortogonali dacă produsul lor scalar este nul,<br />

x T y = 0; semnificaţia geometrică este cea naturală: între cei doi vectori este un<br />

unghi drept; <strong>de</strong> aceea vom folosi şi notaţia x ⊥ y.<br />

Vectorii u 1 , u 2 , . . .,u p se numesc ortogonali dacă sunt ortogonali doi câte doi,<br />

adică<br />

u T i u j = 0, ∀i ≠ j, i, j ∈ 1 : p. (1.5)


26 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

Dacă, în plus faţă <strong>de</strong> (1.5), vectorii u i au norme euclidiene unitare, ‖u i ‖ 2 = 1,<br />

∀i = 1 : p, ei sunt numiţi ortonormali.<br />

Vectorii ortogonali sunt liniar in<strong>de</strong>pen<strong>de</strong>nţi; justificarea e intuitivă: un vector<br />

ortogonal pe toţi ceilalţi este ortogonal şi pe orice combinaţie liniară a lor.<br />

Orice subspaţiu <strong>de</strong> dimensiune mai mare ca unu are o infinitate <strong>de</strong> baze ortonormale<br />

4 . De exemplu, baza canonică a R n , e 1 , . . . , e n , este ortonormală. Folosirea<br />

bazelor ortonormale este recomandabilă nu numai datorită proprietăţilor matematice,<br />

dar şi a acurateţii <strong>numeric</strong>e pe care o induc în <strong>calcul</strong>e. Un mod simplu, dar nu<br />

şi <strong>numeric</strong> stabil, <strong>de</strong> a construi o bază ortonormală, pornind <strong>de</strong> la o bază oarecare,<br />

este sugerat în problema 1.6 (algoritmul Gram-Schmidt); <strong>meto<strong>de</strong></strong> <strong>numeric</strong> stabile<br />

vor fi prezentate în capitolele 3 şi 5.<br />

Teorema lui Pitagora se generalizează imediat în R n : vectorii x, y ∈ R n sunt<br />

ortogonali dacă şi numai dacă ‖x + y‖ 2 2 = ‖x‖2 2 + ‖y‖2 2 .<br />

Noţiunea <strong>de</strong> ortogonalitate poate fi extinsă la subspaţii liniare. Vectorul x ∈ R n<br />

este ortogonal pe subspaţiul S ⊂ R n dacă este ortogonal pe orice vector din S. Două<br />

subspaţii S, T ⊂ R n sunt ortogonale dacă orice vector s ∈ S este ortogonal pe orice<br />

vector t ∈ T ; vom nota S ⊥ T .<br />

Un subspaţiu S ⊂ R n este numit complementul ortogonal al subspaţiului<br />

T ⊂ R n dacă cele două subspaţii sunt ortogonale şi complementare. (∀x ∈ R n ,<br />

există vectorii unici s ∈ S, t ∈ T astfel încât x = t + s şi t ⊥ s.) Se utilizează<br />

notaţia S = T ⊥ ; <strong>de</strong>sigur, avem şi T = S ⊥ .<br />

Particularităţi ale spaţiului euclidian complex C n . Produsul scalar uzual<br />

al vectorilor x, y ∈ C n este <strong>de</strong>finit <strong>de</strong> proprietăţi uşor diferite <strong>de</strong> cele ale produsului<br />

scalar din R n ; mai precis, notând cu α complex conjugatul scalarului complex α,<br />

proprietăţile 1 şi 3 <strong>de</strong>vin:<br />

1’. f(x, y) = f(y, x);<br />

3’. f(x, αy) = αf(x, y).<br />

Produsul scalar uzual în C n se <strong>de</strong>fineşte prin y H x = ∑ n<br />

i=1 x iy i .<br />

Doi vectori x, y ∈ C n sunt ortogonali dacă y H x = 0.<br />

Norma euclidiană ‖ · ‖ : C n → R + se <strong>de</strong>fineşte prin ‖x‖ 2 = √ x H x, ∀x ∈ C n ,<br />

un<strong>de</strong> x H x = ∑ n<br />

i=1 |x i| 2 , iar |α| este modulul scalarului complex α.<br />

AA. Calculul produsului scalar. Urmând (1.3), produsul scalar se <strong>calcul</strong>ează<br />

astfel:<br />

Algoritmul 1.2 (DOT – Calculul produsului scalar) (Se dau vectorii<br />

x, y ∈ R n . Se <strong>calcul</strong>ează α = y T x.)<br />

1. α ← 0<br />

2. Pentru i = 1 : n<br />

1. α ← α + x i y i<br />

Comentarii. Algoritmul are 2n operaţii şi face <strong>de</strong>ci parte din grupul operaţiilor<br />

<strong>de</strong> nivel 1. Îl vom apela prin α = DOT(x, y).<br />

4 În general vom spune baze ortogonale în loc <strong>de</strong> ortonormale, presupunând implicit că normele<br />

vectorilor sunt unitare.


1.2. PRODUS SCALAR. NORME. ORTOGONALITATE 27<br />

Datorită erorilor <strong>numeric</strong>e, la execuţie algoritmul DOT nu va <strong>calcul</strong>a α = y T x,<br />

ci o valoare ˆα, <strong>de</strong>spre care se poate <strong>de</strong>monstra (vezi şi problema 1.5):<br />

|ˆα − α| ≤ nε M |y| T |x| + O(ε 2 M ), (1.6)<br />

un<strong>de</strong> |x| este vectorul modulelor elementelor vectorului x. Eroarea nu este neapărat<br />

mică; dacă |y T x| ≪ |y| T |x|, atunci eroarea relativă din (1.6) poate fi mare. ♦<br />

AA. Calculul normelor. Normele 1 şi ∞ se <strong>calcul</strong>ează uşor. De exemplu,<br />

‖x‖ ∞ se <strong>calcul</strong>ează astfel:<br />

Algoritmul 1.3 (Nrminf – Calculul normei infinit a unui vector)<br />

(Se dă x ∈ R n . Se <strong>calcul</strong>ează ‖x‖ ∞ .)<br />

1. norm ← 0<br />

2. Pentru i = 1 : n<br />

1. Dacă |x i | > norm atunci norm ← |x i |<br />

Pentru <strong>calcul</strong>ul normei 2 a unui vector x ∈ R n poate fi utilizat algoritmul 1.2,<br />

apelând DOT(x, x), şi apoi extrăgând radicalul. Există însă posibilitatea ca, <strong>de</strong>şi<br />

‖x‖ 2 este reprezentabil în virgulă mobilă, x T x = ‖x‖ 2 2 să nu fie (<strong>de</strong> exemplu 1025 este<br />

reprezentabil în simplă precizie, dar 10 50 nu) şi atunci <strong>calcul</strong>ul lui x T x să conducă<br />

la <strong>de</strong>păşire superioară. Similar poate apărea o <strong>de</strong>păşire inferioară, care antrenează<br />

pier<strong>de</strong>re <strong>de</strong> precizie sau <strong>de</strong>cizii eronate: ‖x‖ 2 = 0 <strong>de</strong>şi x ≠ 0. Pentru a preveni acest<br />

eveniment care ar împiedica obţinerea rezultatului, se scalează vectorul x, adică se<br />

împart toate elementele sale cu, <strong>de</strong> exemplu, ‖x‖ ∞ (se aduce astfel x la altă scară<br />

<strong>de</strong> mărime). Dacă ˜x = x/‖x‖ ∞ , atunci |˜x i | ≤ 1, ∀i ∈ 1 : n, şi <strong>de</strong>păşirea superioară<br />

este practic imposibilă. (Apariţia unor <strong>de</strong>păşiri inferioare la ridicarea la pătrat a<br />

unor elemente ale vectorului ˜x nu este supărătoare, <strong>de</strong>oarece în acest caz rezultatul<br />

se aproximează cu zero.) Se obţine următorul algoritm.<br />

Algoritmul 1.4 (Nrm2 – Calculul normei 2 a unui vector) (Se dă<br />

x ∈ R n . Se <strong>calcul</strong>ează α = ‖x‖ 2 , efectuând o operaţie <strong>de</strong> scalare.)<br />

1. Se <strong>calcul</strong>ează β = ‖x‖ ∞<br />

2. α = 0<br />

3. Pentru i = 1 : n<br />

1. α ← α + (x i /β) 2<br />

4. α ← β √ α<br />

Comentarii. Se observă că scalarea, care se efectuează în instrucţiunile 1 şi 3.1,<br />

încarcă algoritmul cu n flopi (2) şi n comparaţii (1); cu toate acestea, siguranţa<br />

<strong>calcul</strong>elor impune <strong>de</strong> regulă utilizarea ei, cu excepţia cazurilor în care informaţiile<br />

apriorice <strong>de</strong>spre date exclud apariţia <strong>de</strong>păşirii.<br />

Un rafinament al algoritmului 1.4 este <strong>de</strong> a utiliza pentru scalare nu ‖x‖ ∞ , ci<br />

cea mai apropiată putere a bazei <strong>de</strong> numeraţie a formatului virgulă mobilă utilizat<br />

(<strong>de</strong> regulă 2). Scalările din instrucţiunea 3.1 vor avea rezultate <strong>de</strong> acelaşi ordin <strong>de</strong><br />

mărime ca în cazul scalării cu ‖x‖ ∞ , <strong>de</strong>ci nu va exista pericol <strong>de</strong> <strong>de</strong>păşire superioară,<br />

în schimb toate împărţirile se vor efectua exact, neintroducându-se nici un fel <strong>de</strong><br />

eroare <strong>numeric</strong>ă suplimentară la <strong>calcul</strong>ul normei.<br />


28 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

AA. Ortogonalitate <strong>numeric</strong>ă. Matematic, testul <strong>de</strong> ortogonalitate a doi<br />

vectori x, y ∈ R n este foarte clar: se verifică dacă x T y = 0. Numeric însă, se<br />

întâmplă foarte rar ca DOT(x, y) să fie exact 0; aceasta se datorează atât erorilor<br />

<strong>numeric</strong>e apărute în execuţia algoritmului DOT, cât şi erorilor <strong>de</strong> reprezentare<br />

asociate elementelor celor doi vectori. De aceea, pentru a consi<strong>de</strong>ra doi vectori<br />

<strong>numeric</strong> ortogonali, ne mulţumim cu condiţia<br />

|DOT(x/‖x‖ 2 , y / ‖y‖ 2 ) | < cε M ,<br />

un<strong>de</strong> c ≥ 1 este o constantă mică, adică produsul scalar al vectorilor normalizaţi<br />

să fie <strong>de</strong> acelaşi ordin <strong>de</strong> mărime cu epsilon maşină al formatului virgulă mobilă<br />

utilizat.<br />

1.3 Matrice<br />

Matrice. O matrice reală A este un tablou bidimensional (rectangular) <strong>de</strong><br />

numere reale dispuse pe m linii şi n coloane; notând cu a ij elementul matricei <strong>de</strong><br />

pe linia i şi coloana j, matricea arată astfel<br />

⎡<br />

A = ⎢<br />

⎣<br />

⎤<br />

a 11 a 12 . . . a 1n<br />

a 21 a 22 . . . a 2n<br />

⎥<br />

. . . ⎦<br />

a m1 a m2 . . . a mn<br />

(1.7)<br />

Dacă m = n, matricea se numeşte pătrată.<br />

Mulţimea tuturor matricelor reale (complexe) cu m linii şi n coloane va fi notată<br />

R m×n (respectiv C m×n ). Păstrăm în continuare convenţia <strong>de</strong> a ne referi la cazul<br />

complex doar atunci când este diferit <strong>de</strong> cel real.<br />

Se numeşte diagonală principală a matricei mulţimea poziţiilor <strong>de</strong> indici egali din<br />

tablou; pentru A ∈ R n×n , suma elementelor <strong>de</strong> pe diagonala principală se numeşte<br />

urmă şi se notează tr(A) <strong>de</strong>f<br />

= ∑ n<br />

i=1 a ii.<br />

Operaţii. Definim acum câteva operaţii elementare cu matrice: suma, produsul<br />

cu un scalar, transpunerea.<br />

Suma a două matrice A, B ∈ R m×n este matricea C = A + B ∈ R m×n , <strong>de</strong>finită<br />

prin c ij = a ij + b ij ; aşadar, suma se face adunând elementele <strong>de</strong> pe poziţii corespon<strong>de</strong>nte.<br />

Produsul unei matrice A ∈ R m×n cu un scalar α ∈ R este matricea<br />

B = αA ∈ R m×n , <strong>de</strong>finită prin b ij = αa ij , i = 1 : m, j = 1 : n.<br />

Cu aceste două operaţii — suma şi produsul cu un scalar — R m×n are o structură<br />

<strong>de</strong> spaţiu vectorial <strong>de</strong> dimensiune mn. O bază este E ij , i = 1 : m, j = 1 : n, un<strong>de</strong><br />

E ij este matricea nulă cu excepţia elementului (i, j) egal cu 1.<br />

Transpusa unei matrice A ∈ R m×n este matricea B ∈ R n×m , notată B = A T ,<br />

<strong>de</strong>finită prin b ij = a ji . Propunem cititorului <strong>de</strong>monstrarea următoarelor proprietăţi<br />

simple ale operaţiei <strong>de</strong> transpunere:


1.3. MATRICE 29<br />

1. (A T ) T = A, ∀A ∈ R m×n ;<br />

2. (A + B) T = A T + B T , ∀A, B ∈ R m×n ;<br />

3. (αA) T = αA T , ∀A ∈ R m×n , ∀α ∈ R.<br />

Produsul matrice-vector. În funcţie <strong>de</strong> modul <strong>de</strong> utilizare, o matrice poate fi<br />

interpretată în mai multe feluri. De exemplu, o matrice poate fi văzută ca alăturare<br />

<strong>de</strong> vectori:<br />

A = [a 1 a 2 . . . a n ], (1.8)<br />

cu a 1 , a 2 , . . . , a n ∈ R m notându-se coloanele matricei A. Această interpretare este<br />

utilă în special în lucrul cu subspaţii.<br />

Cu notaţia (1.8), produsul dintre matricea A ∈ R m×n şi vectorul x ∈ R n este<br />

vectorul y ∈ R m<br />

y <strong>de</strong>f<br />

= Ax =<br />

n∑<br />

a j x j , (1.9)<br />

i.e. combinaţia liniară a coloanelor lui A cu coeficienţii x j . Un caz particular este<br />

produsul dintre matricea A şi vectorul unitate e j , care are ca rezultat coloana j a<br />

matricei: Ae j = a j .<br />

Se poate observa că produsul matrice-vector <strong>de</strong>fineşte o transformare liniară<br />

f : R n → R m , f(x) = Ax, adică o aplicaţie cu proprietăţile (evi<strong>de</strong>nt satisfăcute în<br />

cazul nostru): f(u + v) = f(u) + f(v), f(αu) = αf(u), ∀u, v ∈ R n , α ∈ R.<br />

Matrice şi subspaţii liniare. Deoarece matricea A poate fi privită ca o<br />

”mulţime” <strong>de</strong> vectori (coloane), se impune o notaţie specială pentru subspaţiul<br />

generat <strong>de</strong> coloanele matricei, numit imaginea acesteia:<br />

j=1<br />

ImA = {y ∈ R m | ∃x ∈ R n astfel încât y = Ax}. (1.10)<br />

Un alt subspaţiu interesant, <strong>de</strong> data asta în R n , este cel al vectorilor având ca<br />

elemente coeficienţii combinaţiilor liniare nule ale coloanelor lui A, numit nucleul<br />

matricei A:<br />

KerA = {x ∈ R n | Ax = 0}. (1.11)<br />

O proprietate fundamentală a acestor subspaţii este dată <strong>de</strong><br />

Teorema 1.1 Dacă A ∈ R m×n , atunci ImA şi KerA T sunt subspaţii ortogonale şi<br />

complementare în R m , i.e.<br />

1. ImA ⊥ KerA T .<br />

2. R m = ImA ⊕ KerA T .<br />

Demonstraţie. 1. Fie y = Ax ∈ ImA şi z ∈ KerA T . Atunci y T z = x T A T z = 0.<br />

2. Fie z ⊥ ImA. Atunci x T A T z = 0, oricare x ∈ R n , <strong>de</strong>ci A T z = 0. ♦<br />

Evi<strong>de</strong>nt, teorema poate fi aplicată pentru A T , şi <strong>de</strong>ci avem ImA T ⊥ KerA şi<br />

R n = ImA T ⊕ KerA.


30 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

y 3<br />

✻<br />

(1,0,1)<br />

✒<br />

(0,1,1)<br />

◗❦<br />

◗<br />

◗<br />

y 1<br />

◗ ImA<br />

✲<br />

✟<br />

✟<br />

✟ ✟<br />

y 2 ✟✙<br />

✟<br />

KerA T<br />

• (1,1,-1)<br />

Fig. 1.5: KerA T este complementul ortogonal al lui ImA. Datele sunt cele din<br />

exemplul 1.1<br />

Exemplul 1.1 Fie A =<br />

⎡<br />

⎣ 1 0<br />

0 1<br />

1 1<br />

⎤<br />

⎦.<br />

Atunci, S = ImA = {y ∈ R 3 | y = ⎣<br />

⎡<br />

⎤<br />

x 1<br />

x 2<br />

⎦, x 1 , x 2 ∈ R}, adică S este<br />

x 1 + x 2<br />

planul <strong>de</strong> ecuaţie y 3 = y 1 + y 2 .<br />

T = KerA T = {y ∈ R⎡<br />

3 | A T y ⎤= 0} = {y ⎛∈⎡<br />

R 3 | ⎤y 2 ⎞+ y 3 = 0, y 1 + y 3 = 0}, <strong>de</strong>ci<br />

avem T = {y ∈ R 3 | y =<br />

Vezi figura 1.5.<br />

⎣ 1 1<br />

−1<br />

⎦α} = Im ⎝⎣ 1 1 ⎦⎠.<br />

−1<br />

Privind în continuare matricea A în forma (1.8), rangul matricei A este dimensiunea<br />

subspaţiului ImA generat <strong>de</strong> coloanele lui A. Aşadar rangA = dim(ImA),<br />

sau, altfel spus, rangul este numărul maxim <strong>de</strong> coloane liniar in<strong>de</strong>pen<strong>de</strong>nte din A.<br />

Se poate <strong>de</strong>monstra că rangA = rangA T şi <strong>de</strong>ci rangul este totodată şi numărul<br />

maxim <strong>de</strong> linii liniar in<strong>de</strong>pen<strong>de</strong>nte din A. Recapitulând:<br />

♦<br />

dimImA = dimImA T not<br />

= r,<br />

dimKerA = n − r,<br />

dimKerA T = m − r.<br />

(1.12)<br />

O matrice A ∈ R m×n având coloanele liniar in<strong>de</strong>pen<strong>de</strong>nte se numeşte monică;<br />

în acest caz, m ≥ n, rangA = n şi KerA = {0}. Se mai spune că A are rang maxim<br />

pe coloane.<br />

O matrice A ∈ R m×n având liniile liniar in<strong>de</strong>pen<strong>de</strong>nte se numeşte epică; atunci<br />

m ≤ n, rangA = m şi ImA = R m ; se spune că A are rang maxim pe linii.


1.3. MATRICE 31<br />

O matrice A ∈ R m×n având una din dimensiuni egală cu 1 este un vector; dacă<br />

n = 1, vectorul este coloană (accepţiunea implicită), iar dacă m = 1 vectorul este<br />

linie. Este clar că transpusa unui vector linie este un vector coloană şi reciproc. În<br />

mod analog cu (1.8), o matrice poate fi scrisă evi<strong>de</strong>nţiind liniile:<br />

⎡ ⎤<br />

a T 1<br />

a T<br />

A = ⎢<br />

⎣<br />

2.<br />

a T m<br />

⎥<br />

⎦ . (1.13)<br />

Atenţie: acum a T i e o notaţie pentru vectorul format <strong>de</strong> linia i a matricei A; a i nu<br />

este coloana i din (1.8). Pentru a evita confuziile, vom folosi şi notaţiile: A(:, i)<br />

pentru coloana i din A, respectiv A(i, :) pentru linia i din A.<br />

Folosind forma (1.13) a matricei A, se poate observa uşor că produsul matricevector<br />

se poate exprima prin intermediul unor produse scalare:<br />

⎡<br />

Ax =<br />

⎢<br />

⎣<br />

a T 1 x ⎤<br />

.<br />

a T m x<br />

⎥<br />

⎦. (1.14)<br />

AA. Gaxpy. Vom prezenta acum mai multe implementări ale produsului<br />

matrice-vector, sub forma operaţiei y ← Ax + y, numită Gaxpy 5 .<br />

Din (1.9), la nivel <strong>de</strong> element, operaţia se scrie y i ← y i + ∑ n<br />

j=1 a ijx j , şi <strong>de</strong>ci<br />

Algoritmul 1.5 (Gaxpy – Produs matrice-vector) (Se dau<br />

A ∈ R m×n , x ∈ R n . Se <strong>calcul</strong>ează y ← Ax + y ∈ R m utilizând operaţii<br />

elementare.)<br />

1. Pentru i = 1 : m<br />

1. Pentru j = 1 : n<br />

1. y i ← y i + a ij x j<br />

Se observă imediat că bucla interioară reprezintă o operaţie DOT, corespunzând<br />

exprimării produsului matrice-vector în forma (1.14). Algoritmul <strong>de</strong> mai sus<br />

se scrie <strong>de</strong>ci, în forma vectorială<br />

Algoritmul 1.6 (Se dau A ∈ R m×n , x ∈ R n .<br />

y ← Ax + y ∈ R m utilizând operaţii DOT.)<br />

1. Pentru i = 1 : m<br />

1. y i ← y i + DOT(A(i, :), x)<br />

Se <strong>calcul</strong>ează<br />

Inversând acum ordinea buclelor din algoritmul 1.5, ceea ce nu afectează în nici<br />

un fel rezultatul (ordinea operaţiilor pentru <strong>calcul</strong>ul fiecărei sume y i în parte este<br />

aceeaşi), obţinem<br />

Algoritmul 1.7 (Se dau A ∈ R m×n , x ∈ R n .<br />

y ← Ax + y ∈ R m utilizând operaţii elementare.)<br />

5 Prescurtare pentru General Ax Plus y.<br />

Se <strong>calcul</strong>ează


32 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

1. Pentru j = 1 : n<br />

1. Pentru i = 1 : m<br />

1. y i ← y i + a ij x j<br />

Bucla interioară reprezintă acum o operaţie Saxpy, corespunzând exprimării<br />

produsului matrice-vector în forma (1.9), care este o sumă <strong>de</strong> vectori. Algoritmul<br />

1.7 se rescrie <strong>de</strong>ci în forma vectorială:<br />

Algoritmul 1.8 (Se dau A ∈ R m×n , x ∈ R n .<br />

y ← Ax + y ∈ R m folosind operaţii Saxpy.)<br />

1. Pentru j = 1 : n<br />

1. y ← Saxpy(x j , A(:, j), y)<br />

Se <strong>calcul</strong>ează<br />

Comentarii. Toţi <strong>algoritmi</strong>i <strong>de</strong> mai sus au 2n 2 operaţii. De aceea Gaxpy<br />

face parte din grupul operaţiilor <strong>de</strong> nivel 2. Vom face referinţă la ea în forma<br />

y = Gaxpy(A, x, y). Desigur, implementările din <strong>algoritmi</strong>i 1.6 şi 1.8 vor fi <strong>de</strong>osebit<br />

<strong>de</strong> eficiente pe <strong>calcul</strong>atoare vectoriale.<br />

♦<br />

1.4 Înmulţirea matricelor<br />

Dedicăm o secţiune separată înmulţirii <strong>de</strong> matrice (şi unor noţiuni conexe),<br />

<strong>de</strong>oarece această operaţie este specifică (nu se poate <strong>de</strong>fini în general produsul a<br />

doi vectori cu rezultat vector 6 ) şi apare <strong>de</strong>seori în construcţia <strong>algoritmi</strong>lor <strong>de</strong> nivel<br />

superior, <strong>de</strong>venind astfel interesantă atât ”teoretic”, cât şi din punctul <strong>de</strong> ve<strong>de</strong>re al<br />

<strong>de</strong>taliilor <strong>de</strong> implementare.<br />

Definiţia 1.1 Fie A ∈ R m×l şi B ∈ R l×n , două matrice; produsul lor este matricea<br />

C = AB ∈ R m×n , <strong>de</strong>finită prin<br />

c ij =<br />

l∑<br />

a ik b kj , i = 1 : m, j = 1 : n.<br />

k=1<br />

Cazuri particulare. Să discutăm întâi cazurile particulare în care cel puţin<br />

una dintre dimensiuni este egală cu 1.<br />

Dacă m = n = 1, atunci A not<br />

= x T este un vector linie, B not<br />

= y este un vector<br />

coloană, ambii în R l , iar produsul lor coinci<strong>de</strong> cu simplul produs scalar AB = x T y.<br />

Dacă l = 1, atunci A not<br />

= x este un vector coloană în R m , B not<br />

= y T este un<br />

vector linie în R n , iar produsul lor este matricea C = xy T ∈ R m×n , <strong>de</strong>finită prin<br />

c ij = x i y j ; această operaţie cu doi vectori poartă numele <strong>de</strong> produs exterior şi va fi<br />

notată prin OUT(x, y).<br />

Dacă n = 1, atunci B not<br />

= y este un vector coloană şi operaţia AB este o înmulţire<br />

matrice-vector.<br />

Dacă m = 1, atunci A not<br />

= x T este un vector linie şi AB = x T B este un vector<br />

linie (înmulţire vector linie - matrice).<br />

6 Produsul ”vectorial” a × b este posibil, printr-un acci<strong>de</strong>nt fericit căruia îi este îndatorată<br />

întreaga fizică clasică, numai în R 3 .


1.4. ÎNMULŢIREA MATRICELOR 33<br />

Forme ale produsului <strong>matriceal</strong>. Vom evi<strong>de</strong>nţia acum mai multe forme<br />

<strong>de</strong> prezentare a înmulţirii a două matrice, folosind ca operaţii elementare cazurile<br />

particulare prezentate mai sus.<br />

1. Să privim A ca alăturare <strong>de</strong> vectori linie, ca în (1.13), şi B ca alăturare <strong>de</strong><br />

vectori coloană, ca în (1.8). Se observă imediat din <strong>de</strong>finiţie că c ij = a T i b j, adică<br />

fiecare element al rezultatului poate fi exprimat printr-un produs scalar (DOT).<br />

2. Privim acum A partiţionată pe coloane şi B pe linii. Produsul lor se poate<br />

exprima ca o sumă <strong>de</strong> produse exterioare:<br />

⎡ ⎤<br />

b T<br />

⎢<br />

C = AB = [a 1 . . . a l ] ⎣<br />

1.<br />

b T l<br />

⎥<br />

⎦ =<br />

l∑<br />

a k b T k . (1.15)<br />

Demonstraţie: c ij = ∑ l<br />

k=1 (a kb T k ) ij = ∑ l<br />

k=1 (a k) i (b T k ) j = ∑ l<br />

k=1 a ikb kj .<br />

3. Punem acum în evi<strong>de</strong>nţă numai coloanele matricei B. Atunci<br />

k=1<br />

C = AB = A[b 1 . . . b n ] = [Ab 1 . . . Ab n ], (1.16)<br />

<strong>de</strong>ci fiecare coloană a produsului este obţinută prin înmulţirea matrice-vector dintre<br />

matricea A şi coloana respectivă a lui B.<br />

4. Fie acum A partiţionată pe linii. Atunci<br />

⎡ ⎤ ⎡ ⎤<br />

C = AB =<br />

⎢<br />

⎣<br />

a T 1.<br />

a T m<br />

⎥<br />

⎦B =<br />

⎢<br />

⎣<br />

a T 1 B<br />

.<br />

a T mB<br />

⎥<br />

⎦ , (1.17)<br />

<strong>de</strong>ci fiecare linie a produsului este obţinută prin înmulţirea vector linie - matrice<br />

dintre linia respectivă a lui A şi matricea B.<br />

5. Să exprimăm acum coloanele produsului C în funcţie <strong>de</strong> coloanele matricei<br />

A. Cu ajutorul relaţiei (1.16) se obţine<br />

c j = Ab j =<br />

l∑<br />

b kj a k , (1.18)<br />

<strong>de</strong>ci orice coloană din C este combinaţie liniară a coloanelor matricei A.<br />

6. În sfârşit, o ultimă formă, în care vom exprima liniile produsului C în funcţie<br />

<strong>de</strong> liniile matricei B. Din (1.17) rezultă<br />

k=1<br />

l∑<br />

c T i = a T i B = a ik b T k . (1.19)<br />

Proprietăţi. Înmulţirea <strong>de</strong> matrice are unele proprietăţi imediate, prezentate în<br />

continuare; presupunem că matricele au dimensiuni potrivite operaţiilor efectuate;<br />

<strong>de</strong>monstraţiile sunt lăsate cititorului.<br />

1. A(BC) = (AB)C (asociativitate);<br />

2. A(B + C) = AB + AC (distributivitate);<br />

k=1


34 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

3. (AB) T = B T A T .<br />

Trebuie subliniat faptul că înmulţirea <strong>de</strong> matrice nu este comutativă. Să <strong>de</strong>taliem<br />

puţin; consi<strong>de</strong>răm A ∈ R m×l şi B ∈ R l×n , cazul cel mai general pentru care este<br />

<strong>de</strong>finit produsul AB; dacă m ≠ n, atunci produsul BA nici măcar nu este <strong>de</strong>finit.<br />

Dacă m = n, atunci AB ∈ R m×l , iar BA ∈ R l×m ; prin urmare, dacă m ≠ l, atunci<br />

AB şi BA au dimensiuni diferite, <strong>de</strong>ci nu se pune problema egalităţii. În fine, dacă<br />

şi m = l, <strong>de</strong>ci ambele matrice sunt pătrate, [ atunci ] egalitatea [ ] AB = BA nu are loc,<br />

1 1 1 2<br />

în general; un exemplu simplu: A = , B = .<br />

1 1 3 4<br />

Matrice pătrate. Ne vom ocupa în continuare <strong>de</strong> unele aspecte specifice matricelor<br />

pătrate din R n×n , a căror mulţime are structură <strong>de</strong> inel necomutativ. Matricea<br />

unitate <strong>de</strong> ordinul n are elementele <strong>de</strong> pe diagonala principală egale cu 1 şi<br />

toate celelalte elemente nule; ea este notată prin I n , sau numai I dacă dimensiunea<br />

rezultă din context; scrisă pe coloane, matricea unitate are forma I n = [e 1 . . . e n ].<br />

Fie o matrice A ∈ R n×n ; dacă există o matrice X ∈ R n×n astfel încât<br />

AX = XA = I, atunci X se numeşte inversa matricei A şi se notează cu A −1 .<br />

O matrice care are inversă se numeşte inversabilă; matricea inversă este unică. Se<br />

poate <strong>de</strong>monstra că mulţimea matricelor inversabile din R n×n are o structură <strong>de</strong><br />

grup (necomutativ) în raport cu înmulţirea, notat GL(n).<br />

Se pune întrebarea când este o matrice inversabilă Vom menţiona <strong>de</strong>ocamdată,<br />

fără a <strong>de</strong>monstra, că inversabilitatea este echivalentă cu condiţia rangA = n, adică<br />

cu in<strong>de</strong>pen<strong>de</strong>nţa coloanelor (şi liniilor) matricei A. (O altă condiţie echivalentă este<br />

KerA = {0}, i.e. KerA are dimensiune nulă.) Testarea <strong>numeric</strong>ă a inversabilitaţii<br />

va fi o problemă tratată mai mult sau mai puţin explicit în capitolele următoare,<br />

<strong>meto<strong>de</strong></strong>le prezentate fiind din ce în ce mai sigure, dar şi mai sofisticate.<br />

O ultimă proprietate: inversarea şi transpunerea unei matrice sunt operaţii care<br />

comută între ele, adică (A T ) −1 = (A −1 ) T not<br />

= A −T .<br />

Echivalenţă. Două matrice A, B ∈ R m×n se numesc echivalente la dreapta<br />

dacă există o matrice T ∈ R n×n inversabilă astfel încât B = AT. Avem:<br />

Propoziţia 1.1 Dacă A, B ∈ R m×n sunt echivalente la dreapta, atunci avem ImA =<br />

ImB.<br />

Demonstraţie. Din <strong>de</strong>finiţie, există T astfel încât B = AT. Evi<strong>de</strong>nţiind coloanele<br />

din A şi B şi folosind (1.18) se obţine b j = At j = ∑ n<br />

i=1 t ija i , <strong>de</strong>ci orice coloană<br />

din B este combinaţie liniară a coloanelor matricei A; atunci b j ∈ ImA, pentru<br />

j ∈ 1 : n, şi <strong>de</strong>ci ImB ⊂ ImA.<br />

Cum T este inversabilă, A = BT −1 , şi un raţionament similar conduce la concluzia<br />

ImA ⊂ ImB.<br />

♦<br />

Dacă matricele echivalente la dreapta A şi B au coloanele liniar in<strong>de</strong>pen<strong>de</strong>nte,<br />

atunci coloanele fiecăreia formează o bază pentru ImA = ImB. În acest caz, matricea<br />

T este numită schimbare <strong>de</strong> bază (în R n , din baza A în baza B).<br />

Fie un vector x ∈ ImA; atunci x se exprimă unic în fiecare dintre cele două<br />

baze: x = Ac = ∑ n<br />

i=1 γ ia i , cu c = [γ 1 . . .γ n ] T şi, respectiv, x = Bd = ∑ n<br />

i=1 δ ib i , cu


1.4. ÎNMULŢIREA MATRICELOR 35<br />

d = [δ 1 . . . δ n ] T ; vectorii c şi d conţin coordonatele în cele două baze. Cum B = AT,<br />

atunci x = Ac = ATd, din unicitate rezultând c = Td, sau d = T −1 c. Această<br />

ultimă relaţie justifică <strong>de</strong>numirea <strong>de</strong> transformare <strong>de</strong> coordonate dată matricei T −1<br />

(din nou, din baza A în baza B).<br />

Desigur, dacă A şi B sunt echivalente la dreapta, atunci şi KerA T = KerB T ,<br />

consecinţă a propoziţiei <strong>de</strong> mai sus şi a teoremei 1.1.<br />

Deoarece înmulţirea <strong>de</strong> matrice nu este comutativă, are sens noţiunea <strong>de</strong> echivalenţă<br />

la stânga; matricele A, B ∈ R m×n se numesc echivalente la stânga dacă există<br />

o matrice S ∈ R m×m inversabilă astfel încât B = SA. În acest caz, ImAT = ImB T<br />

şi KerA = KerB.<br />

Dacă coloanele fiecăreia dintre matricele echivalente la stânga A şi B formează<br />

o bază pentru ImA = ImB, atunci din (1.16) a j = Sb j , <strong>de</strong>ci matricea S transformă<br />

vectorii unei baze în vectorii celeilalte.<br />

Două matrice sunt echivalente (bilateral) dacă există S ∈ R m×m , T ∈ R n×n<br />

inversabile astfel încât B = SAT. S şi T se numesc generic transformări (<strong>de</strong><br />

echivalenţă).<br />

AA. Algoritmi. Vom prezenta mai multe variante <strong>de</strong> <strong>calcul</strong> al produsului <strong>matriceal</strong>,<br />

variante ce diferă, în esenţă, prin ordinea în care sunt efectuate operaţiile<br />

scalare. În acest mod punem în evi<strong>de</strong>nţă diverse posibilităţi <strong>de</strong> organizare a <strong>calcul</strong>elor<br />

în ve<strong>de</strong>rea unei exploatări optime a particularităţilor arhitecturale ale <strong>calcul</strong>atorului<br />

ţintă.<br />

Pentru început prezentăm un algoritm pentru produsul exterior, singurul caz<br />

particular ne<strong>de</strong>taliat până acum în care cel puţin o dimensiune a operanzilor înmulţirii<br />

este 1.<br />

Algoritmul 1.9 (OUT – Calculul produsului exterior) (Se dau<br />

x ∈ R m , y ∈ R n . Se <strong>calcul</strong>ează C = xy T ∈ R m×n .)<br />

1. Pentru j = 1 : n<br />

1. Pentru i = 1 : m<br />

1. c ij ← x i y j<br />

În cazul general, o implementare directă a înmulţirii <strong>de</strong> matrice, folosind <strong>de</strong>finiţia,<br />

este prezentată în continuare.<br />

Algoritmul 1.10 (MM – Înmulţire <strong>matriceal</strong>ă) (Se dau<br />

A ∈ R m×l , B ∈ R l×n . Se <strong>calcul</strong>ează C = AB ∈ R m×n .)<br />

1. C ← 0<br />

2. Pentru j = 1 : n<br />

1. Pentru i = 1 : m<br />

1. Pentru k = 1 : l<br />

1. c ij ← c ij + a ik b kj<br />

Rezultatul acestui algoritm nu se modifică dacă ordinea celor trei bucle Pentru<br />

este alta. Algoritmul <strong>de</strong> mai sus se mai numeşte ”forma jik” a produsului <strong>matriceal</strong>.<br />

Bucla Pentru cea mai interioară se poate înlocui cu apelul produsului scalar<br />

DOT(A(i, :), B(:, j)), obţinându-se astfel un algoritm cu operaţii vectoriale. Cele<br />

două buclePentru interioare se pot înlocui cu un apel la Gaxpy(A, B(:, j), C(:, j)),<br />

după cum sugerează direct relaţia (1.16).<br />

Forma jki pune în evi<strong>de</strong>nţă operaţii Saxpy, având la bază relaţia (1.18):


36 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

Algoritmul 1.11 (Se dau A ∈ R m×l , B ∈ R l×n . Se <strong>calcul</strong>ează<br />

C = AB ∈ R m×n . Forma jki.)<br />

1. C ← 0<br />

2. Pentru j = 1 : n<br />

1. Pentru k = 1 : l<br />

1. C(:, j) ← Saxpy(B(k, j), A(:, k), C(:, j))<br />

Din nou cele două bucle interioare se pot înlocui cu Gaxpy.<br />

Forma kji a algoritmului este o implementare directă a formulei (1.15), care<br />

evi<strong>de</strong>nţiază produse exterioare.<br />

Algoritmul 1.12 (Se dau A ∈ R m×l , B ∈ R l×n . Se <strong>calcul</strong>ează<br />

C = AB ∈ R m×n folosind operaţii OUT.)<br />

1. C ← 0<br />

2. Pentru k = 1 : l<br />

1. C ← C + OUT(A(:, k), B(k, :))<br />

Apelul rutinei OUT înlocuieşte buclele Pentru cu indicii j şi i.<br />

Formele ijk, kij şi ikj sunt, în această ordine, variante ale celor trei forme<br />

prezentate mai sus. Permutarea buclelor i şi j nu este esenţială, <strong>de</strong>oarece acestea<br />

au rolul <strong>de</strong> parcurgere a matricei C, pe linii sau pe coloane. Acest lucru poate<br />

<strong>de</strong>veni important dacă se ţine seama <strong>de</strong> modul <strong>de</strong> adresare a elementelor matricei<br />

impus <strong>de</strong> limbajul <strong>de</strong> programare utilizat. De exemplu, în FORTRAN se preferă<br />

organizarea pe coloane, corespunzător formelor jik, jki, kji, <strong>de</strong>oarece matricele<br />

sunt memorate pe coloane.<br />

În oricare dintre formele menţionate, înmulţirea <strong>de</strong> matrice necesită 2mnl flopi,<br />

<strong>de</strong>ci 2n 3 în cazul matricelor pătrate, şi face parte din grupul operaţiilor <strong>de</strong> nivel 3.<br />

Vom face referire la ea în forma C = MM(A, B).<br />

Înmulţirea matricelor complexe. Algoritmii <strong>de</strong> mai sus, ca şi toate consi<strong>de</strong>raţiile<br />

care îi preced, sunt valabili şi pentru înmulţirea matricelor complexe<br />

C = AB ∈ C m×n , cu A ∈ C m×l , B ∈ C l×n . Diferenţa constă în numărul <strong>de</strong><br />

flopi necesari execuţiei. Dacă adunarea a două numere complexe se face în doi flopi<br />

(unul pentru partea reală, altul pentru partea imaginară), în schimb înmulţirea<br />

necesită şase:<br />

(α + iβ)(γ + iδ) = αγ − βδ + i(αδ + βγ). (1.20)<br />

Aşadar înmulţirea matricelor complexe se execută în aproximativ 8mnl flopi (câte<br />

mnl înmulţiri şi adunări <strong>de</strong> scalari complecşi).<br />

Aceeaşi observaţie poate fi făcută scriind A = A 1 + iA 2 , cu A 1 , A 2 ∈ R m×l ,<br />

B = B 1 + iB 2 , cu B 1 , B 2 ∈ R l×n , şi<br />

C = A 1 B 1 − A 2 B 2 + i(A 1 B 2 + A 2 B 1 ). (1.21)<br />

Înmulţirea matricelor complexe se poate efectua <strong>de</strong>ci prin patru produse (şi două<br />

adunări) <strong>de</strong> matrice reale.<br />

Numărul <strong>de</strong> operaţii se poate reduce printr-un mic artificiu <strong>de</strong> <strong>calcul</strong>; o formă<br />

echivalentă cu (1.20) este<br />

(α + iβ)(γ + iδ) = αγ − βδ + i((α + β)(γ + δ) − αγ − βδ). (1.22)


1.5. NORME MATRICEALE 37<br />

Aparent, nu se câştigă nimic, <strong>de</strong>oarece în loc <strong>de</strong> patru înmulţiri şi două adunări<br />

reale, ca în (1.20), avem trei înmulţiri şi cinci adunări. Egalitatea (1.22) se scrie<br />

însă i<strong>de</strong>ntic şi în cazul <strong>matriceal</strong>, înlocuindu-se (1.21) cu<br />

G = A 1 B 1 ,<br />

H = A 2 B 2 ,<br />

C = G − H + i((A 1 + A 2 )(B 1 + B 2 ) − G − H).<br />

(1.23)<br />

Aşadar C se <strong>calcul</strong>ează acum cu doar trei înmulţiri <strong>de</strong> matrice, adică 6mnl flopi, şi<br />

cinci adunări a căror contribuţie la numărul <strong>de</strong> operaţii este neglijabilă.<br />

Acest algoritm rapid pentru înmulţirea matricelor complexe are totuşi şi un<br />

<strong>de</strong>zavantaj: stabilitatea sa <strong>numeric</strong>ă este mai slabă <strong>de</strong>cât cea a algoritmului ”clasic”<br />

(1.21); cu toate acestea, el poate fi folosit cu succes în majoritatea aplicaţiilor.<br />

1.5 Norme <strong>matriceal</strong>e<br />

Produsul scalar <strong>matriceal</strong> este o generalizare imediată a produsului scalar<br />

a doi vectori. Dacă A, B ∈ R m×n , produsul lor scalar este<br />

(A, B) <strong>de</strong>f<br />

=<br />

m∑<br />

i=1 j=1<br />

n∑<br />

a ij b ij = tr(B T A). (1.24)<br />

Se observă că (1.24) este i<strong>de</strong>ntică cu produsul scalar al celor doi vectori din R mn<br />

obţinuţi prin vectorizarea matricelor A şi B, i.e. prin concatenarea coloanelor lui<br />

A, respectiv B.<br />

Normele <strong>matriceal</strong>e se <strong>de</strong>finesc la fel ca normele vectoriale. O normă <strong>matriceal</strong>ă<br />

este o funcţie ‖ · ‖ : R m×n → R + care satisface condiţiile<br />

1. ‖A‖ > 0, ∀A ∈ R m×n , A ≠ 0 (pozitivitate);<br />

2. ‖αA‖ = |α| · ‖A‖, ∀A ∈ R m×n , ∀α ∈ R (omogenitate);<br />

3. ‖A + B‖ ≤ ‖A‖ + ‖B‖, ∀A, B ∈ R m×n (inegalitatea triunghiului).<br />

Pentru a utiliza normele <strong>matriceal</strong>e in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong> dimensiunile matricelor, introducem<br />

noţiunea <strong>de</strong> familie <strong>de</strong> norme <strong>matriceal</strong>e, care este o funcţie<br />

‖ · ‖ : ⋃ ∞<br />

m=1,n=1 Rm×n → R + astfel încât, pentru fiecare m, n > 0, restricţia lui<br />

‖ · ‖ la R m×n este o normă <strong>matriceal</strong>ă. Dacă n = 1, atunci ‖ · ‖ este o familie <strong>de</strong><br />

norme vectoriale.<br />

O familie ‖ · ‖ <strong>de</strong> norme <strong>matriceal</strong>e este consistentă dacă<br />

‖AB‖ ≤ ‖A‖ · ‖B‖, (1.25)<br />

atunci când produsul AB este <strong>de</strong>finit. (Să observăm că, în general, A, B şi AB au<br />

dimensiuni diferite, <strong>de</strong>ci normele lor sunt funcţii diferite; <strong>de</strong> aceea se lucrează cu<br />

familii <strong>de</strong> norme.)<br />

Norma Frobenius este norma <strong>matriceal</strong>ă indusă <strong>de</strong> produsul scalar (1.24):<br />

m∑ n∑<br />

‖A‖ F = √ a 2 ij . (1.26)<br />

i=1 j=1


38 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

Familia <strong>de</strong> norme Frobenius este consistentă.<br />

Norme subordonate. O familie <strong>de</strong> norme <strong>matriceal</strong>e poate fi obţinută dintr-o<br />

familie <strong>de</strong> norme vectoriale ‖ · ‖, prin următoarea relaţie<br />

‖Ax‖<br />

‖A‖ = sup<br />

x≠0 ‖x‖<br />

= max ‖Ax‖, (1.27)<br />

‖x‖=1<br />

în care norma <strong>matriceal</strong>ă ‖A‖ se <strong>de</strong>fineşte cu ajutorul normelor vectoriale ‖x‖ şi<br />

‖Ax‖. (Trecerea <strong>de</strong> la sup la max este justificată <strong>de</strong> faptul că hipersfera <strong>de</strong> ecuaţie<br />

‖x‖ = 1 este un compact iar norma vectorială ‖ · ‖ este o funcţie continuă, <strong>de</strong>ci<br />

mărginită şi îşi atinge marginile.) Familia <strong>de</strong> norme <strong>matriceal</strong>e este numită subordonată<br />

celei <strong>de</strong> norme vectoriale sau indusă <strong>de</strong> aceasta.<br />

Astfel, folosind (1.27), se pot <strong>de</strong>fini normele p <strong>matriceal</strong>e subordonate normelor<br />

p (Höl<strong>de</strong>r) vectoriale. Cele mai utilizate norme p sunt normele 1, 2 şi ∞. Pentru<br />

p = 1, ∞, relaţia (1.27) se reduce la expresiile simple<br />

( m<br />

)<br />

‖A‖ 1 = max ‖Ax‖ ∑<br />

1 = max |a ij | ,<br />

‖x‖ 1=1 j=1:n<br />

i=1 ⎛ ⎞<br />

(1.28)<br />

n∑<br />

‖A‖ ∞ = max ‖Ax‖ ∞ = max ⎝ |a ij | ⎠.<br />

‖x‖ ∞=1 i=1:m<br />

Pentru norma 2, atât semnificaţia cât şi modul <strong>de</strong> <strong>calcul</strong> vor fi prezentate în<br />

capitolele următoare.<br />

Normele p <strong>matriceal</strong>e, aplicate unor vectori priviţi ca matrice, dau aceleaşi valori<br />

ca normele p vectoriale. Astfel, nu e nici o posibilitate <strong>de</strong> confuzie în utilizarea<br />

aceluiaşi simbol ‖ · ‖ p pentru normele <strong>matriceal</strong>e şi cele vectoriale.<br />

În sfârşit, normele <strong>matriceal</strong>e subordonate unor norme vectoriale sunt consistente<br />

(<strong>de</strong>monstraţi, folosind <strong>de</strong>finiţia) şi, în plus, au proprietatea ‖I‖ = 1.<br />

Echivalenţă. Normele <strong>matriceal</strong>e prezentate mai sus sunt echivalente, în sensul<br />

relaţiei (1.4). De exemplu (vezi problema 1.10):<br />

j=1<br />

1<br />

√ n<br />

‖A‖ ∞ ≤ ‖A‖ 2 ≤ √ m‖A‖ ∞ ,<br />

1<br />

√ m<br />

‖A‖ 1 ≤ ‖A‖ 2 ≤ √ n‖A‖ 1 ,<br />

(1.29)<br />

‖A‖ 2 ≤ ‖A‖ F ≤ √ n‖A‖ 2 .<br />

Cazul complex. O normă <strong>matriceal</strong>ă peste spaţiul complex C m×n este o funcţie<br />

cu valori reale pozitive satisfăcând cele trei condiţii <strong>de</strong> la începutul secţiunii. Toate<br />

<strong>de</strong>finiţiile şi relaţiile <strong>de</strong> mai sus rămân valabile, cu singura observaţie că acum norma<br />

Frobenius este ‖A‖ 2 F = ∑ m<br />

i=1<br />

∑ n<br />

j=1 |a ij| 2 .<br />

AA. Calculul normei 1 se face folosind direct relaţiile (1.28):<br />

Algoritmul 1.13 (Nm1 – Calculul normei <strong>matriceal</strong>e 1) (Se dă<br />

A ∈ R m×n . Se <strong>calcul</strong>ează ν = ‖A‖ 1 .)


1.6. MATRICE STRUCTURATE 39<br />

0<br />

0<br />

L<br />

U<br />

Fig. 1.6: Matrice inferior şi superior triunghiulare<br />

1. ν ← 0<br />

2. Pentru j = 1 : n<br />

1. α ← 0<br />

2. Pentru i = 1 : m<br />

1. α ← α + |a ij |<br />

3. Dacă α > ν atunci ν ← α<br />

Algoritmul necesită mn flopi. Calculul normei ∞ este asemănător şi are aceeaşi<br />

complexitate. Calculul normei Frobenius necesită 2mn flopi; <strong>de</strong>sigur, pentru evitarea<br />

<strong>de</strong>păşirilor superioare, în implementarea formulei directe (1.26) se utilizează scalarea.<br />

În schimb, după cum vom ve<strong>de</strong>a, <strong>calcul</strong>ul normei 2 face apel la noţiuni mai evoluate<br />

şi implică O(n 3 ) operaţii (pentru matrice pătrate). De aceea, normele 1, ∞ şi<br />

Frobenius sunt cele mai folosite în <strong>calcul</strong>ul <strong>numeric</strong> elementar. Toate aceste norme<br />

fiind echivalente, criteriul <strong>de</strong> alegere primordial este efortul <strong>de</strong> <strong>calcul</strong>.<br />

1.6 Matrice structurate<br />

În numeroase probleme apar matrice ale căror elemente sunt nule în anumite regiuni.<br />

Astfel <strong>de</strong> matrice sunt numite generic structurate; în cazul lor, <strong>algoritmi</strong>i <strong>de</strong> rezolvare<br />

a unei probleme oarecare sunt <strong>de</strong> obicei mai simpli; <strong>de</strong> aceea, majoritatea <strong>algoritmi</strong>lor<br />

generali au ca prim obiectiv reducerea matricei iniţiale la una cu structură<br />

mai simplă.<br />

În această secţiune vom prezenta câteva tipuri <strong>de</strong> matrice structurate şi proprietăţile<br />

lor principale. Pentru simplitate, vom consi<strong>de</strong>ra doar matrice pătrate,<br />

din R n×n . Extin<strong>de</strong>rea la matrice dreptunghiulare este imediată.<br />

Definiţii. 1) O matrice D se numeşte diagonală dacă elementele nediagonale<br />

sunt nule, adică d ij = 0, pentru i ≠ j.<br />

2) O matrice T se numeşte inferior triunghiulară dacă t ij = 0, pentru i < j, şi<br />

superior triunghiulară dacă t ij = 0, pentru i > j. Figura 1.6 prezintă astfel <strong>de</strong> matrice.<br />

Evi<strong>de</strong>nt, o matrice simultan inferior şi superior triunghiulară este diagonală.<br />

O matrice se numeşte triunghiulară unitate dacă este triunghiulară şi, în plus,<br />

toate elementele sale diagonale sunt egale cu 1.<br />

O matrice se numeşte strict triunghiulară dacă este triunghiulară şi toate e-<br />

lementele sale diagonale sunt nule. De exemplu, o matrice A este strict inferior


40 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

triunghiulară dacă a ij = 0, pentru i ≤ j.<br />

Matricele triunghiulare au proprietăţi <strong>de</strong>osebite care vor fi evi<strong>de</strong>nţiate în secţiuni<br />

următoare ale acestui capitol.<br />

3) O matrice H se numeşte inferior Hessenberg dacă h ij = 0, pentru j > i + 1,<br />

şi superior Hessenberg dacă h ij = 0, pentru i > j + 1.<br />

4) O matrice A se numeşte tridiagonală dacă este simultan inferior şi superior<br />

Hessenberg, adică a ij = 0, pentru |i − j| > 1.<br />

În general, o matrice B se numeşte bandă, <strong>de</strong> lăţime inferioară p, dacă b ij = 0,<br />

pentru i > j+p, şi <strong>de</strong> lăţime superioară q, dacă b ij = 0, pentru j > i+q. Dacă p = q,<br />

vom spune că B este matrice bandă <strong>de</strong> lăţime p. Evi<strong>de</strong>nt, matricele tridiagonale<br />

sunt un caz particular <strong>de</strong> matrice bandă, cu p = q = 1. O matrice bandă cu<br />

p = q = 2 se zice pentadiagonală.<br />

Proprietăţi. Vom prezenta în continuare câteva proprietăţi utile ale matricelor<br />

structurate.<br />

Este evi<strong>de</strong>nt că suma a două matrice cu structuri i<strong>de</strong>ntice va avea aceeaşi structură.<br />

De asemenea, înmulţirea unei matrice cu un scalar conservă structura.<br />

În ce priveşte produsul, proprietăţile nu mai sunt atât <strong>de</strong> generale.<br />

Propoziţia 1.2 a. Dacă D este o matrice diagonală şi A este o matrice structurată,<br />

atunci matricele DA şi AD vor avea structura matricei A.<br />

b. Produsul a două matrice inferior (superior) triunghiulare (unitate) este o<br />

matrice inferior (superior) triunghiulară (unitate).<br />

c. Dacă L este o matrice inferior (superior) triunghiulară şi H este inferior (superior)<br />

Hessenberg, atunci LH şi HL sunt matrice inferior (superior) Hessenberg.<br />

Demonstraţie. Vom <strong>de</strong>monstra doar punctul b în cazul inferior triunghiular, celelalte<br />

<strong>de</strong>monstraţii fiind lăsate ca exerciţiu.<br />

Fie A şi B două matrice inferior triunghiulare, şi C = AB. Evi<strong>de</strong>nt,<br />

c ij = ∑ n<br />

k=1 a ikb kj . Consi<strong>de</strong>răm i < j. A fiind inferior triunghiulară, a ik = 0 pentru<br />

k > i; în plus, b kj = 0, pentru k ≤ i < j, <strong>de</strong>oarece B este inferior triunghiulară;<br />

aşadar, a ik b kj = 0, pentru oricare k ∈ 1 : n, <strong>de</strong>ci c ij = 0 pentru i < j, adică C este<br />

inferior triunghiulară.<br />

Elementele posibil nenule ale matricei C (pentru i ≥ j) se <strong>calcul</strong>ează economic<br />

cu relaţia<br />

i∑<br />

c ij = a ik b kj , (1.30)<br />

k=j<br />

<strong>de</strong>oarece a ik = 0 pentru k > i şi b kj = 0 pentru k < j.<br />

Dacă A şi B sunt inferior triunghiulare unitate, atunci particularizând (1.30) se<br />

obţine c ii = a ii b ii = 1, <strong>de</strong>ci şi C este inferior triunghiulară unitate. ♦<br />

AA. Înmulţirea matricelor triunghiulare. Datorită elementelor nule, <strong>algoritmi</strong>i<br />

implicând matrice structurate pot fi simplificaţi astfel încât să fie executate<br />

doar operaţiile aritmetice strict necesare.<br />

Vom exemplifica cu algoritmul <strong>de</strong> înmulţire a două matrice inferior triunghiulare,<br />

A şi B. Profităm <strong>de</strong> faptul că rezultatul C este inferior triunghiular şi <strong>calcul</strong>ăm c ij<br />

numai pentru i ≥ j, folosind (1.30) şi nu formula generală.


1.6. MATRICE STRUCTURATE 41<br />

Algoritmul 1.14 (TRMM – Înmulţire <strong>de</strong> matrice inferior triunghiulare)<br />

(Se dau A, B ∈ R n×n inferior triunghiulare. Se <strong>calcul</strong>ează<br />

C = AB.)<br />

1. Pentru i = 1 : n<br />

1. Pentru j = 1 : i<br />

1. c ij = ∑ i<br />

k=j a ikb kj<br />

Comentarii. Cele două bucle sunt <strong>de</strong>stinate parcurgerii pe linii a elementelor<br />

triunghiului inferior al matricei C; parcurgerea se poate face şi pe coloane, prin:<br />

Pentru j = 1 : n, Pentru i = j : n. Acest algoritm necesită n 3 /3 flopi, adică <strong>de</strong><br />

şase ori mai puţin <strong>de</strong>cât algoritmul general <strong>de</strong> înmulţire <strong>de</strong> matrice. ♦<br />

AA. Memorarea matricelor structurate se poate face în tablouri n × n,<br />

ca pentru toate celelalte matrice, cu <strong>de</strong>zavantajul stocării elementelor nule; totuşi,<br />

există şi un avantaj: accesul la elementele matricelor se face i<strong>de</strong>ntic pentru matricele<br />

generale şi pentru cele structurate.<br />

Dacă se doreşte economie <strong>de</strong> memorie, stocarea elementelor nule se poate evita<br />

uşor; acest mod <strong>de</strong> memorare se numeşte compact sau împachetat (packed). Exemplificăm<br />

în continuare pentru câteva tipuri <strong>de</strong> matrice.<br />

O matrice triunghiulară se poate memora într-un vector, să-l notăm v, <strong>de</strong><br />

lungime n(n + 1)/2 (numărul elementelor posibil nenule ale matricei). Dacă L<br />

este inferior triunghiulară, atunci o ordine naturală <strong>de</strong> memorare, cea pe linii, este<br />

l 11 , l 21 , l 22 , l 31 , . . . (în v 1 , v 2 , v 3 , v 4 , . . . ). Se observă că l ij se memorează în poziţia<br />

i(i−1)<br />

2<br />

+ j din v.<br />

O matrice tridiagonală T se poate memora în trei vectori a, b, c (în fiecare câte<br />

o diagonală), ceea ce este evi<strong>de</strong>nt din notaţia:<br />

⎡<br />

T =<br />

⎢<br />

⎣<br />

a 1 c 1<br />

b 2 a 2 c 2<br />

. .. . .. . ..<br />

⎤<br />

.<br />

⎥<br />

b n−1 a n−1 c n−1<br />

⎦<br />

b n a n<br />

În general, o matrice bandă B, <strong>de</strong> lăţime p, se poate memora uşor într-un tablou<br />

cu 2p + 1 linii şi n coloane. Exemplificăm pentru p = 2:<br />

⎡<br />

⎤<br />

α β γ<br />

δ α β γ<br />

∗ ∗ γ . . . γ γ γ<br />

ε δ α β γ<br />

∗ β β . . . β β β<br />

B =<br />

ε δ α β γ<br />

α α α . . . α α α<br />

⎢<br />

⎣<br />

ε δ α β γ ⎥ δ δ δ . . . δ δ ∗<br />

⎦<br />

. .. . .. . .. . .. . ε ε ε . . . ε ∗ ∗<br />

..<br />

În stânga se găseşte matricea bandă (cu elementele notate generic), în dreapta<br />

tabloul <strong>de</strong> memorare (prin ∗ sunt notate elemente nesemnificative); se observă că elementele<br />

<strong>de</strong> pe aceeaşi diagonală a matricei se memorează pe aceeaşi linie a tabloului.<br />

Elementul b ij se memorează pe linia p + i − j + 1, coloana j.


42 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

× • • × •<br />

× × × × ×<br />

× • • × •<br />

× • • × •<br />

<br />

<br />

<br />

<br />

<br />

<br />

(a) (b) (c)<br />

Fig. 1.7: Submatrice: (a) cu I = {1, 3, 4}, J = {2, 3, 5} (elementele submatricei<br />

sunt notate cu •); (b) bloc; (c) li<strong>de</strong>r principală<br />

1.7 Matrice bloc<br />

Submatrice, bloc. Până acum am privit o matrice A ca fiind formată din<br />

elemente sau, eventual, din coloane sau linii, ca în (1.7), (1.8), respectiv (1.13). Un<br />

alt punct <strong>de</strong> ve<strong>de</strong>re este <strong>de</strong> a evi<strong>de</strong>nţia submatrice sau blocuri, adică matrice <strong>de</strong><br />

dimensiuni mai mici conţinute în A.<br />

În sensul cel mai larg, noţiunea <strong>de</strong> submatrice se <strong>de</strong>fineşte după cum urmează.<br />

Dacă A ∈ R m×n , iar I = {i 1 , i 2 , . . . , i r } ⊂ 1 : m şi J = {j 1 , j 2 , . . . , j p } ⊂ 1 : n sunt<br />

două mulţimi <strong>de</strong> indici astfel încât i 1 < i 2 < . . . < i r , j 1 < j 2 < . . . < j p , atunci<br />

matricea A ′ <strong>de</strong> dimensiune r × p <strong>de</strong>finită <strong>de</strong> a ′ kl = a i k j l<br />

, este numită submatrice a<br />

matricei A. Figura 1.7a ilustrează noţiunea.<br />

Se observă că A ′ este obţinută prin extragerea elementelor aflate la ”intersecţiile”<br />

liniilor şi coloanelor din I, respectiv J . Dacă indicii din I, respectiv J , sunt<br />

consecutivi, atunci submatricea mai este numită şi bloc. Pentru a ne referi la blocul<br />

astfel <strong>de</strong>finit vom folosi şi notaţia A(i 1 : i r , j 1 : j p ).<br />

Dacă A ∈ R n×n şi I = J , atunci submatricea A ′ se numeşte principală. Dacă,<br />

în plus, I = {1, 2, . . ., r}, atunci A ′ not<br />

= A [r] este numită submatrice li<strong>de</strong>r principală<br />

<strong>de</strong> ordin r a matricei A; aceasta este blocul r × r poziţionat stânga-sus în A. Vezi<br />

figurile 1.7b,c.<br />

Partiţionări conforme. Vom lucra în continuare cu matrice partiţionate în<br />

blocuri, notate astfel<br />

⎡<br />

⎤<br />

A 11 A 12 . . . A 1n<br />

A 21 A 22 . . . A 2n<br />

A = ⎢<br />

⎣<br />

.<br />

.<br />

. .. .<br />

⎥<br />

⎦ ,<br />

A m1 A m2 . . . A mn<br />

⎡<br />

⎤<br />

B 11 B 12 . . . B 1l<br />

B = B 21 B 22 . . . B 2l<br />

⎢<br />

⎣<br />

.<br />

.<br />

. .. .<br />

⎥<br />

⎦ , (1.31)<br />

B p1 B p2 . . . B pl<br />

în care blocurile A ij au dimensiune µ i × ν j , iar B ij dimensiune π i × λ j . Evi<strong>de</strong>nt,<br />

matricea A are (µ 1 + . . . + µ m ) linii şi (ν 1 + . . . + ν n ) coloane.<br />

Este interesant să studiem operaţiile cu matrice astfel partiţionate, mai precis<br />

modul <strong>de</strong> partiţionare care permite înlocuirea operaţiilor cu elemente prin cele cu<br />

blocuri.


1.7. MATRICE BLOC 43<br />

• Dacă m = p, µ i = π i , ∀i ∈ 1 : m, şi n = l, cu ν j = λ j , ∀j ∈ 1 : n, atunci<br />

A + B = C =<br />

⎡<br />

⎢<br />

⎣<br />

⎤<br />

C 11 . . . C 1n<br />

.<br />

. ..<br />

⎥<br />

. ⎦, cu C ij = A ij + B ij . (1.32)<br />

. . . C mn<br />

C m1<br />

• Dacă n = p, ν i = π i , ∀i ∈ 1 : n, atunci<br />

⎡<br />

⎤<br />

D 11 . . . D 1l<br />

⎢<br />

AB = D = ⎣<br />

.<br />

. ..<br />

⎥<br />

n∑<br />

. ⎦, cu D ij = A ik B kj . (1.33)<br />

. . . D<br />

k=1<br />

ml<br />

D m1<br />

Partiţionările care permit scrierea relaţiilor <strong>de</strong> mai sus se numesc conforme cu<br />

operaţia executată; se observă că formulele <strong>de</strong> <strong>calcul</strong> al sumei şi produsului la nivel<br />

<strong>de</strong> bloc sunt similare celor la nivel <strong>de</strong> element; evi<strong>de</strong>nt, suma şi produsul a două<br />

blocuri se <strong>calcul</strong>ează cu formulele elementare cunoscute.<br />

Întorcându-ne la secţiunea <strong>de</strong>dicată înmulţirii <strong>de</strong> matrice, putem acum constata<br />

că relaţiile (1.15)–(1.18) sunt cazuri particulare ale relaţiei (1.33).<br />

• Pentru transpunere avem<br />

⎡<br />

⎤<br />

A T 11 A T 21 . . . A T m1<br />

A T A T 12 A T 22 . . . A T m2<br />

= ⎢<br />

⎣<br />

.<br />

.<br />

. .. .<br />

⎥<br />

⎦ . (1.34)<br />

A T 1n A T 2n . . . A T mn<br />

Matrice bloc structurate. O matrice partiţionată ca în (1.31) poate fi structurată<br />

la nivel <strong>de</strong> blocuri. Folosim aceleaşi <strong>de</strong>finiţii ca în secţiunea prece<strong>de</strong>ntă,<br />

gândind însă acum la nivel <strong>de</strong> blocuri şi nu la nivel <strong>de</strong> element.<br />

Presupunem că A din 1.31 este pătrată, m = n şi blocurile diagonale sunt<br />

pătrate, adică µ i = ν i , i ∈ 1 : n (cu aceste ipoteze, diagonala principală a fiecărui<br />

bloc A ii este parte din diagonala principală a matricei). Spunem că A este bloc<br />

diagonală dacă A ij = 0, pentru i ≠ j; A este bloc superior triunghiulară dacă<br />

A ij = 0, pentru i > j, etc. Este evi<strong>de</strong>nt că, în general, o matrice bloc diagonală nu<br />

este diagonală, o matrice bloc triunghiulară nu este triunghiulară etc.<br />

Structura la nivel <strong>de</strong> bloc este conservată la adunare dacă matricele operand sunt<br />

partiţionate conform pentru adunare. Pentru înmulţire, este a<strong>de</strong>vărat analogul la<br />

nivel <strong>de</strong> bloc al propoziţiei 1.2, adică, <strong>de</strong> exemplu, produsul a două matrice bloc<br />

superior (inferior) triunghiulare partiţionate conform este o matrice bloc superior<br />

(inferior) triunghiulare.<br />

AA. Înmulţire la nivel <strong>de</strong> bloc. Pe <strong>calcul</strong>atoarele cu memorie ierarhică, cu<br />

structura sugerată în figura 0.4c, partiţionarea matricelor în blocuri şi utilizarea unei<br />

relaţii <strong>de</strong> tipul (1.33) poate conduce la o eficienţă sporită a înmulţirii <strong>de</strong> matrice.<br />

Consi<strong>de</strong>răm, pentru simplitate, matricele pătrate A, B ∈ R q×q şi dorim să <strong>calcul</strong>ăm<br />

produsul lor C = AB. Partiţionăm A, B şi C ca în (1.31), cu menţiunea<br />

că acum m = n, p = l, iar toate blocurile sunt pătrate şi au aceleaşi dimensiuni,


44 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

adică A ij ∈ R r×r , r fiind numită dimensiunea blocurilor, iar m = q/r numărul <strong>de</strong><br />

blocuri; presupunem că r divi<strong>de</strong> dimensiunea matricelor q doar pentru a simplifica<br />

expunerea.<br />

Exprimăm produsul <strong>matriceal</strong> ca în (1.33), <strong>de</strong>ci<br />

C ij =<br />

m∑<br />

A ik B kj . (1.35)<br />

k=1<br />

Pe un <strong>calcul</strong>ator cu memorie ierarhică trebuie minimizat traficul între memoria<br />

principală MP şi memoria rapidă MR. Desigur, matricele A, B, C sunt stocate<br />

în MP. Dacă alegem dimensiunea blocurilor r astfel încât 3 blocuri <strong>de</strong> matrice să<br />

poată fi stocate simultan în MR (<strong>de</strong>ci, 3r 2 < dim(MR)), atunci putem construi<br />

un algoritm <strong>de</strong> <strong>calcul</strong> al produsului <strong>matriceal</strong> bazat pe i<strong>de</strong>ea <strong>de</strong> a aduce, pe rând,<br />

blocurile A ik , B kj implicate în suma din (1.35), din MP în MR, şi abia apoi <strong>de</strong> a<br />

efectua înmulţirea lor.<br />

Algoritmul 1.15 (Se dau matricele A, B. Se <strong>calcul</strong>ează produsul<br />

<strong>matriceal</strong> C = AB, la nivel <strong>de</strong> bloc. Se presupune că variabilele X, Y şi<br />

Z se găsesc în MR.)<br />

1. Pentru i = 1 : m<br />

1. Pentru j = 1 : m<br />

1. Z ← 0<br />

2. Pentru k = 1 : m<br />

1. X ← A ik , Y ← B kj<br />

2. Z ← Z + X · Y<br />

3. C ij ← Z<br />

Comentarii. În acest algoritm, atribuirile din instrucţiunea 1.1.2.1 reprezintă <strong>de</strong><br />

fapt transferuri din MP în MR; analog, în instrucţiunea 1.1.3 se execută un transfer<br />

din MR în MP. Operaţia <strong>matriceal</strong>ă Z ← Z +X ·Y din 1.1.2.2 nu este <strong>de</strong>taliată aici;<br />

ea se execută cu algoritmul 1.10 la nivel <strong>de</strong> element; esenţial este faptul că toate<br />

variabilele implicate se găsesc în MR, <strong>de</strong>ci nu e necesar nici un transfer din/spre MP.<br />

Lucrând la nivel <strong>de</strong> blocuri, numărul <strong>de</strong> operaţii rămâne neschimbat, adică 2q 3 ;<br />

în schimb, numărul <strong>de</strong> accesuri la MP <strong>de</strong>vine 2r 2 m 3 = 2q 2 m = 2q 3 /r (instrucţiunea<br />

1.1.2.1 se execută <strong>de</strong> m 3 ori, <strong>de</strong> fiecare dată transferându-se două blocuri cu r 2<br />

elemente).<br />

Dacă s-ar folosi algoritmul 1.10 la nivel <strong>de</strong> element pe un <strong>calcul</strong>ator cu memorie<br />

ierarhică, fiecare operaţie c ij ← c ij + a ik b kj ar implica cel puţin două transferuri<br />

din MP în MR (putem presupune că c ij rămâne în MR cât timp este <strong>calcul</strong>at). Ar<br />

avea loc <strong>de</strong>ci aproximativ 2q 3 accesuri la MP.<br />

În concluzie, faţă <strong>de</strong> versiunea la nivel <strong>de</strong> element, în algoritmul 1.15 la nivel<br />

<strong>de</strong> bloc se accesează <strong>de</strong> r ori mai puţin memoria principală, ceea ce conduce la o<br />

creştere semnificativă <strong>de</strong> viteză.<br />

♦<br />

Să rezumăm i<strong>de</strong>ea eficientizării <strong>algoritmi</strong>lor pe <strong>calcul</strong>atoare cu memorie ierarhică;<br />

ea va fi folosită şi în rezolvarea altor probleme. Se partiţionează matricele <strong>de</strong><br />

intrare în blocuri şi se exprimă algoritmul în operaţii între blocuri (aceasta e banal


1.7. MATRICE BLOC 45<br />

la produsul <strong>matriceal</strong>, dar mai complicat la alte probleme); dimensiunile blocurilor<br />

se aleg cât mai mari (<strong>de</strong> obicei), dar astfel încât toate blocurile implicate într-o<br />

operaţie să încapă simultan în MR.<br />

Algoritmul Strassen. Aparent, prin însăşi <strong>de</strong>finiţia ei (algoritmul numit<br />

generic ”standard”, în continuare), înmulţirea a două matrice n × n reale necesită<br />

2n 3 flopi. Există însă o multitudine <strong>de</strong> <strong>algoritmi</strong>, numiţi global ”rapizi”, <strong>de</strong>şi se<br />

bazează pe i<strong>de</strong>i diferite, care au o complexitate aritmetică mai mică. Primul dintre<br />

aceştia, şi singurul dovedit utilizabil în practică (împreună cu unele variante), este<br />

cel <strong>de</strong>scoperit în 1969 <strong>de</strong> Strassen [].<br />

Fie A, B ∈ R n×n şi, pentru simplitate, consi<strong>de</strong>răm că n este divizibil cu 2.<br />

Partiţionăm matricele A, B şi C = AB în blocuri <strong>de</strong> dimensiune n/2 × n/2, adică<br />

A =<br />

[ ]<br />

A11 A 12<br />

, B =<br />

A 21 A 22<br />

[ ]<br />

B11 B 12<br />

, C =<br />

B 21 B 22<br />

[ ]<br />

C11 C 12<br />

. (1.36)<br />

C 21 C 22<br />

Algoritmul lui Strassen este <strong>de</strong>finit <strong>de</strong> formulele următoare, uşor <strong>de</strong> verificat prin<br />

simplă substituţie:<br />

[ ]<br />

M1 + M<br />

C = A · B = 2 + M 3 − M 4 M 4 + M 6<br />

M 3 + M 5 M 1 − M 5 + M 6 + M 7<br />

M 1 = (A 11 + A 22 ) · (B 11 + B 22 ) M 5 = (A 21 + A 22 ) · B 11<br />

M 2 = (A 12 − A 22 ) · (B 21 + B 22 ) M 6 = A 11 · (B 12 − B 22 )<br />

M 3 = A 22 · (B 21 − B 11 ) M 7 = (A 21 − A 11 ) · (B 11 + B 12 )<br />

M 4 = (A 11 + A 12 ) · B 22<br />

(1.37)<br />

Se observă că pentru <strong>calcul</strong>ul matricei C sunt necesare 7 înmulţiri şi 18 adunări<br />

<strong>de</strong> matrice <strong>de</strong> dimensiune n/2 × n/2, în timp ce în algoritmul standard la nivel <strong>de</strong><br />

bloc se fac, pentru aceeaşi partiţionare (1.36), 8 înmulţiri şi 4 adunări <strong>de</strong> blocuri.<br />

Astfel, numărul <strong>de</strong> operaţii pentru algoritmul Strassen este N 1 (n) = 14n3<br />

8<br />

+ 18n2<br />

4 .<br />

Este evi<strong>de</strong>nt că, pentru n suficient <strong>de</strong> mare (mai precis n > 18), N 1 (n) < 2n 3 şi <strong>de</strong>ci<br />

algoritmul Strassen este mai rapid <strong>de</strong>cât cel standard. În schimb, implementarea<br />

formulelor (1.37) necesită memorie suplimentară pentru rezultatele intermediare.<br />

Un număr <strong>de</strong> operaţii şi mai bun se obţine dacă, pentru <strong>calcul</strong>ul celor 7 produse<br />

<strong>de</strong> matrice n/2 × n/2 din (1.37) se utilizează, recursiv, aceleaşi formule ale<br />

lui Strassen. La fiecare nivel <strong>de</strong> recursie dimensiunea problemei se înjumătăţeşte<br />

(simplificând, presupunem acum că n este o putere a lui 2). Recursia are loc până<br />

când se atinge o dimensiune n 0 suficient <strong>de</strong> mică, pentru care algoritmul standard<br />

este mai eficient <strong>de</strong>cât cel al lui Strassen. Numărul <strong>de</strong> operaţii N(n) este <strong>de</strong>finit <strong>de</strong><br />

recurenţa<br />

N(n) = 7N( n 2 ) + 18n2 4 , N(n 0) = 2n 3 0, (1.38)<br />

a cărei soluţie, pentru n ≫ n 0 , este <strong>de</strong> ordinul<br />

N(n) = O(n log 2 7 ), (log 2 7 ≈ 2.807). (1.39)<br />

Vezi problema 1.20 pentru soluţia exactă.


46 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

În practică, dimensiunea n 0 este mai mare <strong>de</strong>cât 18 (dar <strong>de</strong> obicei n 0 < 100),<br />

datorită operaţiilor nearitmetice suplimentare necesare în algoritmul Strassen, în<br />

special alocărilor <strong>de</strong> memorie şi apelurilor recursive. Aşadar, acest algoritm este<br />

eficient pentru înmulţirea matricelor mari, cu dimensiuni <strong>de</strong> ordinul sutelor sau<br />

miilor.<br />

În privinţa stabilităţii <strong>numeric</strong>e algoritmul Strassen este inferior celui standard,<br />

<strong>de</strong> aceea trebuie utilizat cu anume precauţii. Recomandăm referinţele [IX], []<br />

cititorului interesat.<br />

1.8 Matrice normale<br />

În această secţiune vom lucra în principal cu matrice pătrate, din R n×n , specificând<br />

explicit celelalte cazuri.<br />

O matrice A ∈ R n×n se numeşte normală dacă A T A = AA T .<br />

Matricele normale au proprietăţi <strong>de</strong>osebit <strong>de</strong> interesante, cu precă<strong>de</strong>re în câteva<br />

cazuri particulare pe care le enumerăm acum şi le vom discuta pe larg în continuare:<br />

1. matricele simetrice, pentru care A = A T ;<br />

2. matricele antisimetrice, care satisfac A = −A T ;<br />

3. matricele ortogonale, pentru care A T A = I.<br />

Fie A ∈ R n×n ; se numeşte formă biliniară asociată matricei A funcţia<br />

f : R n × R n → R, f(x, y) = x T Ay = ∑ n ∑ n<br />

i=1 j=1 a ijx i y j . Se observă că funcţia este<br />

liniară în fiecare din cele două argumente luate separat, ceea ce îi justifică numele.<br />

Matrice simetrice. Matricea A este simetrică dacă A = A T , adică a ij = a ji ,<br />

∀i, j ∈ 1 : n. Aşadar simetria este faţă <strong>de</strong> diagonala principală a matricei; se observă<br />

că pentru o matrice nepătrată noţiunea <strong>de</strong> simetrie nu are sens, A şi A T neavând<br />

aceleaşi dimensiuni.<br />

Suma şi produsul cu scalari conservă simetria, adică dacă matricele A, B sunt<br />

simetrice şi α ∈ R, atunci A + B şi αA sunt simetrice. În schimb, în general,<br />

produsul AB nu este simetric; consi<strong>de</strong>raţi, <strong>de</strong> exemplu, A =<br />

[ ] 1 1<br />

B = .<br />

1 1<br />

[<br />

1 1<br />

1 2<br />

Matrice antisimetrice. Matricea A este antisimetrică dacă A = −A T , adică<br />

a ij = −a ji , ∀i, j ∈ 1 : n. Evi<strong>de</strong>nt, elementele sale diagonale sunt nule.<br />

Forma pătratică asociată unei matrice simetrice este funcţia g : R n → R,<br />

g(x) = x T Ax = ∑ n ∑ n<br />

i=1 j=1 a ijx i x j . Forma pătratică este un polinom omogen <strong>de</strong><br />

gradul 2, în n variabile; <strong>de</strong> asemenea, se observă că g(x) = f(x, x), un<strong>de</strong> f este<br />

forma biliniară asociată matricei A 7 .<br />

7 Formele pătratice se asociază numai matricelor simetrice din următorul motiv: dacă A nu e<br />

simetrică, luând à = (A + AT )/2 se ve<strong>de</strong> că x T Ax = x T Ãx, ∀x ∈ Rn , şi à este simetrică. Să<br />

notăm că B = (A − A T )/2 se numeşte componenta antisimetrică, iar x T Bx = 0.<br />

]<br />

şi


1.8. MATRICE NORMALE 47<br />

Matricele simetrice şi formele pătratice asociate pot avea ”semn”, în sensul<br />

<strong>de</strong>finit în continuare.<br />

O matrice simetrică A este pozitiv <strong>de</strong>finită dacă x T Ax > 0, pentru orice vector<br />

x ∈ R n , x ≠ 0; se notează A > 0, dar, atenţie, [ aceasta]<br />

nu înseamnă că toate<br />

2 −1<br />

elementele matricei sunt pozitive; <strong>de</strong> exemplu, este pozitiv <strong>de</strong>finită,<br />

−1<br />

[<br />

2<br />

]<br />

1 2<br />

<strong>de</strong>oarece 2x 2 1 − 2x 1x 2 + 2x 2 2 > 0, ∀[x 1 x 2 ] T ≠ 0, însă nu este, <strong>de</strong>oarece<br />

2 1<br />

x 2 1 − 4x 1x 2 + x 2 2 poate avea orice semn când x 1, x 2 ∈ R. Matricea A este pozitiv<br />

semi<strong>de</strong>finită dacă x T Ax ≥ 0, ∀x ∈ R n , ceea ce se notează A ≥ 0.<br />

O matrice simetrică A este negativ (semi)<strong>de</strong>finită dacă −A este pozitiv (semi)-<br />

<strong>de</strong>finită. O matrice simetrică care nu se încadrează în nici una dintre categoriile <strong>de</strong><br />

mai sus se numeşte cu semn ne<strong>de</strong>finit.<br />

Suma şi produsul cu scalari pozitivi conservă semnul; <strong>de</strong> exemplu, dacă A, B<br />

sunt pozitiv <strong>de</strong>finite şi α > 0, atunci A+B şi αA sunt pozitiv <strong>de</strong>finite (<strong>de</strong>monstraţi !).<br />

Propoziţia 1.3 O submatrice principală a unei matrice pozitiv <strong>de</strong>finite A este pozitiv<br />

<strong>de</strong>finită. În particular, submatricele li<strong>de</strong>r principale A [k] , k ∈ 1 : n, sunt<br />

pozitiv <strong>de</strong>finite şi toate elementele diagonale sunt pozitive.<br />

Demonstraţie. Fie I = {i 1 , i 2 , . . . , i r }, mulţimea <strong>de</strong> indici <strong>de</strong>finind o submatrice<br />

principală A ′ a matricei A. Pentru orice vector nenul x ∈ R r , <strong>de</strong>finim vectorul<br />

y ∈ R n prin:<br />

y ik = x k , k = 1 : r,<br />

y i = 0, i ∉ I.<br />

Evi<strong>de</strong>nt, x ≠ 0 implică y ≠ 0, şi din pozitivitatea matricei A se <strong>de</strong>duce:<br />

x T A ′ x = y T Ay > 0, adică A ′ este pozitiv <strong>de</strong>finită.<br />

♦<br />

Congruenţă. Două matrice simetrice A, B se numesc congruente dacă există<br />

o matrice nesingulară T ∈ R n×n astfel încât B = T T AT. Evi<strong>de</strong>nt, A = T −T BT −1 .<br />

(Demonstraţi că simetria este conservată <strong>de</strong> transformarea <strong>de</strong> congruenţă.)<br />

Dacă A, B sunt congruente şi A > 0, atunci B > 0, adică transformarea <strong>de</strong><br />

congruenţă conservă semnul. (Într-a<strong>de</strong>văr, xT Bx = x T T T ATx = (Tx) T A(Tx) > 0,<br />

pentru că A > 0 şi Tx ≠ 0, dacă x ≠ 0, coloanele lui T fiind liniar in<strong>de</strong>pen<strong>de</strong>nte.)<br />

Matrice ortogonale. O matrice pătrată Q ∈ R n×n este ortogonală dacă<br />

Q T Q = I n ; evi<strong>de</strong>nt, avem Q T = Q −1 , <strong>de</strong>ci transpusa matricei este chiar inversa ei,<br />

iar QQ T = I n . Partiţionând Q pe coloane şi exprimând Q T Q prin produse scalare,<br />

<strong>de</strong>finiţia este echivalentă cu qi Tq j = 0, pentru i ≠ j, şi ‖q i ‖ 2 = 1, adică matricea Q<br />

are coloanele vectori ortonormali.<br />

În cazul în care matricea nu este pătrată, Q ∈ R m×n , dacă Q T Q = I n , atunci<br />

matricea are coloanele ortonormale (m > n şi QQ T ≠ I m ). Dacă QQ T = I m , atunci<br />

matricea are liniile ortogonale (m < n şi Q T Q ≠ I n ).<br />

Vom consi<strong>de</strong>ra în continuare doar matrice ortogonale pătrate. Referitor la<br />

operaţiile elementare, vom observa că produsul a două matrice ortogonale este<br />

o matrice ortogonală; într-a<strong>de</strong>văr, dacă Q, U sunt amândouă ortogonale, atunci<br />

(QU) T (QU) = U T Q T QU = U T U = I. Aşadar, matricele ortogonale formează grup<br />

în raport cu înmulţirea, notat GO(n).


48 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

De asemenea, transpusa unei matrice ortogonale este ortogonală, <strong>de</strong>oarece<br />

(Q T ) T Q T = QQ T = I. În schimb, suma a două matrice ortogonale nu este ortogonală,<br />

nici produsul unei matrice ortogonale cu un scalar diferit <strong>de</strong> ±1.<br />

Matricele ortogonale au proprietatea remarcabilă <strong>de</strong> a conserva normele 2 şi<br />

Frobenius.<br />

Propoziţia 1.4 Fie matricele ortogonale Q ∈ R n×n , U ∈ R m×m . Atunci:<br />

1. ‖Qx‖ 2 = ‖x‖ 2 , ∀x ∈ R n , <strong>de</strong>ci ‖Q‖ 2 = 1.<br />

2. ‖UAQ‖ 2 = ‖A‖ 2 , ‖UAQ‖ F = ‖A‖ F , ∀A ∈ R m×n .<br />

Demonstraţie. 1. ‖Qx‖ 2 2 = (Qx) T (Qx) = x T Q T Qx = x T x = ‖x‖ 2 .<br />

2. Aplicând punctul 1 avem<br />

‖UA‖ 2 = max<br />

‖x‖ 2=1 ‖U(Ax)‖ 2 = max<br />

‖x‖ 2=1 ‖Ax‖ 2 = ‖A‖ 2 .<br />

Deoarece ImQ = R n , aplicând din nou punctul 1 avem<br />

‖AQ‖ 2 = max<br />

‖x‖ 2=1 ‖AQx‖ 2 = max<br />

‖Qx‖ 2=1 ‖A(Qx)‖ 2 = ‖A‖ 2 .<br />

Utilizând cele două rezultate anterioare se obţine ‖UAQ‖ 2 = ‖AQ‖ 2 = ‖A‖ 2 .<br />

Revenim acum puţin la noţiunea <strong>de</strong> echivalenţă, prezentată în secţiunea 1.4.<br />

Două matrice A, B ∈ R m×n se numesc ortogonal echivalente la dreapta (stânga),<br />

dacă există o matrice ortogonală Q ∈ R n×n (Q ∈ R m×m ) astfel încât A = BQ (A =<br />

QB). A şi B se numesc ortogonal echivalente dacă există Q ∈ R m×m , P ∈ R n×n<br />

ortogonale astfel încât B = Q T AP.<br />

Presupunând A, B <strong>de</strong> rang maxim (<strong>de</strong>ci coloanele lor sunt baze pentru ImA, respectiv<br />

ImB) şi amintindu-ne că A = QB se scrie pe coloane a i = Qb i , să observăm<br />

că a T i a j = b T i QT Qb j = b T i b j, <strong>de</strong>ci unghiurile dintre vectorii componenţi ai bazei se<br />

păstrează la o transformare <strong>de</strong> echivalenţă ortogonală (la stânga).<br />

Proiectori. Fie o matrice P ∈ R n×n şi un subspaţiu S ⊂ R n . P se numeşte<br />

proiector pe S dacă ImP = S şi P 2 = P. Justificare: dacă x ∈ R n , atunci Px ∈<br />

ImP = S, <strong>de</strong>ci aplicarea proiectorului unui vector oarecare îl va duce pe acesta în S;<br />

Px este proiecţia lui x pe S. Mai mult, P(Px) = Px, <strong>de</strong>ci aplicarea proiectorului<br />

nu modifică proiecţia.<br />

În general, orice matrice P astfel încât P 2 = P se zice matrice <strong>de</strong> proiecţie sau<br />

proiector, pentru că ea proiectează pe S <strong>de</strong>f<br />

= ImP. Analog, Q = I − P proiectează<br />

pe T = ImQ.<br />

Dacă, în plus, matricea P este simetrică, atunci P se numeşte proiector ortogonal.<br />

Justificare: dacă x ∈ R n , atunci Px ∈ ImP şi P(x − Px) = 0, <strong>de</strong>ci<br />

x − Px ∈ KerP = KerP T , <strong>de</strong>ci Px ⊥ (x − Px), adică x se <strong>de</strong>scompune ca sumă a<br />

doi vectori ortogonali ca în figura 1.8.<br />

Dacă matricea B ∈ R n×r are coloanele ortonormale (formând <strong>de</strong>ci o bază ortogonală<br />

pentru ImB = S), atunci P = BB T este proiecţie ortogonală pe S şi, mai<br />

mult, este unică (<strong>de</strong>monstraţi !).<br />

Particularităţi ale matricelor complexe. Noţiunile <strong>de</strong> simetrie şi ortogonalitate<br />

se pot <strong>de</strong>fini şi pentru matrice complexe. Având în ve<strong>de</strong>re <strong>de</strong>finiţia produsului<br />


1.9. SISTEME DE ECUAŢII LINIARE 49<br />

✧<br />

✧<br />

✧<br />

✧<br />

✧<br />

✻<br />

x<br />

x − Px<br />

✟ ✟✟✟✟✟✟✟✟✟✯ ✲<br />

✧ ✧✧✧✧<br />

S<br />

Px<br />

Fig. 1.8: Acţiunea unui proiector ortogonal pe S asupra unui vector oarecare x<br />

scalar complex, mai utile sunt noţiunile analoage obţinute (formal) prin înlocuirea<br />

transpunerii prin transpunere şi complex conjugare. Dacă A ∈ C n×n , se notează<br />

cu A H = A T conjugata transpusei matricei A. Matricea A ∈ C n×n se numeşte<br />

normală dacă AA H = A H A.<br />

Matricea A ∈ C n×n se numeşte hermitică dacă A H = A. În acest caz scalarul<br />

x H Ax este real pentru orice x ∈ C n . O matrice hermitică A ∈ C n×n este pozitiv<br />

<strong>de</strong>finită dacă x H Ax > 0, ∀x ∈ C n , x ≠ 0. O matrice A ∈ C n×n este unitară dacă<br />

A H A = I, adică are coloanele ortogonale în C n .<br />

AA. Memorarea matricelor simetrice. Dacă A ∈ R n×n este simetrică, <strong>de</strong>ci<br />

A = A T , nu este necesară memorarea întregii matrice, ci doar a unei ”jumătăţi”,<br />

mai precis a triunghiului inferior sau a celui superior. Memorarea se poate face în<br />

variantele discutate pentru matrice triunghiulare, în secţiunea 1.6.<br />

Desigur, acest mod <strong>de</strong> memorare va implica particularizări ale <strong>algoritmi</strong>lor; vom<br />

exemplifica pentru produsul matrice-vector (Gaxpy) y ← Ax + y, presupunând că<br />

A este memorată prin triunghiul superior. În exprimarea elementului y i,<br />

y i ← y i +<br />

n∑ ∑i−1<br />

a ij x j = y i + a ji x j +<br />

j=1<br />

j=1<br />

n∑<br />

a ij x j ,<br />

înlocuim elementele matricei A din linia i aflate în triunghiul inferior, prin cele egale<br />

aflate pe coloana i, în triunghiul superior, după cum este sugerat în figura 1.9.<br />

Acelaşi mod <strong>de</strong> memorare, printr-un singur triunghi, se utilizează şi în cazul<br />

matricelor antisimetrice sau hermitice. Propunem cititorului adaptarea algoritmului<br />

Gaxpy în aceste două cazuri.<br />

j=i<br />

1.9 Sisteme <strong>de</strong> ecuaţii liniare<br />

Un sistem <strong>de</strong> m ecuaţii liniare cu n necunoscute are forma<br />

⎧<br />

a 11 x 1 + a 12 x 2 + . . . + a 1n x n = b 1<br />

⎪⎨<br />

a 21 x 1 + a 22 x 2 + . . . + a 2n x n = b 2<br />

. . . ⎪⎩<br />

a m1 x 1 + a m2 x 2 + . . . + a mn x n = b m<br />

, (1.40)<br />

un<strong>de</strong> a ij ∈ R, b i ∈ R, pentru i = 1 : m, j = 1 : n, sunt date şi x j , j = 1 : n, sunt


50 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

i<br />

i<br />

A<br />

Fig. 1.9: Utilizarea elementelor din triunghiul superior în produsul dintre o matrice<br />

simetrică şi un vector<br />

x<br />

necunoscutele.<br />

În formă <strong>matriceal</strong>ă, sistemul este<br />

Ax = b, (1.41)<br />

A fiind numită matricea coeficienţilor, b termenul liber (sau partea dreaptă a sistemului),<br />

iar x vectorul necunoscutelor.<br />

Dacă termenul liber al sistemului este vectorul nul (b = 0), sistemul este numit<br />

omogen.<br />

Prima caracteristică importantă a unui sistem liniar este relaţia între m şi n:<br />

• când numărul <strong>de</strong> ecuaţii este mai mare <strong>de</strong>cât numărul <strong>de</strong> necunoscute (m > n),<br />

sistemul (1.41) se numeşte supra<strong>de</strong>terminat;<br />

• când, dimpotrivă, numărul <strong>de</strong> necunoscute este mai mare (n > m), sistemul<br />

este numit sub<strong>de</strong>terminat;<br />

• în cazul unei matrice A pătrate (m = n), sistemul (1.41) este <strong>de</strong>terminat.<br />

A găsi soluţia sistemului liniar (1.41) înseamnă a <strong>calcul</strong>a un vector x ∈ R n astfel<br />

încât egalitatea Ax = b să fie satisfăcută. Desigur, aceasta se poate realiza doar<br />

dacă sistemul are într-a<strong>de</strong>văr (cel puţin) o soluţie. Dacă nu are, vom atribui o nouă<br />

semnificaţie noţiunii <strong>de</strong> ”soluţie”, astfel încât sistemul să aibă cel puţin una. Dacă<br />

există mai multe soluţii, va trebui selectată, într-un anume fel, una singură care va<br />

fi <strong>calcul</strong>ată.<br />

Condiţiile în care sistemul (1.41) are soluţie şi în care aceasta este unică sunt<br />

bine cunoscute din algebra liniară.<br />

Teorema 1.2 Sistemul liniar (1.41) are soluţie dacă şi numai dacă b ∈ ImA.<br />

Dacă ImA = R m , adică A este epică (are liniile in<strong>de</strong>pen<strong>de</strong>nte), atunci sistemul<br />

(1.41) are soluţie pentru orice termen liber b ∈ R m şi reciproc.<br />

Demonstraţia este imediată prin <strong>de</strong>finiţia lui ImA.<br />


1.9. SISTEME DE ECUAŢII LINIARE 51<br />

y 3<br />

✻<br />

b ∉ ImA<br />

❍❨ b ❍<br />

∈ ImA ❍<br />

❍<br />

❍<br />

y 1<br />

❍✏ ✲<br />

✟<br />

✟<br />

✏✏✏✏✏✏✏✶<br />

✟ ✟<br />

y 2 ✟✙<br />

✟<br />

ImA<br />

Fig. 1.10: ImA şi posibili b pentru exemplul 1.2<br />

⎡<br />

Exemplul 1.2 Dacă A = ⎣ 1 0 ⎤<br />

1 1 ⎦, atunci ImA este planul y 2 = y 1 + y 3 . Dacă<br />

0 1<br />

b = [b 1 b 2 b 3 ] T este astfel încât b 2 = b 1 + b 3 , atunci sistemul Ax = b are soluţie<br />

<strong>de</strong>oarece condiţia din teorema 1.2 este în<strong>de</strong>plinită. Altfel, sistemul nu are soluţie<br />

(vezi figura 1.10).<br />

♦<br />

Când soluţia există, unicitatea ei rezultă din<br />

Teorema 1.3 1) Dacă x 0 ∈ R n este o soluţie particulară a sistemului liniar (1.41),<br />

atunci mulţimea tuturor soluţiilor sistemului este varietatea liniară<br />

x 0 + KerA = {x = x 0 + z | z ∈ KerA}.<br />

2) Soluţia x este unică dacă şi numai dacă KerA = {0}, adică matricea A este<br />

monică (are coloanele in<strong>de</strong>pen<strong>de</strong>nte).<br />

Demonstraţie. Dacă Ax 0 = b, atunci z = x − x 0 satisface Az = 0, <strong>de</strong>ci z ∈ KerA;<br />

reciproc, Az = 0 implică A(x 0 + z) = b.<br />

♦<br />

⎡<br />

[ ] [ ]<br />

1 1 0 2<br />

Exemplul 1.3 Dacă A = şi b = , atunci x<br />

0 1 1 1<br />

0 = ⎣ 1 ⎤<br />

1 ⎦ este<br />

0<br />

soluţie particulară pentru Ax = b. Pe <strong>de</strong> altă parte, KerA este dreapta <strong>de</strong>scrisă <strong>de</strong><br />

{<br />

x1 + x 2 = 0<br />

x 2 + x 3 = 0 ,<br />

care trece prin punctele O(0, 0, 0) şi P(1, −1, 1). Astfel, vectorii din KerA au forma<br />

⎡<br />

Ker A ∋ z = α ⎣ 1 ⎤<br />

−1 ⎦, α ∈ R,<br />

1


52 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

✻<br />

P<br />

•<br />

x 3<br />

x 1<br />

✲<br />

x 2<br />

✘✾✘ ✘✘ ✘ ✘✘✘<br />

O<br />

• ✘ ✘✘✘ ✘<br />

x ✘✘✘ ✘✿<br />

x❅ 0<br />

❅❘<br />

KerA<br />

x + KerA<br />

Fig. 1.11: Soluţiile (x 0 – soluţie particulară, x – soluţie generală) sistemului din<br />

exemplul 1.3<br />

şi <strong>de</strong>ci (vezi figura 1.11),<br />

x + KerA =<br />

⎧ ⎡<br />

⎨<br />

⎩ y = ⎣ 1 + α<br />

1 − α<br />

α<br />

⎤ ⎫<br />

⎬<br />

⎦ | α ∈ R<br />

⎭ .<br />

♦<br />

Corolar 1.1 Când matricea A este pătrată (A ∈ R n×n ), atunci următoarele afirmaţii<br />

sunt echivalente:<br />

i) ImA = R n , i.e. sistemul (1.41) admite soluţie unică pentru orice b ∈ R n ;<br />

ii) KerA = {0};<br />

iii) A este inversabilă.<br />

Dacă sistemul are soluţie, aceasta se poate scrie<br />

x = A −1 b. (1.42)<br />

Dacă sistemul este omogen, atunci soluţia unică este x = 0.<br />

Trebuie subliniat că (1.42) nu este o formulă a<strong>de</strong>cvată <strong>calcul</strong>ului <strong>numeric</strong> al<br />

soluţiei sistemului Ax = b. Vom ve<strong>de</strong>a în capitolul 2 <strong>meto<strong>de</strong></strong> <strong>numeric</strong>e eficiente şi<br />

precise pentru a face acest lucru.<br />

Când sistemul (1.41) nu are soluţie, este convenabil să <strong>de</strong>finim pseudosoluţia x ∗<br />

ca vectorul care minimizează o normă a reziduului r = b −Ax. Este evi<strong>de</strong>nt că dacă<br />

b ∈ ImA, atunci această pseudosoluţie <strong>de</strong>vine soluţie a<strong>de</strong>vărată a sistemului.<br />

Când sistemul (1.41) are mai multe soluţii, o posibilitate <strong>de</strong> a selecta una dintre<br />

ele este <strong>de</strong> a <strong>de</strong>fini soluţia normală x ∗ <strong>de</strong> ”lungime” minimă, lungimea fiind <strong>de</strong>finită<br />

printr-o normă a<strong>de</strong>cvată.<br />

Vom reveni asupra acestor <strong>de</strong>finiţii în capitolul 3, acolo un<strong>de</strong> vom prezenta şi<br />

<strong>algoritmi</strong> <strong>de</strong> <strong>calcul</strong> al soluţiilor astfel <strong>de</strong>finite.


1.9. SISTEME DE ECUAŢII LINIARE 53<br />

Determinantul. Fie o matrice pătrată A ∈ R n×n ; <strong>de</strong>terminantul matricei A<br />

este un număr real, notat <strong>de</strong>t(A), pe care îl vom <strong>de</strong>fini recursiv. Dacă A not<br />

= a ∈ R,<br />

atunci <strong>de</strong>t(A) = a. Pentru A ∈ R n×n ,<br />

<strong>de</strong>t(A) =<br />

n∑<br />

(−1) j+1 a 1j <strong>de</strong>t(Ā1j),<br />

j=1<br />

un<strong>de</strong> Ā1j ∈ R (n−1)×(n−1) este matricea obţinută din A prin eliminarea liniei 1 şi<br />

coloanei j.<br />

Câteva proprietăţi importante ale <strong>de</strong>terminantului sunt:<br />

1. <strong>de</strong>t(I) = 1;<br />

2. <strong>de</strong>t(αA) = α n <strong>de</strong>t(A), ∀α ∈ R;<br />

3. <strong>de</strong>t(A T ) = <strong>de</strong>t(A);<br />

4. <strong>de</strong>t(AB) = <strong>de</strong>t(A) · <strong>de</strong>t(B).<br />

O matrice A ∈ R n×n pentru care <strong>de</strong>t(A) ≠ 0 se numeşte nesingulară. Se poate<br />

<strong>de</strong>monstra că noţiunea <strong>de</strong> nesingularitate este echivalentă cu cea <strong>de</strong> inversabilitate.<br />

Să notăm <strong>de</strong> acum că în rezolvarea <strong>numeric</strong>ă a sistemului <strong>de</strong>terminat Ax = b<br />

nesingularitatea matricei A nu se verifică prin <strong>calcul</strong>ul <strong>de</strong>terminantului, ci prin alte<br />

mijloace, mult mai eficiente şi sigure, după cum se va ve<strong>de</strong>a în capitolul 2. De aceea<br />

mai <strong>de</strong>parte vom spune <strong>de</strong> cele mai multe ori inversabilă în loc <strong>de</strong> nesingulară.<br />

AA. Rezolvarea sistemelor triunghiulare. Sistemul Ax = b este numit inferior<br />

(superior) triunghiular dacă matricea A este inferior (superior) triunghiulară.<br />

O matrice triunghiulară este inversabilă dacă şi numai dacă toate elementele<br />

sale diagonale sunt nenule.<br />

Algoritmii pentru rezolvarea sistemelor triunghiulare sunt foarte simpli, <strong>de</strong>oarece<br />

necunoscutele pot fi <strong>calcul</strong>ate, într-o ordine precizată, prin substituţie <strong>numeric</strong>ă.<br />

Să consi<strong>de</strong>răm întâi un sistem inferior triunghiular, Lx = b, un<strong>de</strong> L ∈ R n×n , cu<br />

l ij = 0 pentru i < j, l ii ≠ 0, i ∈ 1 : n, şi b ∈ R n . Prima ecuaţie este l 11 x 1 = b 1 , din<br />

care<br />

x 1 = b 1 / l 11 . (1.43)<br />

În general, dacă se cunosc x 1 , x 2 , . . . , x i−1 , se poate rezolva a i-a ecuaţie,<br />

∑i−1<br />

l ij x j + l ii x i = b i ,<br />

j=1<br />

pentru a obţine<br />

⎛ ⎞<br />

∑i−1<br />

x i = ⎝b i − l ij x j<br />

⎠ / l ii . (1.44)<br />

j=1<br />

Formulele (1.43) şi (1.44) <strong>de</strong>finesc un algoritm pentru <strong>calcul</strong>ul soluţiei sistemului<br />

Lx = b, cunoscut ca metoda substituţiei înainte.<br />

Algoritmul 1.16 (LTRIS – Calculul soluţiei unui sistem inferior<br />

triunghiular) (Se dau L ∈ R n×n , inferior triunghiulară, inversabilă, şi<br />

b ∈ R n . Se <strong>calcul</strong>ează soluţia x a sistemului Lx = b.)


54 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

1. x ← b<br />

2. Pentru i = 1 : n<br />

1. Pentru j = 1 : i − 1<br />

1. x i ← x i − l ij x j<br />

2. x i ← x i / l ii<br />

Comentarii. Bucla Pentru interioară se poate înlocui cu un apel la produsul<br />

scalar DOT(L(i, 1 : i − 1), x(1 : i − 1)). Fiecare execuţie a buclei Pentru i necesită<br />

2(i − 1) flopi în 2.1.1, pentru <strong>calcul</strong>ul sumei din (1.44), şi 1 flop pentru împărţirea<br />

din 2.2. În total, sunt necesari N LTRIS = ∑ n<br />

i=1<br />

(2(i − 1) + 1) = n(n − 1) + n = n2<br />

flopi şi M LTRIS = n(n + 1)/2 + 2n + 1 ≈ n 2 /2 locaţii <strong>de</strong> memorie (pentru elemente<br />

în virgulă mobilă). Dacă vectorul b nu este necesar ulterior, soluţia x poate fi<br />

memorată în aceeaşi zonă <strong>de</strong> memorie cu b; se spune că se efectuează <strong>calcul</strong>ul pe loc<br />

în b. Ulterior, vom apela acest algoritm prin x = LTRIS(L, b).<br />

♦<br />

Un algoritm cu aceleaşi proprietăţi se obţine dacă schimbăm ordinea celor două<br />

bucle, ceea ce revine la a parcurge matricea L pe coloane, nu pe linii. Substituţia<br />

<strong>de</strong>curge acum astfel: după <strong>calcul</strong>ul lui x 1 cu (1.43), se actualizează valorile celorlalte<br />

necunoscute x i , i = 2 : n (iniţializate cu b i ), cu termenul l i1 x 1 care contribuie la<br />

sumele din (1.44); se poate <strong>calcul</strong>a acum x 2 , după care se actualizează din nou<br />

restul necunoscutelor.<br />

Algoritmul 1.17 (LTRIS – versiunea pe coloane) (Se dau<br />

L ∈ R n×n , inferior triunghiulară, inversabilă, şi b ∈ R n . Se <strong>calcul</strong>ează<br />

soluţia x a sistemului Lx = b.)<br />

1. x ← b<br />

2. Pentru j = 1 : n<br />

1. x j ← x j / l jj<br />

2. Pentru i = j + 1 : n<br />

1. x i ← x i − l ij x j<br />

Comentarii. Se observă că bucla Pentru interioară se poate înlocui cu un apel la<br />

Saxpy(−x(j), L(j + 1 : n, :), x(j + 1 : n)).<br />

♦<br />

Datorită erorilor <strong>numeric</strong>e, execuţia algoritmului LTRIS nu produce x = L −1 b,<br />

ci o soluţie aproximativă ˆx. Se poate <strong>de</strong>monstra că acest ˆx satisface<br />

(L + F)ˆx = b, cu |f ij | ≤ nε M |l ij | + O(ε 2 M), (1.45)<br />

adică ˆx este soluţia unui sistem cu matricea coeficienţilor uşor perturbată faţă<br />

<strong>de</strong> L. Aşadar algoritmul LTRIS este <strong>numeric</strong> stabil. (Acesta este un rezultat tipic<br />

<strong>de</strong> analiză inversă a erorilor.) Practica <strong>numeric</strong>ă arată o acurateţe a algoritmului<br />

LTRIS mult superioară celei indicate <strong>de</strong> (1.45).<br />

Pentru a rezolva sistemul superior triunghiular (nesingular) Ux = b, un<strong>de</strong><br />

U ∈ R n×n este o matrice superior triunghiulară, cu u ii ≠ 0, i ∈ 1 : n, şi b ∈ R n , să<br />

observăm că ultima ecuaţie are forma u nn x n = b n , iar <strong>de</strong> aici<br />

x n = b n /u nn . (1.46)


1.9. SISTEME DE ECUAŢII LINIARE 55<br />

Mai mult, dacă x n , x n−1 , . . . , x i+1 , sunt <strong>de</strong>ja <strong>calcul</strong>ate, atunci, din a i-a ecuaţie,<br />

se obţine<br />

u ii x i +<br />

⎛<br />

x i = ⎝b i −<br />

n∑<br />

j=i+1<br />

n∑<br />

j=i+1<br />

u ij x j = b i ,<br />

u ij x j<br />

⎞<br />

⎠/u ii . (1.47)<br />

Din formulele (1.46) şi (1.47), care <strong>de</strong>finesc aşa numita substituţie înapoi, obţinem<br />

direct algoritmul următor.<br />

Algoritmul 1.18 (UTRIS – Calculul soluţiei unui sistem superior<br />

triunghiular) (Se dau U ∈ R n×n , superior triunghiulară, inversabilă, şi<br />

b ∈ R n . Se <strong>calcul</strong>ează soluţia x a sistemului Ux = b.)<br />

1. x ← b<br />

2. Pentru i = n : −1 : 1<br />

1. Pentru j = i + 1 : n<br />

1. x i ← x i − u ij x j<br />

2. x i ← x i /u ii<br />

Perfect analog cu algoritmul 1.17 avem versiunea pe coloane a UTRIS.<br />

Algoritmul 1.19 (UTRIS – versiunea pe coloane) (Se dau<br />

U ∈ R n×n , superior triunghiulară, inversabilă, şi b ∈ R n . Se <strong>calcul</strong>ează<br />

soluţia x a sistemului Ux = b.)<br />

1. x ← b<br />

2. Pentru j = n : −1 : 1<br />

1. x j ← x j /u jj<br />

1. Pentru i = 1 : j − 1<br />

1. x i ← x i − u ij x j<br />

Comentarii. Ca şi în cazul inferior triunghiular, efortul <strong>de</strong> <strong>calcul</strong> este N UTRIS = n 2<br />

flopi, iar memoria ocupată M UTRIS ≈ n 2 /2 locaţii în virgulă mobilă. Vom apela<br />

acest algoritm prin x = UTRIS(L, b). Şi pentru algoritmul UTRIS este valabilă<br />

o relaţie <strong>de</strong> genul (1.45), i.e. algoritmul <strong>de</strong> mai sus este <strong>numeric</strong> stabil. Rezolvarea<br />

sistemelor triunghiulare este o operaţie <strong>de</strong> nivel 2.<br />

♦<br />

AA. Sisteme triunghiulare cu parte dreaptă multiplă. Se spune <strong>de</strong>spre<br />

un sistem <strong>de</strong> forma AX = B, cu A ∈ R n×n , B ∈ R n×p (rezultând X ∈ R n×p ), cu<br />

p > 1, că este un sistem cu parte dreaptă multiplă. Desigur, a rezolva AX = B este<br />

matematic echivalent cu a <strong>calcul</strong>a X = A −1 B. Partiţionând X şi B pe coloane,<br />

rezolvarea sistemului AX = B se poate reduce rezolvarea a p sisteme <strong>de</strong> forma<br />

(1.41), Ax j = b j , j ∈ 1 : p.<br />

Consi<strong>de</strong>răm A inferior triunghiulară. Prezentăm o variantă bloc <strong>de</strong> rezolvare a<br />

sistemului AX = B, a<strong>de</strong>cvată <strong>calcul</strong>atoarelor cu memorie ierarhică. Partiţionăm<br />

sistemul astfel


56 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

⎡<br />

⎢<br />

⎣<br />

⎤⎡<br />

A 11 0 . . . 0<br />

A 21 A 22 . . . 0<br />

.<br />

.<br />

. ..<br />

⎥⎢<br />

0 ⎦⎣<br />

A m1 A m2 . . . A mm<br />

⎤ ⎡<br />

X 1<br />

X 2<br />

⎥<br />

. ⎦ = ⎢<br />

⎣<br />

X m<br />

⎤<br />

B 1<br />

B 2<br />

⎥<br />

. ⎦ , (1.48)<br />

B m<br />

în care A ij ∈ R r×r , iar B i , X i ∈ R r×p . Evi<strong>de</strong>nt, blocurile diagonale A ii sunt inferior<br />

triunghiulare. Se presupune că r divi<strong>de</strong> n şi fie m = n/r.<br />

Sistemul (1.48) se rezolvă în mod analog cu sistemul inferior triunghiular cu o<br />

singură parte dreaptă, tratat mai sus. Bloc linia i a sistemului (1.48) conduce la o<br />

relaţie asemănătoare cu (1.44):<br />

i∑<br />

∑i−1<br />

A ij X j = B i =⇒ A ii X i = B i − A ij X j , (1.49)<br />

j=1<br />

din care se poate <strong>de</strong>duce un algoritm similar cu LTRIS (prin substituţie înainte).<br />

Pe un <strong>calcul</strong>ator cu memorie ierarhică (figura 0.4c), A, B şi X sunt stocate în<br />

memoria principală MP. Alegem r astfel încât blocurile A ij , X j şi B i să poată fi<br />

stocate simultan în memoria rapidă MR (<strong>de</strong>ci r 2 + 2rp < dim(MR)). Algoritmul<br />

următor se bazează pe i<strong>de</strong>ea aducerii acestor blocuri în MR şi apoi a efectuării<br />

<strong>calcul</strong>elor din (1.49).<br />

Algoritmul 1.20 (Se dau A ∈ R n×n , inferior triunghiulară, inversabilă,<br />

şi B ∈ R n×p . Se rezolvă sistemul AX = B. Se utilizează<br />

variabilele C, D, Z în MR.)<br />

1. Pentru i = 1 : m<br />

1. D ← B i<br />

2. Pentru j = 1 : i − 1<br />

1. C ← A ij , Z ← X j<br />

2. D ← D − CZ<br />

3. C ← A ii<br />

4. rezolvă sistemul triunghiular cu p.d.m. CZ = D<br />

(aplicând <strong>de</strong> p ori algoritmul LTRIS pentru<br />

Cz j = d j , j ∈ 1 : p)<br />

5. X i ← Z<br />

Comentarii. Toate operaţiile aritmetice, în număr <strong>de</strong> pn 2 (<strong>de</strong> p ori mai multe<br />

<strong>de</strong>cât pentru algoritmul LTRIS aplicat unui sistem Ax j = b j ), se efectuează cu<br />

operanzi din MR. Instrucţiunile 1.1, 1.2.1, 1.3, 1.5 reprezintă transferuri între MP<br />

şi MR; numărul acestor transferuri este <strong>de</strong><br />

⎛<br />

⎞<br />

m∑ ∑i−1<br />

⎝ (r 2 + rp) + r 2 + rp⎠ ≈ pn2<br />

2r + n2<br />

2 ,<br />

i=1<br />

j=1<br />

sensibil mai mic <strong>de</strong>cât în cazul în care operanzii s-ar fi aflat în MP (atunci ar fi fost<br />

aproximativ 2pn 2 accesuri la MP).<br />

j=1


1.9. SISTEME DE ECUAŢII LINIARE 57<br />

Rezolvarea sistemelor triunghiulare cu parte dreaptă multiplă face parte din<br />

grupul operaţiilor <strong>de</strong> nivel 3.<br />

♦<br />

AA. Inversarea matricelor triunghiulare. Fie L ∈ R n×n o matrice inferior<br />

triunghiulară; presupunem că L este inversabilă, adică l ii ≠ 0, i ∈ 1 : n. Pentru a<br />

<strong>calcul</strong>a X = L −1 , utilizăm egalitatea evi<strong>de</strong>ntă<br />

pe care o partiţionăm pe coloane<br />

LX = I n ,<br />

Lx j = e j , j ∈ 1 : n, (1.50)<br />

x j = Xe j fiind cea <strong>de</strong>-a j-a coloană a matricei X. Sistemul inferior triunghiular<br />

(1.50) poate fi rezolvat în mod eficient prin adaptarea algoritmului LTRIS la forma<br />

particulară a termenului drept. Într-a<strong>de</strong>văr, sistemul (1.50) poate fi partiţionat<br />

astfel: [<br />

un<strong>de</strong> L (j)<br />

11<br />

matricei L şi<br />

L (j)<br />

11 0<br />

L (j)<br />

21 L (j)<br />

22<br />

] [ x<br />

′<br />

j<br />

x ′′<br />

j<br />

]<br />

=<br />

[ 0<br />

e ′′<br />

j<br />

]<br />

, (1.51)<br />

este submatricea <strong>de</strong> dimensiune (j − 1) × (j − 1) din colţul stânga sus al<br />

Din (1.51) rezultă {<br />

e ′′<br />

j = [1 0 . . .0]T ∈ R n−j+1 .<br />

L (j)<br />

11 x′ j = 0,<br />

L (j)<br />

21 x′ j + L(j) 22 x′′ j = e′′ j . (1.52)<br />

Deoarece L este inversabilă şi, prin urmare, la fel sunt L (j)<br />

11<br />

şi L(j) 22 , relaţia (1.52)<br />

<strong>de</strong>vine {<br />

x<br />

′<br />

j = 0,<br />

L (j)<br />

22 x′′ j = e′′ j . (1.53)<br />

Această relaţie stabileşte un fapt important, dat <strong>de</strong><br />

Propoziţia 1.5 Inversa unei matrice inferior triunghiulare nesingulare este inferior<br />

triunghiulară.<br />

În concluzie, matricele inferior triunghiulare inversabile formează grup în raport<br />

cu înmulţirea <strong>matriceal</strong>ă.<br />

Din (1.53) poate fi <strong>de</strong>dus un algoritm <strong>de</strong> <strong>calcul</strong> al inversei unei matrice nesingulare,<br />

având la bază următoarea schemă <strong>de</strong> <strong>calcul</strong>:<br />

L −1<br />

1. Pentru j = 1 : n<br />

1. Dacă j > 1 atunci x ′ j = 0<br />

2. x ′′<br />

j = LTRIS(L(j) 22 , e′′ j )<br />

Se poate observa că inversa <strong>calcul</strong>ată poate fi memorată în aceeaşi zonă <strong>de</strong><br />

memorie ca matricea L. Explicitând rezolvarea sistemului inferior triunghiular,<br />

obţinem


58 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

Algoritmul 1.21 (LINV – Calculul inversei unei matrice inferior<br />

triunghiulare) (Se dă L ∈ R n×n , inferior triunghiulară şi inversabilă. Se<br />

<strong>calcul</strong>ează pe loc în L inversa acesteia.)<br />

1. Pentru j = 1 : n<br />

1. l jj ← x jj = 1 / l jj<br />

2. Pentru i = j + 1 :<br />

(<br />

n<br />

∑i−1<br />

)<br />

1. l ij ← x ij = −<br />

k=j l ikx kj / l ii<br />

Comentarii.<br />

Numărul <strong>de</strong> operaţii necesar este<br />

n−1<br />

∑<br />

N LINV = n +<br />

n∑<br />

j=1 i=j+1<br />

2(i − j) ≈ n3<br />

3 .<br />

Memoria necesară este M LINV ≈ n 2 /2 locaţii în virgulă mobilă. Se ve<strong>de</strong> acum că<br />

rezolvarea sistemului liniar Lx = b folosind relaţia x = L −1 b (adică LINV) este<br />

ineficientă în comparaţie cu algoritmul direct LTRIS.<br />

♦<br />

Pentru a <strong>calcul</strong>a inversa unei matrice superior triunghiulare nesingulare<br />

U ∈ R n×n , trebuie rezolvată ecuaţia <strong>matriceal</strong>ă UX = I n , sau, echivalent, cele<br />

n ecuaţii liniare<br />

Ux j = e j , j = 1 : n, (1.54)<br />

un<strong>de</strong> x j este coloana j a matricei X = U −1 .<br />

Utilizând partiţia<br />

[ ] [<br />

U (j)<br />

11 U (j)<br />

12 x<br />

′<br />

j<br />

0 U (j) x ′′<br />

22 j<br />

] [ e<br />

′<br />

= j<br />

0<br />

]<br />

, (1.55)<br />

un<strong>de</strong> U (j)<br />

11 este submatricea <strong>de</strong> dimensiune j × j din colţul stânga sus a lui U şi<br />

e ′ j = [0 0 . . .0 1]T ∈ R j , şi urmând o cale asemănătoare celei parcurse pentru inversarea<br />

matricelor inferior triunghiulare, se obţin analoagele relaţiei (1.53), propoziţiei<br />

1.5 şi algoritmului LINV. Avem:<br />

{<br />

U (j)<br />

11 x′ j = e′ j ,<br />

x ′′<br />

j = 0. (1.56)<br />

Propoziţia 1.6 Inversa unei matrice superior triunghiulare nesingulare este superior<br />

triunghiulară.<br />

Aşadar matricele superior triunghiulare inversabile formează grup în raport cu<br />

înmulţirea.<br />

Dacă sistemele (1.56) sunt rezolvate în ordine inversă (pentru j = n, n−1, . . ., 1),<br />

se poate ve<strong>de</strong>a cu uşurinţă că elementele matricei inverse se pot memora peste cele<br />

ale matricei originale, pe măsură ce sunt <strong>calcul</strong>ate. Vom obţine <strong>de</strong>ci următorul<br />

algoritm.


1.10. VALORI ŞI VECTORI PROPRII 59<br />

Algoritmul 1.22 (UINV – Calculul inversei unei matrice superior<br />

triunghiulare) (Se dă U ∈ R n×n , superior triunghiulară şi inversabilă.<br />

Se <strong>calcul</strong>ează pe loc în U inversa acesteia.)<br />

1. Pentru j = n : −1 : 1<br />

1. u jj ← x jj = 1/u jj<br />

2. Pentru i = j − 1 : −1 ( : 1<br />

∑j<br />

)<br />

1. u ij ← x ij = −<br />

k=i+1 u ikx kj /u ii<br />

Comentarii. Ca în cazul inferior triunghiular, N UINV ≈ n 3 /3 şi M UINV ≈ n 2 /2.<br />

Algoritmii <strong>de</strong> inversare a matricelor triunghiulare sunt <strong>numeric</strong> stabili. ♦<br />

1.10 Valori şi vectori proprii<br />

Fie A ∈ C n×n . Numărul λ ∈ C se numeşte valoare proprie a matricei A dacă există<br />

un vector v ∈ C n , v ≠ 0, astfel încât<br />

Av = λv. (1.57)<br />

În acest caz, v se numeşte vector propriu al matricei A, asociat lui λ.<br />

Se observă că dacă v este vector propriu al matricei A, atunci şi u = αv este<br />

vector propriu al lui A, corespunzând aceleiaşi valori proprii, oricare α ∈ C, α ≠ 0.<br />

Aşadar, vectorii proprii sunt <strong>de</strong>terminaţi numai ca direcţie, nu şi ca mărime.<br />

Teorema 1.4 Fie A ∈ C n×n . Scalarul λ ∈ C este valoare proprie a matricei A<br />

dacă şi numai dacă matricea λI − A este singulară. Mai mult, matricea A are<br />

exact n valori proprii (numărând separat valorile proprii multiple), care coincid cu<br />

zerourile polinomului caracteristic<br />

p(λ) = <strong>de</strong>t(λI n − A). (1.58)<br />

Dacă A ∈ R n×n , valorile proprii apar în perechi complex conjugate (iar vectorii<br />

proprii asociaţi acestor perechi pot fi aleşi complex conjugaţi).<br />

Demonstraţie. Dacă λ este valoare proprie a matricei A, atunci există un vector<br />

v ≠ 0 astfel încât Av = λv, <strong>de</strong>ci (λI n − A)v = 0 şi în consecinţă λI n − A este<br />

singulară. Reciproc, dacă pentru un λ ∈ C matricea λI n − A este singulară, atunci<br />

există v ∈ C n , v ≠ 0, astfel încât (λI n − A)v = 0, adică Av = λv şi <strong>de</strong>ci λ este<br />

valoare proprie a matricei A.<br />

Deoarece λI n −A este singulară dacă şi numai dacă λ satisface <strong>de</strong>t(λI −A) = 0,<br />

iar p(λ) = <strong>de</strong>t(λI −A) este un polinom monic <strong>de</strong> grad n, din teorema fundamentală<br />

a algebrei rezultă că (1.58) are n zerouri care coincid cu valorile proprii ale matricei<br />

A. Dacă A este reală, polinomul caracteristic p(λ) are coeficienţi reali şi atunci<br />

zerourile sale complexe apar în perechi complex conjugate (pentru vectori proprii,<br />

vezi problema 1.28).<br />

♦<br />

Ca o consecinţă directă a faptului că valorile proprii sunt rădăcinile ecuaţiei<br />

<strong>de</strong>t(λI n − A) = 0, să observăm că dacă A este diagonală sau triunghiulară, atunci<br />

valorile sale proprii sunt chiar elementele diagonale.


60 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

Notăm prin<br />

λ(A) = {λ 1 , λ 2 , . . .,λ n } = {λ ∈ C | <strong>de</strong>t(λI − A) = 0} (1.59)<br />

mulţimea valorilor proprii ale matricei A ∈ C n×n (cu repetarea valorilor proprii<br />

multiple). Mulţimea λ(A) se numeşte spectrul matricei A.<br />

Transformări <strong>de</strong> asemănare. Suntem interesaţi <strong>de</strong> transformările care conservă<br />

spectrul unei matrice date; se observă că valorile proprii nu sunt conservate<br />

în urma premultiplicării sau postmultiplicării cu o altă matrice.<br />

Două matrice A, B ∈ C n×n sunt numite asemenea dacă există o matrice nesingulară<br />

T ∈ C n×n astfel încât<br />

B = TAT −1 . (1.60)<br />

T se numeşte transformare <strong>de</strong> asemănare. Dacă T este unitară (ortogonală, în cazul<br />

real), atunci A şi B sunt ortogonal asemenea.<br />

Teorema 1.5 Două matrice asemenea A, B ∈ C n×n au acelaşi spectru, adică<br />

λ(A) = λ(B). Mai mult, dacă T este matricea <strong>de</strong> transformare din (1.60) şi dacă<br />

v A este vector propriu al matricei A corespunzător valorii proprii λ ∈ λ(A), atunci<br />

vectorul<br />

v B = Tv A (1.61)<br />

este vector propriu al matricei B, corespunzător aceleiaşi valori proprii.<br />

Demonstraţie. Dacă A şi B satisfac (1.60), atunci<br />

<strong>de</strong>t(λI − B) = <strong>de</strong>t(λI − TAT −1 ) = <strong>de</strong>t(T(λI − A)T −1 ) =<br />

= <strong>de</strong>t(T)<strong>de</strong>t(λI − A)<strong>de</strong>t(T −1 ) = <strong>de</strong>t(λI − A),<br />

<strong>de</strong>ci λ(A) = λ(B). Dacă v A este vector propriu al matricei A corespunzător valorii<br />

proprii λ, atunci Av A = λv A , sau TAT −1 Tv A = λTv A , <strong>de</strong> un<strong>de</strong> Bv B = λv B şi <strong>de</strong>ci<br />

(1.61) este a<strong>de</strong>vărată. ♦<br />

Matrice simple. O matrice A ∈ C n×n care are un set complet <strong>de</strong> n vectori<br />

proprii liniar in<strong>de</strong>pen<strong>de</strong>nţi se numeşte simplă. Acesta este cazul generic şi totodată<br />

cel în care proprietăţile spectrale ale matricelor sunt mai ”vizibile”. Se poate<br />

<strong>de</strong>monstra că dacă matricea A are n valori proprii distincte, atunci ea este simplă.<br />

Teorema 1.6 Fie A ∈ C n×n o matrice simplă şi V ∈ C n×n matricea ale cărei<br />

coloane sunt vectorii proprii ai lui A. Atunci<br />

este o matrice diagonală.<br />

V −1 AV = Λ ∈ C n×n (1.62)<br />

Demonstraţie. V = [v 1 v 2 . . . v n ] şi Av j = λ j v j , j ∈ 1 : n, un<strong>de</strong> λ j sunt valorile<br />

proprii ale lui A. Atunci<br />

AV = [Av 1 Av 2 . . . Av n ] = [λ 1 v 1 λ 2 v 2 . . . λ n v n ] =


1.10. VALORI ŞI VECTORI PROPRII 61<br />

= [v 1 v 2 . . . v n ] diag(λ 1 , λ 2 , . . .,λ n ) = V Λ.<br />

Deoarece vectorii v j , j ∈ 1 : n, sunt liniar in<strong>de</strong>pen<strong>de</strong>nţi, matricea V este nesingulară<br />

şi (1.62) este a<strong>de</strong>vărată.<br />

♦<br />

Aşadar o matrice simplă poate fi diagonalizată peste C printr-o transformare <strong>de</strong><br />

asemănare. Nu aceasta este şi abordarea <strong>numeric</strong>ă a problemei, care va fi discutată<br />

pe larg în capitolul 4.<br />

Subspaţii invariante. Fie A ∈ C n×n şi un subspaţiu S ⊂ C n ; spunem că S<br />

este A-invariant dacă Av ∈ S, ∀v ∈ S. (Definiţia este i<strong>de</strong>ntică pentru A ∈ R n×n ,<br />

S ⊂ R n .)<br />

Se observă uşor că dacă S are o bază formată din vectori proprii ai matricei A,<br />

atunci S este A-invariant. Reciproca acestei afirmaţii nu este, în general, a<strong>de</strong>vărată.<br />

AA. Calculul vectorilor proprii ai matricelor triunghiulare. Fie<br />

U ∈ R n×n o matrice superior triunghiulară. Aşa cum am observat mai sus, valorile<br />

sale proprii sunt λ i = u ii , i ∈ 1 : n. Dorim acum să <strong>calcul</strong>ăm vectorii proprii.<br />

1. Consi<strong>de</strong>răm întâi cazul în care valorile proprii sunt distincte două câte două.<br />

Fie T = λ j I −U; vectorul propriu v j va fi <strong>calcul</strong>at rezolvând sistemul liniar Tv j = 0,<br />

care poate fi partiţionat<br />

⎡<br />

⎣ T ⎤⎡<br />

11 y T 13 v ′ ⎤ ⎧<br />

0 w T<br />

j ⎨ T 11 v j ′ + v jjy + T 13 v j ′′ = 0<br />

⎦⎣<br />

v jj<br />

⎦ = 0 ⇔ w T v<br />

T 33 v j<br />

′′<br />

j ′′<br />

⎩<br />

= 0<br />

, (1.63)<br />

T 33 v j ′′ = 0<br />

un<strong>de</strong> v j ′ ∈ Rj−1 , v j ′′ ∈ Rn−j . Valorile proprii fiind distincte, T 11 şi T 33 sunt nesingulare.<br />

Din (1.63), T 33 v j ′′ = 0, şi <strong>de</strong>ci v′′ j = 0. Ecuaţia wT v j ′′ = 0 este întot<strong>de</strong>auna<br />

satisfăcută iar v jj poate avea o valoare nenulă oarecare, să zicem v jj = 1. În fine,<br />

sistemul superior triunghiular T 11 v j ′ = −y are soluţie unică, care se poate <strong>calcul</strong>a<br />

cu algoritmul UTRIS.<br />

Vectorii proprii astfel <strong>calcul</strong>aţi sunt liniar in<strong>de</strong>pen<strong>de</strong>nţi, <strong>de</strong>oarece matricea<br />

V = [v 1 v 2 . . . v n ] este superior triunghiulară unitate; rezultatul e natural, <strong>de</strong>oarece<br />

U este simplă. Direcţiile vectorilor proprii sunt unic <strong>de</strong>finite, mărimile lor fiind alese<br />

arbitrar prin constrângerea v jj = 1.<br />

2. Dacă există valori proprii multiple, atunci T va avea mai multe valori diagonale<br />

nule. Putem alege în continuare, în (1.63), v j ′′ = 0, v jj = 1. Acum însă,<br />

T 11 poate fi singulară, <strong>de</strong>ci se pune problema dacă sistemul superior triunghiular<br />

T 11 v j ′ = −y are soluţie. Procedând prin substituţie înapoi, presupunem că v jj = 1,<br />

v j−1,j , ..., v i+1,j au fost <strong>calcul</strong>ate şi scriem ecuaţia i a acestui sistem<br />

t ii v ij = β ij ,<br />

cu β ij = −t ij −<br />

∑j−1<br />

k=i+1<br />

t ik v kj . (1.64)<br />

Dacă t ii ≠ 0, evi<strong>de</strong>nt că în (1.64) v ij = β ij / t ii şi substituţia poate continua. Dacă<br />

t ii = 0, sunt două variante: fie β ij = 0, şi atunci v ij din (1.64) poate avea o valoare<br />

arbitrară, <strong>de</strong> exemplu v ij = 1, şi substituţia continuă; fie β ij ≠ 0, şi atunci (1.64)<br />

nu este satisfăcută, <strong>de</strong>ci sistemul (1.63) nu are soluţie v j ; în acest caz, matricea U<br />

este <strong>de</strong>fectivă, adică nu are n vectori proprii liniar in<strong>de</strong>pen<strong>de</strong>nţi.


62 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

Consi<strong>de</strong>raţiile <strong>de</strong> mai sus conduc la următorul algoritm general, în care matricea<br />

T = λ j − U nu se formează explicit<br />

Algoritmul 1.23 (TRV – Calculul vectorilor proprii ai unei matrice<br />

superior triunghiulare) (Se dă U ∈ R n×n , superior triunghiulară.<br />

Se <strong>calcul</strong>ează vectorii proprii ai matricei U în matricea V ; coloanele nule<br />

din V <strong>de</strong>semnează cazurile <strong>de</strong> <strong>de</strong>fectivitate.)<br />

1. V ← 0<br />

2. Pentru j = 1 : n<br />

1. v jj ← 1<br />

2. Pentru i = j − 1 : −1 : 1<br />

1. β ← u ij + ∑ j−1<br />

k=i+1 u ikv kj<br />

2. Dacă u ii ≠ u jj atunci % t ii ≠ 0<br />

1. v ij ← β/(u jj − u ii )<br />

altfel dacă β = 0 atunci<br />

2. v ij ← 1<br />

altfel % β ≠ 0<br />

3. v kj ← 0, cu k = i + 1 : j<br />

4. treci la următorul j<br />

Comentarii. Instrucţiunile 2.2.2.1, 2.2.2.2, 2.2.2.3 implementează cele trei cazuri<br />

posibile în rezolvarea ecuaţiei (1.64); în 2.2.2.3 se refac zerourile din coloana j<br />

a matricei V , pentru a se marca ne<strong>calcul</strong>area unui vector propriu. Numărul <strong>de</strong><br />

operaţii este <strong>de</strong> cel mult n 3 /3 flopi.<br />

Deoarece <strong>calcul</strong>ul valorii β este afectat <strong>de</strong> erori <strong>numeric</strong>e, <strong>de</strong>cizia β = 0 se<br />

implementează efectiv printr-un test <strong>de</strong> genul |β| < cε M , un<strong>de</strong> c > 1 este o constantă<br />

mică. În unele programe <strong>de</strong> <strong>calcul</strong>, cazurile <strong>de</strong> <strong>de</strong>fectivitate sunt pur şi simplu<br />

ocolite; atunci când u ii = u jj , se ia forţat în 2.2.2.1 u jj −u ii = ε M şi se lucrează ca<br />

şi cum matricea U are avea valori proprii distincte. Se obţin astfel întot<strong>de</strong>auna n<br />

vectori proprii distincţi; în cazurile <strong>de</strong> <strong>de</strong>fectivitate, vectorii proprii corespunzători<br />

aceleiaşi valori proprii sunt aproape (cu o aproximaţie <strong>de</strong> ordinul preciziei <strong>de</strong> <strong>calcul</strong>)<br />

coliniari.<br />

♦<br />

Cazul matricelor inferior triunghiulare se tratează analog şi e lăsat ca exerciţiu.<br />

1.11 Rutinele BLAS<br />

Am prezentat în secţiunile anterioare <strong>algoritmi</strong> simpli a<strong>de</strong>cvaţi <strong>calcul</strong>atoarelor cu<br />

memorie ierarhică: 1.15 pentru înmulţirea <strong>de</strong> matrice şi 1.20 pentru rezolvarea<br />

sistemelor triunghiulare cu parte dreaptă multiplă. Pentru majoritatea problemelor,<br />

însă, <strong>algoritmi</strong>i sunt complicaţi şi efortul găsirii unei i<strong>de</strong>i <strong>de</strong> adaptare poate fi consi<strong>de</strong>rabil;<br />

programatorul ar fi obligat să cunoască <strong>de</strong>talii arhitecturale şi ale sistemului<br />

<strong>de</strong> operare pentru <strong>calcul</strong>atorul în cauză. În plus, programul realizat ar funcţiona<br />

doar pe tipul respectiv <strong>de</strong> <strong>calcul</strong>ator, transferul pe un altul implicând rescrierea<br />

parţială.<br />

Pentru a uşura sarcina programatorului şi pentru a realiza portabilitatea, a<br />

apărut i<strong>de</strong>ea scrierii unor biblioteci <strong>de</strong> rutine fundamentale, puţine la număr, dar


1.11. RUTINELE BLAS 63<br />

S – real simplă precizie<br />

D – real dublă precizie<br />

C – complex simplă precizie<br />

Z – complex dublă precizie<br />

GE - generală GB - generală bandă<br />

SY - simetrică SB - simetrică bandă SP - simetrică împachetat<br />

HE - hermitică HB - hermitică bandă HP - hermitică împachetat<br />

TR - triunghiulară TB - triungh. bandă TP - triungh. împachetat<br />

Tabelul 1.1: Convenţii <strong>de</strong> nume în BLAS: tipuri <strong>de</strong> date şi structuri <strong>de</strong> matrice<br />

implementate foarte eficient pe majoritatea <strong>calcul</strong>atoarelor (<strong>de</strong> către programatori<br />

profesionişti). Atunci, un program obişnuit va folosi cât mai mult aceste rutine, şi<br />

cât mai puţin alt gen <strong>de</strong> operaţii; eficienţa este asigurată, datorită a<strong>de</strong>cvării rutinelor<br />

<strong>de</strong> bază la arhitectură, iar efortul <strong>de</strong> programare este redus, datorită numărului<br />

redus al rutinelor.<br />

Astfel s-au născut (începând din 1973, până în 1989) bibliotecile BLAS (Basic<br />

Linear Algebra Subroutines – rutine <strong>de</strong> bază în algebra liniară), care s-au impus ca<br />

un standard unanim acceptat şi sunt implementate pe marea majoritate a <strong>calcul</strong>atoarelor<br />

<strong>de</strong> performanţă. Există trei nivele BLAS, în fapt trei biblioteci distincte<br />

al căror conţinut tratează operaţii asemănătoare din punct <strong>de</strong> ve<strong>de</strong>re al datelor<br />

implicate:<br />

• nivel 1: <strong>de</strong>dicat operaţiilor vectoriale, <strong>de</strong> genul Saxpy sau DOT, care necesită<br />

O(n) flopi. BLAS-1 este a<strong>de</strong>cvat <strong>calcul</strong>atoarelor vectoriale.<br />

• nivel 2: <strong>de</strong>dicat operaţiilor matrice-vector, <strong>de</strong> tipul Gaxpy sau rezolvare <strong>de</strong><br />

sisteme triunghiulare, care necesită O(n 2 ) flops. Şi BLAS-2 are aplicabilitate<br />

în special pe <strong>calcul</strong>atoare vectoriale.<br />

• nivel 3: operaţii matrice-matrice, ca înmulţirea <strong>de</strong> matrice sau rezolvarea <strong>de</strong><br />

sisteme triunghiulare cu parte dreaptă multiplă, care necesită O(n 3 ) flops.<br />

BLAS-3 este eficient în<strong>de</strong>osebi pe <strong>calcul</strong>atoare cu memorie ierarhică.<br />

Prezentăm în continuare câteva din rutinele BLAS, insistând asupra nivelului 3,<br />

<strong>de</strong>oarece <strong>calcul</strong>atoarele cu memorie ierarhică sunt tot mai răspândite.<br />

Convenţii <strong>de</strong> nume. Scrise iniţial în FORTRAN, numele rutinelor sunt foarte<br />

scurte (cel mult şase caractere) şi <strong>de</strong> aceea greu <strong>de</strong> înţeles fără explicaţii asupra<br />

convenţiilor utilizate pentru stabilirea lor. În tabelul 1.1, prima literă a numelui<br />

unei rutine indică tipul datelor, iar următoarele două (numai pentru nivelele 2 şi<br />

3), structura matricelor argumente ale funcţiei.<br />

În fine, ultimele trei (uneori două) litere — tot pentru nivelele 2 şi 3 — codifică<br />

operaţia executată, după cum se va ve<strong>de</strong>a imediat.<br />

BLAS 1. Prezentăm în tabelul 1.2 cele mai importante rutine ale nivelului 1 al<br />

BLAS, fără a preciza argumentele lor, ci numai operaţia realizată; ca şi până acum,<br />

x, y sunt vectori în R n sau C n , iar α scalar. Prima literă a numelui, care arată tipul<br />

datelor, este precizată în ultima coloană.


64 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

Nume Operaţie Prefixe<br />

xSWAP x ↔ y S, D, C, Z<br />

xSCAL x ← αx S, D, C, Z<br />

xCOPY x ← y S, D, C, Z<br />

xAXPY y ← αx + y S, D, C, Z<br />

xDOT dot ← x T y S, D<br />

xDOTU dot ← x T y C, Z<br />

xDOTC dot ← x H y C, Z<br />

xNRM2 nrm2 ← ‖x‖ 2 S, D, C, Z<br />

Tabelul 1.2: Rutine din BLAS 1<br />

Deoarece argumentele funcţiilor sunt asemănătoare, exemplificăm cu un apel<br />

tipic:<br />

SAXPY(N, ALFA, X, INCX, Y, INCY)<br />

INCX reprezintă distanţa, în memorie, între două elemente succesive ale vectorului<br />

al cărui prim element se găseşte la adresaX. Argumentul INCX permite utilizarea<br />

ca vectori, în SAXPY, atât a coloanelor cât şi a liniilor unei matrice. Să presupunem<br />

că o matrice A este memorată într-un tablou m × n, în ordinea coloanelor (adică<br />

a 11 , a 21 , . . ., a m1 , a 12 , . . . ). Atunci coloana j este reprezentată astfel: X este adresa<br />

elementului a 1j (adică A + mjd, un<strong>de</strong> d este numărul <strong>de</strong> octeţi necesari memorării<br />

unui element), iar INCX = 1. Pentru a reprezenta linia i a matricei A, luămXadresa<br />

elementului a i1 (adică A + id), iar INCX = m.<br />

BLAS 2. Nivelul 2 al BLAS conţine rutine pentru trei operaţii: produsul<br />

matrice-vector, rezolvarea sistemelor triunghiulare şi produsul exterior, în diverse<br />

variante pe care le enumerăm în continuare.<br />

Rutinele care execută înmulţire matrice-vector <strong>de</strong> forma y ← αAx + βy au<br />

numele <strong>de</strong> tipul xyyMV, în care primele trei litere sunt cele din tabelul 1.1 (toate<br />

combinaţiile permise).<br />

Rezolvarea sistemelor (inferior sau superior) triunghiulare este efectuată <strong>de</strong> rutinele<br />

xyySV, un<strong>de</strong> yy este TR, TB sau TP.<br />

Pentru produsul exterior, rutina <strong>de</strong> bază este xGER, care execută operaţia<br />

A ← αxy T + A, un<strong>de</strong> A este o matrice.<br />

Nu dăm un exemplu <strong>de</strong> apel, <strong>de</strong>oarece <strong>de</strong>scrierea matricelor se face ca la rutinele<br />

<strong>de</strong> nivel 3, explicate mai jos, iar cea a vectorilor ca în rutinele <strong>de</strong> nivel 1.<br />

BLAS 3. Vom prezenta acum cele 6 rutine alese a face parte din setul BLAS<br />

nivel 3 în []. Ele sunt puţine la număr, <strong>de</strong>oarece munca <strong>de</strong> creare a unei rutine<br />

optime este dificilă; chiar dacă rutinele rezolvă probleme relativ simple, arhitectura<br />

complicată implică folosirea aproape exclusivă a limbajului <strong>de</strong> asamblare; pe un<br />

<strong>calcul</strong>ator CRAY, s-a ajuns chiar la 100 000 linii <strong>de</strong> program pentru o, în aparenţă<br />

banală, înmulţire <strong>de</strong> matrice.<br />

Operaţiile implementate <strong>de</strong> rutinele BLAS nivel 3 sunt esenţialmente în număr<br />

<strong>de</strong> două: înmulţirea <strong>de</strong> matrice, în câteva variante, şi rezolvarea <strong>de</strong> sisteme triunghiulare<br />

cu parte dreaptă multiplă. Numele rutinelor sunt <strong>de</strong>ja intrate în uzul curent şi


1.11. RUTINELE BLAS 65<br />

✛<br />

K<br />

✲<br />

✻<br />

✻<br />

LDA<br />

M<br />

❄<br />

❄<br />

Fig. 1.12: Memorarea (pe coloane a) unei matrice într-un tablou<br />

respectă regulile din tabelul 1.1; pentru a nu încărca expunerea, nu vom prezenta<br />

modul efectiv <strong>de</strong> apel <strong>de</strong>cât pentru prima rutină prezentată.<br />

În cele ce urmează, A, B, C sînt matrice oarecare, cu dimensiuni oarecare,<br />

dar a<strong>de</strong>cvate operaţiilor, sau simetrice şi pătrate, T este o matrice triunghiulară,<br />

superior sau inferior, iar α şi β sînt scalari.<br />

1. xGEMM (GEneral Matrix Multiplication) – înmulţirea matrice-matrice, în cazul<br />

general. Modul complet <strong>de</strong> apel este:<br />

xGEMM(TRANSA, TRANSB, M, N, K, ALFA, A, LDA, B, LDB, BETA, C, LDC)<br />

Operaţiile efectuate <strong>de</strong> rutină sînt prezentate în tabelul următor; C este întot<strong>de</strong>una<br />

<strong>de</strong> dimensiune m × n.<br />

TRANSA = ’N’ TRANSA = ’T’<br />

TRANSB = ’N’ C ←− αAB + βC C ←− αA T B + βC<br />

A este m × k, B este k × n A este k × m, B este k × n<br />

TRANSB = ’T’ C ←− αAB T + βC C ←− αA T B T + βC<br />

A este m × k, B este n × k A este k × m, B este n × k<br />

Argumentele rutinei <strong>de</strong>vin acum mai clare: TRANSA şi TRANSB arată dacă matricele<br />

A, B se transpun sau nu; M, N, K sunt dimensiunile efective ale matricelor;<br />

LDA, LDB, LDC conţin dimensiunea principală a variabilelor în care sunt stocate<br />

matricele, presupuse memorate pe coloane. Semnificaţia acestor variabile dimensionale<br />

este mai clară în figura 1.12. Elementele <strong>de</strong> pe aceeaşi linie se află la distanţă<br />

LDA în memorie. Se mai poate observa că patru variabile (analog cu A, M, K, LDA)<br />

sunt suficiente pentru utilizarea oricărei submatrice a matricei din figură.<br />

Rutina acoperă toate variantele <strong>de</strong> înmulţire a două matrice, operaţia <strong>de</strong> bază<br />

fiind C ← αAB + βC; transpunerea nu este lăsată utilizatorului, <strong>de</strong>oarece poate<br />

fi mare consumatoare <strong>de</strong> timp dacă se execută explicit (în xGEMM nu se întâmplă<br />

aşa); la fel, înmulţirea matrice-scalar. Cum toate celelalte rutine BLAS nivel 3 au<br />

argumente <strong>de</strong> apelare asemănătoare, vom prezenta în continuare doar operaţia <strong>de</strong><br />

bază implementată.<br />

2. xSYMM (SYmetric Matrix Multiplication) – înmulţire matrice-matrice, cu una<br />

din matrice simetrică:


66 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

C ← αAB + βC. (1.65)<br />

3. xSYRK (SYmmetric Rank-K update) – actualizare <strong>de</strong> rang k a unei matrice<br />

simetrice; A are dimensiune n × k.<br />

C ← αAA T + βC. (1.66)<br />

De obicei, k < n; <strong>de</strong> aici numele rutinei, AA T având rang ≤ k.<br />

4. xSYR2K – actualizare <strong>de</strong> rang 2k a unei matrice simetrice:<br />

C ← αAB T + αBA T + βC. (1.67)<br />

5. xTRMM (TRiangular Matrix Multiplication) – înmulţire matrice-matrice, cu<br />

una dintre matrice triunghiulară:<br />

B ← αTB. (1.68)<br />

Evi<strong>de</strong>nt, există şi varianta în care T este la dreapta; <strong>de</strong> asemenea, T poate fi inferior<br />

sau superior triunghiulară.<br />

6. xTRSM (TRiangular system Solver, with Multiple right hand term) – <strong>calcul</strong>ează<br />

soluţia unui sistem liniar triunghiular, cu parte dreaptă multiplă (TX = B):<br />

X ← αT −1 B. (1.69)<br />

Şi pentru această rutină există versiuni în care necunoscuta este în stânga (<strong>de</strong> genul<br />

XT = B); T este fie superior, fie inferior triunghiulară.<br />

Ca pentru orice standard, alegerea setului <strong>de</strong> mai sus poate părea mai mult sau<br />

mai puţin arbitrară; principala justificare a alegerii este numărul mare <strong>de</strong> <strong>algoritmi</strong><br />

din algebra liniară care folosesc rutine din setul propus.<br />

Vom prezenta în cursul acestei lucrări şi <strong>algoritmi</strong> scrişi astfel încât marea majoritate<br />

a operaţiilor să apară în execuţia unor rutine BLAS <strong>de</strong> nivel 3. Pentru a<br />

cuantifica eficienţa lor, introducem pon<strong>de</strong>rea operaţiilor <strong>de</strong> nivel 3 prin raportul<br />

P 3 (n) =<br />

N 3(n)<br />

N total (n) . (1.70)<br />

N total (n) reprezintă numărul total <strong>de</strong> flopi necesari execuţiei algoritmului, iar N 3 (n)<br />

numărul <strong>de</strong> flopi executaţi în rutinele din BLAS-3; ele <strong>de</strong>pind (cel puţin) <strong>de</strong> dimensiunea<br />

problemei n.<br />

Pe un <strong>calcul</strong>ator cu memorie ierarhică, un algoritm este cu atât mai bun cu cât<br />

P 3 (n) este mai apropiată <strong>de</strong> 1; evi<strong>de</strong>nt, P 3 (n) ≤ 1. Motivul este clar: pe un astfel<br />

<strong>de</strong> <strong>calcul</strong>ator, operaţiile din rutinele BLAS-3 se execută mai rapid <strong>de</strong>cât celelalte<br />

<strong>de</strong>oarece memoria rapidă este utilizată optim.


1.12. PROBLEME 67<br />

1.12 Probleme<br />

P 1.1 Demonstraţi că un subspaţiu liniar în R n este un spaţiu vectorial.<br />

P 1.2 Scrieţi <strong>algoritmi</strong> pentru <strong>calcul</strong>ul normelor 1 şi ∞ ale unui vector x ∈ R n .<br />

P 1.3 (Cauchy-Buniakowski-Schwarz) Demonstraţi că |x T y| ≤ ‖x‖ 2‖y‖ 2, ∀x, y ∈ R n .<br />

P 1.4 Găsiţi vectori liniar in<strong>de</strong>pen<strong>de</strong>nţi x, y ∈ R n care să satisfacă ‖x+y‖ p = ‖x‖ p+‖y‖ p,<br />

pentru p = 1,2, ∞.<br />

P 1.5 Demonstraţi (1.6) pentru n = 2, apoi în cazul general.<br />

P 1.6 (Ortogonalizare Gram-Schmidt) Fie b 1, ..., b p o bază a unui subspaţiu S ⊂ R n .<br />

Să se găsească o bază ortogonală a 1, ..., a p a lui S procedând prin inducţie: a 1 = b 1 şi<br />

a k+1 = P k<br />

i=1 α ika i + b k+1 . (Evi<strong>de</strong>nt, baza <strong>de</strong>vine ortonormală prin normalizare.)<br />

P 1.7 Fie x ∈ R m şi y ∈ R n doi vectori, şi A = xy T ∈ R m×n produsul lor exterior.<br />

Demonstraţi că rangA = 1.<br />

P 1.8 Fie matricele A ∈ R n 1×n 2<br />

, B ∈ R n 2×n 3<br />

, C ∈ R n 3×n 4<br />

. Sugeraţi un algoritm <strong>de</strong><br />

<strong>calcul</strong> al produsului ABC.<br />

P 1.9 Demonstraţi că max i,j |a ij| ≤ ‖A‖ 2 ≤ √ mnmax i,j |a ij|, ∀A ∈ R m×n .<br />

P 1.10 Demonstraţi (1.29) şi găsiţi matrice pentru care inegalităţile (fie cele <strong>de</strong> majorare,<br />

fie cele <strong>de</strong> minorare) <strong>de</strong>vin egalităţi.<br />

P 1.11 Fie B o submatrice a matricei A. Arătaţi că ‖B‖ p ≤ ‖A‖ p.<br />

P 1.12 Demonstraţi că: 1. ‖A‖ 2 = max ‖x‖2 =1,‖y‖ 2 =1 |y T Ax|; 2. ‖A T ‖ 2 = ‖A‖ 2;<br />

3. ‖A T A‖ 2 = ‖A‖ 2 2.<br />

P 1.13 Demonstraţi că dacă A ∈ R n×n este inversabilă, atunci pentru orice normă <strong>matriceal</strong>ă<br />

subordonată unei norme vectoriale avem 1 / ‖A −1 ‖ = min ‖x‖=1 ‖Ax‖.<br />

P 1.14 Fie L ∈ R n×n o matrice strict inferior triunghiulară. Demonstraţi că L n = 0.<br />

P 1.15 Fie A,B ∈ R n×n două matrice bandă, prima <strong>de</strong> lăţime p, a doua <strong>de</strong> lăţime q.<br />

Demonstraţi că AB este o matrice bandă <strong>de</strong> lăţime p + q şi scrieţi un algoritm pentru<br />

<strong>calcul</strong>ul acestui produs.<br />

P 1.16 Scrieţi un algoritm pentru <strong>calcul</strong>ul produsului dintre o matrice inferior triunghiulară<br />

şi una superior triunghiulară.<br />

P 1.17 Arătaţi că algoritmul 1.14 <strong>de</strong> înmulţire <strong>de</strong> matrice inferior triunghiulare se poate<br />

executa pe loc în A. Cum trebuie modificat pentru a se putea executa pe loc în B <br />

P 1.18 Arătaţi că submatricele li<strong>de</strong>r principale ale unor matrice triunghiulare, Hessenberg,<br />

simetrice sunt triunghiulare, Hessenberg, respectiv simetrice. Este afirmaţia valabilă<br />

pentru matrice ortogonale <br />

P 1.19 Presupunem că dispuneţi <strong>de</strong> un algoritm general <strong>de</strong> rezolvare a sistemelor liniare.<br />

Indicaţi un mod eficient <strong>de</strong> rezolvare a sistemului Ax = b atunci când A, partiţionată ca<br />

în (1.31), este pătrată şi bloc superior triunghiulară.<br />

P 1.20 Demonstraţi că numărul <strong>de</strong> operaţii N(n) al algoritmului Strassen, respectând<br />

recurenţa (1.38), este<br />

N(n) = 2n3 0 + 6n 2 0<br />

n log 7 − 6n 2 0.<br />

n log 7<br />

0


68 CAPITOLUL 1. ALGORITMI ELEMENTARI<br />

P 1.21 Dacă A ∈ R n×n este simetrică pozitiv <strong>de</strong>finită, <strong>de</strong>monstraţi că ‖x‖ A = √ x T Ax<br />

este o normă vectorială. (Indicaţie: matricele simetrice sunt ortogonal diagonalizabile.)<br />

P 1.22 Fie A ∈ R n×n , simetrică pozitiv <strong>de</strong>finită. Demonstraţi că A este inversabilă şi că<br />

A −1 este pozitiv <strong>de</strong>finită.<br />

P 1.23 a. Este clar că o matrice triunghulară şi simetrică este diagonală. Cum este o<br />

matrice triunghiulară şi antisimetrică <br />

b. Demonstraţi că o matrice triunghiulară şi ortogonală este diagonală.<br />

c. Puteţi extin<strong>de</strong> rezultatul în cazul matricelor triunghiulare şi normale <br />

P 1.24 Scrieţi <strong>algoritmi</strong> eficienţi pentru rezolvarea sistemului Ax = b, cu A ∈ R n×n şi<br />

b ∈ R n , în cazurile:<br />

a. A inferior bidiagonală, adică a ij = 0 pentru i < j sau i > j + 1.<br />

b. A inferior triunghiulară şi bandă <strong>de</strong> lăţime p (a ij = 0 pentru i < j sau i > j + p).<br />

c. A superior bidiagonală.<br />

d. A superior triunghiulară şi bandă <strong>de</strong> lăţime p.<br />

P 1.25 Adaptaţi <strong>algoritmi</strong>i LINV şi UINV pentru inversarea matricelor inferior, respectiv<br />

superior bidiagonale.<br />

P 1.26 Propuneţi <strong>algoritmi</strong> <strong>de</strong> rezolvare a sistemelor inferior (superior) triunghiulare,<br />

folosind operaţiile vectoriale DOT sau Saxpy.<br />

P 1.27 Prezentaţi un algoritm <strong>de</strong> rezolvare a sistemului inferior triunghiular Lx = b,<br />

ştiind că matricea L este memorată compact, pe linii (i.e. sunt memorate doar elementele<br />

din triunghiul inferior, în ordinea l 11, l 21, l 22, l 31 etc. Dar dacă L este memorată pe<br />

coloane <br />

P 1.28 Fie A ∈ R n×n şi x = u + iv ∈ C n un vector propriu al său, cu u, v ∈ R n , v ≠ 0.<br />

Demonstraţi că:<br />

a. u − iv este vector propriu al matricei A.<br />

b. Vectorii u şi v sunt liniar in<strong>de</strong>pen<strong>de</strong>nţi iar subspaţiul generat <strong>de</strong> ei în R n este<br />

A-invariant.<br />

P 1.29 Dacă matricea A ∈ R n×n are spectrul λ(A) = {λ 1, . . . , λ n}, atunci<br />

tr(A) = P n<br />

i=1 λi, iar <strong>de</strong>tA = Q n<br />

i=1<br />

λi. Puteţi generaliza <br />

P 1.30 Fie A ∈ R n×n , simetrică pozitiv <strong>de</strong>finită. Demonstraţi că toate valorile proprii<br />

ale matricei A sunt (reale şi) pozitive.


Capitolul 2<br />

Rezolvarea sistemelor <strong>de</strong><br />

ecuaţii liniare<br />

În acest capitol vom prezenta principalele <strong>meto<strong>de</strong></strong> <strong>de</strong> rezolvare a sistemelor <strong>de</strong>terminate<br />

<strong>de</strong> ecuaţii liniare<br />

Ax = b, (2.1)<br />

un<strong>de</strong> A ∈ R n×n este o matrice inversabilă, iar b ∈ R n este un vector dat. Aşa cum<br />

am văzut în secţiunea 1.9, în virtutea condiţiei <strong>de</strong> inversabilitate, sistemul (2.1) are<br />

o soluţie unică x ∈ R n .<br />

În practica <strong>numeric</strong>ă actuală se folosesc două categorii principale <strong>de</strong> <strong>meto<strong>de</strong></strong><br />

<strong>numeric</strong>e sigure pentru <strong>de</strong>terminarea acestei soluţii:<br />

• Meto<strong>de</strong> directe, bazate pe reducerea sistemului (2.1), printr-o secvenţă finită<br />

<strong>de</strong> transformări elementare, la unul sau două sisteme triunghiulare, care se<br />

rezolvă utilizând procedurile <strong>de</strong> substituţie cunoscute din secţiunea 1.9 (<strong>algoritmi</strong>i<br />

LTRIS şi UTRIS). Din această categorie fac parte <strong>meto<strong>de</strong></strong>le <strong>de</strong><br />

eliminare gaussiană şi <strong>de</strong> factorizare compactă LU, care sunt recomandate<br />

pentru sisteme <strong>de</strong> dimensiuni medii, să zicem n < 500, dar această limită<br />

<strong>de</strong>pin<strong>de</strong> <strong>de</strong> puterea <strong>calcul</strong>atorului pe care rezolvăm sistemul.<br />

• Meto<strong>de</strong> iterative, bazate pe construirea recursivă a unui şir <strong>de</strong> vectori care<br />

converge către soluţia sistemului (2.1). Aceste <strong>meto<strong>de</strong></strong> sunt recomandate pentru<br />

sisteme <strong>de</strong> dimensiuni foarte mari, sau/şi atunci când matricea A are o<br />

structură specială, eventual rară.<br />

Acest capitol este <strong>de</strong>dicat prezentării celor mai importante <strong>meto<strong>de</strong></strong> directe <strong>de</strong><br />

rezolvare a sistemelor liniare.<br />

Deoarece în reducerea sistemului (2.1) la formă triunghiulară transformările<br />

matricei A sunt primordiale, în primele patru secţiuni ale capitolului vom trata<br />

aceste transformări ca subiect <strong>de</strong> sine stătător. Algoritmii <strong>de</strong>scrişi vor fi utilizaţi<br />

în secţiunea 2.5 pentru rezolvarea efectivă a unui sistem (2.1), <strong>de</strong> formă generală.<br />

Ca probleme conexe, în secţiunea 2.6 vor fi prezentaţi <strong>algoritmi</strong> <strong>de</strong> <strong>calcul</strong> al inversei<br />

şi <strong>de</strong>terminantului unei matrice. Următoarele două secţiuni sunt <strong>de</strong>dicate


70 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

analizei condiţionării unui sistem liniar şi respectiv stabilităţii <strong>numeric</strong>e a <strong>algoritmi</strong>lor<br />

prezentaţi. De asemenea, sunt <strong>de</strong>scrise unele <strong>meto<strong>de</strong></strong> <strong>de</strong> îmbunătăţire a<br />

acurateţii soluţiei <strong>numeric</strong>e obţinute. În fine, ultimele secţiuni ale capitolului se<br />

ocupă <strong>de</strong> cazuri particulare <strong>de</strong> sisteme liniare cu structură — bandă, bloc, simetrice<br />

şi pozitiv <strong>de</strong>finite — care apar frecvent în practică.<br />

2.1 Transformări elementare<br />

Transformările matricei A necesare pentru rezolvarea sistemului (2.1) se pot <strong>de</strong>scrie<br />

concis şi elegant în termeni <strong>de</strong> operaţii <strong>matriceal</strong>e, mai precis ca produs între A<br />

şi anumite matrice elementare. (În loc <strong>de</strong> produs sau înmulţire, vom vorbi <strong>de</strong>spre<br />

aplicarea asupra lui A a matricei <strong>de</strong> transformare corespunzătoare.)<br />

Definiţia 2.1 O matrice inferior triunghiulară elementară (ITE) <strong>de</strong> ordin n şi indice<br />

k este o matrice <strong>de</strong> forma<br />

M k = I n − m k e T k , (2.2)<br />

un<strong>de</strong><br />

m k = [0 0 . . . 0 µ k+1,k . . . µ nk ] T (2.3)<br />

este un vector având primele k componente nule, iar e k este vectorul unitate <strong>de</strong><br />

indice k.<br />

Din motive ce vor fi evi<strong>de</strong>nte ulterior, M k se mai numeşte transformare elementară<br />

sau gaussiană, m k se numeşte vector Gauss, iar scalarii µ ik se numesc<br />

multiplicatori (gaussieni).<br />

Structura unei matrice elementare inferior triunghiulare <strong>de</strong> ordinul n şi indice k<br />

este<br />

⎡<br />

⎤<br />

1 0 . . . 0 . . . 0<br />

0 1 . . . 0 . . . 0<br />

. .. . . .<br />

M k =<br />

0 0 . . . 1 . . . 0<br />

.<br />

0 0 . . . −µ k+1,k . . . 0<br />

⎢<br />

⎣<br />

. ⎥<br />

. . . . . . .. 0 ⎦<br />

0 0 . . . −µ nk . . . 1<br />

Notăm <strong>de</strong> acum faptul că o matrice ITE este complet <strong>de</strong>finită <strong>de</strong> vectorul m k<br />

din (2.3); în orice algoritm, matricea M k nu se memorează integral, ci doar prin<br />

vectorul m k , i.e. prin multiplicatorii µ ik , i = k + 1 : n. Principalele proprietăţi ale<br />

unei astfel <strong>de</strong> matrice sunt rezumate în următoarea propoziţie.<br />

Propoziţia 2.1 a) O matrice ITE este inversabilă şi<br />

M −1<br />

k<br />

= I n + m k e T k . (2.4)


2.1.<br />

TRANSFORMĂRI ELEMENTARE 71<br />

b) Fie x ∈ R n un vector dat, iar M k o matrice ITE precizată. Atunci vectorul<br />

transformat y = M k x are elementele<br />

{<br />

xi , pentru i = 1 : k,<br />

(M k x) i =<br />

(2.5)<br />

x i − µ ik x k , pentru i = k + 1 : n.<br />

c) Fie x ∈ R n . Dacă x k ≠ 0, atunci există o matrice ITE M k astfel încât<br />

vectorul transformat y = M k x are ultimele n − k componente nule, mai precis<br />

{<br />

xi , pentru i = 1 : k,<br />

(M k x) i =<br />

(2.6)<br />

0, pentru i = k + 1 : n.<br />

Dacă x k = 0, atunci pentru orice M k<br />

M k x = x. (2.7)<br />

Demonstraţie.<br />

a) Evi<strong>de</strong>nt, <strong>de</strong>t(M k ) = 1, adică M k este inversabilă. Mai mult,<br />

M k (I n + m k e T k ) = (I n − m k e T k )(I n + m k e T k ) = I n − m k (e T k m k)e T k = I n<br />

<strong>de</strong>oarece, din (2.3), e T k m k = 0. Deci (2.4) este a<strong>de</strong>vărată.<br />

b) Utilizând (2.2), obţinem<br />

M k x = (I n − m k e T k )x = x − m k e T k x = x i − x k m k .<br />

Scriind relaţia <strong>de</strong> mai sus pe componente şi ţinând seama <strong>de</strong> (2.3), obţinem (2.5).<br />

c) Ţinând seama <strong>de</strong> (2.5) şi alegând<br />

µ ik = x i /x k , i = k + 1 : n, (2.8)<br />

rezultă (M k x) i = 0, pentru i = k + 1 : n. Dacă x k = 0, atunci (2.5) conduce direct<br />

la (2.7). De observat că, dacă x k ≠ 0, atunci matricea ITE <strong>de</strong>finită <strong>de</strong> vectorul<br />

Gauss cu elementele din (2.8) este unica matrice ITE <strong>de</strong> indice k care introduce<br />

zerouri în ultimele n − k componente ale vectorului x.<br />

♦<br />

După cum vom ve<strong>de</strong>a în secţiunea următoare, proprietăţile (2.6) şi (2.7) sunt<br />

cruciale în reducerea unei matrice la formă triunghiulară.<br />

Similar se introduce noţiunea <strong>de</strong> matrice superior triunghiulară elementară (STE)<br />

sau transformare elementară ”retrogradă”, în care vectorul m k are ultimele k componente<br />

nule. Propunem cititorului formularea şi <strong>de</strong>monstrarea analoagei propoziţiei<br />

2.1.<br />

Vom introduce acum noţiunea <strong>de</strong> matrice <strong>de</strong> permutare, care permite <strong>de</strong>scrierea<br />

concisă a interschimbărilor <strong>de</strong> linii sau coloane în termeni <strong>de</strong> operaţii <strong>matriceal</strong>e.<br />

Definiţia 2.2 O matrice P ij ∈ R n×n obţinută din matricea unitate I n prin interschimbarea<br />

a două coloane (sau linii) i şi j, adică o matrice <strong>de</strong> forma (aici i < j):<br />

⎡<br />

⎤<br />

I i−1 0 1<br />

P ij = [e 1 e 2 . . . e i−1 e j e i+1 . . . e j−1 e i e j+1 . . . e n ] =<br />

⎢ I j−i−1<br />

⎥<br />

⎣ 1 0 ⎦<br />

I n−j


72 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

în care toate elementele nefigurate sunt nule, se numeşte (matrice <strong>de</strong>) permutare<br />

elementară (PE).<br />

Dacă (i 1 , i 2 , . . . , i n ) este o permutare a mulţimii 1 : n, atunci matricea<br />

P = [e i1 e i2 . . . e in ] este o matrice <strong>de</strong> permutare. Desigur, un produs <strong>de</strong> matrice<br />

elementare <strong>de</strong> permutare este o matrice <strong>de</strong> permutare şi, reciproc, orice matrice <strong>de</strong><br />

permutare se poate exprima ca produs <strong>de</strong> matrice PE.<br />

Proprietăţile matricelor elementare <strong>de</strong> permutare sunt expuse în următoarea<br />

propoziţie, a cărei <strong>de</strong>monstraţie e evi<strong>de</strong>ntă.<br />

Propoziţia 2.2 a) O PE este ortogonală şi simetrică, <strong>de</strong>ci Pij<br />

−1 = P ij , iar<br />

<strong>de</strong>tP ij = −1.<br />

b) Premultiplicarea unei matrice A cu PE P ij interschimbă linia i cu linia j din<br />

A, adică:<br />

⎧<br />

⎨e T<br />

e T k A, pentru k ≠ i, j,<br />

k (P ij A) = e T j A, pentru k = i,<br />

⎩<br />

A, pentru k = j.<br />

e T i<br />

c) Postmultiplicarea unei matrice A cu PE P ij interschimbă coloana i cu coloana<br />

j din A, adică:<br />

{ Aek , pentru k ≠ i, j,<br />

(AP ij )e k = Ae j , pentru k = i,<br />

Ae i , pentru k = j.<br />

2.2 Triangularizare prin eliminare gaussiană<br />

Fie A ∈ R n×n (cazul A ∈ C n×n este i<strong>de</strong>ntic) o matrice nu neapărat inversabilă.<br />

Eliminarea gaussiană este o metodă <strong>de</strong> reducere a matricei A la formă superior<br />

triunghiulară prin aplicarea la stânga lui A a unei secvenţe M k , k = 1 : n − 1,<br />

<strong>de</strong> matrice ITE, fiecare aleasă astfel încât să anuleze elementele subdiagonale în<br />

coloana corespunzătoare a k a matricei A.<br />

Pentru prezentarea <strong>meto<strong>de</strong></strong>i avem nevoie <strong>de</strong> două rezultate cu caracter tehnic,<br />

a căror <strong>de</strong>monstraţie e lăsată cititorului.<br />

Propoziţia 2.3 Fie A ∈ R n×n . a) Dacă L ∈ R n×n este inferior triunghiulară,<br />

atunci 1 (LA) [k] = L [k] A [k] .<br />

b) Dacă L i ∈ R n×n , i = 1 : p, sunt matrice inferior triunghiulare, atunci<br />

(L 1 L 2 . . .L p A) [k] = L [k]<br />

1 L[k] 2 . . .L[k] p A[k] .<br />

Următoarea teoremă stabileşte condiţiile în care este posibilă reducerea unei<br />

matrice la formă triunghiulară, utilizând transformări ITE.<br />

1 Reamintim că A [k] <strong>de</strong>f<br />

= A(1 : k,1 : k) este submatricea li<strong>de</strong>r principală <strong>de</strong> ordin k a matricei A.


2.2. TRIANGULARIZARE PRIN ELIMINARE GAUSSIANĂ 73<br />

Teorema 2.1 Dacă matricea A ∈ R n×n satisface condiţia<br />

(i) submatricele li<strong>de</strong>r principale A [k] , k = 1 : n − 1, sunt nesingulare,<br />

atunci există o matrice inferior triunghiulară unitate M astfel încât matricea<br />

MA = U<br />

este superior triunghiulară. Dacă A este nesingulară, atunci U este nesingulară.<br />

Demonstraţia este constructivă, adică <strong>de</strong>scrie o procedură pentru reducerea efectivă<br />

a matricei A la forma superior triunghiulară U. Procedura constă în n − 1 paşi.<br />

Pasul 1. Fie A 1 = A şi a 1 = Ae 1 prima sa coloană. Prin ipoteză, A [1]<br />

1 = A[1] =<br />

= a 11 ≠ 0. Din propoziţia 2.1, există o matrice ITE M 1 astfel încât<br />

{<br />

a11 , pentru i = 1,<br />

(M 1 a 1 ) i =<br />

0, pentru i = 2 : n,<br />

adică matricea A 2 = M 1 A 1 are toate elementele subdiagonale ale primei coloane<br />

egale cu zero:<br />

⎡<br />

a (2)<br />

11 a (2)<br />

12 . . . a (2) ⎤<br />

1n<br />

A 2 =<br />

⎢<br />

⎣<br />

0 a (2)<br />

22 . . . a (2)<br />

2n<br />

0 a (2)<br />

32 . . . a (2)<br />

3n<br />

. . . . . . . . . . . .<br />

0 a (2)<br />

n2 . . . a (2)<br />

nn<br />

Pasul k. Presupunem că matricea curentă<br />

A k = M k−1 . . . M 2 M 1 A<br />

este superior triunghiulară în primele k − 1 coloane, i.e. are toate elementele subdiagonale<br />

ale acestor coloane egale cu zero. Aplicând propoziţia 2.3, obţinem<br />

A [k]<br />

k<br />

= M[k] k−1 . . .M[k] 1 A[k] ,<br />

un<strong>de</strong> matricele M [k]<br />

i sunt toate inferior triunghiulare unitate, <strong>de</strong>ci <strong>de</strong>t(M [k]<br />

i ) = 1,<br />

i = 1 : k − 1. Deoarece A [k]<br />

k<br />

este superior triunghiulară, în virtutea condiţiei (i) din<br />

enunţul teoremei avem<br />

.<br />

⎥<br />

⎦<br />

k<br />

<strong>de</strong>t(A [k]<br />

k ) = ∏<br />

a (k)<br />

ii = <strong>de</strong>t(A [k] ) ≠ 0,<br />

i=1<br />

adică elementul a (k)<br />

kk<br />

, numit pivot, este nenul. Consi<strong>de</strong>răm partiţionarea pe coloane<br />

a matricei A k :<br />

A k = [ a (k)<br />

1 a (k)<br />

2 . . . a (k)<br />

k<br />

. . . a (k)<br />

n ].<br />

Putem utiliza acum propoziţia 2.1 pentru a conchi<strong>de</strong> că există o matrice ITE M k<br />

astfel încât (M k a (k)<br />

k ) i = 0, pentru i = k + 1 : n. Mai mult, premultiplicarea cu<br />

M k a matricei A k nu alterează primele k − 1 coloane şi în particular zerourile <strong>de</strong>ja


74 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

introduse la paşii anteriori, <strong>de</strong>oarece a (k)<br />

kj<br />

= 0, pentru j = 1 : k − 1 (vezi propoziţia<br />

2.1, punctul c). Prin urmare matricea<br />

este superior triunghiulară în primele k coloane.<br />

A k+1 = M k A k (2.9)<br />

Astfel, procedura <strong>de</strong> introducere a zerourilor subdiagonale, începută la pasul 1<br />

şi continuată până la pasul n − 1 (inclusiv), are ca rezultat matricea<br />

U <strong>de</strong>f<br />

= A n = M n−1 M n−2 . . .M 1 A, (2.10)<br />

evi<strong>de</strong>nt superior triunghiulară. Mai mult, <strong>de</strong>oarece produsul <strong>matriceal</strong> conservă<br />

structura inferior triunghiulară unitate (vezi propoziţia 1.2), matricea<br />

M = M n−1 M n−2 . . .M 1<br />

este inferior triunghiulară unitate iar, dacă A este nesingulară, atunci şi U rezultă<br />

nesingulară, ca produs a două matrice nesingulare.<br />

♦<br />

Demonstraţia <strong>de</strong> mai sus furnizează o procedură <strong>de</strong> triangularizare a unei matrice,<br />

cunoscută sub numele <strong>de</strong> eliminare gaussiană. Procedura este bazată pe<br />

următoarea schemă, în care <strong>calcul</strong>ele se <strong>de</strong>sfăşoară pe loc în tabloul A<br />

ElG 1. Pentru k = 1 : n − 1<br />

1. Se <strong>calcul</strong>ează matricea ITE M k (adică multiplicatorii µ ik ,<br />

i = k + 1 : n), astfel încât (M k A) i = 0, pentru i = k + 1 : n<br />

2. Se <strong>calcul</strong>ează A ← M k A<br />

La pasul 1.1, multiplicatorii gaussieni µ ik sunt <strong>calcul</strong>aţi conform (2.8) prin<br />

µ ik = a (k)<br />

ik /a(k) kk<br />

, i = k + 1 : n, (2.11)<br />

şi pot fi memoraţi pe poziţiile elementelor anulate. Prin instrucţiunea 1.2 a schemei<br />

<strong>de</strong> mai sus, toate rezultatele intermediare sunt <strong>de</strong>puse în spaţiul <strong>de</strong> memorie ocupat<br />

<strong>de</strong> matricea A; vezi şi figura 2.1.<br />

La pasul 1.2, transformarea A ← M k A este echivalentă cu <strong>calcul</strong>ul a j ← M k a j ,<br />

pentru toate coloanele a j = Ae j ale matricei A. Transformarea poate fi efectuată<br />

eficient ţinând cont că primele k−1 coloane ale matricei A nu sunt afectate. Coloana<br />

k este modificată prin anularea elementelor subdiagonale. Pentru restul submatricei,<br />

ţinând seama <strong>de</strong> propoziţia 2.1b, coloana transformată are elementele<br />

a ij ← (M k a j ) i = ((I n − m k e T k )a j) i = a ij − µ ik a kj , i = k + 1 : n, (2.12)<br />

un<strong>de</strong> j = k + 1 : n. Relaţiile (2.11) şi (2.12) împreună cu schema <strong>de</strong> <strong>calcul</strong> ElG<br />

<strong>de</strong>finesc algoritmul <strong>de</strong> eliminare gaussiană <strong>de</strong>taliat în continuare. Condiţia <strong>de</strong> terminare<br />

corectă a algoritmului este ca numerele a (k)<br />

kk<br />

, k = 1 : n − 1, numite elemente<br />

pivot, să fie nenule, adică submatricele li<strong>de</strong>r principale A [k] , k = 1 : n − 1, ale<br />

matricei iniţiale, să fie nesingulare.


2.2. TRIANGULARIZARE PRIN ELIMINARE GAUSSIANĂ 75<br />

⎡<br />

⎢<br />

⎣<br />

u 11 u 12 . . . u 1k u 1,k+1 . . . u 1n<br />

µ 21 u 22 . . . u 2k u 2,k+1 . . . u 2n<br />

. . . . . .<br />

µ k1 µ k2 . . . u kk u k,k+1 . . . u kn<br />

µ k+1,1 µ k+1,2 . . . µ k+1,k a (k+1)<br />

k+1,k+1 . . . a(k+1) k+1,n<br />

. . . . . .<br />

µ n1 µ n2 . . . µ nk a (k+1)<br />

n,k+1<br />

După pasul k<br />

. . . a (k+1)<br />

nn<br />

⎤<br />

⎥<br />

⎦<br />

⎡<br />

⎤<br />

u 11 u 12 . . . u 1k . . . u 1n<br />

µ 21 u 22 . . . u 2k . . . u 2n<br />

. . . . . .<br />

µ k1 µ k2 . . . u kk . . . u kn<br />

⎢ . . . . . .<br />

⎥<br />

⎣ . . . . . . ⎦<br />

µ n1 µ n2 . . . µ nk . . . u nn<br />

În final<br />

Fig. 2.1: Conţinutul matricei A după pasul k al eliminării gaussiene şi la terminarea<br />

execuţiei algoritmului<br />

Algoritmul 2.1 (G – Eliminare gaussiană) (Se dă A ∈ R n×n , cu<br />

submatricele li<strong>de</strong>r principale A [k] , k = 1 : n − 1, nesingulare. Se <strong>calcul</strong>ează<br />

matricea superior triunghiulară U şi matricele ITE M 1 , . . .,<br />

M n−1 , astfel încât U = M n−1 M n−2 . . .M 1 A. Matricea U se memorează<br />

în triunghiul superior al lui A, inclusiv diagonala, iar multiplicatorii<br />

gaussieni µ ik care <strong>de</strong>finesc transformările M k se memorează în triunghiul<br />

inferior al matricei A, pe poziţiile elementelor anulate.)<br />

1. Pentru k = 1 : n − 1<br />

1. Pentru i = k + 1 : n<br />

1. a ik ← µ ik = a ik /a kk<br />

2. Pentru j = k + 1 : n<br />

1. Pentru i = k + 1 : n<br />

1. a ij ← a ij − µ ik a kj<br />

O formă vectorială a eliminării gaussiene se poate <strong>de</strong>duce imediat din cea <strong>de</strong><br />

mai sus, prin înlocuirea buclelor 1.1 şi 1.2.1 cu operaţiile corespunzătoare: scalare,<br />

respectiv Saxpy (aceasta din urmă putând fi <strong>de</strong>dusă din (2.12), care se mai scrie<br />

M k a j = a j − a kj m k ). Avem<br />

Algoritmul 2.2 (G – varianta vectorială)<br />

1. Pentru k = 1 : n − 1<br />

1. A(k + 1 : n, k) ← m k = A(k + 1 : n, k)/A(k, k)<br />

2. Pentru j = k + 1 : n<br />

1. A(k + 1 : n, j) ← A(k + 1 : n, j) − A(k, j)m k<br />

Comentarii.<br />

În oricare dintre cele două forme <strong>de</strong> mai sus, algoritmul necesită<br />

n−1<br />

∑<br />

N G = (n − k + 2(n − k) 2 ) =<br />

k=1<br />

n(n − 1)<br />

2<br />

n(n − 1)(2n − 1)<br />

+ 2 ≈ 2n3<br />

6 3 ,


76 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

operaţii în virgulă mobilă (flopi), iar memoria ocupată este <strong>de</strong> M G = n 2 locaţii<br />

(elemente în virgulă mobilă).<br />

♦<br />

Algoritmul G poate fi utilizat pentru rezolvarea sistemului liniar Ax = b atunci<br />

când A are toate submatricele li<strong>de</strong>r principale nesingulare (inclusiv A [n] = A).<br />

Într-a<strong>de</strong>văr, sistemul Ax = b are aceeaşi soluţie ca sistemul superior triunghiular<br />

Ux = M n−1 M n−2 . . . M 1 b,<br />

în care matricea U este furnizată <strong>de</strong> algoritmul G. Acest sistem triunghiular poate<br />

fi rezolvat cu algoritmul UTRIS.<br />

Semnificaţia operaţiilor din algoritmul G este imediată; introducerea <strong>de</strong> zerouri<br />

subdiagonale în coloana k înseamnă eliminarea necunoscutei x k din ecuaţiile<br />

k+1 : n; buclele 1.2 şi 1.2.1 reprezintă scă<strong>de</strong>rea din ecuaţiile i = k+1 : n a ecuaţiei<br />

k înmulţite, pe rând, cu multiplicatorii µ ik , cu scopul <strong>de</strong> a elimina x k din fiecare<br />

ecuaţie i.<br />

Totuşi, nesingularitatea submatricelor li<strong>de</strong>r principale ale matricei A nu este o<br />

condiţie necesară pentru existenţa şi unicitatea soluţiei sistemului (2.2). De aceea,<br />

algoritmul G trebuie modificat astfel încât să producă rezultatul dorit şi atunci<br />

când unele submatrice li<strong>de</strong>r principale sunt singulare, dar A este nesingulară.<br />

2.3 Strategii <strong>de</strong> pivotare<br />

Dacă o submatrice li<strong>de</strong>r principală A [k] este singulară, atunci, la pasul k al procedurii<br />

<strong>de</strong> eliminare gaussiană, pivotul a (k)<br />

kk<br />

este nul; <strong>de</strong>ci, conform propoziţiei 2.1c, nu există<br />

nici o matrice ITE M k care să anuleze, prin premultiplicare, elementele subdiagonale<br />

ale coloanei k din A k . Modificarea algoritmului G recomandată pentru a evita<br />

această dificultate constă într-o interschimbare <strong>de</strong> linii (sau/şi coloane), care aduce<br />

în poziţia pivotului un element nenul. Un alt motiv pentru permutarea <strong>de</strong> linii şi<br />

coloane este asigurarea stabilităţii <strong>numeric</strong>e a procesului <strong>de</strong> <strong>calcul</strong>. O explicaţie<br />

intuitivă este că, atunci când un proces matematic nu poate fi <strong>de</strong>finit pentru o<br />

anumită valoare ”critică” a unui parametru (<strong>de</strong> exemplu A [k] singulară), există<br />

şanse mari ca procesul <strong>numeric</strong> corespunzător să fie instabil atunci când parametrul<br />

efectiv este în vecinătatea valorii critice. În cazul nostru, trebuie evitaţi pivoţii<br />

mici (în modul), corespunzători cazului în care submatricele li<strong>de</strong>r principale sunt<br />

”aproape” singulare; astfel se îmbunătăţeşte stabilitatea <strong>numeric</strong>ă a algoritmului.<br />

2.3.1 Pivotare parţială<br />

Vom modifica algoritmul G după cum urmează. La pasul k al procedurii <strong>de</strong> triangularizare<br />

a matricei A ∈ R n×n (vezi <strong>de</strong>monstraţia teoremei 2.1), se alege ca pivot<br />

primul element maxim în modul din coloana k. Presupunând că acest element<br />

se găseşte în linia i k şi este nenul, i.e. a (k)<br />

i k k ≠ 0, interschimbarea liniilor k şi i k,<br />

obţinută <strong>matriceal</strong> prin înmulţirea la stânga a lui A k cu PE P kik , va muta a (k)<br />

i k k în<br />

poziţia (k, k), astfel încât acest element <strong>de</strong>vine noul pivot. Pentru a evita alterarea<br />

structurii matricei obţinute până la pasul k (superior triunghiulară în primele k −1<br />

coloane), trebuie să alegem i k ≥ k. Vezi figura 2.2.


2.3. STRATEGII DE PIVOTARE 77<br />

⎡<br />

⎤<br />

u 11 . . . u 1k . . . u 1n<br />

0 . . . . . .<br />

a (k)<br />

kk<br />

A k =<br />

. . . a(k) kn<br />

0 . . .<br />

a (k)<br />

⎢ i k k . . . a(k) i k n<br />

⎥<br />

⎣ 0 . . . ⎦<br />

a (k)<br />

nk . . . a(k) nn<br />

⎡<br />

⎤<br />

u 11 . . . u 1k . . . u 1n<br />

0 . . . . . .<br />

a (k)<br />

i<br />

P kik A k =<br />

k k . . . a(k) i k n<br />

0 . . .<br />

a (k)<br />

⎢ kk<br />

. . . a(k)<br />

kn ⎥<br />

⎣ 0 . . . ⎦<br />

a (k)<br />

nk . . . a(k) nn<br />

Fig. 2.2: Pasul k al eliminării gaussiene cu interschimbare <strong>de</strong> linii; a (k)<br />

kk<br />

este nul<br />

sau prea aproape <strong>de</strong> zero; în P kik A k , noul pivot este a (k)<br />

i k k şi are o valoare ”bună”<br />

(suficient <strong>de</strong> mare, în modul)<br />

Pentru simplitate, vom nota matricea P ik k cu P k . Pasul k al algoritmului G<br />

<strong>de</strong>vine<br />

1. Se <strong>de</strong>termină cel mai mic (primul) i k ≥ k astfel încât |a ik k| = max i=k:n |a ik |.<br />

2. Se interschimbă liniile i k şi k, adică A ← P k A.<br />

3. Se <strong>de</strong>termină matricea ITE M k astfel încât (M k A) ik = 0, i = k + 1 : n.<br />

4. Se aplică transformarea A ← M k A.<br />

Astfel la pasul k are loc transformarea<br />

A ← A k+1 = M k P k A k , (2.13)<br />

un<strong>de</strong> matricea T k = M k P k se numeşte transformare elementară stabilizată.<br />

Procesul global, cunoscut sub numele <strong>de</strong> eliminare gaussiană cu pivotare parţială,<br />

conduce în cele din urmă la matricea superior triunghiulară<br />

U <strong>de</strong>f<br />

= A n = M n−1 P n−1 M n−2 P n−2 . . .M 1 P 1 A. (2.14)<br />

Această egalitate afirmă că orice matrice A este echivalentă la stânga cu o matrice<br />

superior triunghiulară, iar matricea <strong>de</strong> transformare poate fi un produs <strong>de</strong><br />

transformări elementare stabilizate.<br />

Algoritmul corespunzător este prezentat în continuare.<br />

Algoritmul 2.3 (GPP – Eliminare gaussiană cu pivotare parţială)<br />

(Se dă A ∈ R n×n , nesingulară. Se <strong>calcul</strong>ează matricea superior triunghiulară<br />

U, matricele ITE M 1 , . . ., M n−1 şi PE P 1 , . . . , P n−1 astfel<br />

încât (2.14) să fie satisfăcută. Matricea U se memorează în triunghiul<br />

superior al lui A, inclusiv diagonala, iar multiplicatorii gaussieni µ ik<br />

care <strong>de</strong>finesc matricele M k se memorează în triunghiul inferior al lui<br />

A. Întregii i k care <strong>de</strong>finesc PE P k , sunt memoraţi într-un vector p <strong>de</strong><br />

dimensiune n − 1, cu elementele p(k) = i k , pentru k = 1 : n − 1.)


78 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

1. Pentru k = 1 : n − 1<br />

1. Se <strong>de</strong>termină cel mai mic i k ∈ k : n astfel încât<br />

|a ik k| = max i=k:n |a ik |.<br />

2. p(k) ← i k<br />

3. Pentru j = k : n % interschimbă liniile k şi i k<br />

1. a kj ↔ a ik j<br />

4. Pentru i = k + 1 : n<br />

1. a ik ← µ ik = a ik /a kk<br />

5. Pentru j = k + 1 : n<br />

1. Pentru i = k + 1 : n<br />

1. a ij ← a ij − µ ik a kj<br />

Comentarii. Operaţiile suplimentare necesare în algoritmul GPP, faţă <strong>de</strong> algoritmul<br />

G, apar numai în căutarea pivotului şi constau în comparaţiile necesare găsirii<br />

maximului din instrucţiunea 1.1; numărul <strong>de</strong> comparaţii este<br />

n−1<br />

∑<br />

(n − k + 1) ≈ n 2 /2 ≪ 2n 3 /3,<br />

k=1<br />

<strong>de</strong>ci pivotarea parţială nu este costisitoare (relativ la numărul <strong>de</strong> operaţii aritmetice).<br />

Necesarul <strong>de</strong> memorie este M GPP = n 2 .<br />

♦<br />

Un rezultat important referitor la algoritmul GPP este dat <strong>de</strong><br />

Teorema 2.2 Dacă A ∈ R n×n este nesingulară, atunci algoritmul GPP se va<br />

executa complet iar matricea superior triunghiulară U rezultată în final, vezi (2.14),<br />

este nesingulară.<br />

Demonstraţie. Algoritmul GPP nu se execută complet dacă, la un pas k, elementul<br />

pivot a ik k = 0. Într-un astfel <strong>de</strong> caz, <strong>de</strong>oarece pivotul este maxim în modul<br />

pe coloană (sub diagonală), toate elementele a ik , i = k : n, sunt nule, <strong>de</strong>ci matricea<br />

A k este singulară (vezi structura matricei A k , cu A [k]<br />

k<br />

superior triunghiulară).<br />

Matricele ITE şi PE fiind nesingulare, singularitatea matricei<br />

A k = M k−1 P k−1 . . . M 1 P 1 A<br />

implică A singulară; contradicţie. Deci, toţi pivoţii a ik k ≠ 0 şi algoritmul se execută<br />

complet. Nesingularitatea matricei U rezultă din nesingularitatea tuturor matricelor<br />

din termenul drept din (2.14).<br />

♦<br />

2.3.2 Pivotare completă<br />

Proprietăţi <strong>numeric</strong>e superioare se pot obţine dacă, la pasul k al eliminării gaussiene,<br />

pivotul maxim în modul este căutat printre elementele a (k)<br />

ij , i = k : n, j = k : n,<br />

adică în întregul colţ dreapta jos al matricei A k . Primul element cu modul maxim


2.3. STRATEGII DE PIVOTARE 79<br />

⎡<br />

⎤<br />

u 11 . . . u 1k . . . u 1jk . . . u 1n<br />

0 . . . . . . . . .<br />

a (k)<br />

kk<br />

A k =<br />

. . . a(k) kj k<br />

. . . a (k)<br />

kn<br />

0 . . .<br />

a (k)<br />

⎢ i k k . . . a(k) i k j k<br />

. . . a (k)<br />

i k n<br />

⎥<br />

⎣ 0 . . . ⎦<br />

a (k)<br />

nk . . . a(k) nj k<br />

. . . a (k)<br />

nn<br />

⎡<br />

⎤<br />

u 11 . . . u 1jk . . . u 1k . . . u 1n<br />

0 . . . . . . . . .<br />

a (k)<br />

i<br />

P kik A k Q kjk =<br />

k j k<br />

. . . a (k)<br />

i k k . . . a(k)<br />

i k n<br />

0 . . .<br />

a (k)<br />

⎢ kj k<br />

. . . a (k)<br />

kk . . . a(k) kn<br />

⎥<br />

⎣ 0 . . . ⎦<br />

a (k)<br />

nj k<br />

. . . a (k)<br />

nk . . . a(k) nn<br />

Fig. 2.3: Pasul k al eliminării gaussiene, cu interschimbări <strong>de</strong> linii şi coloane<br />

(e.g. în ordinea explorării pe coloane), să zicem a ik j k<br />

, este mutat în poziţia pivot<br />

(k, k), prin intermediul a două interschimbări, una <strong>de</strong> linii, cealaltă <strong>de</strong> coloane,<br />

exprimate <strong>matriceal</strong> prin înmulţirea lui A k la stânga, respectiv la dreapta, cu PE<br />

P kik , respectiv Q kjk ; vezi figura 2.3.<br />

Notând P kik cu P k şi Q kjk cu Q k , pasul k al algoritmului G <strong>de</strong>vine:<br />

1. Se <strong>de</strong>termină cei mai mici i k şi j k astfel încât |a ik j k<br />

| = max i=k:n,j=k:n |a ij |.<br />

2. Se interschimbă liniile i k şi k, adică A ← P k A.<br />

3. Se interschimbă coloanele j k şi k, adică A ← AQ k .<br />

4. Se <strong>de</strong>termină matricea ITE M k astfel încât (M k A) ik = 0, i = k + 1 : n.<br />

5. Se aplică transformarea A ← M k A.<br />

Astfel, la pasul k are loc transformarea<br />

A ← A k+1 = M k P k A k Q k , (2.15)<br />

iar procesul global <strong>de</strong> <strong>calcul</strong>, cunoscut sub numele <strong>de</strong> eliminare gaussienă cu pivotare<br />

completă, conduce la matricea superior triunghiulară<br />

A ← U <strong>de</strong>f<br />

= M n−1 P n−1 . . .M 1 P 1 AQ 1 . . .Q n−1 . (2.16)<br />

Algoritmul rezultat este prezentat în continuare.<br />

Algoritmul 2.4 (GPC – Eliminare gaussiană cu pivotare completă)<br />

(Se dă A ∈ R n×n , nesingulară. Se <strong>calcul</strong>ează matricea superior triunghiulară<br />

U, matricele ITE M 1 , . . . , M n−1 şi PE P 1 , Q 1 , . . . , P n−1 ,<br />

Q n−1 , astfel încât (2.16) să fie satisfăcută. Matricea U se memorează<br />

în triunghiul superior al lui A, inclusiv diagonala, iar multiplicatorii<br />

gaussieni µ ik care <strong>de</strong>finesc matricele M k se memorează în triunghiul inferior<br />

al matricei A. Întregii i k şi j k , <strong>de</strong>finind PE P k , respectiv Q k , sunt<br />

memoraţi în vectorii p, respectiv q, <strong>de</strong> dimensiune n − 1, astfel încât<br />

p(k) = i k şi q(k) = j k , pentru k = 1 : n − 1.)


80 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

1. Pentru k = 1 : n − 1<br />

1. Se <strong>de</strong>termină i k ∈ k : n şi j k ∈ k : n astfel încât<br />

|a ik j k<br />

| = max i=k:n,j=k:n |a ij |.<br />

2. p(k) ← i k<br />

3. q(k) ← j k<br />

4. Pentru j = k : n % interschimbă liniile k şi i k<br />

1. a kj ↔ a ik j<br />

5. Pentru i = 1 : n % interschimbă coloanele k şi j k<br />

1. a ik ↔ a ijk<br />

6. Pentru i = k + 1 : n<br />

1. a ik ← µ ik = a ik /a kk<br />

7. Pentru j = k + 1 : n<br />

1. Pentru i = k + 1 : n<br />

1. a ij ← a ij − µ ik a kj<br />

Comentarii. Operaţiile suplimentare ce apar în algoritmul GPC, faţă <strong>de</strong> algoritmul<br />

G, sunt doar cele necesare căutării pivotului, ca şi la pivotarea parţială; acum<br />

însă, numărul <strong>de</strong> comparaţii este<br />

n−1<br />

∑<br />

(n − k + 1) 2 =<br />

k=1<br />

n∑<br />

k 2 ≈ n 3 /3;<br />

spre <strong>de</strong>osebire <strong>de</strong> pivotarea parţială, pivotarea completă introduce un număr <strong>de</strong><br />

comparaţii <strong>de</strong> acelaşi ordin <strong>de</strong> mărime cu numărul operaţiilor aritmetice; aceasta<br />

poate conduce la creşterea semnificativă a timpului <strong>de</strong> execuţie, <strong>de</strong> aceea pivotarea<br />

completă trebuie folosită doar atunci când se doreşte o mare siguranţă în <strong>calcul</strong>ul<br />

rezultatului. Vom prezenta ulterior argumentele care conduc la alegerea strategiei<br />

<strong>de</strong> pivotare. Necesarul <strong>de</strong> memorie este şi aici M GPC = n 2 .<br />

♦<br />

Teorema următoare corespun<strong>de</strong> teoremei 2.2, <strong>de</strong>monstraţia fiind asemănătoare.<br />

Teorema 2.3 Dacă A ∈ R n×n este nesingulară, atunci algoritmul GPC se execută<br />

complet, iar matricea superior triunghiulară rezultată U din (2.16) este nesingulară.<br />

Observaţia 2.1 Algoritmii GPP şi GPC pot fi modificaţi cu uşurinţă pentru a<br />

putea triangulariza şi matrice singulare.<br />

În GPP, după pasul 1.1, trebuie adăugată următoarea condiţie: dacă a ik k = 0,<br />

adică a ik = 0, i = k : n, atunci pentru acest k, instrucţiunile 1.2 – 1.5 nu trebuie<br />

executate. În acest caz matricea U = A n poate avea elemente diagonale nule<br />

În GPC, dacă a ik j k<br />

= 0, adică a ij = 0, i = k : n, j = k : n, atunci algoritmul<br />

se termină la pasul k, <strong>de</strong>oarece matricea U = A k este <strong>de</strong>ja superior triunghiulară,<br />

mai precis superior trapezoidală, iar rangA = k − 1. Desigur, datorită erorilor <strong>de</strong><br />

rotunjire inerente, găsirea unui pivot nul este un eveniment <strong>de</strong>stul <strong>de</strong> rar. Deoarece<br />

este dificil <strong>de</strong> stabilit, în general, o toleranţă <strong>de</strong> trunchiere ǫ astfel încât |a ik j k<br />

| < ǫ<br />

să fie consi<strong>de</strong>rat pivot nul, algoritmul GPC nu se foloseşte pentru <strong>de</strong>terminarea<br />

rangului unei matrice; proceduri mai sigure sunt oferite <strong>de</strong> <strong>algoritmi</strong>i <strong>de</strong> factorizare<br />

QR cu pivotarea coloanelor şi DVS, vezi capitolele 3 şi 5.<br />

♦<br />

k=2


2.4.<br />

FACTORIZĂRI LU 81<br />

2.4 Factorizări LU<br />

În multe situaţii, este convenabil a exprima o matrice dată ca produs a două matrice<br />

triunghiulare. Această formă poate fi utilizată pentru a simplifica anumite <strong>calcul</strong>e<br />

implicând matricea respectivă.<br />

Definiţia 2.3 Fie A ∈ R n×n . Dacă există o matrice inferior triunghiulară<br />

L ∈ R n×n şi o matrice superior triunghiulară U ∈ R n×n astfel încât<br />

A = LU (2.17)<br />

atunci se spune că A admite o factorizare (sau <strong>de</strong>scompunere) LU. L şi U se numesc<br />

factori triunghiulari ai matricei A.<br />

În general, orice exprimare a matricei A ca produs <strong>de</strong> două matrice triunghiulare<br />

(cu eventuale permutări) se numeşte factorizare triunghiulară.<br />

Dacă A ∈ R n×n este o matrice care are o factorizare LU, iar D este o matrice<br />

diagonală nesingulară, atunci, D −1 fiind <strong>de</strong> asemenea diagonală, (2.17) poate fi<br />

scrisă în forma<br />

A = LU = LDD −1 U = L ′ U ′ , (2.18)<br />

un<strong>de</strong> L ′ = LD este inferior triunghiulară şi U ′ = D −1 U este superior triunghiulară.<br />

Dacă D ≠ I, atunci factorizările (2.17) şi (2.18) diferă şi <strong>de</strong>ci factorizarea LU, dacă<br />

există, nu este unică. De aceea este util a se introduce <strong>de</strong>finiţia următoare.<br />

Definiţia 2.4 Fie A ∈ R n×n . Dacă există matricele L ∈ R n×n inferior triunghiulară<br />

unitate, U ∈ R n×n superior triunghiulară unitate şi D ∈ R n×n diagonală astfel<br />

încât<br />

A = LDU,<br />

atunci expresia <strong>de</strong> mai sus este numită factorizare LDU a matricei A.<br />

Arătăm în continuare în ce condiţii o factorizare LDU există şi este unică.<br />

Teorema 2.4 O matrice A ∈ R n×n are o unică factorizare LDU dacă şi numai<br />

dacă submatricele li<strong>de</strong>r principale A [k] , k = 1 : n − 1, sunt nesingulare.<br />

Demonstraţie. Demonstrăm aici doar existenţa factorizării LDU, pentru unicitate<br />

vezi problema 2.5.<br />

În condiţiile enunţate, din teorema 2.1, care constituie baza eliminării gaussiene,<br />

rezultă că există M inferior triunghiulară unitate (<strong>de</strong>ci inversabilă) astfel încât<br />

MA = U, cu U superior triunghiulară. Cu notaţia L = M −1 , matrice inferior<br />

triunghiulară unitate, avem A = LU. Notând acum<br />

D = diag(u 11 , u 22 , . . . , u nn ),<br />

U ′ = D −1 U,<br />

atunci A = LDU ′ , cu L, D, U ′ satisfăcând condiţiile <strong>de</strong>scompunerii LDU.


82 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

Reciproc, se poate <strong>de</strong>monstra prin reducere la absurd — vezi problema 2.6 —<br />

că dacă factorizarea LDU este unică, atunci submatricele A [k] , k = 1 : n − 1, sunt<br />

nesingulare.<br />

♦<br />

Factorizările LU utilizate în practica <strong>numeric</strong>ă curentă asociază matricea diagonală<br />

D din cu una dintre matricele U, L ale factorizării LDU. Astfel se obţin,<br />

respectiv:<br />

• factorizarea Doolittle A = LU, cu L inferior triunghiulară unitate şi U superior<br />

triunghiulară,<br />

• factorizarea Crout A = LU, cu L inferior triunghiulară şi U superior triunghiulară<br />

unitate.<br />

Din teorema 2.4 rezultă că ambele factorizări, Doolittle şi Crout, există şi sunt<br />

unice dacă şi numai dacă submatricele li<strong>de</strong>r principale A [k] , k = 1 : n − 1, sunt<br />

nesingulare. Vom păstra în continuare această ipoteză, specificând cazurile în care<br />

ea nu este necesară.<br />

2.4.1 Factorizări LU rezultate din eliminarea gaussiană<br />

Factorizarea Doolittle este <strong>calcul</strong>ată chiar <strong>de</strong> algoritmul G <strong>de</strong> triangularizare gaussiană<br />

! Este una din ”surprizele” plăcute ale <strong>calcul</strong>ului <strong>numeric</strong>.<br />

Teorema 2.5 Algoritmul G, aplicat matricei A ∈ R n×n , cu <strong>de</strong>tA [k] ≠ 0,<br />

k = 1 : n − 1, <strong>calcul</strong>ează factorizarea Doolittle A = LU, cu L inferior triunghiulară<br />

unitate şi U superior triunghiulară. Factorii L (mai puţin elementele diagonale) şi<br />

U sunt memoraţi peste A.<br />

Demonstraţie. Algoritmul G produce matricele ITE M k , k = 1 : n − 1, astfel<br />

încât din (2.10) rezultă A = LU, cu L = (M n−1 . . . M 2 M 1 ) −1 şi U memorată peste<br />

A. Aşadar<br />

L = M1 −1 M 2 −1 . . . Mn−1 −1 .<br />

Dar (vezi propoziţia 2.1), M −1<br />

k<br />

= I n + m k e T k , <strong>de</strong>ci<br />

n−1<br />

L = (I n + m 1 e T 1 )(I n + m 2 e T 2 )...(I n + m n−1 e T n−1 ) = I ∑<br />

n + m k e T k + S,<br />

un<strong>de</strong> S este o sumă <strong>de</strong> matrice <strong>de</strong> forma<br />

T = . . . m p e T p m qe T q . . .<br />

cu p < q. Deoarece e T p m q = 0, pentru orice p < q, obţinem T = 0 şi S = 0. Astfel,<br />

⎡<br />

⎤<br />

1 0 . . . 0 0<br />

µ 21 1 . . . 0 0<br />

n−1<br />

∑<br />

L = I n + m k e T µ 31 µ 32 . . . 0 0<br />

k =<br />

.<br />

k=1 ⎢ . . . .. ,<br />

. . .<br />

⎥<br />

⎣ µ n−1,1 µ n−1,2 . . . 1 0 ⎦<br />

µ n1 µ n2 . . . µ n,n−1 1<br />

k=1


2.4.<br />

FACTORIZĂRI LU 83<br />

<strong>de</strong>ci matricea L este formată chiar din multiplicatorii gaussieni memoraţi în A, în<br />

algoritmul G.<br />

♦<br />

Vom studia acum legătura între algoritmul GPP <strong>de</strong> eliminare gaussiană cu pivotare<br />

parţială şi factorizările LU.<br />

Teorema 2.6 Triangularizarea (2.14) (M n−1 P n−1 . . . M 1 P 1 A = U) a matricei<br />

A ∈ R n×n , obţinută prin algoritmul GPP, este echivalentă cu factorizarea Doolittle<br />

a matricei A cu liniile permutate, adică<br />

PA = LU, (2.19)<br />

un<strong>de</strong> P = P n−1 . . . P 1 . În partea subdiagonală, coloana k ∈ 1 : n − 1 a matricei<br />

L este o permutare a vectorului Gauss corespunzător m k ; mai precis, dacă<br />

h k = P n−1 . . .P k+1 m k , atunci L(k + 1 : n, k) = h k (k + 1 : n).<br />

Demonstraţie.<br />

Se poate verifica uşor echivalenţa dintre (2.14) şi<br />

˜M n−1 . . . ˜M 1 PA = U, (2.20)<br />

un<strong>de</strong> ˜M n−1 = M n−1 şi, pentru k < n − 1,<br />

˜M k = P n−1 . . . P k+1 M k P k+1 . . .P n−1 =<br />

= I − P n−1 . . .P k+1 m k e T k P k+1 . . . P n−1 =<br />

= I − P n−1 . . .P k+1 m k e T k = I − h ke T k .<br />

În relaţiile <strong>de</strong> mai sus am ţinut seama că M k = I − m k e T −1<br />

k şi Ps<br />

= P s ; în plus,<br />

e T k P s = e T k , pentru s > k, <strong>de</strong>oarece P s este o PE <strong>de</strong> indici s şi t ≥ s. Deci ˜Mk este o<br />

matrice ITE <strong>de</strong>finită <strong>de</strong> vectorul Gauss h k . Deoarece (2.20) şi (2.10) sunt analoage,<br />

−1 −1<br />

rezultă, ca în teorema 2.5, că matricea L = ˜M 1 . . . ˜M n−1 este inferior triunghiulară<br />

unitate cu coloanele egale în partea subdiagonală cu vectorii h k , k ∈ 1 : n − 1. Prin<br />

urmare relaţia (2.19) este satisfăcută.<br />

♦<br />

Expresia vectorului h k arată cum trebuie modificat algoritmul GPP pentru a<br />

produce factorizarea LU cu pivotare (2.19); se observă că asupra fiecărui vector<br />

Gauss m k trebuie aplicate toate permutările ulterioare P s , cu s > k. Pentru a<br />

implementa aceasta, modificăm instrucţiunea 1.3 a GPP din ”Pentru j = k : n”<br />

în ”Pentru j = 1 : n”, adică, ceea ce e echivalent cu afirmaţia anterioară, fiecare<br />

permutare P k se aplică şi tuturor vectorilor Gauss anteriori m j , cu j ∈ 1 : k − 1.<br />

După execuţia algoritmului GPP astfel modificat, matricele triunghiulare L şi U<br />

din (2.19) se vor afla în A.<br />

Cazul eliminării gaussiane cu pivotare completă este acum clar şi vom lăsa <strong>de</strong>taliile<br />

ca exerciţiu pentru cititor (problema 2.8). Modificând algoritmul GPC în<br />

acelaşi mod ca pe GPP, se va obţine pe loc în matricea A o factorizare LU a unei<br />

matrice obţinute din A prin permutări <strong>de</strong> linii şi coloane:<br />

PAQ = LU, (2.21)<br />

un<strong>de</strong> P, L şi U au aceeaşi semnificaţie (dar nu aceleaşi elemente) ca în teorema<br />

2.6, iar Q = Q 1 . . . Q n−1 este construită din matricele <strong>de</strong> permutare elementară din<br />

relaţia (2.16).


84 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

elemente <strong>calcul</strong>ate<br />

0<br />

1<br />

❄<br />

a kk . . . a kj . . .<br />

.<br />

a ik<br />

.<br />

.<br />

= l kk<br />

.<br />

i l ik<br />

.<br />

.<br />

✒<br />

elemente <strong>calcul</strong>ate<br />

0<br />

1<br />

k<br />

. . . u kj . . .<br />

1<br />

Fig. 2.4: Stadiu intermediar al factorizării Crout.<br />

2.4.2 Factorizări LU compacte<br />

Factorizarea Crout poate fi <strong>calcul</strong>ată luând în relaţia (2.18) expresia LU ca fiind factorizarea<br />

Doolittle şi D = diag(u 11 , u 12 , . . .,u nn ). Atunci, L ′ U ′ este <strong>de</strong>scompunerea<br />

Crout a matricei A.<br />

Totuşi, există şi alte posibilităţi <strong>de</strong> a organiza <strong>calcul</strong>ele, care <strong>de</strong> obicei se numesc<br />

scheme <strong>de</strong> factorizare compactă. Vom <strong>de</strong>duce o astfel <strong>de</strong> factorizare Crout pe baza<br />

i<strong>de</strong>ii <strong>de</strong> a utiliza direct i<strong>de</strong>ntitatea A = LU, <strong>calcul</strong>ând succesiv câte o coloană din<br />

L şi câte o linie din U. Procedura poate fi iniţializată consi<strong>de</strong>rând prima coloană a<br />

i<strong>de</strong>ntităţii A = LU, i.e.<br />

Ae 1 = LUe 1 = Le 1 ,<br />

<strong>de</strong> un<strong>de</strong><br />

respectiv prima linie a aceleiaşi i<strong>de</strong>ntităţi,<br />

adică<br />

l i1 = a i1 , i = 1 : n, (2.22)<br />

e T 1 A = eT 1 LU = l 11e T 1 U,<br />

a 1j = l 11 u 1j , j = 2 : n.<br />

Deoarece l 11 = a 11 = A [1] ≠ 0, din relaţia anterioară rezultă<br />

u 1j = a 1j / l 11 , j = 2 : n. (2.23)<br />

Presupunem acum că primele k − 1 coloane din L şi primele k − 1 linii din U<br />

sunt cunoscute (<strong>calcul</strong>ate); vezi figura 2.4. Din i<strong>de</strong>ntitatea A = LU obţinem<br />

k−1<br />

∑<br />

a ik = l is u sk + l ik , i = k : n,<br />

s=1<br />

în care singura necunoscută este scalarul l ik . Deci,<br />

k−1<br />

∑<br />

l ik = a ik − l is u sk , i = k : n. (2.24)<br />

s=1


2.4.<br />

FACTORIZĂRI LU 85<br />

De asemenea,<br />

k−1<br />

∑<br />

a kj = l ks u sj + l kk u kj , j = k + 1 : n,<br />

s=1<br />

în care acum singura necunoscută este scalarul u kj . Din propoziţia 2.3 rezultă<br />

A [k] = L [k] U [k] , un<strong>de</strong> A [k] , <strong>de</strong>ci şi L [k] sunt nesingulare, adică l kk ≠ 0. Aşadar,<br />

(<br />

)<br />

k−1<br />

∑<br />

u kj = a kj − l ks u sj / l kk , j = k + 1 : n. (2.25)<br />

s=1<br />

Astfel, procedura iniţiată prin (2.22) şi (2.23) poate fi continuată prin (2.24) şi<br />

(2.25); dacă submatricele A [k] , k = 1 : n − 1, sunt nesingulare, ceea ce garantează<br />

că împărţirea din (2.25) poate fi executată, procedura va <strong>calcul</strong>a complet factorii<br />

L şi U. Observând că (2.22) şi (2.23) sunt cazuri particulare ale (2.24), respectiv<br />

(2.25), putem inclu<strong>de</strong> primul pas în bucla generală, rezultând algoritmul următor.<br />

Algoritmul 2.5 (CROUT – Factorizare Crout) (Se dă A ∈ R n×n ,<br />

cu submatricele li<strong>de</strong>r principale A [k] , k = 1 : n − 1, nesingulare. Se<br />

<strong>calcul</strong>ează factorizarea Crout A = LU, cu L inferior triunghiulară şi U<br />

superior triunghiulară unitate. Matricele L şi U sunt memorate peste<br />

elementele corespunzătoare din A, mai puţin elementele diagonale ale<br />

lui U, egale cu 1.)<br />

1. Pentru k = 1 : n<br />

1. Pentru i = k : n<br />

1. a ik ← l ik = a ik − ∑ k−1<br />

s=1 l isu sk<br />

2. Pentru j = k + 1 (: n<br />

1. a kj ← u kj = a kj − ∑ )<br />

k−1<br />

s=1 l ksu sj / l kk<br />

Comentarii. Numărul <strong>de</strong> operaţii în virgulă mobilă este N CROUT ≈ 2n 3 /3 la fel<br />

ca în <strong>algoritmi</strong>i G, GPP sau GPC, iar memoria ocupată este M CROUT ≈ n 2 . ♦<br />

Ca şi algoritmul G <strong>de</strong> eliminare gaussiană, algoritmul CROUT eşuează pe<br />

parcurs dacă se obţine un l kk = 0 (ceea ce este echivalent cu A [k] singulară); mai<br />

mult, valori apropiate <strong>de</strong> zero ale unui l kk conduc la valori absolute foarte mari ale<br />

elementelor matricei U <strong>calcul</strong>ate în instrucţiunea 1.2.1 precum şi la erori <strong>numeric</strong>e<br />

inadmisibile în rezultat.<br />

Pentru a preveni această situaţie se introduce pivotarea parţială (pe linii). Spre<br />

<strong>de</strong>osebire <strong>de</strong> algoritmul G un<strong>de</strong>, la pasul k, permutarea liniilor se efectua înaintea<br />

celorlaltor operaţii, aici permutarea poate avea loc doar după <strong>calcul</strong>area elementelor<br />

l ik , cu i ∈ k : n, pentru a putea aduce cea mai convenabilă valoare în poziţia (k, k).<br />

(Să observăm că pivotarea completă este acum imposibilă, <strong>de</strong>oarece ar implica anticiparea<br />

<strong>calcul</strong>elor pentru toată matricea.) Aceasta revine la înmulţirea la stânga<br />

a matricei A cu o PE P kik , cu i k ≥ k, la fiecare pas k şi, global, la o factorizare<br />

PA = LU, cu P = P n−1 . . . P 1 . Algoritmul corespunzător este următorul.<br />

Algoritmul 2.6 (CROUTP – Factorizare Crout cu pivotare parţială)<br />

(Se dă A ∈ R n×n nesingulară. Se <strong>calcul</strong>ează factorizarea Crout


86 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

PA = LU, cu L inferior triunghiulară, U superior triunghiulară unitate<br />

şi P = P n−1 . . . P 1 matrice <strong>de</strong> permutare. Matricele L şi U sunt<br />

memorate peste elementele corespunzătoare din A, mai puţin elementele<br />

diagonale ale lui U, egale cu 1. Întregii i k <strong>de</strong>finind PE P k sunt memoraţi<br />

într-un vector p astfel încât p(k) = i k , k = 1 : n − 1.)<br />

1. Pentru k = 1 : n<br />

1. Pentru i = k : n<br />

1. a ik ← l ik = a ik − ∑ k−1<br />

s=1 l isu sk<br />

2. Se <strong>de</strong>termină i k ∈ k : n astfel încât |l ik k| = max i=k:n |l ik |<br />

3. Pentru j = 1 : n {interschimbă liniile k şi i k }<br />

1. a kj ↔ a ik j<br />

4. Pentru j = k + 1 : n<br />

1. a kj ← u kj =<br />

(<br />

a kj − ∑ k−1<br />

s=1 l ksu sj<br />

)<br />

/ l kk<br />

Comentarii. Desigur, numărul comparaţiilor efectuate în instrucţiunea 1.2 este<br />

<strong>de</strong> ordinul O(n 2 ), adică neglijabil faţă <strong>de</strong> cel al operaţiilor aritmetice. ♦<br />

2.4.3 Factorizări LU prin eliminare gaussiană la nivel <strong>de</strong> bloc<br />

Vom elabora în continuare un algoritm pentru <strong>calcul</strong>ul factorizării Doolittle a unei<br />

matrice A ∈ R n×n , folosind cât mai mult operaţii din setul BLAS nivel 3, anume<br />

GEMM şi TRSM. Abordarea problemei se face în mod natural prin partiţionarea matricelor<br />

în blocuri. Vom prezenta întâi varianta fără pivotare, <strong>de</strong>ci presupunem că<br />

submatricele A [k] sunt nesingulare, pentru k ∈ 1 : n − 1.<br />

Partiţionăm matricea A astfel<br />

A =<br />

[ ]<br />

A11 A 12 } r<br />

A 21 A 22 } n − r<br />

}{{} }{{}<br />

r n−r<br />

, (2.26)<br />

alegerea lui r urmând a fi precizată ulterior.<br />

În i<strong>de</strong>ea <strong>calcul</strong>ului la nivel <strong>de</strong> bloc al factorizării LU, să începem prin a <strong>de</strong>termina<br />

L 11 , L 21 , U 11 , U 12 , astfel încât să fie satisfăcută egalitatea:<br />

[ ]<br />

A11 A 12<br />

=<br />

A 21 A 22<br />

[ ]<br />

L11 0<br />

·<br />

L 21 I n−r<br />

[<br />

Ir 0<br />

0 B<br />

]<br />

·<br />

[ ]<br />

U11 U 12<br />

. (2.27)<br />

0 I n−r<br />

Din această egalitate, privită pe rând pentru cele patru blocuri componente, se pot<br />

<strong>de</strong>duce uşor blocurile dorite din L şi U:<br />

1. A 11 = L 11 U 11 , <strong>de</strong>ci L 11 şi U 11 provin din factorizarea LU la nivel <strong>de</strong> element<br />

a matricei A 11 .<br />

2. A 21 = L 21 U 11 ⇒ L 21 = A 21 U −1<br />

11 . Deci, U 11 fiind cunoscut <strong>de</strong> la pasul<br />

anterior, L 21 poate fi <strong>calcul</strong>at prin rezolvarea unui sistem superior triunghiular<br />

cu parte dreaptă multiplă.


2.4.<br />

FACTORIZĂRI LU 87<br />

3. A 12 = L 11 U 12 ⇒ U 12 = L −1<br />

11 A 12. Deci, U 12 este soluţia unui sistem inferior<br />

triunghiular cu parte dreaptă multiplă.<br />

4. A 22 = L 21 U 12 + B ⇒ B = A 22 − L 21 U 12 ; blocul ”restant” B <strong>de</strong>pin<strong>de</strong> doar<br />

<strong>de</strong> matrice cunoscute sau <strong>de</strong>ja <strong>calcul</strong>ate.<br />

Deci, în ordinea <strong>de</strong> mai sus, se pot <strong>calcul</strong>a toate necunoscutele din (2.27).<br />

Procedând mai <strong>de</strong>parte în mod similar cu matricea B, se poate <strong>calcul</strong>a o factorizare<br />

LU a acesteia, adică<br />

B = L 22 U 22 . (2.28)<br />

În acest caz, egalitatea (2.27) <strong>de</strong>vine o factorizare LU a matricei A, cu<br />

[ ]<br />

[ ]<br />

L11 0<br />

U11 U<br />

L = ; U = 12<br />

. (2.29)<br />

L 21 L 22 0 U 22<br />

Pe scurt, aplicând în mod repetat paşii 1-4 <strong>de</strong> mai sus, dimensiunea problemei<br />

se reduce <strong>de</strong> la n la n − r, n − 2r etc. La etapa m (un<strong>de</strong> n = mr), problema constă<br />

în factorizarea LU a unui bloc r ×r, factorizarea întregii matrice A fiind terminată.<br />

Algoritmul <strong>de</strong> factorizare LU va consta <strong>de</strong>ci dintr-o buclă conţinând paşii 1-4. În<br />

figura 2.5 sunt reprezentate blocurile <strong>de</strong> interes pe parcursul unei iteraţii.<br />

Algoritmul 2.7 (Gbl – Eliminare gaussiană la nivel <strong>de</strong> bloc) (Se<br />

dau A ∈ R n×n , cu A [k] , k = 1 : n − 1, nesingulare, şi r ∈ N astfel încât<br />

n = mr. Se <strong>calcul</strong>ează factorizarea Doolittle A = LU, prin operaţii la<br />

nivel <strong>de</strong> bloc.)<br />

1. Pentru k = 1 : m<br />

1. s ← (k − 1)r + 1<br />

2. f ← kr<br />

3. Se <strong>calcul</strong>ează factorizarea LU<br />

A(s : f, s : f) = L(s : f, s : f) · U(s : f, s : f)<br />

4. Se rezolvă sistemul superior triunghiular<br />

Z · U(s : f, s : f) = A(f + 1 : n, s : f)<br />

5. L(f + 1 : n, s : f) ← Z<br />

6. Se rezolvă sistemul inferior triunghiular<br />

L(s : f, s : f) · Z = A(s : f, f + 1 : n)<br />

7. U(s : f, f + 1 : n) ← Z<br />

8. A(f + 1 : n, f + 1 : n) ← A(f + 1 : n, f + 1 : n)−<br />

−L(f + 1 : n, s : f)U(s : f, f + 1 : n)<br />

Comentarii. Se observă că doar în instrucţiunea 1.3, factorizarea LU a blocului<br />

A(s : f, s : f), <strong>de</strong> dimensiune r × r, trebuie explicitată cu operaţii la nivel <strong>de</strong><br />

element; în rest, în instrucţiunile 1.4 şi 1.6 se foloseşte TRSM, iar în 1.8 GEMM. Din<br />

totalul <strong>de</strong> 2n 3 /3 flopi ai algoritmului 2.7 (la fel ca pentru algoritmul G), doar<br />

2mr 3 /3 = 2nr 2 /3 apar în factorizările LU ”mici” din instrucţiunea 1.3. În acest<br />

caz, pon<strong>de</strong>rea operaţiilor <strong>de</strong> nivel 3 este<br />

P3 LU (n, r) = 2n3 /3 − 2nr 2 /3<br />

2n 3 /3<br />

= 1 − r2<br />

n 2 . (2.30)


88 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

<strong>de</strong>ja factorizat<br />

s f n<br />

s<br />

f<br />

❇<br />

❇❇<br />

❇◆<br />

❄<br />

L<br />

U<br />

✛<br />

✻<br />

✛<br />

curent<br />

n<br />

curent<br />

❍❨<br />

❍<br />

❍<br />

❍<br />

<strong>de</strong> factorizat<br />

Fig. 2.5: Structura blocurilor într-un pas al factorizării Doolittle la nivel <strong>de</strong> bloc<br />

Cum, în general, se alege r ≪ n (şi <strong>de</strong>ci, cu atât mai mult, r 2 ≪ n 2 ), pon<strong>de</strong>rea<br />

operaţiilor <strong>de</strong> nivel 3 este apropiată <strong>de</strong> 1, <strong>de</strong>ci putem estima o bună comportare<br />

a algoritmului pe un <strong>calcul</strong>ator cu memorie ierarhică. Totuşi, alegerea dimensiunii<br />

blocurilor r se face în urma unui compromis: pe <strong>de</strong> o parte, din (2.30) e <strong>de</strong> dorit<br />

ca r să fie cât mai mic, pe <strong>de</strong> alta, pentru ca rutinele din BLAS-3 să fie eficiente<br />

trebuie ca r să fie suficient <strong>de</strong> mare; valoarea i<strong>de</strong>ală se <strong>de</strong>termină fie din estimări<br />

teoretice, fie, mai ales, prin încercări experimentale.<br />

♦<br />

Introducerea pivotării se face relativ simplu, ţinându-se seama că în (2.27) apare<br />

în plus o matrice <strong>de</strong> permutare P 1 :<br />

[ ]<br />

A11 A<br />

P 1 · 12<br />

=<br />

A 21 A 22<br />

[ ]<br />

L11 0<br />

·<br />

L 21 I n−r<br />

[<br />

Ir 0<br />

0 B<br />

] [ ]<br />

U11 U<br />

· 12<br />

. (2.31)<br />

0 I n−r<br />

Reducerea <strong>calcul</strong>ului factorizării LU a matricei A la un <strong>calcul</strong> analog pentru<br />

matricea <strong>de</strong> dimensiuni mai mici B se face în felul următor:<br />

1. Se <strong>calcul</strong>ează, <strong>de</strong> exemplu prin eliminare gaussiană, factorizarea LU (rezultată<br />

din (2.31), pentru cele două blocuri din stânga):<br />

[ ] [ ]<br />

A11 L11<br />

P 1 · = · U<br />

A 21 L 11 . (2.32)<br />

21<br />

(Se aplică algoritmul GPP, chiar dacă matricea în cauză este n × r; căutarea<br />

pivotului se face pe toată porţiunea subdiagonală a unei coloane. Vezi problema<br />

2.9.)<br />

2. Se aplică permutarea restului matricei A (cele două blocuri din dreapta),<br />

obţinându-se [ ] [ ]<br />

Ã12 A12<br />

= P 1 · .<br />

à 22 A 22


2.4.<br />

FACTORIZĂRI LU 89<br />

3. Din Ã12 = L 11 U 12 se poate <strong>calcul</strong>a U 12 = L −1<br />

11 Ã12, prin rezolvarea unui sistem<br />

inferior triunghiular cu parte dreaptă multiplă (se apelează TRSM).<br />

4. Mai rămâne B = Ã22 − L 21 U 12 , termenii din dreapta fiind toţi <strong>de</strong>ja <strong>calcul</strong>aţi;<br />

<strong>de</strong>ci B se poate obţine în urma unui apel la GEMM.<br />

Lăsăm cititorului <strong>de</strong>talierea i<strong>de</strong>ii <strong>algoritmi</strong>ce <strong>de</strong> mai sus, ca şi <strong>calcul</strong>ul pon<strong>de</strong>rii<br />

operaţiilor <strong>de</strong> nivel 3; <strong>de</strong>şi acum vor fi mai multe operaţii la nivel <strong>de</strong> element faţă <strong>de</strong><br />

cazul factorizării fără pivotare, totuşi numărul lor rămâne suficient <strong>de</strong> mic pentru<br />

a putea aprecia algoritmul ca eficient.<br />

2.4.4 Factorizări LU compacte la nivel <strong>de</strong> bloc<br />

Vom prezenta în continuare o variantă la nivel <strong>de</strong> bloc a <strong>meto<strong>de</strong></strong>i Crout pentru<br />

factorizarea LU; ne vom ocupa doar <strong>de</strong> cazul în care nu se efectuează pivotare.<br />

Raţionamentul este absolut i<strong>de</strong>ntic cu cel la nivel <strong>de</strong> element. La nivel <strong>de</strong> bloc,<br />

egalitatea A = LU se poate scrie<br />

⎡<br />

⎤ ⎡<br />

⎤ ⎡<br />

⎤<br />

A 11 A 12 . . . A 1m L 11 0 . . . 0 U 11 U 12 . . . U 1m<br />

A 21 A 22 . . . A 2m<br />

⎢<br />

⎣<br />

.<br />

. . ..<br />

⎥<br />

. ⎦ = L 21 L 22 . . . 0<br />

⎢<br />

⎣<br />

.<br />

. . ..<br />

⎥<br />

. ⎦ ·<br />

0 U 22 . . . U 2m<br />

⎢<br />

⎣<br />

.<br />

. . ..<br />

⎥<br />

. ⎦ ,<br />

A m1 A m2 . . . A mm L m1 L m2 . . . L mm 0 0 . . . U mm<br />

(2.33)<br />

ceea ce, pentru blocul cu indici i, j, revine la A ij = ∑ min(i,j)<br />

t=1<br />

L it U tj .<br />

Detaliind această relaţie, distingem următoarele cazuri:<br />

(<br />

)<br />

k∑<br />

k−1<br />

∑<br />

i = j = k ⇒ A kk = L kt U tk ⇒ L kk U kk = A kk − L kt U tk . (2.34)<br />

i > j = k ⇒ A ik =<br />

k = i < j ⇒ A kj =<br />

t=1<br />

t=1<br />

t=1<br />

t=1<br />

(<br />

)<br />

k∑<br />

k−1<br />

∑<br />

L it U tk ⇒ L ik = A ik − L it U tk U −1<br />

kk ; (2.35)<br />

k∑<br />

t=1<br />

L kt U tj ⇒ U kj = L −1<br />

kk<br />

(<br />

)<br />

k−1<br />

∑<br />

A kj − L kt U tj . (2.36)<br />

Ordinea în care se aplică formulele <strong>de</strong> mai sus este aceeaşi ca în algoritmul la<br />

nivel <strong>de</strong> element: se <strong>calcul</strong>ează întâi prima bloc coloană din L şi prima bloc linie din<br />

U; diferenţa este că acum trebuie <strong>calcul</strong>ate două blocuri diagonale, L 11 şi U 11 (în<br />

algoritmul la nivel <strong>de</strong> element, u 11 = 1); aceasta se face printr-o factorizare Crout<br />

LU; se continuă apoi cu a doua bloc coloană din L şi a doua bloc linie din U etc.<br />

Procesul <strong>de</strong> <strong>calcul</strong> va <strong>de</strong>curge conform următoarei scheme:<br />

1. Pentru k = 1 : m<br />

1. Se <strong>calcul</strong>ează L kk şi U kk factorizând LU termenul drept din (2.34)<br />

2. Pentru i = k + 1 : m<br />

1. Se <strong>calcul</strong>ează L ik ca în (2.35)<br />

3. Pentru j = k + 1 : m<br />

1. Se <strong>calcul</strong>ează U kj ca în (2.36)<br />

t=1


90 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

Pentru a <strong>de</strong>talia algoritmul şi a-l scrie în mod cât mai eficient prin apeluri la<br />

rutine BLAS-3, să observăm că sumele din relaţiile (2.34–2.36) se pot scrie compact;<br />

exemplificăm doar pentru una dintre sume, cea din (2.35), notând s = (k − 1)r + 1,<br />

f = kr, s i = (i − 1)r + 1, f i = ir:<br />

k−1<br />

∑<br />

L it U tk ≡ L(s i : f i , 1 : s − 1) · U(1 : s − 1, s : f).<br />

t=1<br />

Mai mult, putem scrie compact toate relaţiile <strong>de</strong> tip (2.35), pentru un k fixat, dar<br />

cu i = k + 1 : m. Mai exact, bucla 1.2 din schema <strong>de</strong> mai sus se transformă într-o<br />

singură atribuire (profitând <strong>de</strong> faptul că U −1<br />

kk<br />

nu <strong>de</strong>pin<strong>de</strong> <strong>de</strong> i), anume:<br />

L(f +1 : n, s : f) ← [A(f +1 : n, s : f) − L(f +1 : n, 1 : s−1) · U(1 : s−1, s : f)] ·<br />

·U(s : f, s : f) −1<br />

În fine, combinând forma <strong>de</strong> mai sus cu termenul drept din (2.34), obţinem instrucţiunea<br />

1.3 din algoritmul <strong>de</strong>taliat în continuare (<strong>calcul</strong>ele se pot efectua pe loc în<br />

matricea A, dar, pentru claritate, nu procedăm astfel).<br />

Algoritmul 2.8 (CROUTbl – Factorizare Crout la nivel <strong>de</strong> bloc)<br />

(Se dau A ∈ R n×n şi r ∈ N astfel încât n = mr. Se <strong>calcul</strong>ează factorizarea<br />

A = LU, utilizând operaţii la nivel <strong>de</strong> bloc.)<br />

1. Pentru k = 1 : m<br />

1. s ← (k − 1)r + 1<br />

2. f ← kr<br />

3. A(s : n, s : f) ← A(s : n, s : f) − L(s : n, 1 : s−1)·U(1 : s−1, s : f)<br />

4. Se <strong>calcul</strong>ează factorizarea LU Crout<br />

A(s : f, s : f) = L(s : f, s : f) · U(s : f, s : f)<br />

5. Se rezolvă sistemul superior triunghiular<br />

Z · U(s : f, s : f) = A(f + 1 : n, s : f)<br />

6. L(f + 1 : n, s : f) ← Z (o bloc coloană din L)<br />

7. A(s : f, f + 1 : n) ← A(s : f, f + 1 : n)−<br />

−L(s : f, 1 : s − 1) · U(1 : s − 1, f + 1 : n)<br />

8. Se rezolvă sistemul inferior triunghiular<br />

L(s : f, s : f) · Z = A(s : f, f + 1 : n)<br />

9. U(s : f, f + 1 : n) ← Z (o bloc linie din U)<br />

Comentarii. Desigur, înmulţirile <strong>matriceal</strong>e din instrucţiunile 1.3 şi 1.7 se vor<br />

executa prin apeluri la GEMM, iar rezolvările <strong>de</strong> sisteme triunghiulare din 1.5 şi 1.8,<br />

prin apeluri laTRSM. Pon<strong>de</strong>rea operaţiilor <strong>de</strong> nivel 3 este aceeaşi ca pentru algoritmul<br />

2.7, diferenţa fiind că aici se execută mai multe apeluri la GEMM, ceea ce ar putea<br />

mări timpul <strong>de</strong> execuţie, dar probabil numai într-o măsură nesemnificativă.<br />

Algoritmul <strong>de</strong> mai sus poate <strong>calcul</strong>a şi o factorizare LU Doolittle dacă în instrucţiunea<br />

1.4 se utilizează algoritmul G în loc <strong>de</strong> CROUT.<br />


2.5. REZOLVAREA SISTEMELOR LINIARE 91<br />

2.5 Rezolvarea sistemelor liniare<br />

Teoremele 2.2 şi 2.3 arată că <strong>algoritmi</strong>i GPP şi GPC constituie un bun instrument<br />

pentru rezolvarea sistemului liniar nesingular Ax = b.<br />

Să consi<strong>de</strong>răm următoarea sintaxă neformală pentru utilizarea <strong>algoritmi</strong>lor GPP<br />

şi respectiv GPC:<br />

[M, U, p] = GPP(A)<br />

[M, U, p, q] = GPC(A)<br />

un<strong>de</strong> M <strong>de</strong>notă multiplicatorii gaussieni µ ik , k = 1 : n − 1, i = k + 1 : n, U<br />

este matricea superior triunghiulară produsă <strong>de</strong> algoritm, iar p şi q sunt vectori <strong>de</strong><br />

întregi <strong>de</strong>finind permutările <strong>de</strong> linii şi, respectiv, coloane. Deşi matricele M şi U se<br />

memorează peste A (aşa cum am şi procedat în GPP şi GPC), vom utiliza sintaxa<br />

<strong>de</strong> mai sus pentru claritate.<br />

Rezolvarea sistemelor utilizând GPP. Consi<strong>de</strong>răm sistemul liniar Ax = b,<br />

cu A nesingulară şi utilizăm GPP pentru triangularizarea matricei A conform<br />

relaţiei (2.14). Doarece toate matricele M k şi P k sunt nesingulare, sistemul Ax = b<br />

este echivalent (are aceeaşi soluţie) cu sistemul<br />

M n−1 P n−1 . . .M 1 P 1 Ax = M n−1 P n−1 . . . M 1 P 1 b. (2.37)<br />

În consecinţă, (2.37) se scrie în forma<br />

Ux = d,<br />

un<strong>de</strong> matricea superior triunghiulară U se află în A, iar vectorul<br />

d = M n−1 P n−1 . . . M 1 P 1 b, (2.38)<br />

se poate <strong>calcul</strong>a pe loc în b, utilizând următoarea schemă <strong>de</strong> <strong>calcul</strong>:<br />

b 1. Pentru k = 1 : n − 1<br />

1. b ← P k b<br />

2. b ← M k b<br />

În <strong>de</strong>finitiv, soluţia x a sistemului Ax = b se obţine rezolvând (pe loc în b) sistemul<br />

superior triunghiular Ux = b. Evi<strong>de</strong>nt, în acest scop se utilizează algoritmul<br />

UTRIS, cu sintaxa<br />

x = UTRIS(U, b).<br />

Pentru <strong>de</strong>talierea schemei facem apel la propoziţiile 2.1 şi 2.2. Se obţine algoritmul<br />

<strong>de</strong> mai jos.<br />

Algoritmul 2.9 (S GPP – Calculul soluţiei unui sistem liniar utilizând<br />

GPP) (Se dau A ∈ R n×n nesingulară şi b ∈ R n . Se <strong>calcul</strong>ează<br />

soluţia x ∈ R n a sistemului liniar Ax = b, utilizând procedura <strong>de</strong> eliminare<br />

gaussiană cu pivotare parţială.)


92 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

1. [M, U, p] = GPP(A)<br />

2. Pentru k = 1 : n − 1<br />

1. b k ↔ b p(k)<br />

2. Pentru i = k + 1 : n<br />

1. b i ← b i − µ ik b k<br />

3. x = UTRIS(U, b)<br />

Comentarii.<br />

Numărul <strong>de</strong> operaţii este:<br />

n−1<br />

∑<br />

N S GPP = N GPP + 2(n − k) + N UTRIS ≈ 2n3<br />

3 + n2 + n 2 ≈ 2n3<br />

3 ≈ N GPP,<br />

k=1<br />

şi <strong>de</strong>ci principalul efort constă în triangularizarea matricei A. Evi<strong>de</strong>nt, memoria<br />

necesară este M S GPP ≈ n 2 .<br />

♦<br />

Rezolvarea sistemelor utilizând GPC. Alternativ, dar mai costisitor, putem<br />

utiliza GPC, vezi (2.16); în acest caz, sistemul Ax = b este echivalent cu<br />

M n−1 P n−1 . . . M 1 P 1 AQ 1 . . . Q n−1 Q n−1 . . . Q 1 x = M n−1 P n−1 . . . M 1 P 1 b. (2.39)<br />

Notând<br />

Q n−1 . . .Q 1 x = y, (2.40)<br />

din (2.16) rezultă că vectorul y poate fi <strong>calcul</strong>at prin rezolvarea sistemului superior<br />

triunghiular<br />

Uy = d, (2.41)<br />

un<strong>de</strong> d este vectorul dat <strong>de</strong> (2.38). În final, din (2.40), şi ştiind că Q −1<br />

k<br />

= Q k ,<br />

obţinem<br />

x = Q 1 Q 2 . . . Q n−1 y. (2.42)<br />

Din relaţiile (2.38)–(2.42), rezultă algoritmul următor.<br />

Algoritmul 2.10 (S GPC – Calculul soluţiei unui sistem liniar<br />

utilizând GPC) (Se dau A ∈ R n×n nesingulară şi b ∈ R n . Se <strong>calcul</strong>ează<br />

soluţia x ∈ R n a sistemului liniar Ax = b, utilizând procedura<br />

<strong>de</strong> eliminare gaussiană cu pivotare completă.)<br />

1. [M, U, p, q] = GPC(A)<br />

2. Pentru k = 1 : n − 1<br />

1. b k ↔ b p(k)<br />

2. Pentru i = k + 1 : n<br />

1. b i ← b i − µ ik b k<br />

3. x = UTRIS(U, b)<br />

4. Pentru k = n − 1 : −1 : 1<br />

1. x k ↔ x q(k)<br />

Comentarii. Complexitatea acestui algoritm este asimptotic aceeaşi cu cea a<br />

algoritmului GPC.<br />


2.6. CALCULUL INVERSEI ŞI AL DETERMINANTULUI 93<br />

Observaţia 2.2 Eliminarea gaussiană, prezentată aici într-un mod sistematic,<br />

este binecunoscuta metodă <strong>de</strong> <strong>calcul</strong> manual prin reducere şi substituţie. Pivotarea<br />

pe linii corespun<strong>de</strong> unei reordonări a ecuaţiilor în (2.1), iar pivotarea pe coloane<br />

corespun<strong>de</strong> unei reordonări a componentelor necunoscutei x. Subliniem că această<br />

metodă este cea mai eficientă procedură <strong>de</strong> rezolvare a sistemelor <strong>de</strong> ecuaţii liniare<br />

nesingulare <strong>de</strong> formă generală. Stabilitatea <strong>numeric</strong>ă a acestor <strong>algoritmi</strong> va fi discutată<br />

ulterior.<br />

♦<br />

Este clar că sistemul Ax = b se poate rezolva şi recurgând explicit la factorizarea<br />

LU a matricei A. Presupunând, pentru simplitate, că nu a fost utilizată pivotarea,<br />

factorizarea este A = LU. Avem LUx = b, sau Ly = b, un<strong>de</strong> am notat Ux = y.<br />

Prin urmare, soluţia sistemului poate fi găsită după următoarea schemă:<br />

Ax = b<br />

1. A = LU (<strong>calcul</strong>ează factorizarea LU)<br />

2. Se rezolvă sistemul inferior triunghiular Ly = b<br />

3. Se rezolvă sistemul superior triunghiular Ux = y<br />

Efortul <strong>de</strong> <strong>calcul</strong> este acelaşi ca în eliminarea gaussiană şi partea sa cea mai<br />

importantă se consumă în procesul <strong>de</strong> factorizare.<br />

Dacă sistemul liniar are parte dreaptă multiplă, adică este <strong>de</strong> forma AX = B<br />

cu B ∈ R n×p , p > 1, atunci X va rezulta <strong>de</strong> aceeaşi dimensiune; sistemul AX = B<br />

poate fi redus la p sisteme cu parte dreaptă simplă, Ax j = b j , j = 1 : p, un<strong>de</strong><br />

vectorii b j şi x j sunt coloanele j din B, respectiv X. Utilizarea naivă <strong>de</strong> p ori a<br />

algoritmului S GPP ar conduce la un efort <strong>de</strong> <strong>calcul</strong> <strong>de</strong> pn 3 /3 flopi, inacceptabil<br />

<strong>de</strong> mare. Dar, <strong>de</strong>oarece A este aceeaşi pentru toate cele p sisteme, factorizarea LU<br />

sau, în general, triangularizarea matricei A, se efectuează o singură dată, rămânând<br />

apoi <strong>de</strong> rezolvat doar sisteme triunghiulare. I<strong>de</strong>ea algoritmului, în cazul factorizării<br />

LU, este următoarea:<br />

AX = B<br />

1. A = LU (<strong>calcul</strong>ează factorizarea LU)<br />

2. Pentru j = 1 : p<br />

1. Se rezolvă sistemul inferior triunghiular Ly = b j<br />

2. Se rezolvă sistemul superior triunghiular Ux j = y<br />

Numărul <strong>de</strong> operaţii va <strong>de</strong> numai aproximativ 2n 3 /3 + 2pn 2 flopi, menţinânduse<br />

complexitatea O(n 3 ). Desigur, în practică este recomandat a se folosi pivotarea,<br />

efectuând o factorizare LU <strong>de</strong> forma PA = LU sau apelând algoritmul GPP.<br />

Modificarea corespunzătoare a schemelor <strong>de</strong> <strong>calcul</strong> prezentate mai sus este propusă<br />

cititorului (vezi problema 2.15).<br />

2.6 Calculul inversei şi al <strong>de</strong>terminantului<br />

unei matrice<br />

Grupăm în această secţiune două probleme care au în comun metoda <strong>de</strong> rezolvare<br />

utilizată — eliminarea gaussiană, precum şi recomandarea <strong>de</strong> a <strong>calcul</strong>a inversa sau<br />

<strong>de</strong>terminantul unei matrice doar atunci când acestea se doresc explicit. Repetăm


94 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

A ←<br />

M<br />

U<br />

⇒<br />

A ←<br />

M<br />

U −1<br />

Fig. 2.6: Memorarea datelor în inversarea <strong>matriceal</strong>ă<br />

că, <strong>de</strong> exemplu, inversa nu se <strong>calcul</strong>ează atunci când se rezolvă sisteme liniare, după<br />

cum nu se <strong>calcul</strong>ează <strong>de</strong>terminantul pentru a testa nesingularitatea unei matrice.<br />

2.6.1 Calculul inversei unei matrice<br />

Dacă A ∈ R n×n este nesingulară, atunci procedura <strong>de</strong> eliminare gaussiană cu pivotare<br />

parţială se termină cu succes şi produce o matrice superior triunghiulară<br />

nesingulară U astfel încât<br />

M n−1 P n−1 . . . M 1 P 1 A = U, (2.43)<br />

un<strong>de</strong> M k sunt matrice ITE şi P k sunt matrice elementare <strong>de</strong> permutare. Din (2.43)<br />

rezultă<br />

X ≡ A −1 = U −1 M n−1 P n−1 . . .M 1 P 1 ,<br />

<strong>de</strong>ci inversa matricei A poate fi <strong>calcul</strong>ată astfel<br />

A −1<br />

1. [M, U, p] = GPP(A)<br />

2. X = UINV(U)<br />

3. Pentru k = n − 1 : −1 : 1<br />

1. X ← XM k<br />

2. X ← XP k<br />

Ne amintim că în algoritmul GPP, matricea U şi multiplicatorii gaussieni µ ik ,<br />

k = 1 : n −1, i = k +1 : n, notaţi global cu M în schema <strong>de</strong> mai sus, se memorează<br />

peste matricea A ca în partea stângă a figurii 2.6. În algoritmul UINV, am văzut<br />

că U −1 se poate memora peste U, astfel că, după instrucţiunea 2 a schemei <strong>de</strong> mai<br />

sus, datele sunt memorate ca în partea dreaptă a figurii 2.6.<br />

Pornind <strong>de</strong> la schema prece<strong>de</strong>ntă, vom prezenta un algoritm care <strong>calcul</strong>ează<br />

inversa matricei A, folosind minimum <strong>de</strong> memorie. Pentru aceasta, observăm că<br />

primele două instrucţiuni necesită memorie adiţională doar pentru vectorul p ∈<br />

R n−1 , în care se memorează permutările <strong>de</strong> linii din GPP. Analizăm acum bucla<br />

Pentru din instrucţiunea 3. Prima atribuire, X ← XM k , poate fi <strong>de</strong>taliată utilizând<br />

o partiţionare pe linii a lui X:<br />

x T i M k = x T i (I n − m k e T k ) = x T i − (x T i m k )e T k (2.44)<br />

= [x i1 x i2 . . . x i,k−1 x ik − x T i m k x i,k+1 . . . x in ], i = 1 : n.<br />

Se poate observa că sunt modificate numai elementele <strong>de</strong> pe coloana k a lui X.


2.6. CALCULUL INVERSEI ŞI AL DETERMINANTULUI 95<br />

Ū −1<br />

¯M<br />

u (−1)<br />

1ḳ<br />

× . . . ×<br />

. . .<br />

.<br />

× . . . ×<br />

. . .<br />

.<br />

µ nk × . . . ×<br />

u (−1)<br />

kk<br />

µ k+1,k<br />

k<br />

× × . . . ×<br />

Ū −1<br />

. . .<br />

.<br />

X ← XM k P k × × . . . ×<br />

✲<br />

×<br />

¯M . . .<br />

.<br />

× × . . . ×<br />

k<br />

Fig. 2.7: Memorarea datelor în pasul k al inversării <strong>matriceal</strong>e<br />

A doua instrucţiune a buclei Pentru, X ← XP k , interschimbă coloanele k şi i k<br />

(i k ≥ k).<br />

Ţinând cont <strong>de</strong> toate aceste consi<strong>de</strong>raţii şi <strong>de</strong> ordinea inversă <strong>de</strong> <strong>calcul</strong> a coloanelor,<br />

pasul k al buclei Pentru din schema <strong>de</strong> mai sus, adică X ← XM k P k , poate fi<br />

<strong>de</strong>scris ca în figura 2.7, un<strong>de</strong> Ū −1 şi ¯M reprezintă elementele din U<br />

−1 şi, respectiv,<br />

multiplicatorii gaussieni care nu au fost utilizaţi (şi nici modificaţi) în execuţia buclei<br />

până la pasul curent; elementele modificate (parte a lui X) sunt notate prin ×.<br />

Astfel, singura informaţie care trebuie salvată constă în multiplicatorii gaussieni<br />

din coloana curentă, µ ik , i = k + 1 : n, necesari pentru <strong>calcul</strong>ul din (2.45).<br />

În acest fel, inversarea matricei A poate fi executată utilizând doar doi vectori<br />

suplimentari <strong>de</strong> lungime (n − 1), anume p pentru memorarea permutărilor şi,<br />

să zicem, g pentru salvarea temporară a multiplicatorilor gaussieni <strong>de</strong> pe coloana<br />

curentă.<br />

Algoritmul care implementează consi<strong>de</strong>raţiile <strong>de</strong> mai sus este:<br />

Algoritmul 2.11 (INV GPP – Calculul inversei unei matrice) (Se<br />

dă A ∈ R n×n nesingulară. Se <strong>calcul</strong>ează matricea A −1 peste A. Algoritmul<br />

utilizează <strong>algoritmi</strong>i GPP pentru triangularizarea gaussiană şi<br />

UINV pentru inversarea unei matrice superior triunghiulare.)<br />

1. [M, U, p] = GPP(A) % M şi U sunt memorate în A<br />

2. A ← X = UINV(U) % doar triunghiul sup. e modificat<br />

3. Pentru k = n − 1 : −1 : 1<br />

1. Pentru i = k + 1 : n<br />

1. g i ← µ ik % salvează multiplicatorii<br />

2. Pentru i = 1 : k<br />

1. a ik ← a ik − ∑ n<br />

t=k+1 a itg t % relaţia (2.45), primele k linii<br />

3. Pentru i = k + 1 : n<br />

1. a ik ← − ∑ n<br />

t=k+1 a itg t<br />

% relaţia (2.45), celelalte linii<br />

4. Dacă p(k) ≠ k atunci<br />

1. Pentru i = 1 : n % interschimbă coloanele k şi p(k)<br />

1. a ik ↔ a i,p(k)


96 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

Comentarii.<br />

Numărul <strong>de</strong> operaţii în virgulă mobilă este<br />

n−1<br />

∑<br />

N INV GPP = N GPP + N UINV + 2n(n − k) ≈ 2n3<br />

3 + n3<br />

3 + n3 = 2n 3<br />

k=1<br />

şi memoria utilizată M INV GPP = n 2 .<br />

Este remarcabil faptul că inversarea <strong>matriceal</strong>ă nu este mai complexă (ca număr<br />

<strong>de</strong> operaţii) <strong>de</strong>cât înmulţirea <strong>de</strong> matrice.<br />

♦<br />

O acurateţe mai bună a matricei inverse <strong>calcul</strong>ate se poate obţine utilizând<br />

algoritmul GPC în locul lui GPP. În acest caz,<br />

M n−1 P n−1 . . . M 1 P 1 AQ 1 Q 2 . . . Q n−1 = U,<br />

şi <strong>de</strong>ci<br />

X ≡ A −1 = Q 1 Q 2 . . . Q n−1 U −1 M n−1 P n−1 . . .M 1 P 1 .<br />

Scrierea algoritmului corespunzător este lăsată în sarcina cititorului.<br />

În practică, acurateţea obţinută cu INV GPP este suficient <strong>de</strong> bună pentru<br />

majoritatea aplicaţiilor.<br />

Observaţia 2.3 Efortul <strong>de</strong> <strong>calcul</strong> necesar inversării unei matrice este <strong>de</strong> aproximativ<br />

trei ori mai mare <strong>de</strong>cât cel pentru rezolvarea unui sistem liniar <strong>de</strong> aceeaşi<br />

dimensiune. De aceea, <strong>de</strong> câte ori e posibil, inversarea <strong>matriceal</strong>ă trebuie evitată<br />

şi înlocuită <strong>de</strong> rezolvarea <strong>de</strong> sisteme liniare. De exemplu, pentru <strong>calcul</strong>ul scalarului<br />

real<br />

α = c T A −1 b,<br />

un<strong>de</strong> A ∈ R n×n , b, c ∈ R n , schema recomandată este<br />

c T A −1 b 1. Se rezolvă sistemul Ax = b % rezultă x = A −1 b<br />

2. α ← c T x<br />

sensibil mai eficientă <strong>de</strong>cât varianta cu inversarea matricei A<br />

Este clar că inversa matricei A se poate <strong>calcul</strong>a şi recurgând explicit la factorizarea<br />

LU a matricei. Presupunând că A = LU, avem<br />

A −1 = U −1 L −1 ,<br />

iar o procedură <strong>de</strong> inversare ar putea consta în:<br />

1. A = LU (se <strong>calcul</strong>ează factorizarea LU)<br />

2. U ← X = U −1<br />

3. L ← Y = L −1<br />

3. A −1 ← XY<br />

Numărul <strong>de</strong> operaţii este tot 2n 3 . Desigur, în practică este indicat a se folosi o<br />

factorizare LU cu pivotare.<br />


2.7. CONDIŢIONAREA SISTEMELOR LINIARE 97<br />

2.6.2 Calculul <strong>de</strong>terminantului<br />

Algoritmii GPP şi GPC sunt utili şi în <strong>calcul</strong>ul <strong>de</strong>terminantului unei matrice.<br />

Amintim că interschimbarea a două linii sau coloane ale unei matrice schimbă<br />

semnul <strong>de</strong>terminantului acesteia, sau, echivalent, dacă P este o permutare elementară,<br />

atunci <strong>de</strong>t(P) = −1. În plus, matricele ITE M k, k = 1 : n − 1, din (2.43), au<br />

elementele diagonale egale cu 1 şi <strong>de</strong>ci <strong>de</strong>t(M k ) = 1. Aşadar<br />

∏<br />

n<br />

<strong>de</strong>t(A) = (−1) s <strong>de</strong>t(U) = (−1) s u ii ,<br />

un<strong>de</strong> s ≤ n − 1 este numărul <strong>de</strong> PE proprii (adică P k ≠ I n ) în (2.43).<br />

Algoritmul corespunzător celor <strong>de</strong> mai sus este:<br />

Algoritmul 2.12 (DET GPP – Calculul <strong>de</strong>terminantului) (Se dă<br />

A ∈ R n×n . Se <strong>calcul</strong>ează <strong>de</strong>tA, utilizând algoritmul GPP.)<br />

1. [M, U, p] = GPP(A)<br />

2. <strong>de</strong>t ← 1<br />

3. Pentru k = 1 : n<br />

1. <strong>de</strong>t ← <strong>de</strong>t · u kk<br />

4. Pentru k = 1 : n − 1<br />

1. Dacă p(k) ≠ k atunci<br />

1. <strong>de</strong>t ← −<strong>de</strong>t<br />

Principalul efort <strong>de</strong> <strong>calcul</strong> în algoritmul <strong>de</strong> mai sus este efectuat în execuţia<br />

algoritmului GPP. Desigur, algoritmul GPC poate fi utilizat în loc <strong>de</strong> GPP,<br />

obţinându-se, <strong>de</strong> regulă, o acurateţe superioară a rezultatului. Scrierea algoritmului<br />

corespunzător este propusă cititorului.<br />

Dacă este disponibilă o factorizare LU a matricei A, atunci <strong>de</strong>t(A) = <strong>de</strong>t(LU) =<br />

= <strong>de</strong>t(L) · <strong>de</strong>t(U) = ( ∏ n<br />

i=1 l ii)( ∏ n<br />

i=1 u ii), ceea ce permite evaluarea imediată a<br />

<strong>de</strong>terminantului.<br />

2.7 Condiţionarea sistemelor liniare<br />

După cum am văzut în capitolul 0, condiţionarea unei probleme <strong>de</strong> <strong>calcul</strong>, în cazul<br />

nostru rezolvarea sistemului liniar <strong>de</strong>terminat nesingular Ax = b, este crucială în<br />

aprecierea acurateţii rezultatelor obţinute. Să consi<strong>de</strong>răm o perturbaţie a datelor<br />

<strong>de</strong> intrare ale sistemului<br />

i=1<br />

(A, b) −→ (A + ∆A, b + ∆b) ≡ (Â,ˆb),<br />

care va avea ca efect o perturbaţie a soluţiei x<br />

x −→ x + ∆x ≡ ˆx, (2.45)<br />

astfel încât<br />

(A + ∆A)(x + ∆x) = b + ∆b. (2.46)


98 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

Consi<strong>de</strong>răm doar perturbaţii mici, respectând ‖∆A‖ ≪ ‖A‖, ‖∆b‖ ≪ ‖b‖ (un<strong>de</strong><br />

‖ ·‖ este o normă consistentă oarecare), i.e. efectuăm o analiză a sensibilităţii locale<br />

a soluţiei în raport cu variaţia datelor.<br />

Teorema 2.7 Presupunem că x ≠ 0. Eroarea relativă a soluţiei (2.45) a sistemului<br />

perturbat (2.46) este mărginită conform relaţiei<br />

(<br />

‖∆x‖ ‖∆A‖<br />

‖x‖<br />

≤ κ(A) ‖A‖<br />

+ ‖∆b‖ )<br />

, (2.47)<br />

‖b‖<br />

un<strong>de</strong><br />

κ(A) = ‖A −1 ‖ · ‖A‖ (2.48)<br />

se numeşte număr <strong>de</strong> condiţionare (la inversare) al matricei A.<br />

Cu alte cuvinte, erorile relative ‖∆A‖ / ‖A‖ şi ‖∆b‖ / ‖b‖ ale datelor <strong>de</strong> intrare<br />

pot fi amplificate <strong>de</strong> κ(A) ori în soluţie, presupunând că toate <strong>calcul</strong>ele se efectuează<br />

exact (<strong>de</strong>ci indiferent <strong>de</strong> algoritmul folosit).<br />

Demonstraţie.<br />

Deoarece Ax = b, din (2.46) rezultă<br />

A · ∆x + ∆A · x + ∆A · ∆x = ∆b.<br />

Neglijând produsul ∆A · ∆x (<strong>de</strong>oarece perturbaţiile sunt mici), obţinem<br />

∆x ≈ −A −1 · ∆A · x + A −1 · ∆b.<br />

Utilizând o familie consistentă <strong>de</strong> norme <strong>matriceal</strong>e ‖ · ‖, din relaţia <strong>de</strong> mai sus<br />

rezultă<br />

‖∆x‖ ≤ ‖A −1 ‖ · ‖∆A‖ · ‖x‖ + ‖A −1 ‖ · ‖∆b‖.<br />

Prin urmare, dacă x ≠ 0, o limită superioară a erorii relative este dată <strong>de</strong><br />

‖∆x‖<br />

‖x‖<br />

≤<br />

≤<br />

‖A −1 ‖ · ‖A‖ · ‖∆A‖<br />

‖A‖ + ‖∆b‖<br />

‖A−1 ‖ · ‖A‖ ·<br />

‖A‖ · ‖x‖ ≤<br />

( ‖∆A‖<br />

‖A −1 ‖ · ‖A‖<br />

‖A‖<br />

+ ‖∆b‖ )<br />

,<br />

‖b‖<br />

ceea ce <strong>de</strong>monstrează (2.47). (Am ţinut seama că ‖b‖ = ‖Ax‖ ≤ ‖A‖ · ‖x‖.)<br />

Aşadar numărul <strong>de</strong> condiţionare κ(A) <strong>de</strong>finit în (2.48) furnizează o măsură a<br />

condiţionării problemei rezolvării unui sistem liniar Ax = b. Un κ(A) mic corespun<strong>de</strong><br />

unei bune condiţionări, adică unei sensibilităţi reduse a soluţiei în raport cu<br />

perturbaţiile datelor. Vom prezenta în secţiunea următoare un rezultat care permite<br />

aprecierea mai precisă a condiţionării în funcţie <strong>de</strong> valoarea κ(A). Se observă că<br />

doar matricea A <strong>de</strong>termină condiţionarea unui sistem, termenul liber b neavând<br />

nici un rol; <strong>de</strong> aceea vorbim <strong>de</strong> ”condiţionarea matricei A” în loc <strong>de</strong> ”condiţionarea<br />

sistemului”. Vom ataşa un indice notaţiei κ(A) atunci când vom preciza norma<br />

folosită în (2.48); <strong>de</strong> exemplu, κ ∞ (A) = ‖A −1 ‖ ∞ · ‖A‖ ∞ . Între norme echivalente,<br />

alegerea uneia anume pentru evaluarea lui κ(A) nu este relevantă, ordinul <strong>de</strong> mărime<br />

al rezultatului fiind acelaşi; <strong>de</strong> obicei, dintre normele p se alege κ ∞ (A) pentru<br />


2.7. CONDIŢIONAREA SISTEMELOR LINIARE 99<br />

uşurinţa <strong>calcul</strong>ului (vezi mai jos). Să notăm că κ p (A) ≥ 1 şi κ 2 (A) = 1 dacă şi<br />

numai dacă A este ortogonală (<strong>de</strong>monstraţi !).<br />

Este intuitiv faptul că un sistem este cu atât mai rău condiţionat cu cât matricea<br />

A este mai ”aproape” <strong>de</strong> o matrice singulară. Trebuie subliniat că măsura acestei<br />

apropieri este dată <strong>de</strong> numărul <strong>de</strong> condiţionare şi nu <strong>de</strong> <strong>de</strong>terminantul matricei A.<br />

Exemplul 2.1 Să consi<strong>de</strong>răm matricele D, T ∈ R n×n<br />

⎡<br />

⎤ ⎡<br />

⎤<br />

0.1<br />

1 −1 . . . −1<br />

0.1<br />

D = ⎢<br />

⎣<br />

. ..<br />

⎥<br />

⎦ , T = 1 . . . −1<br />

⎢<br />

⎣<br />

. ..<br />

⎥<br />

. ⎦ .<br />

0.1<br />

1<br />

Fiind diagonală, este evi<strong>de</strong>nt că D este bine condiţionată; se verifică imediat că<br />

κ(D) = 1, în schimb <strong>de</strong>t(D) = 10 −n , adică, dacă <strong>de</strong> exemplu n = 20, o valoare<br />

foarte mică. Pentru matricea triunghiulară T situaţia este contrară: <strong>de</strong>şi<br />

<strong>de</strong>t(A) = 1, matricea este rău condiţionată pentru că κ ∞ (T) = n2 n−1 (U = T −1<br />

este inferior triunghiulară unitate cu elementele u ij = 2 j−i−1 , pentru j > i, <strong>de</strong>ci<br />

‖T −1 ‖ ∞ = 1 + 2 + 2 2 + . . . + 2 n−2 = 2 n−1 − 1. Pe <strong>de</strong> altă parte, ‖T ‖ ∞ = n). ♦<br />

Un mod uzual dar naiv <strong>de</strong> verificare a posteriori a ”calităţii” soluţiei <strong>calcul</strong>ate<br />

ˆx a unui sistem liniar Ax = b constă în a <strong>calcul</strong>a norma reziduului r = b − Aˆx, i.e.<br />

‖r‖ = ‖b − Aˆx‖<br />

şi <strong>de</strong> a conchi<strong>de</strong> că dacă ‖r‖ este ”mic”, atunci ˆx este o soluţie precisă. De fapt,<br />

această concluzie, corectă pentru matricele bine condiţionate, poate să nu fie (şi<br />

<strong>de</strong> cele mai multe ori nu este) a<strong>de</strong>vărată dacă matricea A este rău condiţionată.<br />

Într-a<strong>de</strong>văr, soluţia exactă este x = A −1 b, astfel că avem<br />

x − ˆx = A −1 b − A −1 (b − r) = A −1 r,<br />

<strong>de</strong>ci eroarea relativă este mărginită conform relaţiei<br />

‖x − ˆx‖<br />

‖x‖<br />

= ‖A−1 r‖<br />

‖A −1 b‖ ≤ ‖A−1 ‖ · ‖r‖<br />

‖A −1 r‖<br />

‖r‖<br />

≤ κ(A)<br />

‖A‖ · ‖A −1 b‖ ≤ κ(A)‖r‖ ‖b‖ ,<br />

pentru orice normă consistentă ‖ · ‖. Astfel, testul ”r este mic” e valid doar dacă<br />

matricea A este bine condiţionată.<br />

Exemplul 2.2 Matricele Hilbert H n ∈ R n×n , <strong>de</strong>finite prin h ij = 1/(i+j −1) sunt<br />

rău condiţionate, κ(H n ) crescând foarte repe<strong>de</strong> cu n. De exemplu, κ ∞ (H 3 ) ≈ 748.<br />

Dacă luăm<br />

x =<br />

⎡<br />

⎣ 8.27<br />

4.60<br />

3.23<br />

⎤<br />

⎦, b =<br />

⎡<br />

⎣ 11.646 . . .<br />

6.475 . . .<br />

4.552 . . .<br />

⎤<br />

⎦, d =<br />

⎡<br />

⎣ 0.0128<br />

−0.0714<br />

0.0689<br />

⎤<br />

⎦, ˆx = x + d,<br />

atunci x este soluţia sistemului H 3 x = b (în acest exemplu am ales x şi am <strong>calcul</strong>at<br />

b). Pentru soluţia ”aproximativă” ˆx avem<br />

‖b − H 3ˆx‖ ∞<br />

‖b‖ ∞<br />

≈ 1.7 · 10 −5 ,<br />

‖x − ˆx‖ ∞<br />

‖x‖ ∞<br />

≈ 8.6 · 10 −3 .


100 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

Deci, <strong>de</strong>şi reziduul ‖b − H 3ˆx‖ este relativ mic faţă <strong>de</strong> b, eroarea relativă a soluţiei<br />

aproximative ˆx este mult mai mare, <strong>de</strong> aproximativ 510 ori, i.e. cu un factor <strong>de</strong><br />

mărime <strong>de</strong> ordinul lui κ ∞ (H 3 ).<br />

♦<br />

Estimarea numărului <strong>de</strong> condiţionare<br />

Un algoritm bun <strong>de</strong> <strong>calcul</strong> al soluţiei sistemului Ax = b indică şi cât <strong>de</strong> sigură este<br />

soluţia obţinută, în condiţiile perturbării inerente a datelor <strong>de</strong> intrare. Numărul<br />

<strong>de</strong> condiţionare κ ∞ (A) (se alege norma ∞ doar pentru uşurinţa <strong>calcul</strong>ului) poate<br />

furniza informaţii sigure asupra acurateţii soluţiei. În continuare, presupunem că<br />

rezolvarea sistemului se face prin intermediul unei factorizări cu pivotare PA = LU,<br />

<strong>de</strong> exemplu cu algoritmul GPP modificat după cum este sugerat în secţiunea 2.4.1,<br />

dar concluziile pot fi extinse şi în celelalte cazuri.<br />

Calculul exact al κ ∞ (A), utilizând relaţia <strong>de</strong> <strong>de</strong>finiţie, (2.48) este prea costisitor.<br />

Dacă ‖A‖ ∞ se obţine simplu în O(n 2 ) flopi conform (1.28), a <strong>calcul</strong>a ‖A −1 ‖ ∞<br />

implică o inversare <strong>matriceal</strong>ă care necesită <strong>de</strong> trei ori mai multe operaţii <strong>de</strong>cât<br />

rezolvarea sistemului, adică inacceptabil <strong>de</strong> mult. Deoarece κ ∞ (A) indică numai o<br />

limită superioară, şi nu valoarea exactă a amplificării erorii datelor <strong>de</strong> intrare, ne<br />

punem problema estimării numărului <strong>de</strong> condiţionare cu doar O(n 2 ) operaţii.<br />

Cline et al. [] au propus o metodă eficientă prin care se obţin estimaţii <strong>de</strong> bună<br />

calitate ale normei ‖A −1 ‖ ∞ . Metoda se bazează pe implicaţia<br />

Ay = d ⇒ ‖A −1 ‖A −1 f‖ ∞<br />

‖ ∞ = sup ≥ ‖y‖ ∞<br />

.<br />

f≠0 ‖f‖ ∞ ‖d‖ ∞<br />

Problema este <strong>de</strong> a găsi un vector d care conduce la un y suficient <strong>de</strong> mare în normă.<br />

Consi<strong>de</strong>răm cazul simplu în care A este inferior triunghiulară. Deoarece sistemul<br />

Ay = d se rezolvă prin substituţie înainte (algoritmul LTRIS), elementele lui d nu<br />

trebuie precizate toate <strong>de</strong> la început ci se pot alege convenabil pe măsură ce sistemul<br />

este rezolvat. O primă i<strong>de</strong>e constă în a consi<strong>de</strong>ra d i ∈ {1, −1} (<strong>de</strong>ci ‖d‖ ∞ = 1) şi<br />

<strong>de</strong> a alege în expresia<br />

∑i−1<br />

y i = (d i − a ij y j )/a ii<br />

j=1<br />

acea valoare d i care produce cel mai mare |y i |. Schema <strong>de</strong> <strong>calcul</strong> poate fi rezumată<br />

astfel:<br />

ν ≈ ‖A −1 ‖ ∞<br />

1. Pentru i = 1 : n<br />

1. ζ ← ∑ i−1<br />

j=1 a ijy j<br />

2. Dacă ζ ≥ 0 atunci d i ← −1<br />

altfel d i ← 1<br />

3. y i ← (d i − ζ)/a ii<br />

2. ν ← ‖y‖ ∞<br />

Sunt necesari aproximativ n 2 flopi, la fel ca pentru LTRIS.<br />

O metodă mai eficientă constă în a urmări, la pasul i al schemei <strong>de</strong> mai sus, majorarea<br />

în modul nu numai a lui y i , ci şi a tuturor sumelor parţiale z ki = ∑ i<br />

j=1 a kjy j ,


2.7. CONDIŢIONAREA SISTEMELOR LINIARE 101<br />

cu k > i, contribuind astfel la majorarea tuturor y k , şi <strong>de</strong>ci a lui ‖y‖ ∞ . Putem<br />

realiza aceasta alegând valoarea d i = ±1 care corespun<strong>de</strong> celei mai mari dintre<br />

sumele<br />

s + = |y + i | + n<br />

∑<br />

k=i+1<br />

s − = |y − i | + n ∑<br />

k=i+1<br />

|z + ki |,<br />

|z − ki |,<br />

un<strong>de</strong> elementele y + i , y− i<br />

corespund alegerii d i = 1, respectiv d i = −1, iar sumele<br />

parţiale au valorile z ± ki = ∑ i−1<br />

j=1 a kjy j +a ki y i ± . Algoritmul rezultat pentru estimarea<br />

numărului <strong>de</strong> condiţionare κ ∞ (A) = ‖A‖ ∞ ‖A −1 ‖ ∞ este prezentat mai jos; pentru<br />

k fixat, sumele z ki <strong>de</strong> mai sus se memorează într-un scalar notat ζ k .<br />

Algoritmul 2.13 (COND – Estimarea numărului <strong>de</strong> condiţionare)<br />

(Se dă A ∈ R n×n , inferior triunghiulară nesingulară. Se <strong>calcul</strong>ează o<br />

estimare ¯κ a lui κ ∞ (A).)<br />

1. Pentru k = 1 : n<br />

1. ζ k ← 0<br />

2. Pentru i = 1 : n<br />

1. y + i<br />

← (1 − ζ i )/a ii<br />

2. y − i ← (−1 − ζ i )/a ii<br />

3. Pentru k = i + 1 : n<br />

1. ζ + k ← ζ k + a ki y + i<br />

2. ζ − k ← ζ k + a ki yi<br />

−<br />

4. s + ← |y + i | + ∑ n<br />

k=i+1 |ζ+ k |<br />

5. s − ← |y − i | + ∑ n<br />

k=i+1 |ζ− k |<br />

6. Dacă s + ≥ s − atunci<br />

1. y i ← y + i<br />

2. Pentru k = i + 1 : n<br />

1. ζ k ← ζ + k<br />

altfel<br />

3. y i ← y − i<br />

4. Pentru k = i + 1 : n<br />

1. ζ k ← ζ − k<br />

3. ¯κ ← ‖y‖ ∞ ‖A‖ ∞<br />

Execuţia algoritmului necesită aproximativ 3n 2 flopi.<br />

Consi<strong>de</strong>răm acum cazul general al unei matrice A ∈ R n×n a cărei factorizare<br />

PA = LU este cunoscută. Numărul <strong>de</strong> condiţionare κ ∞ (A) se poate estima utilizând<br />

următoarea schemă <strong>de</strong> <strong>calcul</strong>, a cărei justificare <strong>de</strong>păşeşte cadrul acestei<br />

lucrări.<br />

¯κ ≈ κ ∞ (A)<br />

1. Se aplică algoritmul 2.13 pentru a obţine o soluţie <strong>de</strong><br />

normă cât mai mare a sistemului U T y = d<br />

2. Se rezolvă sistemele triunghiulare L T r = y, Lv = Pr,<br />

Uw = v<br />

3. ¯κ ← ‖A‖ ∞ ‖w‖ ∞ / ‖r‖ ∞


102 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

Algoritmul necesită aproximativ 7n 2 flopi şi s-a dovedit excelent în practică,<br />

valorile obţinute fiind <strong>de</strong> regulă <strong>de</strong> cel mult 2-5 ori mai mici <strong>de</strong>cât κ ∞ (A), ceea ce<br />

constituie o aproximaţie acceptabilă, mai ales în situaţiile critice când κ ∞ (A) are<br />

valori foarte mari.<br />

2.8 Stabilitatea <strong>numeric</strong>ă a <strong>algoritmi</strong>lor <strong>de</strong><br />

eliminare gaussiană<br />

Vom prezenta în această secţiune caracterizări ale stabilităţii <strong>numeric</strong>e a <strong>algoritmi</strong>lor<br />

<strong>de</strong> eliminare gaussiană (G, GPP, GPC), precum şi modalităţi <strong>de</strong> îmbunătăţire a<br />

rezultatelor <strong>numeric</strong>e obţinute.<br />

Un algoritm <strong>de</strong> rezolvare a sistemului liniar <strong>de</strong>terminat Ax = b produce o soluţie<br />

<strong>calcul</strong>ată ˆx afectată <strong>de</strong> erori <strong>numeric</strong>e. Vectorul ˆx este soluţia aceluiaşi sistem cu<br />

datele perturbate, i.e.<br />

(A + H)ˆx = b. (2.49)<br />

Vom evalua ”mărimea” matricei H pentru <strong>algoritmi</strong>i menţionaţi, adică vom prezenta<br />

rezultate ale analizei inverse a erorilor. Evaluarea unor margini superioare pentru<br />

‖H‖ este o sarcină dificilă, iar marginile au <strong>de</strong> obicei expresii complicate, <strong>de</strong> aceea<br />

nu va fi prezentată nici o <strong>de</strong>monstraţie. În plus, aceste margini sunt mult mai mari<br />

<strong>de</strong>cât erorile <strong>numeric</strong>e întâlnite în practică; ele au rolul <strong>de</strong> a preciza cazurile când<br />

erorile pot fi importante, nu <strong>de</strong> a cuantifica cu precizie aceste erori.<br />

Nu trebuie uitat nici o clipă că, chiar în prezenţa unor valori ale ‖H‖ foarte<br />

mici, acurateţea soluţiei este asigurată doar dacă matricea A este bine condiţionată.<br />

Altfel, ‖H‖ / ‖A‖ mic poate implica (‖ˆx − x‖)/‖x‖ mare, indiferent <strong>de</strong> algoritmul<br />

utilizat.<br />

În contextul teoremei 2.1, notăm cu Âk şi ˆMk matricele A k , respectiv M k , <strong>calcul</strong>ate<br />

efectiv <strong>de</strong> algoritmul <strong>de</strong> eliminare gaussiană G. Introducem în plus următoarele<br />

notaţii:<br />

β k = max<br />

i,j<br />

|â (k)<br />

ij |, k ∈ 1 : n,<br />

γ = max k=1:n β k<br />

β 1<br />

.<br />

Numărul real γ este numit factor <strong>de</strong> creştere, <strong>de</strong>oarece arată cât <strong>de</strong> mult cresc<br />

valorile elementelor matricei A în cursul transformărilor efectuate <strong>de</strong> algoritmul G.<br />

Teorema 2.8 Matricele ˆM 1 , ˆM2 , ..., ˆMn−1 , Â n = Û <strong>calcul</strong>ate în algoritmul G<br />

satisfac<br />

ˆM 1 −1 −1<br />

. . . ˆM n−1Û = A + E, cu |e ij| ≤ nτβ 1 γε M , (2.50)<br />

cu τ o constantă <strong>de</strong> ordinul unităţii, in<strong>de</strong>pen<strong>de</strong>ntă <strong>de</strong> A.<br />

Deoarece procedura <strong>de</strong> rezolvare a sistemelor triunghiulare prin substituţie este<br />

<strong>numeric</strong> stabilă, majoritatea erorile <strong>numeric</strong>e în rezolvarea unui sistem Ax = b apar<br />

la triangularizarea matricei A. De aceea, matricea H din (2.49) satisface margini<br />

superioare la nivel <strong>de</strong> element asemănătoare cu (2.50).


2.8. STABILITATE NUMERICĂ 103<br />

Se observă că valoarea marginii din (2.50) este <strong>de</strong>terminată în special <strong>de</strong> factorul<br />

<strong>de</strong> creştere γ. Pentru <strong>algoritmi</strong>i GPP şi GPC sunt valabile margini i<strong>de</strong>ntice cu<br />

(2.50), dar cu valori maxime diferite pentru γ.<br />

• În algoritmul G, factorul <strong>de</strong> creştere γ poate avea valori oricât <strong>de</strong> mari; aşadar<br />

acest algoritm este <strong>numeric</strong> instabil.<br />

• Introducerea pivotării parţiale conduce la γ ≤ 2 n−1 . Deşi teoretic această<br />

margine este mare chiar pentru valori mo<strong>de</strong>ste ale lui n, totuşi algoritmul<br />

GPP produce rezultate precise în marea majoritate a cazurilor uzuale (unele<br />

excepţii sunt prezentate în []); marginea este atinsă numai pentru anumite<br />

matrice ”patologice”, special construite în acest scop; un exemplu este prezentat<br />

în problema 2.24. De aceea, GPP poate fi consi<strong>de</strong>rat practic stabil.<br />

• În cazul pivotării complete avem γ ≤ [n · 21 · 3 1/2 · 4 1/3 · . . . · n 1/(n−1) ] 1/2 .<br />

Această margine creşte lent cu n şi practic se poate consi<strong>de</strong>ra γ ≤ n, ceea ce<br />

înseamnă că algoritmul GPC este necondiţionat stabil.<br />

Combinând constatările <strong>de</strong> mai sus cu efortul <strong>de</strong> <strong>calcul</strong> cerut <strong>de</strong> <strong>algoritmi</strong>i<br />

studiaţi, putem conchi<strong>de</strong> că algoritmul GPP este cel mai recomandat pentru rezolvarea<br />

sistemelor liniare. În cazuri speciale, când se doreşte o siguranţă <strong>de</strong>osebită<br />

a rezultatului, se pot utiliza algoritmul GPC sau <strong>meto<strong>de</strong></strong>le prezentate în continuare.<br />

Pentru că marginea superioară (2.50) e relativ complicată, să <strong>de</strong>ducem un rezultat<br />

euristic, şi <strong>de</strong>ci aproximativ, dar cu aplicaţii practice clare şi imediate. Dacă în<br />

rezolvarea sistemului Ax = b se foloseşte o strategie <strong>de</strong> pivotare, atunci γ este suficient<br />

<strong>de</strong> mic; pe <strong>de</strong> altă parte, β 1 ≤ ‖A‖ ∞ , dar <strong>de</strong> acelaşi ordin <strong>de</strong> mărime (în orice<br />

caz, nβ 1 ≥ ‖A‖ ∞ ). Atunci (2.50) este esenţial echivalentă cu afirmaţia grosieră<br />

‖E‖ ∞ ≈ ‖H‖ ∞ ≈ ‖A‖ ∞ ε M . (2.51)<br />

Combinând (2.51) cu (2.47) (în care ∆A = H, ∆b = 0, ∆x = ˆx − x), se obţine<br />

aproximaţia<br />

‖ˆx − x‖ ∞<br />

‖x‖ ∞<br />

≈ κ ∞ (A) · ε M , (2.52)<br />

care conduce la următoarea regulă <strong>de</strong> apreciere a acurateţii rezolvării unui sistem:<br />

Dacă ε M ≈ 10 −t şi κ ∞ (A) ≈ 10 q , atunci soluţia <strong>calcul</strong>ată are aproximativ t − q<br />

cifre zecimale corecte (restul <strong>de</strong> q fiind nesigure).<br />

Altfel spus, un număr <strong>de</strong> condiţionare <strong>de</strong> ordinul 10 q antrenează pier<strong>de</strong>rea a q<br />

cifre semnificative în soluţie. Această constatare subliniază importanţa cunoaşterii<br />

unei evaluări a lui κ(A) pentru aprecierea acurateţii soluţiei <strong>calcul</strong>ate.<br />

2.8.1 Scalarea sistemelor liniare<br />

Fie D 1 , D 2 ∈ R n×n două matrice diagonale nesingulare ale căror elemente sunt puteri<br />

ale bazei <strong>de</strong> numeraţie β a formatului virgulă mobilă utilizat. Evi<strong>de</strong>nt, sistemul<br />

Ax = b este echivalent cu sistemul<br />

D 1 AD 2 y = D 1 b, un<strong>de</strong> x = D 2 y. (2.53)


104 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

Transformarea A ← D 1 AD 2 , b ← D 1 b, prin care sistemul Ax = b se aduce la forma<br />

(2.53) se numeşte scalare.<br />

Astfel <strong>de</strong>finită, scalarea nu introduce erori <strong>numeric</strong>e, iar costul ei este <strong>de</strong> O(n 2 )<br />

flopi, <strong>de</strong>ci convenabil. Sunt mai multe consi<strong>de</strong>rente care sugerează i<strong>de</strong>ea <strong>de</strong> scalare<br />

şi strategia <strong>de</strong> alegere a factorilor <strong>de</strong> scală D 1 , D 2 .<br />

Dacă elementele din A sunt <strong>de</strong> mărimi foarte diferite, atunci, marginea din (2.50)<br />

fiind aceeaşi pentru toate elementele, e posibil ca erorile relative asociate elementelor<br />

a ij mici (în modul) să fie foarte mari. De aceea, un obiectiv al scalării poate fi acela<br />

<strong>de</strong> a echilibra valorile elementelor matricei A.<br />

Pe <strong>de</strong> altă parte, (2.52) sugerează să alegem D 1 , D 2 astfel încât să minimizăm<br />

κ ∞ (D 1 AD 2 ). Acest obiectiv este dificil <strong>de</strong> realizat în general şi imposibil cu restricţia<br />

<strong>de</strong> cost impusă; <strong>de</strong> altfel, nu are sens a optimiza pornind <strong>de</strong> la o relaţie aproximativă.<br />

Ţinând seama <strong>de</strong> cele spuse mai sus precum şi <strong>de</strong> cerinţa evi<strong>de</strong>ntă ca D 1 şi D 2<br />

să fie <strong>calcul</strong>ate cu O(n 2 ) operaţii, s-au impus câteva modalităţi <strong>de</strong> scalare:<br />

• scalare pe linii: D 2 = I şi D 1 se alege astfel încât liniile matricei D 1 A să aibă<br />

aproximativ aceeaşi normă ∞.<br />

• echilibrare linii-coloane: D 1 şi D 2 se aleg astfel încât fiecare linie şi coloană<br />

din D 1 AD 2 să aibă norma ∞ cuprinsă în intervalul [1/β, 1] (vezi problema<br />

2.26).<br />

De obicei, soluţia <strong>calcul</strong>ată a sistemului (2.53) astfel scalat este mai precisă <strong>de</strong>cât<br />

soluţia <strong>calcul</strong>ată a sistemului iniţial, dar în general nu există nici o garanţie în acest<br />

sens, <strong>de</strong> aceea scalarea nu trebuie privită ca panaceu universal ci aplicată în funcţie<br />

<strong>de</strong> problemă.<br />

2.8.2 Rafinarea iterativă a soluţiei <strong>calcul</strong>ate<br />

O altă metodă <strong>de</strong> îmbunătăţire a acurateţii soluţiei <strong>calcul</strong>ate ˆx a sistemului Ax = b<br />

este prezentată în continuare. Presupunem că sistemul a fost rezolvat folosind un<br />

algoritm cu pivotare parţială şi <strong>de</strong>ci că o factorizare PA = LU este disponibilă.<br />

Fie r = b − Aˆx reziduul corespunzător lui ˆx. Dacă notăm e = x − ˆx, atunci<br />

Ae = Ax − Aˆx = b − (b − r) = r. (2.54)<br />

Această egalitate sugerează să rezolvăm sistemul Ae = r, obţinând soluţia ê, şi apoi<br />

să <strong>calcul</strong>ăm o nouă soluţie<br />

ˆx nou = ˆx + ê, (2.55)<br />

sperând că aceasta este mai precisă <strong>de</strong>cât ˆx (dacă nu ar exista erori <strong>numeric</strong>e în<br />

rezolvarea sistemului Ae = r, atunci ê = e, <strong>de</strong>ci ˆx nou = x). Procedura poate fi<br />

repetată pentru noua soluţie, până la atingerea unei acurateţi mulţumitoare sau<br />

până când nu se mai obţine o îmbunătăţire a acesteia. (Nu discutăm aici modalitatea<br />

tehnică <strong>de</strong> estimare a acurateţii soluţiei, care <strong>de</strong>păşeşte nivelul acestei lucrări.)<br />

Aparent, aşa cum rezultă din (2.52), sistemele Ax = b şi Ae = r se rezolvă<br />

cu acurateţi asemănătoare, în esenţă dictate <strong>de</strong> κ ∞ (A), iar adunarea soluţiilor lor<br />

în (2.55) nu ar produce un rezultat mai precis. Se poate însă <strong>de</strong>monstra că, dacă


2.9. SISTEME BANDĂ 105<br />

κ ∞ (A)ε M ≪ 1, atunci schema <strong>de</strong> rafinare iterativă sugerată mai sus conduce (<strong>de</strong><br />

obicei într-un număr foarte mic <strong>de</strong> iteraţii) la soluţia aproximativă ˆx satisfăcând<br />

un<strong>de</strong><br />

‖ˆx − x‖ ∞<br />

‖x‖ ∞<br />

≤ 2n · cond(A, x) · ε M , (2.56)<br />

cond(A, x) <strong>de</strong>f<br />

= ‖ |A−1 | · |A| · |x| ‖ ∞<br />

‖x‖ ∞<br />

, (2.57)<br />

iar |A| este matricea cu elementele |a ij |.<br />

Comparând acum (2.52) şi (2.56) constatăm că în general rafinarea iterativă<br />

conduce într-a<strong>de</strong>văr la îmbunătăţirea acurateţii soluţiei <strong>calcul</strong>ate <strong>de</strong>oarece<br />

cond(A, x) ≤ κ ∞ (A). (2.58)<br />

(Pentru <strong>de</strong>monstrarea acestei inegalităţi vezi problema 2.25.) Creşterea acurateţii<br />

soluţiei este cu atât mai mare cu cât raportul dintre cei doi termeni ai inegalităţii<br />

(2.58) este mai mic.<br />

Rafinarea iterativă dă rezultate şi mai bune dacă se <strong>calcul</strong>ează reziduul r în<br />

dublă precizie (utilizând un format virgulă mobilă cu mai multe cifre semnificative<br />

<strong>de</strong>cât cel utilizat la rezolvarea Ax = b). Mai precis, dacă κ ∞ (A)ε M ≪ 1, atunci prin<br />

rafinare se obţine ‖ˆx − x‖ ∞ / ‖x‖ ∞ ≈ ε M , adică cel mai precis rezultat la care se<br />

poate ajunge în formatul virgulă mobilă <strong>de</strong> lucru. Aceasta concluzie este intuitivă,<br />

<strong>de</strong>oarece în (2.55) ê este <strong>calcul</strong>at mai precis <strong>de</strong>cât ˆx.<br />

Pentru a rezuma, o iteraţie a schemei <strong>de</strong> rafinare are forma (beneficiind <strong>de</strong><br />

factorizarea PA = LU disponibilă)<br />

x nou<br />

1. Se <strong>calcul</strong>ează r = b − Ax (eventual în dublă precizie)<br />

2. Se rezolvă sistemele triunghiulare Ly = Pr, Uz = y<br />

3. x ← x + z<br />

Numărul <strong>de</strong> operaţii este <strong>de</strong> O(n 2 ), <strong>de</strong>ci câteva iteraţii au un cost semnificativ<br />

mai mic <strong>de</strong>cât cel al eliminării gaussiene. Există şi <strong>de</strong>zavantaje: trebuie păstrată o<br />

copie a matricei A pentru <strong>calcul</strong>ul reziduului, iar implementarea <strong>calcul</strong>elor în dublă<br />

precizie poate fi <strong>de</strong>pen<strong>de</strong>ntă <strong>de</strong> maşină (<strong>de</strong>şi standardul IEEE este respectat pe majoritatea<br />

<strong>calcul</strong>atoarelor); <strong>de</strong> aceea, în bibliotecile actuale, <strong>de</strong> exemplu LAPACK, se<br />

utilizează precizia <strong>de</strong> lucru. O analiză <strong>de</strong>taliată a erorilor pentru rafinarea iterativă<br />

poate fi găsită în [IX].<br />

2.9 Sisteme bandă<br />

În această secţiune vom consi<strong>de</strong>ra sisteme Ax = b, în care A ∈ R n×n este o matrice<br />

bandă nesingulară, <strong>de</strong> lăţime inferioară r şi superioară q. Astfel <strong>de</strong> matrice apar<br />

<strong>de</strong>seori în practică, <strong>de</strong> exemplu la soluţionarea <strong>numeric</strong>ă a ecuaţiilor cu <strong>de</strong>rivate<br />

parţiale. Vom ve<strong>de</strong>a în continuare că aplicarea a<strong>de</strong>cvată a procedurii <strong>de</strong> eliminare<br />

gaussiană poate aduce o mare reducere a numărului <strong>de</strong> operaţii, faţă <strong>de</strong> cazul matricelor<br />

oarecare.


106 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

⎡ ⎤<br />

× ×<br />

× × ×<br />

⎢ × × × ×<br />

⎥<br />

⎣ × × × × ⎦<br />

× × ×<br />

k=1<br />

−→<br />

⎡<br />

⎢<br />

⎣<br />

× ×<br />

0 ∗ ×<br />

0 ∗ × ×<br />

⎤<br />

⎥<br />

× × × × ⎦<br />

× × ×<br />

k=2<br />

−→<br />

⎡<br />

⎢<br />

⎣<br />

× ×<br />

× ×<br />

0 ∗ ×<br />

⎤<br />

⎥<br />

0 ∗ × × ⎦<br />

× × ×<br />

k=3<br />

−→ . . .<br />

Fig. 2.8: Eliminarea gaussiană aplicată unei matrice bandă <strong>de</strong> lăţime inferioară 2<br />

şi superioară 1. S-au notat cu ∗ elementele modificate la pasul respectiv, cu 0 cele<br />

anulate, iar cu × cele rămase nemodificate<br />

Teorema 2.9 Dacă eliminarea gaussiană (algoritmul G) este aplicată matricei<br />

A ∈ R n×n bandă <strong>de</strong> lăţime inferioară r şi superioară q, nesingulară şi cu A [k] nesingulare,<br />

k = 1 : n − 1, atunci în egalitatea (2.10) (M n−1 . . . M 1 A = U), matricea U<br />

este superior triunghiulară bandă <strong>de</strong> lăţime q, iar matricele ELT M k = I − m k e T k<br />

sunt caracterizate <strong>de</strong> µ ik = 0, pentru i > k + r (altfel spus, în factorizarea LU<br />

produsă <strong>de</strong> algoritmul G, matricea L este inferior triunghiulară bandă <strong>de</strong> lăţime r).<br />

Pe scurt, în procedura <strong>de</strong> eliminare gaussiană fără pivotare, structura bandă a<br />

matricei A este ereditară, i.e. se transmite ca atare factorilor L, U furnizaţi <strong>de</strong><br />

procedură.<br />

Demonstraţie. Figura 2.8 ilustrează procesul <strong>de</strong> eliminare gaussiană. Deoarece<br />

µ i1 = a i1 /a 11 , rezultă µ i1 = 0 pentru i > 1 + r. În atribuirea A ← M 1 A scrisă<br />

<strong>de</strong>taliat<br />

a ij ← a ij − µ i1 a 1j , pentru i, j = 2 : n,<br />

se observă că a ij rămâne nemodificat pentru i > 1+r (<strong>de</strong>oarece µ i1 = 0) şi j > 1+q<br />

(<strong>de</strong>oarece a 1j = 0). Aşadar, se modifică doar blocul A(2 : 1 + r, 1 : 1 + q) (în prima<br />

coloană sunt introduse zerouri subdiagonale) şi matricea A, inferior triunghiulară<br />

în prima coloană, rămâne bandă <strong>de</strong> lăţime inferioară r şi superioară q.<br />

Procesul continuă analog pentru k = 2, . . .,n−1, la fiecare pas k modificându-se<br />

blocul A(k + 1 : k + r, k : k + q), ceea ce conduce la structura bandă a matricei<br />

U, iar blocul (n − k) × (n − k) dreapta jos păstrându-şi structura bandă, ceea ce<br />

asigură forma enunţată a matricelor ITE.<br />

♦<br />

Algoritmul rezultat este prezentat în continuare.<br />

Algoritmul 2.14 (Gb – Eliminare gaussiană pentru matrice bandă)<br />

(Se dă A ∈ R n×n , bandă <strong>de</strong> lăţime inferioară r şi superioară q, cu A [k]<br />

nesingulare, k = 1 : n −1. Se <strong>calcul</strong>ează matricea superior triunghiulară<br />

U şi matricele ITE M 1 , . . . , M n−1 astfel încât U = M n−1 M n−2 . . . M 1 A.)<br />

1. Pentru k = 1 : n − 1<br />

1. Pentru i = k + 1 : min(k + r, n)<br />

1. a ik ← µ ik = a ik /a kk<br />

2. Pentru i = k + 1 : min(k + r, n)


2.9. SISTEME BANDĂ 107<br />

1. Pentru j = k + 1 : min(k + q, n)<br />

1. a ij ← a ij − µ ik a kj<br />

Lăsăm cititorului <strong>calcul</strong>ul unei formule pentru numărul <strong>de</strong> operaţii; dacă r ≪ n<br />

sau q ≪ n, acesta este ≪ 2n 3 /3.<br />

Triangularizarea matricei A conform algoritmului <strong>de</strong> mai sus permite reducerea<br />

sistemului Ax = b la sistemul echivalent superior triunghiular Ux = d, cu U bandă<br />

<strong>de</strong> lăţime superioară q. Adaptarea UTRIS la acest caz este imediată, elementele<br />

x i <strong>calcul</strong>ându-se prin substituţie înapoi cu formula<br />

⎛<br />

x i = ⎝d i −<br />

min(i+q,n)<br />

∑<br />

j=i+1<br />

u ij x j<br />

⎞<br />

⎠/u ii .<br />

Vom ve<strong>de</strong>a acum ce efect are pivotarea asupra structurii bandă.<br />

Teorema 2.10 Dacă eliminarea gaussiană cu pivotare parţială (algoritmul GPP)<br />

este aplicată matricei A ∈ R n×n bandă <strong>de</strong> lăţime inferioară r şi superioară q, nesingulară,<br />

atunci în egalitatea (2.14) (M n−1 P n−1 . . . M 1 P 1 A = U), matricea U este<br />

superior triunghiulară bandă <strong>de</strong> lăţime q + r, iar matricele ITE M k = I − m k e T k<br />

sunt caracterizate <strong>de</strong> µ ik = 0, pentru i > k + r.<br />

Demonstraţia va fi doar schiţată, procesul <strong>de</strong> eliminare fiind ilustrat cu ajutorul<br />

figurii 2.9. Primul pivot este găsit pe linia i 1 ∈ 1 : 1 + r, restul elementelor din<br />

prima coloană fiind nule. Permutarea liniilor 1 şi i 1 (operaţia A ← P 1 A) va face ca<br />

pe prima linie elementele nenule să fie în coloanele 1 : 1+q+r, în cel mai <strong>de</strong>favorabil<br />

caz (i 1 = 1+r). Evi<strong>de</strong>nt, µ i1 = a i1 /a 11 , <strong>de</strong>ci µ i1 = 0 pentru i > 1+r. În atribuirea<br />

A ← M 1 A scrisă <strong>de</strong>taliat<br />

a ij ← a ij − µ i1 a 1j , pentru i, j = 2 : n,<br />

a ij rămâne nemodificat pentru i > 1 + r (<strong>de</strong>oarece µ i1 = 0) şi j > 1 + q + r<br />

(<strong>de</strong>oarece a 1j = 0). Aşadar se modifică doar blocul A(2 : 1 + r, 1 : 1 + q + r).<br />

Matricea A rămâne bandă <strong>de</strong> lăţime inferioară r; în prima linie, A este bandă <strong>de</strong><br />

lăţime superioară q + r, iar în liniile 1 + r : n bandă <strong>de</strong> lăţime superioară q.<br />

Procesul continuă asemănător pentru k = 2, . . .,n − 1; după A ← P k A, în linia<br />

k rezultă a kj = 0 pentru j > k + q + r; operaţia A ← M k A modifică doar blocul<br />

A(k+1 : k+r, k : k+r+q). În final, U şi matricele ITE M k au structura prezentată<br />

în enunţ.<br />

♦<br />

Observăm că pivotarea parţială conduce la o matrice U superior triunghiulară<br />

bandă <strong>de</strong> lăţime mai mare <strong>de</strong>cât cea a matricei iniţiale A. Mai mult, în factorizarea<br />

rezultată PA = LU, matricea inferior triunghiulară L nu mai este bandă, ca în<br />

lipsa pivotării; ţinând seama <strong>de</strong> teorema 2.6, <strong>de</strong>oarece o coloană a matricei L este<br />

o permutare a vectorului m k (ce <strong>de</strong>fineşte matricea ITE M k = I − m k e T k<br />

), coloana<br />

respectivă are doar r elemente nediagonale nenule, dar în poziţii ce diferă <strong>de</strong> la caz<br />

la caz.<br />

Prezentăm mai jos algoritmul sugerat <strong>de</strong> <strong>de</strong>monstraţia teoremei 2.10.


108 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

⎡<br />

× ×<br />

× × ×<br />

⎢<br />

⎣<br />

× × × ×<br />

× × × ×<br />

× × × ×<br />

× × ×<br />

⎡<br />

P<br />

−→<br />

2<br />

⎢<br />

⎢<br />

⎣<br />

⎤ ⎡<br />

∗ ∗ ∗ ∗<br />

P 1<br />

−→ ⎥ ⎢<br />

⎦ ⎣<br />

× × × ×<br />

∗ ∗ ∗ ∗<br />

× × ×<br />

∗ ∗ ∗<br />

× × ×<br />

∗ ∗<br />

× × × ×<br />

⎤ ⎡<br />

M 2<br />

−→ ⎥ ⎢<br />

× × × × ⎦ ⎣<br />

× × ×<br />

× × × ×<br />

× × ×<br />

⎤ ⎡<br />

M 1<br />

−→ ⎥ ⎢<br />

⎦ ⎣<br />

× × × ×<br />

× × × ×<br />

0 ∗ ∗ ∗<br />

0 ∗ ∗ ∗<br />

⎥<br />

× × × × ⎦<br />

× × ×<br />

× × × ×<br />

0 ∗ ∗ ∗<br />

0 ∗ ∗ ∗<br />

× × × ×<br />

⎤<br />

× × × ×<br />

× × ×<br />

P 3<br />

−→ . . .<br />

Fig. 2.9: Eliminarea gaussiană cu pivotare parţială aplicată unei matrice bandă<br />

<strong>de</strong> lăţime inferioară 2 şi superioară 1. S-a presupus că la pasul k se efectuează<br />

permutarea liniilor k (curentă) şi k + 2 (cea mai <strong>de</strong>părtată posibil <strong>de</strong> cea curentă)<br />

⎤<br />

⎥<br />

⎦<br />

Algoritmul 2.15 (GPPb – Eliminare gaussiană cu pivotare parţială<br />

pentru matrice bandă) (Se dă A ∈ R n×n , bandă <strong>de</strong> lăţime inferioară<br />

r şi superioară q, nesingulară. Se <strong>calcul</strong>ează matricea superior<br />

triunghiulară U, matricele ITE M 1 , . . . , M n−1 (memorate peste A)<br />

şi matricele PE P 1 , . . . , P n−1 (memorate în vectorul p), astfel încât<br />

U = M n−1 P n−1 . . . M 1 P 1 A.)<br />

1. Pentru k = 1 : n − 1<br />

1. r 1 = min(k + r, n), q 1 = min(k + q + r, n)<br />

2. Se <strong>de</strong>termină i k ∈ k : r 1 astfel încât |a ik k| = max i=k:r1 |a ik |<br />

3. p(k) ← i k<br />

4. Pentru j = k : q 1<br />

1. a kj ↔ a ik j<br />

5. Pentru i = k + 1 : r 1<br />

1. a ik ← µ ik = a ik /a kk<br />

6. Pentru i = k + 1 : r 1<br />

1. Pentru j = k + 1 : q 1<br />

1. a ij ← a ij − µ ik a kj<br />

Comentarii. Numărul <strong>de</strong> operaţii este mai mare <strong>de</strong>cât pentru algoritmul 2.14,<br />

dar, dacă r ≪ n sau q ≪ n, acesta este totuşi ≪ 2n 3 /3.<br />

♦<br />

Lăsăm cititorului problema scrierii unui algoritm eficient <strong>de</strong> rezolvare a sistemului<br />

Ax = b, atunci când A are structură bandă, utilizând algoritmul 2.15.<br />

În final, precizăm că pivotarea completă distruge structura bandă şi <strong>de</strong>ci nu este<br />

recomandată în acest caz.


2.10. SISTEME SIMETRICE 109<br />

Factorizarea Crout aplicată unei matrice A ∈ R n×n bandă <strong>de</strong> lăţime inferioară<br />

r şi superioară q are proprietăţi similare cu cele ale eliminării gaussiane; cititorul<br />

este invitat să <strong>de</strong>monstreze afirmaţiile următoare.<br />

Algoritmul CROUT produce o matrice L inferior triunghiulară bandă <strong>de</strong> lăţime<br />

r şi o matrice U superior triunghiulară (unitate) bandă <strong>de</strong> lăţime q.<br />

Algoritmul CROUTP (cu pivotare parţială) produce o matrice L inferior triunghiulară<br />

şi o matrice U superior triunghiulară (unitate) bandă <strong>de</strong> lăţime q + r.<br />

În plus, fiecare coloană a matricei L are cel mult r elemente nediagonale nenule.<br />

2.10 Sisteme simetrice<br />

Ne ocupăm în această secţiune <strong>de</strong> rezolvarea sistemului Ax = b, cu A inversabilă<br />

şi simetrică, în general <strong>de</strong> semn ne<strong>de</strong>finit. Nucleul rezolvării sistemului este factorizarea<br />

matricei A, chiar dacă eventual ea nu se face explicit. Presupunând că<br />

matricea A are factorizare LDU, <strong>de</strong>oarece A = A T şi factorizarea este unică (în<br />

condiţiile teoremei 2.4), rezultă imediat că U = L T . Se pune întrebarea cum putem<br />

profita <strong>de</strong> simetrie pentru a reduce numărul operaţiilor <strong>de</strong> la 2n 3 /3 (cazul general)<br />

la, sperăm, jumătate, adică n 3 /3.<br />

Dificultăţile problemei. Aplicarea ca atare a procedurii <strong>de</strong> eliminare gaussiană<br />

(algoritmul G) pare a avea inconvenientul major <strong>de</strong> a distruge simetria matricei<br />

A. Să explicităm primul pas al eliminării gaussiene; se <strong>calcul</strong>ează A ← M 1 A,<br />

un<strong>de</strong> M 1 = I − m 1 e T 1 este matricea ITE pentru care (M 1A) i1 = 0, i ∈ 2 : n. Matricea<br />

M 1 A nu este simetrică: prima coloană are elementele subdiagonale nule, în<br />

schimb prima linie are elemente în general nenule. Totuşi submatricea (M 1 A) 2:n,2:n<br />

este simetrică, ceea ce se observă şi <strong>de</strong>taliind instrucţiunea 1.2.1.1 din algoritmul G<br />

(cu k = 1), adică,<br />

a ij ← a ij − a i1 a 1j /a 11<br />

care se aplică i<strong>de</strong>ntic şi elementului a ji = a ij<br />

a ji ← a ji − a j1 a 1i /a 11 = a ij − a i1 a 1j /a 11 .<br />

Aşadar nu este necesară modificarea tuturor elementelor matricei, ci doar a celor din<br />

(să zicem) triunghiul inferior; numărul <strong>de</strong> operaţii se reduce astfel la aproximativ<br />

jumătate.<br />

Pentru a păstra simetria sunt necesare transformări <strong>de</strong> congruenţă, adică se<br />

aplică transformările ITE <strong>de</strong> ambele părţi ale matricei A. Primul pas al eliminării<br />

gaussiene (modificate) va fi acum A ← M 1 AM T 1 = M 1A − (M 1 A)e 1 m T 1 ; <strong>de</strong>oarece<br />

(M 1 A)e 1 = a 11 e 1 , se observă că înmulţirea la dreapta cu M T 1 , adică (M 1 A)M T 1 ,<br />

nu afectează <strong>de</strong>cât prima linie a matricei M 1 A (i<strong>de</strong>ntică cu prima linie a matricei<br />

A), anume introducând zerouri în toate poziţiile din dreapta diagonalei. Aşadar,<br />

din punctul <strong>de</strong> ve<strong>de</strong>re al implementării, înmulţirea la dreapta cu M T 1 nu necesită<br />

<strong>calcul</strong>e.<br />

Continuând analog pentru celelalte coloane, se obţine echivalentul relaţiei (2.10)<br />

în cazul simetric<br />

D <strong>de</strong>f<br />

= M n−1 . . . M 2 M 1 AM T 1 M T 2 . . . M T n−1, (2.59)


110 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

un<strong>de</strong> D este evi<strong>de</strong>nt o matrice diagonală.<br />

Modificând algoritmul G astfel încât să se acceseze doar triunghiul inferior al<br />

matricei A, se obţine factorizarea A = LDL T , cu L = M1 −1 M 2 −1 . . . Mn−1 −1 inferior<br />

triunghiulară unitate şi D memorate peste A:<br />

LDL T 1. Pentru k = 1 : n − 1<br />

1. Pentru i = k + 1 : n<br />

1. t i ← a ik<br />

2. a ik ← a ik /a kk<br />

2. Pentru j = k + 1 : n<br />

1. Pentru i = j : n<br />

1. a ij ← a ij − a ik t j<br />

Vectorul auxiliar t se foloseşte pentru salvarea elementelor coloanei curente k,<br />

egale cu cele <strong>de</strong> pe linia k în triunghiul superior, pe poziţiile cărora se memorează<br />

multiplicatorii.<br />

Ca şi în cazul general, chiar dacă A este inversabilă, se pot obţine pivoţi nuli<br />

dacă <strong>de</strong>t(A [k] ) = 0 pentru un k ∈ 1 : n −1. Un exemplu evi<strong>de</strong>nt este A =<br />

[ 0 1<br />

1 0<br />

În plus, algoritmul este <strong>numeric</strong> instabil. De aceea se impune pivotarea.<br />

Din păcate, strategiile <strong>de</strong> pivotare (parţială sau completă) propuse anterior pentru<br />

eliminarea gaussiană distrug simetria. O primă i<strong>de</strong>e ar fi <strong>de</strong> a aplica permutările<br />

elementare <strong>de</strong> ambele părţi ale matricei A, aşa cum am procedat şi cu transformările<br />

ITE; <strong>de</strong> exemplu, la primul pas, să se <strong>calcul</strong>eze A ← P 1 AP T 1 . O astfel <strong>de</strong> permutare<br />

nu poate aduce pe poziţia pivotului <strong>de</strong>cât unul dintre elementele diagonale; exemplul<br />

<strong>de</strong> mai sus dove<strong>de</strong>şte că această strategie poate da greş în situaţii banale.<br />

Factorizarea cvasi-diagonală. Păstrarea simetriei trebuie <strong>de</strong>ci îmbinată cu<br />

participarea la pivotare a elementelor nediagonale. O posibilitate <strong>de</strong> realizare a<br />

acestui compromis este <strong>de</strong> a <strong>calcul</strong>a o factorizare LDL T <strong>de</strong> un tip special, în care<br />

matricea D este cvasi-diagonală 2 .<br />

Teorema 2.11 Fie A ∈ R n×n o matrice inversabilă şi simetrică. Atunci există<br />

o matrice inferior triunghiulară unitate L ∈ R n×n , o matrice cvasi-diagonală<br />

D ∈ R n×n cu blocuri diagonale <strong>de</strong> dimensiune 1 × 1 sau 2 × 2, şi o matrice <strong>de</strong><br />

permutare P ∈ R n×n astfel încât<br />

PAP T = LDL T . (2.60)<br />

Desigur, matricea D este inversabilă. Expresia <strong>de</strong> mai sus este numită factorizare<br />

cvasi-diagonală a matricei A.<br />

Demonstraţia este constructivă. Vom <strong>de</strong>scrie modul <strong>de</strong> <strong>calcul</strong> al factorizării cvasidiagonale<br />

fără a preciza strategia <strong>de</strong> permutare mai mult <strong>de</strong>cât este matematic<br />

necesar <strong>de</strong>monstraţiei. Desigur, într-un algoritm <strong>de</strong> <strong>calcul</strong> efectiv matricea <strong>de</strong> permutare<br />

P va fi construită pornind <strong>de</strong> la consi<strong>de</strong>rente <strong>de</strong> stabilitate <strong>numeric</strong>ă.<br />

2 O i<strong>de</strong>e alternativă, <strong>de</strong>scrisă în [], este <strong>de</strong> a lua D tridiagonală.<br />

]<br />

.


2.10. SISTEME SIMETRICE 111<br />

Primul pas al procedurii <strong>de</strong> factorizare se aplică matricei<br />

[ ]<br />

P 1 AP1 T E C = T<br />

, (2.61)<br />

C B<br />

un<strong>de</strong> E este un bloc s × s, cu s = 1 sau s = 2, iar P 1 o matrice <strong>de</strong> permutare,<br />

eventual elementară. Demonstrăm acum că dacă A este inversabilă, atunci există<br />

P 1 astfel încât E să fie inversabil; <strong>de</strong> exemplu, dacă a 11 ≠ 0, se poate lua s = 1,<br />

P 1 = I; dacă a 11 = 0, există a 1j ≠ 0, altfel prima coloană a matricei A este nulă,<br />

<strong>de</strong>ci A este singulară; în acest caz, cu s = 2 şi P 1 permutând liniile 2 şi j se obţine<br />

<strong>de</strong>t(E) = −a 2 1j ≠ 0.<br />

Pentru a <strong>de</strong>termina primele s coloane ale factorilor L şi D, se utilizează o relaţie<br />

asemănătoare cu (2.31):<br />

[ ][ ] [ ]<br />

P 1 AP1 T = I s 0 E 0 Is E −1 C T<br />

CE −1 I n−s 0 B − CE −1 C T (2.62)<br />

0 I n−s<br />

Dacă s = 1, <strong>calcul</strong>ul factorizării (2.62) este efectuat <strong>de</strong> schema LDL T . Dacă<br />

s = 2, atunci CE −1 se poate <strong>calcul</strong>a folosind eliminarea gaussiană cu pivotare (vezi<br />

problema 2.30) sau chiar — variantă pe care o adoptăm aici pentru simplitate —<br />

<strong>calcul</strong>ând direct<br />

E −1 =<br />

1<br />

<strong>de</strong>t(E)<br />

[<br />

]<br />

e 22 −e 21<br />

−e 21 e 11<br />

(2.63)<br />

şi apoi înmulţind C şi E −1 ; evi<strong>de</strong>nt, blocul B −CE −1 C T se <strong>calcul</strong>ează acum banal,<br />

printr-un produs şi o adunare <strong>matriceal</strong>e, dar numai în partea sa inferior triunghiulară,<br />

<strong>de</strong>oarece este simetric.<br />

Procedura continuă i<strong>de</strong>ntic pentru matricea B − CE −1 C T <strong>de</strong> dimensiune<br />

(n − s) × (n − s), şi aşa mai <strong>de</strong>parte până la obţinerea factorizării cvasi-diagonale<br />

(2.60). ♦<br />

Algoritmul corespunzător este prezentat în continuare. Se ve<strong>de</strong> uşor că procedura<br />

se poate executa pe loc în A; totuşi, la fel ca în schema LDL T , e necesară<br />

alocarea unui spaţiu suplimentar pentru salvarea temporară, acum într-o matrice<br />

T ∈ R n×2 , a elementelor coloanei (coloanelor, dacă s = 2) curente.<br />

Algoritmul 2.16 (FCD – Factorizare cvasi-diagonală) (Se dă<br />

A ∈ R n×n simetrică şi inversabilă. Se <strong>calcul</strong>ează matricea inferior triunghiulară<br />

unitate L, matricea D ∈ R n×n cvasi-diagonală, cu blocuri <strong>de</strong><br />

dimensiune 1 × 1 sau 2 × 2, şi matricea <strong>de</strong> permutare P ∈ R n×n astfel<br />

încât relaţia (2.60) să fie satisfăcută. Matricele L şi D se memorează<br />

peste A. Modul <strong>de</strong> <strong>calcul</strong> al lui P nu este <strong>de</strong>taliat.)<br />

0. k ← 1<br />

1. C^at timp k < n<br />

1. Se <strong>de</strong>termină P k şi s.<br />

2. Se efectuează permutarea (simetrică) A ← P k AP T k<br />

3. Dacă s = 1 atunci<br />

1. Pentru i = k + 1 : n<br />

1. t i1 ← a ik


112 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

2. a ik ← a ik /a kk<br />

altfel [ ]<br />

[ ]<br />

e11 ·<br />

1 ak+1,k+1 ·<br />

2.<br />

←<br />

e 21 e a 22 kk a k+1,k+1 −a 2 k+1,k −a k+1,k a kk<br />

3. Pentru i = k + 2 : n<br />

1. t i1 ← a ik , t i2 ← a i,k+1<br />

2. a ik ← a ik e 11 + a i,k+1 e 21<br />

3. a i,k+1 ← t i1 e 21 + a i,k+1 e 22<br />

4. Pentru j = k + s : n<br />

1. Pentru i = j : n<br />

1. Dacă s = 1 atunci<br />

1. a ij ← a ij − a ik t j1<br />

altfel<br />

2. a ij ← a ij − a ik t j1 − a i,k+1 t j2<br />

5. k ← k + s<br />

Comentarii. Numărul <strong>de</strong> operaţii este <strong>de</strong> ordinul n 3 /3 flopi, iar memoria ocupată<br />

<strong>de</strong> n(n + 1)/2 + 2n.<br />

♦<br />

Strategii <strong>de</strong> pivotare. Vom prezenta în continuare două strategii <strong>de</strong> alegere<br />

a permutărilor, completând astfel algoritmul FCD cu <strong>de</strong>talierea instrucţiunii 1.1.<br />

Ne vom limita la <strong>de</strong>scrierea primei etape din procedura <strong>de</strong> factorizare. Prin extensie<br />

<strong>de</strong> terminologie, numim pivot blocul E din (2.61) şi pivotare permutarea din<br />

instrucţiunea 1.2.<br />

Pivotare completă. Spre <strong>de</strong>osebire <strong>de</strong> eliminarea gaussiană, la procedura <strong>de</strong><br />

factorizare cvasi-diagonală pivotarea completă se poate <strong>de</strong>scrie mai uşor <strong>de</strong>cât cea<br />

parţială. Matricea P 1 şi întregul s sunt alese conform următoarei scheme []:<br />

FCDPC 1 1. Se alege α ∈ (0, 1)<br />

2. µ 0 = max i,j |a ij |, µ 1 = max i |a ii |<br />

3. Dacă µ 1 ≥ αµ 0 atunci<br />

1. s = 1, se alege P 1 astfel încât în (2.61) |e 11 | = µ 1<br />

altfel<br />

2. s = 2, se alege P 1 astfel încât în (2.61) |e 21 | = µ 0<br />

I<strong>de</strong>ea este <strong>de</strong> a alege un pivot 1 × 1 dacă există un element diagonal suficient<br />

<strong>de</strong> mare în raport cu elementul <strong>de</strong> modul maxim µ 0 (<strong>de</strong>păşind un prag dictat <strong>de</strong><br />

constanta α). Altfel pivotul este<br />

E =<br />

[ ]<br />

a11 a r1<br />

, un<strong>de</strong> |a<br />

a r1 a r1 | = µ 0 . (2.64)<br />

rr<br />

Notând à = B − CE−1 C T , se poate <strong>de</strong>monstra că (vezi problema 2.31):<br />

{ (<br />

1 +<br />

1<br />

α)<br />

µ0 , dacă s = 1,<br />

|ã ij | ≤<br />

( )<br />

1 + 2<br />

1−α<br />

µ 0 , dacă s = 2.<br />

(2.65)


2.10. SISTEME SIMETRICE 113<br />

Constanta α se <strong>de</strong>termină impunând condiţia ( ) ( )<br />

1 + 1 2<br />

α = 1 + 2<br />

1−α<br />

, ceea ce<br />

va conduce la factori <strong>de</strong> creştere (vezi secţiunea 2.8) asemănători indiferent <strong>de</strong> dimensiunile<br />

pivoţilor. Se obţine α = (1 + √ 17)/8 ≈ 0.64.<br />

Această strategie <strong>de</strong> pivotare face ca algoritmul FCD să fie <strong>numeric</strong> stabil.<br />

O analiză inversă a erorilor conduce la o margine similară cu cea din (2.50), cu<br />

γ ≤ 3n ·[2 1 ·3 1/2 ·4 1/3 ·. . . ·n 1/(n−1) ] 1/2 ; această margine pentru factorul <strong>de</strong> creştere<br />

γ este puţin mai mare <strong>de</strong>cât cea pentru eliminarea gaussiană cu pivotare completă<br />

(algoritmul GPC).<br />

Costul pivotării complete este <strong>de</strong> O(n 3 ) comparaţii, la fel ca pentru algoritmul<br />

GPC, ceea ce constituie un efort <strong>de</strong> <strong>calcul</strong> important. De aceea este interesantă<br />

găsirea unei strategii <strong>de</strong> pivotare parţială.<br />

Pivotare parţială. Se poate <strong>de</strong>monstra că alegerea pivotului căutând pe o singură<br />

coloană (şi eventual pe diagonală) nu poate avea succes. Surprinzător, căutând<br />

pe două coloane se poate <strong>de</strong>scrie o strategie <strong>de</strong> pivotare parţială eficientă (vezi []),<br />

<strong>de</strong>taliată <strong>de</strong> schema (ne ocupăm din nou doar <strong>de</strong> primul pas al factorizării):<br />

FCDPP 1 1. Se alege α ∈ (0, 1)<br />

2. λ = max i=2:n |a i1 | (şi |a r1 | = λ)<br />

3. Dacă |a 11 | ≥ αλ atunci<br />

1. s = 1, P 1 = I<br />

altfel<br />

2. σ = max i=1:n, i̸=r |a ir |<br />

3. Dacă |a 11 |σ ≥ αλ 2 atunci<br />

1. s = 1, P 1 = I<br />

altfel dacă |a rr | ≥ ασ atunci<br />

2. s = 1, se alege P 1 astfel încât în (2.61) e 11 = a rr<br />

altfel<br />

3. s = 2, se alege P 1 astfel încât în (2.61) |e 21 | = λ<br />

Pentru a înţelege i<strong>de</strong>ea pivotării, este util a consi<strong>de</strong>ra matricea<br />

⎡<br />

a 11 . . . λ . . . . . . . . .<br />

. .<br />

λ . . . a rr . . . σ . . .<br />

. .<br />

. .<br />

⎢<br />

⎣ . σ<br />

.<br />

.<br />

[ ]<br />

a11 a<br />

şi a observa că pivotul este a 11 sau a rr când s = 1, sau r1<br />

când s = 2.<br />

a r1 a rr<br />

Se poate <strong>de</strong>monstra că relaţia (2.65) rămâne în continuare a<strong>de</strong>vărată, <strong>de</strong>ci se va<br />

alege aceeaşi valoare pentru α. Factorul <strong>de</strong> creştere din (2.50) va fi acum limitat <strong>de</strong><br />

γ ≤ (1 + 1/α) n−1 ≈ (2.57) n−1 , o margine ceva mai largă <strong>de</strong>cât pentru algoritmul<br />

GPP. În practică, algoritmul <strong>de</strong> factorizare cvasi-diagonală cu pivotare parţială<br />

⎤<br />

⎥<br />


114 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

are o stabilitate <strong>numeric</strong>ă satisfăcătoare. Cum numărul <strong>de</strong> comparaţii este redus<br />

acum la O(n 2 ), pivotarea parţială este <strong>de</strong> obicei preferată celei complete (la fel ca<br />

la eliminarea gaussiană).<br />

Utilizarea factorizării cvasi-diagonale. Factorizarea (2.60) poate fi folosită<br />

în modul cel mai simplu pentru rezolvarea sistemelor liniare, redusă la rezolvarea<br />

a două sisteme triunghiulare şi a unuia cvasi-diagonal; lăsăm cititorului <strong>de</strong>taliile <strong>de</strong><br />

implementare.<br />

De asemenea, (2.60) se poate utiliza pentru <strong>calcul</strong>ul inversei matricei A, ţinând<br />

seama că<br />

A −1 = P T L −T D −1 L −1 P.<br />

Remarcăm faptul că şi matricea A −1 este simetrică.<br />

Cazul complex. În cazul în care A ∈ Cn×n este hermitică (A = A H ), factorizarea<br />

sa cvasi-diagonală are forma (analoagă cu (2.60))<br />

PAP T = LDL H ,<br />

un<strong>de</strong> P este o matrice <strong>de</strong> permutare, L ∈ C n×n este inferior triunghiulară unitate,<br />

iar D ∈ C n×n este bloc diagonală (cu blocuri 1 × 1 sau 2 × 2) şi hermitică.<br />

Algoritmul FCD îşi păstrează forma generală; trebuie luat însă în consi<strong>de</strong>rare<br />

faptul că în cazul complex transpunerea este însoţită şi <strong>de</strong> conjugare. De exemplu,<br />

(2.61) <strong>de</strong>vine<br />

[ ]<br />

P 1 AP1 T E C = H<br />

, (2.66)<br />

C B<br />

iar E este hermitică, adică, în cazul 2 × 2,<br />

[ ]<br />

e11 ē<br />

E = 21<br />

.<br />

e 21 e 22<br />

Instrucţiunile algoritmului FCD se modifică corespunzător, <strong>de</strong> exemplu 1.4.1.1.1<br />

are forma a ij ← a ij − a ik ā jk .<br />

2.11 Sisteme simetrice pozitiv <strong>de</strong>finite<br />

Consi<strong>de</strong>răm acum sistemul Ax = b, un<strong>de</strong> matricea A ∈ R n×n este simetrică şi<br />

pozitiv <strong>de</strong>finită. I<strong>de</strong>ea <strong>de</strong> bază a rezolvării lui este dată <strong>de</strong> teorema următoare.<br />

Teorema 2.12 Pentru orice matrice simetrică şi pozitiv <strong>de</strong>finită A ∈ R n×n , există<br />

o unică matrice inferior triunghiulară L ∈ R n×n , cu elemente diagonale pozitive,<br />

astfel încât<br />

A = LL T , (2.67)<br />

expresie care este numită factorizare Cholesky (iar L este numit factorul Cholesky<br />

al matricei A). Reciproc, dacă factorizarea Cholesky există, atunci A este pozitiv<br />

<strong>de</strong>finită.


2.11. SISTEME SIMETRICE POZITIV DEFINITE 115<br />

Evi<strong>de</strong>nt, (2.67) se poate scrie sub forma A = R T R, un<strong>de</strong> R = L T este superior<br />

triunghiulară. De asemenea, factorizările A = L T L, respectiv A = RR T , se numesc<br />

tot Cholesky.<br />

Demonstraţie. Deoarece A este pozitiv <strong>de</strong>finită atunci, conform propoziţiei 1.3,<br />

submatricele li<strong>de</strong>r principale A [k] , k = 1 : n − 1, sunt pozitiv <strong>de</strong>finite, <strong>de</strong>ci nesingulare.<br />

Atunci A are o unică factorizare LDU (vezi teorema 2.4), A = L ′ DU ′ şi, din<br />

motive <strong>de</strong> simetrie, U ′ = (L ′ ) T . Dar A şi D sunt congruente, <strong>de</strong>ci D este pozitiv<br />

<strong>de</strong>finită, adică d ii > 0, i = 1 : n. Fie F ∈ R n×n matricea diagonală <strong>de</strong>finită <strong>de</strong><br />

f ii = √ d ii , i = 1 : n. Notând L = L ′ F, prima parte a teoremei este <strong>de</strong>monstrată<br />

(l ii = √ d ii , i = 1 : n).<br />

Reciproca este evi<strong>de</strong>ntă; fie x ∈ R n nenul, altfel arbitrar; atunci avem x T Ax =<br />

x T LL T x = ‖L T x‖ 2 2 > 0 (<strong>de</strong>oarece L este nesingulară, LT x ≠ 0).<br />

♦<br />

Există mai mulţi <strong>algoritmi</strong> pentru <strong>calcul</strong>ul factorizării Cholesky a unei matrice<br />

pozitiv <strong>de</strong>finite, care diferă doar prin ordinea <strong>de</strong> efectuare a <strong>calcul</strong>elor. Vom <strong>de</strong>duce<br />

aici o procedură <strong>de</strong> factorizare compactă, similară cu cea folosită la <strong>calcul</strong>ul factorizării<br />

Crout, în care elementele factorului Cholesky L sunt <strong>calcul</strong>ate în ordinea<br />

(crescătoare a) coloanelor. Din i<strong>de</strong>ntitatea A = LL T (doar triunghiul inferior stâng<br />

al lui A este reprezentat, <strong>de</strong>oarece A este simetrică)<br />

⎡<br />

⎤ ⎡<br />

⎤ ⎡<br />

⎤<br />

a 11<br />

l 11<br />

l 11 . . . l k1 . . . l n1<br />

. . ..<br />

. . .. 0<br />

. .. . .<br />

a k1 . . . a kk<br />

=<br />

l k1 . . . l kk<br />

l kk . . . l nk<br />

⎢<br />

⎣<br />

. ⎥ ⎢<br />

. . .. ⎦ ⎣<br />

. ⎥ ⎢<br />

. . .. ⎦ ⎣<br />

. ⎥<br />

0 .. . ⎦<br />

a n1 . . . a nk . . . a nn l n1 . . . l nk . . . l nn l nn<br />

obţinem pentru prima coloană:<br />

a 11 = l 2 11 ⇒ l 11 = √ a 11 ,<br />

a i1 = l i1 l 11 ⇒ l i1 = a i1 / l 11 , i = 2 : n,<br />

(2.68)<br />

şi <strong>de</strong>ci procesul <strong>de</strong> <strong>calcul</strong> poate fi iniţiat.<br />

Acum, presupunând că primele k−1 coloane din L au fost <strong>calcul</strong>ate, i<strong>de</strong>ntificarea<br />

elementului din poziţia (k, k) în A = LL T furnizează<br />

k−1<br />

∑<br />

a kk = lkj 2 + l2 kk , (2.69)<br />

j=1<br />

în care singura necunoscută este l kk . Conform teoremei 2.12, dacă A este pozitiv<br />

<strong>de</strong>finită, atunci există un unic l kk pozitiv astfel încât (2.69) să aibă loc. Atunci,<br />

şi<br />

k−1<br />

∑<br />

a kk − lkj 2 > 0 (2.70)<br />

j=1<br />

k−1<br />

∑<br />

l kk = √ akk − lkj 2 . (2.71)<br />

j=1


116 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

De asemenea,<br />

k−1<br />

∑<br />

a ik = l ij l kj + l ik l kk , i = k + 1 : n,<br />

j=1<br />

în care, în ordinea <strong>de</strong> <strong>calcul</strong> consi<strong>de</strong>rată, singura necunoscută este l ik . Aşadar<br />

⎛ ⎞<br />

k−1<br />

∑<br />

l ik = ⎝a ik − l ij l kj<br />

⎠ / l kk , i = k + 1 : n. (2.72)<br />

j=1<br />

Formulele (2.68), (2.71) şi (2.72) <strong>de</strong>finesc algoritmul <strong>de</strong> mai jos; pentru concizie,<br />

am inclus şi primul pas în bucla <strong>de</strong> parcurgere a coloanelor. Totodată, acest algoritm<br />

este cel mai bun mijloc <strong>de</strong> testare a pozitivităţii unei matrice; testul se bazează pe<br />

faptul că factorizarea Cholesky a unei matrice poate fi <strong>calcul</strong>ată dacă şi numai<br />

dacă matricea este pozitiv <strong>de</strong>finită (teorema 2.12); aşadar, dacă termenul stâng al<br />

inegalităţii (2.70) nu este pozitiv, atunci matricea A nu este pozitiv <strong>de</strong>finită.<br />

Algoritmul 2.17 (CHOL – factorizare Cholesky) (Se dă A ∈ R n×n<br />

simetrică. Se stabileşte dacă A este pozitiv <strong>de</strong>finită şi, în acest caz,<br />

se scrie peste triunghiul inferior al lui A matricea L din factorizarea<br />

Cholesky A = LL T .)<br />

1. Pentru k = 1 : n<br />

1. α ← a kk − ∑ k−1<br />

j=1 l2 kj<br />

2. Dacă α ≤ 0 atunci<br />

1. Tipăreşte ’A nu este pozitiv <strong>de</strong>finită’<br />

2. Stop<br />

3. a kk ← l kk = √ α<br />

4. Pentru i = k + 1 : n<br />

1. a ik ← l ik =<br />

(<br />

a ik − ∑ k−1<br />

j=1 l ijl kj<br />

)<br />

/ l kk<br />

Comentarii. În mod evi<strong>de</strong>nt, instrucţiunea 1.4.1 reprezintă o operaţie DOT. O<br />

altă ordonare a <strong>calcul</strong>elor, care, în variantă vectorială, conduce la operaţii Saxpy,<br />

este propusă în problema 2.33. Tot ca exerciţiu pentru cititor (problema 2.34)<br />

este lăsată varianta la nivel <strong>de</strong> bloc a factorizării Cholesky, foarte asemănătoare<br />

<strong>algoritmi</strong>lor <strong>de</strong> factorizare LU la nivel <strong>de</strong> bloc, prezentaţi în secţiunea 2.4.<br />

Algoritmul CHOL necesită aproximativ N CHOL = n 3 /3 flopi şi, în plus, <strong>calcul</strong>ul<br />

a n rădăcini pătrate (care e neglijabil). Memoria necesară este <strong>de</strong> aproximativ<br />

M CHOL = n 2 /2.<br />

Algoritmul este <strong>numeric</strong> stabil; dacă ˆL reprezintă factorul Cholesky <strong>calcul</strong>at,<br />

atunci ˆLˆL T = A+E, un<strong>de</strong> perturbaţia E satisface limita (2.50) pentru γ = 1; <strong>de</strong>ci,<br />

stabilitatea este mai bună <strong>de</strong>cât a eliminării gaussiene cu pivotare completă. ♦<br />

Desigur, sistemul liniar Ax = b, cu A pozitiv <strong>de</strong>finită se <strong>calcul</strong>ează cu schema<br />

Ch<br />

1. Se factorizează A = LL T cu algoritmul CHOL<br />

2. Se rezolvă sistemul inferior triunghiular Ly = b<br />

3. Se rezolvă sistemul superior triunghiular L T x = y


2.12. RUTINE LAPACK ŞI MATLAB 117<br />

efectuându-se <strong>de</strong> două ori mai puţine operaţii <strong>de</strong>cât dacă s-ar aplica algoritmul <strong>de</strong><br />

eliminare gaussiană.<br />

În privinţa condiţionării, problema rezolvării sistemului pozitiv <strong>de</strong>finit Ax = b<br />

satisface inegalitatea (2.47).<br />

Inversa (care este tot simetrică şi pozitiv <strong>de</strong>finită) şi <strong>de</strong>terminantul unei matrice<br />

simetrice pozitiv <strong>de</strong>finite se <strong>calcul</strong>ează adaptând i<strong>de</strong>ile din secţiunea 2.6 la contextul<br />

factorizării Cholesky A = LL T .<br />

Matrice bandă. Dacă A ∈ R n×n este o matrice simetrică, pozitiv <strong>de</strong>finită<br />

şi bandă <strong>de</strong> lăţime r, atunci factorul Cholesky este inferior triunghiular bandă <strong>de</strong><br />

lăţime r. Aceasta se poate observa cu uşurinţă din relaţia (2.72), în care un element<br />

l ik <strong>de</strong>pin<strong>de</strong> <strong>de</strong> valorile l ij aflate la stânga sa pe linia i (i.e. j < k); aşadar, l i1 = a i1 ,<br />

<strong>de</strong>ci în prima coloană se moşteneşte structura matricei A; dacă, pentru un indice<br />

<strong>de</strong> coloană s, avem l ij = 0 pentru j = 1 : s − 1, atunci este evi<strong>de</strong>nt că l is = a is /l ss ,<br />

<strong>de</strong>ci structura se moşteneşte şi în coloana s. În concluzie, linia i are, în porţiunea<br />

subdiagonală, aceeaşi structură în A şi L.<br />

Adaptarea algoritmului CHOL la cazul matricelor bandă este un exerciţiu relativ<br />

simplu pe care îl lăsăm cititorului (vezi problema 2.36).<br />

Cazul complex. Dacă matricea A ∈ C n×n este hermitică şi pozitiv <strong>de</strong>finită,<br />

atunci factorizarea sa Cholesky este unică şi are forma<br />

A = LL H ,<br />

un<strong>de</strong> L ∈ C n×n este inferior triunghiulară, cu elementele diagonale reale şi pozitive<br />

(şi A are elementele diagonale reale, fiind hermitică, şi pozitive, fiind pozitiv<br />

<strong>de</strong>finită). Factorul Cholesky se poate <strong>calcul</strong>a cu algoritmul CHOL uşor modificat,<br />

<strong>de</strong>oarece (2.71) şi (2.72) se transformă în<br />

k−1<br />

∑<br />

l kk = √ akk − l kj l kj , (2.73)<br />

j=1<br />

respectiv<br />

⎛ ⎞<br />

k−1<br />

∑<br />

l ik = ⎝a ik − l ij l kj<br />

⎠ / l kk , i = k + 1 : n. (2.74)<br />

j=1<br />

2.12 Rutine LAPACK şi MATLAB<br />

Prezentăm pe scurt în continuare rutinele din biblioteca LAPACK şi instrucţiunile<br />

sau funcţiile limbajului MATLAB care rezolvă problemele tratate în acest capitol.<br />

LAPACK (Linear Algebra PACKage) [XV] este o bibliotecă <strong>de</strong> rutine scrise<br />

iniţial în FORTRAN dar apelabile din mai multe limbaje <strong>de</strong> programare. Rutinele<br />

implementează în special <strong>algoritmi</strong> la nivel <strong>de</strong> bloc (apelând rutinele BLAS <strong>de</strong> nivel<br />

3) şi <strong>de</strong> aceea ating maximul <strong>de</strong> performanţă pe <strong>calcul</strong>atoare cu memorie ierarhică.<br />

Pentru fiecare problemă au fost aleşi <strong>algoritmi</strong>i cei mai fiabili şi rapizi dintre cei<br />

cunoscuţi, bună parte dintre aceştia fiind adaptarea celor din bibliotecile LINPACK


118 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

[XIII] (<strong>de</strong>dicată în special rezolvării sistemelor liniare) şi EISPACK [XI,XII] (pentru<br />

<strong>calcul</strong>ul valorilor proprii şi probleme conexe), cele mai performante şi folosite pachete<br />

<strong>de</strong> programe <strong>de</strong> <strong>calcul</strong> <strong>numeric</strong> ale anilor ’70–’80. De aceea se poate aprecia că<br />

LAPACK este cel mai mo<strong>de</strong>rn şi puternic instrument <strong>de</strong> <strong>calcul</strong> în algebra <strong>matriceal</strong>ă.<br />

În plus, sursele LAPACK sunt disponibile gratuit (vezi http://www.netlib.org).<br />

Numele rutinelor LAPACK respectă convenţiile BLAS (vezi secţiunea 1.11),<br />

adică au forma xyyzzz, un<strong>de</strong> x codifică formatul <strong>de</strong> reprezentare a datelor, yy<br />

reprezintă tipul matricei (vezi tabelul 1.1 pentru cele mai importante tipuri), iar<br />

zzz arată operaţia executată.<br />

Rutinele LAPACK sunt împărţite în trei categorii:<br />

• rutine driver, care rezolvă o problemă completă, <strong>de</strong> exemplu aflarea soluţiei<br />

unui sistem liniar;<br />

• rutine <strong>de</strong> <strong>calcul</strong>, care rezolvă subprobleme sau completează rezolvarea unei<br />

probleme, <strong>de</strong> exemplu <strong>calcul</strong>ul factorizării LU sau rafinarea iterativă a soluţiei<br />

unui sistem liniar;<br />

• rutine auxiliare.<br />

Rezolvării sistemelor liniare îi sunt <strong>de</strong>dicate în LAPACK două tipuri <strong>de</strong> rutine<br />

driver:<br />

1. Driverul simplu, cu numele <strong>de</strong> forma xyySV, rezolvă sistemele (cu parte<br />

dreaptă multiplă) AX = B sau A T X = B. De exemplu, xGESV se utilizează pentru<br />

matrice A oarecare (implementând eliminarea gaussiană la nivel <strong>de</strong> bloc), xPOSV se<br />

utilizează când matricea A este simetrică pozitiv <strong>de</strong>finită (implementând algoritmul<br />

Cholesky la nivel <strong>de</strong> bloc) etc.<br />

2. Driverul expert, cu numele xyySVX, care, în plus<br />

• scalează matricea A dacă este necesar;<br />

• estimează numărul <strong>de</strong> condiţionare al matricei A;<br />

• rafinează iterativ soluţia.<br />

În contextul rezolvării <strong>de</strong> sisteme, rutinele <strong>de</strong> <strong>calcul</strong> cele mai importante sunt<br />

următoarele:<br />

1. xyyTRF <strong>calcul</strong>ează factorizarea PA = LU în cazul general (yy=GE), factorizarea<br />

Cholesky A = LL T pentru matrice simetrice (hermitice) pozitiv <strong>de</strong>finite<br />

(yy=PO), factorizarea cvasi-diagonală PAP T = LDL T pentru matrice simetrice<br />

(hermitice) (yy=SY, yy=HE). În toate cazurile <strong>de</strong> mai sus există rutine şi<br />

pentru matrice bandă.<br />

2. xyyTRS utilizează rezultatul factorizării (ieşirea rutineixyyTRF corespunzătoare)<br />

pentru a <strong>calcul</strong>a soluţia unui sistem liniar.<br />

3. xyyEQU scalează matricea A.<br />

4. xyyRFS rafinează iterativ soluţia unui sistem liniar.


2.13. PROBLEME 119<br />

5. xyyCON estimează inversul numărului <strong>de</strong> condiţionare, adică 1/κ(A).<br />

6. xyyTRI <strong>calcul</strong>ează inversa unei matrice, utilizând rezultatul factorizării.<br />

MATLAB (MATrix LABoratory) [XIV] are o interfaţă mai simplă, dar rutinele<br />

sale implementează <strong>de</strong> asemenea <strong>algoritmi</strong> <strong>de</strong> mare performanţă.<br />

Rezolvarea sistemului liniar (eventual cu parte dreaptă multiplă) AX = B se<br />

face apelând la operatorul <strong>de</strong> ”împărţire” la stânga; dacă A şi B sunt variabilele<br />

memorând matricea coeficienţilor sistemului şi, respectiv, termenul său drept, atunci<br />

soluţia se <strong>calcul</strong>ează cuA\B. Sistemul (cu necunoscuta la stânga) XA = B se rezolvă<br />

utilizând operatorul <strong>de</strong> ”împărţire” la dreapta, soluţia fiind B/A. În ambele cazuri,<br />

algoritmul implementat este eliminarea gaussiană cu pivotare parţială, indiferent<br />

<strong>de</strong> tipul matricei.<br />

Factorizarea PA = LU este <strong>calcul</strong>ată <strong>de</strong> funcţia lu, iar factorizarea Cholesky<br />

<strong>de</strong> funcţia chol. Nu există o funcţie <strong>de</strong>dicată factorizării cvasi-diagonale.<br />

Inversa unei matrice se <strong>calcul</strong>ează cu funcţia inv, iar <strong>de</strong>terminantul cu <strong>de</strong>t.<br />

Reamintim că în nici un caz soluţia unui sistem AX = B nu se <strong>calcul</strong>ează cu<br />

inv(A)*B.<br />

Pentru <strong>calcul</strong>ul numărului <strong>de</strong> condiţionare există mai multe funcţii; cond <strong>calcul</strong>ează<br />

exact κ 2 (A), ceea ce necesită mai multe operaţii <strong>de</strong>cât rezolvarea sistemului<br />

liniar Ax = b (algoritmul va fi prezentat în capitolul 5); rcond estimează 1/κ ∞ (A),<br />

utilizând algoritmul din finalul secţiunii 2.7; în fine, con<strong>de</strong>st estimează 1/κ 1 (A) cu<br />

un algoritm neprezentat în această lucrare.<br />

2.13 Probleme<br />

P 2.1 Descrieţi o variantă a eliminării gaussiene în care se introduc zerouri în coloanele<br />

lui A, <strong>de</strong>asupra diagonalei, în ordinea n : −1 : 2, şi care produce factorizarea A = UL,<br />

un<strong>de</strong> U este superior triunghiulară unitate şi L este inferior triunghiulară.<br />

P 2.2 Scrieţi variantele vectoriale ale <strong>algoritmi</strong>lor GPP şi GPC, utilizând apeluri la<br />

funcţii din biblioteca BLAS 1.<br />

P 2.3 Fie A ∈ R n×n o matrice strict diagonal dominantă pe coloane, i.e. cu proprietatea<br />

|a jj| > P n<br />

i=1,i≠j<br />

|aij|. Demonstraţi că pivotarea parţială nu este necesară în procesul <strong>de</strong><br />

eliminare gaussiană şi că toţi multiplicatorii gaussieni sunt subunitari (în modul).<br />

P 2.4 Fie matricea <strong>de</strong> transformare elementară Gauss-Jordan ˜M k = I n − ˜m k e T k , <strong>de</strong>finită<br />

<strong>de</strong> vectorul ˜m k = [µ 1k . . . µ k−1,k 0 µ k+1,k . . . µ nk ] T .<br />

a. Fie x ∈ R n , cu x k ≠ 0. Determinaţi ˜m k astfel încât ˜M k x = x k e k .<br />

b. Fie A ∈ R n×n , având submatricele li<strong>de</strong>r principale A [k] nesingulare, k = 1 : n − 1.<br />

Scrieţi un algoritm care, utilizând transformări Gauss-Jordan, diagonalizează matricea A,<br />

i.e. generează ˜M 1, ˜M 2, ..., ˜M n−1 astfel încât ˜M n−1 . . . ˜M 2 ˜M 1A = D, cu D diagonală.<br />

Care este numărul <strong>de</strong> operaţii <br />

c. Introduceţi pivotarea în algoritmul anterior.<br />

P 2.5 Demonstraţi unicitatea factorizării LDU în condiţiile teoremei 2.4.<br />

P 2.6 Demonstraţi că dacă A ∈ R n×n admite o factorizare LDU unică, atunci submatricele<br />

li<strong>de</strong>r principale A [k] , k = 1 : n − 1, sunt nesingulare. (Indicaţie: utilizaţi reducerea<br />

la absurd.)


120 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

P 2.7 Demonstraţi că algoritmul GPP modificat conform <strong>de</strong>scrierii din secţiunea 2.4.1<br />

produce o factorizare LU pentru care |l ik | ≤ 1, pentru i > k.<br />

P 2.8 Cum trebuie modificat algoritmul GPC aplicat matricei A ∈ R n×n pentru a furniza<br />

factorizarea LU cu permutări pe linii şi pe coloane <strong>de</strong> forma PAQ = LU Demonstraţi<br />

că |u kk | ≥ |u kj |, pentru j > k (în plus, |l ik | ≤ 1, pentru i > k).<br />

P 2.9 Adaptaţi algoritmul <strong>de</strong> eliminare gaussiană cu pivotare parţială astfel încât să<br />

<strong>calcul</strong>eze factorizarea (2.32).<br />

P 2.10 Scrieţi o variantă la nivel <strong>de</strong> bloc a algoritmului <strong>de</strong> factorizare Crout cu pivotare<br />

CROUTP.<br />

P 2.11 Cum trebuie modificaţi <strong>algoritmi</strong>i 2.7 şi 2.8 astfel încât să funcţioneze corect şi<br />

atunci când dimensiunea n a matricei nu este multiplu al dimensiunii r a blocurilor <br />

P 2.12 Prezentaţi o variantă a algoritmului <strong>de</strong> rezolvare a sistemelor liniare <strong>de</strong> forma<br />

Ax = b prin eliminare gaussiană cu pivotare parţială, fără a memora multiplicatorii.<br />

P 2.13 Fie H ∈ R n×n o matrice nesingulară superior Hessenberg (h ij = 0, pentru<br />

i > j + 1).<br />

a. Dacă toate submatricele li<strong>de</strong>r principale ale lui H sunt nesingulare, adaptaţi algoritmul<br />

<strong>de</strong> eliminare gaussiană pentru rezolvarea sistemului liniar Hx = b, un<strong>de</strong> b ∈ R n ;<br />

<strong>calcul</strong>aţi numărul <strong>de</strong> operaţii.<br />

b. Adaptaţi algoritmul GPP pentru aceeaşi problemă.<br />

c. Adaptaţi algoritmul Crout <strong>de</strong> factorizare LU.<br />

P 2.14 Se consi<strong>de</strong>ră două matrice: H ∈ R n×n , superior Hessenberg nesingulară, şi<br />

R ∈ R n×n , superior triunghiulară unitate. Prezentaţi <strong>algoritmi</strong> eficienţi pentru:<br />

a. rezolvarea sistemului liniar HRx = b, cu b ∈ R n .<br />

b. Atunci când toate submatricele li<strong>de</strong>r principale ale lui H sunt nesingulare, factorizarea<br />

Crout A = HR poate fi obţinută printr-una din următoarele două scheme:<br />

Schema 1. 1. Calculează A = HR.<br />

2. Calculează factorizarea Crout a lui A: A = LU.<br />

Schema 2. 1. Calculează factorizarea Crout a lui H: H = LŪ.<br />

2. Calculează U = ŪR.<br />

Care dintre ele este mai eficientă <br />

P 2.15 a. Propuneţi un algoritm pentru rezolvarea sistemului liniar Ax = b, un<strong>de</strong><br />

A ∈ R n×n este nesingulară şi b ∈ C n , utilizând numai aritmetica reală.<br />

b. Prezentaţi un algoritm pentru rezolvarea ecuaţiei <strong>matriceal</strong>e AX = B, în care<br />

A ∈ R n×n este nesingulară şi B ∈ R n×m . (Indicaţie: utilizaţi GPP.)<br />

c. I<strong>de</strong>m, dar pentru ecuaţia XA = B, cu A ∈ R n×n , B ∈ R m×n .<br />

P 2.16 Se dă matricea A ∈ R n×n nesingulară. Utilizând rezultatul algoritmului <strong>de</strong> eliminare<br />

gaussiană cu pivotare parţială (M n−1P n−1 . . . M 1P 1A = U) sau factorizarea LU<br />

(PA = LU), scrieţi <strong>algoritmi</strong>i pentru rezolvarea sistemelor A T y = c, A T Y = C, un<strong>de</strong><br />

c ∈ R n , C ∈ R n×m .<br />

P 2.17 Prezentaţi un algoritm eficient pentru rezolvarea sistemului liniar A k x = b, un<strong>de</strong><br />

A ∈ R n×n este nesingulară, b ∈ R n şi k ∈ N, k > 1.<br />

P 2.18 Dacă A,B ∈ R n×n sunt matrice nesingulare, prezentaţi un algoritm eficient <strong>de</strong><br />

rezolvare a sistemului liniar (AB) k x = c, un<strong>de</strong> c ∈ R n .


2.13. PROBLEME 121<br />

P 2.19 Sistemul complex Cz = w (cu C = A + iB, z = x + iy, w = u + iv) se poate scrie<br />

(prin ”<strong>de</strong>complexificare”) în forma<br />

» – » – » –<br />

A −B x u<br />

=<br />

B A y v<br />

Ce este preferabil: (a) rezolvarea sistemului Cz = w cu operaţii complexe sau (b) rezolvarea<br />

sistemului <strong>de</strong>complexificat cu operaţii reale <br />

P 2.20 Se presupune că A ∈ R n×n are o factorizare LU şi că L şi U sunt cunoscuţi.<br />

Prezentaţi un algoritm care <strong>calcul</strong>ează elementul din poziţia (i, j) a matricei A −1 , cu<br />

aproximativ (n − j) 2 + (n − i) 2 flopi.<br />

P 2.21 Detaliaţi <strong>algoritmi</strong>i <strong>de</strong> <strong>calcul</strong> al inversei unei matrice A ∈ R n×n şi al <strong>de</strong>t(A),<br />

utilizând eliminarea gaussiană cu pivotare completă.<br />

P 2.22 Se dau A ∈ R n×n , B ∈ R n×r , C ∈ R r×n , D ∈ R r×r , matricele A şi D fiind<br />

inversabile. Fie A + = A+BD −1 C (actualizare <strong>de</strong> rang r a matricei A). Cazuri particulare:<br />

1 ◦ A, D simetrice pozitiv <strong>de</strong>finite, C = B T ; 2 ◦ r = 1, adică A + = A + bc T /δ (actualizare<br />

<strong>de</strong> rang 1).<br />

a. Demonstraţi că are loc formula (Sherman-Morrison-Woodbury):<br />

A −1<br />

+ = A −1 − A −1 BD −1<br />

+ CA −1 , un<strong>de</strong> D + = D + CA −1 B.<br />

b. Scrieţi un algoritm <strong>de</strong> <strong>calcul</strong> al matricei A −1<br />

+ , presupunând A −1 cunoscută (actualizarea<br />

inversei). Consi<strong>de</strong>raţi cazurile<br />

»<br />

particulare<br />

–<br />

1 ◦ şi 2 ◦ . Evaluaţi numărul <strong>de</strong> operaţii.<br />

A B<br />

c. Se consi<strong>de</strong>ră matricea H = . Demonstraţi că<br />

C −D<br />

»<br />

H −1 =<br />

A −1<br />

+ A −1 BD −1<br />

+<br />

D −1<br />

+ CA−1 −D −1<br />

+<br />

–<br />

.<br />

P 2.23 Fie u, v ∈ R n doi vectori nenuli şi matricea A = I n + uv T .<br />

a. Prezentaţi un algoritm eficient pentru <strong>calcul</strong>ul <strong>de</strong>terminantului matricei A. Când<br />

este A nesingulară <br />

b. Dacă A este nesingulară şi b ∈ R n , scrieţi un algoritm eficient pentru rezolvarea<br />

sistemului liniar Ax = b.<br />

P 2.24 Matricea A ∈ R n×n <strong>de</strong> mai jos este un exemplu (construit special în acest scop)<br />

în care factorul <strong>de</strong> creştere γ atinge valoarea maximă în algoritmul GPP.<br />

2<br />

A =<br />

6<br />

4<br />

1 0 . . . 0 1<br />

−1 1 . . . 0 1<br />

.<br />

.<br />

. ..<br />

. ..<br />

. ..<br />

−1 −1 . . . 1 1<br />

−1 −1 . . . −1 1<br />

Demonstraţi că în algoritmul GPP nu se efectuează nici o permutare şi că γ = 2 n−1 .<br />

P 2.25 Fie A ∈ R n×n şi x ∈ R n . Demonstraţi inegalitatea cond(A,x) ≤ κ ∞(A) (relaţia<br />

(2.58)).<br />

3<br />

.<br />

7<br />

5


122 CAPITOLUL 2. REZOLVAREA SISTEMELOR DE ECUAŢII LINIARE<br />

P 2.26 Se dă A ∈ R n×n . Să se găsească matricele diagonale D 1 şi D 2 astfel încât fiecare<br />

linie şi coloană din D 1AD 2 să aibă norma ∞ egală cu 1. (Impunându-se restricţia ca<br />

elementele matricelor D 1 şi D 2 să fie puteri ale bazei <strong>de</strong> numeraţie β, să se construiască<br />

D 1 şi D 2 astfel încât liniile şi coloanele lui D 1AD 2 să aibă norma ∞ cuprinsă în intervalul<br />

[1/β, 1].)<br />

» – A 0<br />

P 2.27 Fie B = , cu A,R ∈ R n×n , nesingulare, R superior triunghiulară. Se<br />

R A<br />

presupune că factorizarea LU a lui A există şi este cunoscută (A = LU).<br />

a. Scrieţi un algoritm pentru <strong>calcul</strong>ul factorizării LU a lui B, B = ˜LŨ.<br />

b. Propuneţi un algoritm pentru rezolvarea sistemului liniar Bx = d, în care d ∈ R 2n .<br />

Calculaţi numărul <strong>de</strong> operaţii pentru ambii <strong>algoritmi</strong>.<br />

P 2.28 Fie A ∈ R 2n×2n » o matrice–<br />

nesingulară cu toate submatricele li<strong>de</strong>r principale nesingulare,<br />

<strong>de</strong> forma A = , cu A<br />

A1 A 2<br />

A 3 A 1, A 2, A 3, A 4 ∈ R n×n şi A 3 superior triunghiulară.<br />

4<br />

a. Scrieţi un algoritm pentru rezolvarea sistemului liniar Ax = b, cu b ∈ R 2n .<br />

b. Aceeaşi problemă, dar presupunând doar că A este nesingulară.<br />

P 2.29 Fie A ∈ R n×n o matrice nesingulară tridiagonală (a ij = 0, pentru i > j + 1 sau<br />

i < j − 1).<br />

a. Adaptaţi algoritmul <strong>de</strong> eliminare gaussiană la acest tip <strong>de</strong> matrice.<br />

b. Prezentaţi un algoritm care rezolvă sistemul Ax = b, cu b ∈ R n .<br />

c. Dacă matricea A este simetrică şi pozitiv <strong>de</strong>finită, adaptaţi algoritmul <strong>de</strong> factorizare<br />

Cholesky pentru A.<br />

P 2.30 Detaliaţi o procedură <strong>de</strong> <strong>calcul</strong> al matricei F = CE −1 din (2.62), pentru cazul<br />

s = 2, utilizând eliminarea gaussiană cu pivotare parţială.<br />

P 2.31 Demonstraţi relaţia (2.65) (care mărgineşte creşterea elementelor matricei simetrice<br />

A în timpul execuţiei algoritmul FCD, <strong>de</strong> factorizare cvasi-diagonală cu pivotare<br />

completă).<br />

P 2.32 Detaliaţi permutările efectuate în algoritmul <strong>de</strong> factorizare cvasi-diagonală cu pivotare<br />

completă (schema FCDPC 1), operând numai în triunghiul inferior al matricei simetrice<br />

date.<br />

P 2.33 Scrieţi un algoritm <strong>de</strong> <strong>calcul</strong> al factorului Cholesky L al unei matrice A ∈ R n×n<br />

pozitiv <strong>de</strong>finite, în care elementele lui L să fie <strong>calcul</strong>ate prin operaţii Saxpy (şi nu DOT,<br />

ca în algoritmul CHOL). Indicaţie: algoritmul este asemănător eliminării gaussiene.<br />

P 2.34 Scrieţi o variantă la nivel <strong>de</strong> bloc a algoritmului <strong>de</strong> factorizare Cholesky a unei<br />

matrice simetrice pozitiv <strong>de</strong>finite.<br />

P 2.35 Fie A ∈ R n×n o matrice nesingulară inferior bidiagonală, şi T = AA T . Prezentaţi<br />

un algoritm eficient pentru <strong>calcul</strong>ul factorizării Cholesky a matricei T (<strong>de</strong>monstraţi întâi<br />

că T este simetrică şi pozitiv <strong>de</strong>finită).<br />

P 2.36 Adaptaţi algoritmul CHOL pentru factorizarea matricelor simetrice pozitiv <strong>de</strong>finite<br />

bandă <strong>de</strong> lăţime r.<br />

P 2.37 Dacă matricea A ∈ R n×n este simetrică şi pozitiv <strong>de</strong>finită, propuneţi un algoritm<br />

pentru factorizarea Cholesky A = RR T , un<strong>de</strong> R este superior triunghiulară şi are<br />

elementele diagonale pozitive.<br />

P 2.38 Fie A ∈ R n×n o matrice simetrică şi pozitiv <strong>de</strong>finită. Scrieţi un algoritm <strong>de</strong> <strong>calcul</strong><br />

al factorizării A = LDL T , cu L inferior triunghiulară unitate şi D diagonală. (A = LDL T<br />

mai este numită factorizare Cholesky ”fără radical”.)


Capitolul 3<br />

Problema celor mai mici<br />

pătrate<br />

În acest capitol vom prezenta principalele <strong>meto<strong>de</strong></strong> <strong>numeric</strong>e <strong>de</strong> rezolvare a sistemelor<br />

<strong>de</strong> ecuaţii liniare<br />

Ax = b, (3.1)<br />

în care matricea A ∈ R m×n şi vectorul b ∈ R m sunt date, iar m ≠ n, adică<br />

numărul ecuaţiilor este diferit <strong>de</strong> cel al necunoscutelor. Întrucât, <strong>de</strong> regulă, un<br />

sistem supra<strong>de</strong>terminat (cu m > n) nu are soluţii, iar un sistem sub<strong>de</strong>terminat (cu<br />

m < n) nu are soluţie unică, pentru a asigura buna formulare a problemei <strong>de</strong> <strong>calcul</strong>,<br />

în prima situaţie trebuie să re<strong>de</strong>finim, iar în a doua trebuie să precizăm noţiunea<br />

<strong>de</strong> ”soluţie” a sistemului (3.1).<br />

În cazul m > n, o reformulare naturală a problemei (3.1) constă în a cere <strong>de</strong>terminarea<br />

unei soluţii aproximative a sistemului (3.1), adică a unui vector<br />

x ∗ ∈ R n astfel încât reziduul corespunzător r ∗ = b − Ax ∗ să fie, într-un anumit<br />

sens, cât mai mic. (Altfel spus, vectorul b trebuie să fie aproximat cât mai bine<br />

printr-o combinaţie liniară a coloanelor lui A.) Într-o exprimare mai precisă, aceasta<br />

înseamnă că x ∗ trebuie să minimizeze funcţia<br />

ρ(x) = ν(b − Ax), (3.2)<br />

un<strong>de</strong> ν(·) este o normă pe R m , aleasă în mod a<strong>de</strong>cvat.<br />

În cazul m < n, un criteriu natural <strong>de</strong> selecţie a unei singure soluţii x ∗ ∈ R n a<br />

sistemului (3.1) impune ca aceasta să fie, într-un anumit sens, cât mai ”economică”,<br />

<strong>de</strong> exemplu să aibă o ”lungime”, adică o normă, cât mai mică. Altfel spus, x ∗ trebuie<br />

să minimizeze funcţia<br />

φ(x) = µ(x)| Ax=b , (3.3)<br />

un<strong>de</strong> µ(·) este o normă pe R n 1 .<br />

1 Notaţia din (3.3) spune că φ este restricţia normei µ pe mulţimea X a soluţiilor sistemului<br />

(3.1). Desigur, pentru ca problema minimizării funcţiei φ să aibă sens, este necesar să presupunem<br />

că sistemul liniar (3.1) are cel puţin o soluţie, i.e. b ∈ ImA.


124 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Subliniem din start că alegerea normelor din (3.2) şi (3.3) <strong>de</strong>pin<strong>de</strong> <strong>de</strong> natura<br />

problemei consi<strong>de</strong>rate şi, în acelaşi timp, <strong>de</strong>termină specificul <strong>meto<strong>de</strong></strong>lor <strong>de</strong> <strong>calcul</strong><br />

utilizate pentru rezolvarea ei. (De exemplu, în cazul normelor ‖ · ‖ 1 sau ‖ · ‖ ∞<br />

se obţin probleme <strong>de</strong> programare liniară, care se rezolvă prin <strong>meto<strong>de</strong></strong>le expuse în<br />

capitolul 2, vezi [X]).<br />

În acest capitol vom consi<strong>de</strong>ra că normele ν şi µ coincid cu norma euclidiană<br />

‖ · ‖ = ‖ · ‖ 2 , iar terminologia utilizată va fi următoarea.<br />

1.<br />

2.<br />

În cazul m ≥ n problema <strong>de</strong> minimizare<br />

‖b − Ax ∗ ‖ = min ‖b − Ax‖ (3.4)<br />

x∈Rn a normei euclidiene a reziduului r = b − Ax se numeşte problema (liniară) a<br />

celor mai mici patrate (CMMP), iar soluţia ei x ∗ este, prin <strong>de</strong>finiţie, pseudosoluţia<br />

sistemului (3.1) în sensul CMMP. Vectorul b ∗ = Ax ∗ constituie cea<br />

mai bună aproximare a lui b printr-o combinaţie liniară a coloanelor matricei<br />

A, i.e. pe ImA, iar reziduul <strong>de</strong> normă minimă r ∗ = b −Ax ∗ reprezintă eroarea<br />

<strong>de</strong> aproximare optimală.<br />

În cazul m ≤ n soluţia problemei <strong>de</strong> minimizare cu restricţii liniare<br />

‖x ∗ ‖ = min ‖x‖ (3.5)<br />

Ax=b<br />

este, prin <strong>de</strong>finiţie, soluţia normală în sensul CMMP (i.e. soluţia <strong>de</strong> normă<br />

euclidiană minimă) a sistemului (3.1).<br />

Problemele <strong>de</strong> tip CMMP enunţate mai sus apar sub diverse forme (inclusiv cu<br />

date complexe) în multe aplicaţii care, <strong>de</strong> exemplu, vizează aproximarea funcţiilor,<br />

prelucrarea statistică a datelor experimentale, mo<strong>de</strong>larea şi i<strong>de</strong>ntificarea sistemelor<br />

dinamice, prelucrarea semnalelor etc.<br />

Exemplul 3.1 Consi<strong>de</strong>răm un proces <strong>de</strong>scris printr-o <strong>de</strong>pen<strong>de</strong>nţă funcţională<br />

y = f 0 (u), cunoscută doar parţial din date experimentale constând într-o mulţime<br />

<strong>de</strong> perechi intrare-ieşire (u i , y i ), un<strong>de</strong> y i = f 0 (u i ), i = 1 : m.<br />

Se pune problema găsirii unei expresii analitice aproximative f pentru funcţia<br />

f 0 , sub forma unei combinaţii liniare cu coeficienţii c 1 , c 2 , . . . , c n a n funcţii date<br />

g 1 , g 2 , . . . , g n , i.e.<br />

n∑<br />

f(u) = c j g j (u),<br />

j=1<br />

astfel încât erorile <strong>de</strong> aproximare (sau reziduurile)<br />

r i = y i − f(u i ), i = 1 : m,<br />

evaluate în punctele date (u i , y i ), să fie cât mai mici.<br />

În cazul tipic m > n, formularea în sens CMMP a problemei <strong>de</strong> aproximare<br />

consi<strong>de</strong>rate mai sus constă în <strong>de</strong>terminarea coeficienţilor c j , j = 1 : n, astfel încât<br />

eroarea medie pătratică<br />

⎛<br />

⎞2<br />

m∑ m∑ n∑<br />

‖r‖ 2 = ri 2 = ⎝y i − c j g j (u i ) ⎠<br />

(3.6)<br />

i=1<br />

i=1<br />

j=1


3.1.<br />

TRANSFORMĂRI ORTOGONALE 125<br />

să fie minimă.<br />

Introducând matricea A ∈ R m×n cu elementele a ij = g j (u i ), i = 1 : m,<br />

j = 1 : n, precum şi vectorii b = [ y 1 y 2 . . . y m ] T ∈ R m şi x = [ c 1 c 2 . . . c n ] T ∈ R n ,<br />

problema minimizării lui (3.6) se scrie evi<strong>de</strong>nt sub forma sintetică (3.4). ♦<br />

Exemplul 3.2 În problemele <strong>de</strong> i<strong>de</strong>ntificare şi estimare a parametrilor, relaţiile<br />

din exemplul anterior apar scrise sub forma<br />

y i =<br />

n∑<br />

c j g j (u i ) + r i , i = 1 : m,<br />

j=1<br />

în care acum reziduurile r i reprezintă erori (sau zgomote) <strong>de</strong> măsură şi, în consecinţă,<br />

au o <strong>de</strong>scriere statistică. Se poate arăta că, în anumite condiţii standard, estimările<br />

optimale ale parametrilor x = [c 1 . . . c n ] T sunt soluţii ale problemei CMMP (3.6)<br />

cu exact aceleaşi date A, b ca mai sus. În general, probleme <strong>de</strong> mo<strong>de</strong>lare sistemică<br />

extrem <strong>de</strong> complicate admit o dublă interpretare, ca probleme <strong>de</strong> aproximare sau <strong>de</strong><br />

estimare, şi în consecinţă se tratează în spiritul principiului CMMP. Pentru <strong>de</strong>talii<br />

şi aplicaţii specifice, cititorul poate consulta [, ].<br />

♦<br />

Teoria problemelor CMMP este intim legată <strong>de</strong> geometria spaţiului euclidian<br />

R m , în special <strong>de</strong> noţiunea <strong>de</strong> ortogonalitate, care – după cum vom ve<strong>de</strong>a mai <strong>de</strong>parte<br />

– dă un sens (geometric) clar şi extrem <strong>de</strong> intuitiv problemelor <strong>de</strong> minimizare<br />

formulate mai sus. În mod corespunzător, practica <strong>numeric</strong>ă actuală recomandă<br />

rezolvarea acestor probleme prin <strong>meto<strong>de</strong></strong> directe <strong>de</strong> triangularizare a matricei A,<br />

bazate pe utilizarea transformărilor ortogonale 2 .<br />

De aceea, în primele secţiuni ale acestui capitol, vom introduce transformările<br />

ortogonale utilizate în <strong>calcul</strong>e şi vom <strong>de</strong>scrie procedurile corespunzătoare <strong>de</strong> triangularizare<br />

ortogonală. Pe această bază, în continuare vom prezenta procedurile <strong>de</strong><br />

rezolvare a problemelor CMMP <strong>de</strong> tip (3.4) şi (3.5), insistând totodată asupra unor<br />

aspecte practice importante privind condiţionarea problemelor consi<strong>de</strong>rate precum<br />

şi stabilitatea <strong>numeric</strong>ă a <strong>algoritmi</strong>lor <strong>de</strong> <strong>calcul</strong> propuşi.<br />

3.1 Transformări ortogonale<br />

În această secţiune vom <strong>de</strong>fini cele două tipuri <strong>de</strong> transformări ortogonale utilizate<br />

în <strong>calcul</strong>ul <strong>numeric</strong> şi vom <strong>de</strong>scrie proprietăţile lor importante.<br />

3.1.1 Reflectori<br />

Consi<strong>de</strong>răm spaţiul R m cu produsul scalar (x, y) = y T x şi notăm cu ‖x‖ = (x T x) 1/2<br />

norma euclidiană indusă. Amintim că o matrice U ∈ R m×m se numeşte ortogonală<br />

dacă U T U = I m .<br />

2 Aici este esenţial faptul că norma euclidiană consi<strong>de</strong>rată în (3.4) şi (3.5) este invariantă în<br />

raport cu grupul transformărilor ortogonale. În legătură cu aceste noţiuni, cititorul este invitat să<br />

consulte capitolul 1.


126 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Definiţia 3.1 Fie u ∈ R m un vector normat, i.e. ‖u‖ = 1. O matrice U ∈ R m×m<br />

<strong>de</strong> forma<br />

U = I m − 2uu T (3.7)<br />

se numeşte reflector elementar <strong>de</strong> ordinul m sau transformare Househol<strong>de</strong>r 3 .<br />

Se constată imediat că orice reflector elementar U este o matrice simetrică şi<br />

ortogonală. Într-a<strong>de</strong>văr, produsul exterior uuT este evi<strong>de</strong>nt o matrice simetrică, iar<br />

în virtutea condiţiei <strong>de</strong> normare, ‖u‖ 2 = u T u = 1, avem<br />

U T U = U 2 = ( I m − 2uu T) ( I m − 2uu T) = I m − 4uu T + 4u(u T u)u T = I m .<br />

Aşadar, un reflector elementar este o transformare involutivă, i.e. coinci<strong>de</strong> cu propria<br />

sa inversă.<br />

În cele ce urmează vom fixa un întreg k ∈ 1 : m −1 şi vom consi<strong>de</strong>ra că vectorul<br />

u ≠ 0 din (3.7), nu neapărat normat, are primele k −1 componente nule, i.e. u i = 0,<br />

i = 1 : k − 1. Pentru precizare, în acest caz vom scrie<br />

un<strong>de</strong><br />

U k = I m − uuT<br />

β ,<br />

β <strong>de</strong>f<br />

= 1 2 ‖u‖2 (3.8)<br />

u = [ 0 . . . 0 u k . . . u m ] T (3.9)<br />

şi vom spune că U k este un reflector <strong>de</strong> ordin m şi indice k. Vectorul u se numeşte<br />

vector Househol<strong>de</strong>r, iar β este factorul <strong>de</strong> normare corespunzător. (Uneori, în loc <strong>de</strong><br />

β se utilizează scalarul τ = β −1 . Vom reveni asupra acestei chestiuni în secţiunea<br />

următoare.) Observăm că datorită zerourilor din (3.9) matricea U k are structura<br />

[ ]<br />

Ik−1 0<br />

U k = , (3.10)<br />

0 Ũ 1<br />

în care Ũ1 este evi<strong>de</strong>nt un reflector <strong>de</strong> ordin m − k + 1 şi indice 1.<br />

Reflectorii U k cu structura precizată mai sus au două proprietăţi importante 4 .<br />

AA. Fiind daţi un reflector U k şi un vector x ∈ R m , aplicarea transformării<br />

U k , i.e. <strong>calcul</strong>ul vectorului transformat y = U k x, se face simplu, observând că<br />

un<strong>de</strong>, evi<strong>de</strong>nt<br />

U k x = (I m − uuT<br />

β )x = x − u(uT x)<br />

= x − νu, (3.11)<br />

β<br />

ν = uT x<br />

β . (3.12)<br />

Relaţia (3.11) scrisă pe componente (un<strong>de</strong> amintim că u i = 0, i = 1 : k − 1)<br />

arată că premultiplicarea cu U k nu modifică primele k −1 componente ale lui x. De<br />

aceea, transformarea y = U k x se efectuează avantajos pe loc în x, conform schemei<br />

x ← y = U k x. Consi<strong>de</strong>rând că reflectorul U k este <strong>de</strong>finit <strong>de</strong> vectorul u ∈ R m precum<br />

şi <strong>de</strong> scalarul β, procedura <strong>de</strong> <strong>calcul</strong> este următoarea.<br />

3 Transformările <strong>de</strong> tip (3.7) au fost introduse în <strong>calcul</strong>ul <strong>numeric</strong> <strong>de</strong> A. Househol<strong>de</strong>r în 1958.<br />

De regulă, mai <strong>de</strong>parte vom omite calificativul ”elementar”.<br />

4 La fel ca în capitolul 1, sigla AA indică expunerea unor aspecte <strong>algoritmi</strong>ce semnificative.


3.1.<br />

TRANSFORMĂRI ORTOGONALE 127<br />

✛<br />

−νu<br />

U k x<br />

❍❍❨<br />

✟✯ x<br />

❍<br />

❍<br />

❍<br />

❍<br />

❍<br />

❍<br />

❍<br />

❍<br />

❍<br />

❍✟ ✟✟✟✟✟✟✟✟✟✟ ✲<br />

✲<br />

0 u (u T x)u<br />

H<br />

Fig. 3.1: Efectul aplicării unui reflector U asupra unui vector x, în R 2<br />

Algoritmul 3.1 (Se dau un reflector U k şi un vector x ∈ R m . Se<br />

aplică transformarea x ← U k x).<br />

1. ν = ( ∑ m<br />

i=k u ix i )/β.<br />

2. x i ← x i − νu i , pentru i = k : m<br />

Comentarii. În esenţă, la pasul 1 se <strong>calcul</strong>ează un produs scalar (<strong>de</strong> exemplu,<br />

utilizând funcţia DOT), iar la pasul 2 se face o actualizare <strong>de</strong> tip Saxpy a lui x<br />

(funcţiile DOT şi Saxpy au fost <strong>de</strong>finite în capitolul 1). De fiecare dată se operează<br />

asupra unor vectori <strong>de</strong> dimensiune m − k + 1. Prin urmare, numărul <strong>de</strong> operaţii<br />

necesar este aproximativ N op = 4(m − k).<br />

♦<br />

Semnificaţia geometrică a transformării (3.11) rezultă din figura 3.1, un<strong>de</strong> pentru<br />

claritate am consi<strong>de</strong>rat m = 2 şi ‖u‖ = 1, <strong>de</strong>ci ν = 2u T x (vezi (3.12)), iar (u T x)u<br />

este proiecţia ortogonală a lui x pe direcţia lui u. În general, transformarea U k<br />

reprezintă simetria (”reflexia”) în raport cu hiperplanul H (”oglinda”) care trece<br />

prin origine şi are vectorul normal u.<br />

În practică, algoritmul 3.1 apare extrem <strong>de</strong> frecvent.<br />

• Aplicarea transformării B = U k A, un<strong>de</strong> A ∈ R m×n este o matrice cu n coloane,<br />

iar U k acţionează la stânga, se face partiţionând A pe coloane. Avem<br />

A = [a 1 a 2 . . . a n ] ⇒ U k A = [U k a 1 U k a 2 . . . U k a n ],<br />

<strong>de</strong>ci <strong>calcul</strong>ul se poate <strong>de</strong>sfăşura pe loc în tabloul A, utilizând algoritmul 3.1 pentru<br />

actualizarea fiecărei coloane a matricei A.<br />

% Se aplică transformarea A ← U k A<br />

1. Pentru j = 1 : n<br />

1. a j ← U k a j<br />

Conform celor spuse mai sus, premultiplicarea cu U k nu modifică primele k − 1<br />

linii ale matricei A. Mai precis, partiţionând A conform cu U k din (3.10), avem<br />

[ ] [ ]<br />

B B<br />

A = ⇒ U<br />

C<br />

k A = .<br />

Ũ 1 C


128 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Pe <strong>de</strong> altă parte, în formă compactă, similară cu (3.11), avem evi<strong>de</strong>nt<br />

U k A = (I m − uuT<br />

β )A = A − uvT , un<strong>de</strong> v = AT u<br />

β .<br />

Altfel spus, matricea transformată B = U k A este o modificare <strong>de</strong> rang 1 a lui A.<br />

• Aplicarea transformării C = AU k , un<strong>de</strong> acum A ∈ R l×m are m coloane,<br />

iar U k acţionează la dreapta, se face partiţionând A pe linii şi observând că, în<br />

virtutea simetriei lui U k , avem AU k = (U k A T ) T . Prin urmare, asupra coloanelor<br />

lui A T , adică a liniilor lui A, are loc aceeaşi transformare ca mai sus. În particular,<br />

postmultiplicarea cu U k nu modifică primele k − 1 coloane ale matricei A.<br />

AA. În <strong>calcul</strong>ul <strong>numeric</strong> generarea reflectorilor se face în scopul introducerii<br />

<strong>de</strong> zerouri într-un vector. Pe scurt, fiind dat un vector x ∈ R m , putem <strong>de</strong>termina<br />

un reflector U k <strong>de</strong> forma (3.8) astfel încât ultimele m −k componente ale vectorului<br />

transformat să fie nule, i.e. (U k x) i = 0, pentru i = k + 1 : m. Formularea precisă a<br />

acestui fapt esenţial trebuie reţinută.<br />

Propoziţia 3.1 Fixăm un întreg k ∈ 1 : m − 1 şi fie x ∈ R m un vector astfel încât<br />

σ 2 <strong>de</strong>f<br />

=<br />

Vectorul Househol<strong>de</strong>r u ∈ R m având componentele<br />

{ 0, pentru i = 1 : k − 1<br />

u i = x k + σ, pentru i = k<br />

x i , pentru i = k + 1 : m<br />

precum şi scalarul<br />

m∑<br />

x 2 i ≠ 0. (3.13)<br />

i=k<br />

(3.14)<br />

β <strong>de</strong>f<br />

= 1 2 ‖u‖2 = σu k (3.15)<br />

<strong>de</strong>finesc un reflector U k <strong>de</strong> ordin m şi indice k astfel încât<br />

{ xi , pentru i = 1 : k − 1<br />

(U k x) i = −σ, pentru i = k<br />

0, pentru i = k + 1 : m.<br />

(3.16)<br />

Demonstraţie. Într-a<strong>de</strong>văr, datorită alegerii (3.14), avem<br />

(<br />

)<br />

β = 1 m∑<br />

u 2 i<br />

2<br />

= 1 m∑<br />

(x k + σ) 2 + x 2 i = σ 2 + x k σ = σu k ,<br />

2<br />

i=k<br />

i=k+1<br />

<strong>de</strong>ci (3.15) are loc. Mai <strong>de</strong>parte, din (3.12) rezultă<br />

ν =<br />

∑ m<br />

i=1 u ix i<br />

β<br />

= x k(x k + σ) + ∑ m<br />

i=k+1 x2 i<br />

β<br />

= σ2 + x k σ<br />

β<br />

= 1.<br />

În virtutea acestui fapt, (3.16) rezultă imediat din (3.11) şi (3.14).<br />


3.1.<br />

TRANSFORMĂRI ORTOGONALE 129<br />

Relaţiile (3.13)–(3.15) furnizează un algoritm aproape complet pentru <strong>calcul</strong>ul<br />

reflectorului U k cu proprietatea cerută. Constanta σ este <strong>de</strong>terminată, mai puţin<br />

semnul, <strong>de</strong> faptul că U k este o matrice ortogonală, <strong>de</strong>ci ‖U k x‖ = ‖x‖ (vezi (3.13) şi<br />

(3.16)). Pentru a evita pier<strong>de</strong>rea <strong>de</strong> cifre semnificative la <strong>calcul</strong>ul componentei<br />

u k = x k + σ, semnul lui σ se alege acelaşi cu cel al lui x k . (Menţionăm că<br />

această alegere este esenţială pentru stabilitatea <strong>numeric</strong>ă a algoritmului rezultat.)<br />

Consi<strong>de</strong>raţiile <strong>de</strong> mai sus pot fi rezumate astfel.<br />

Algoritmul 3.2 (Se dau un întreg k ∈ 1 : m − 1 şi un vector<br />

x ∈ R m cu proprietatea (3.13). Se <strong>de</strong>termină un reflector U k astfel<br />

încât (U k x) i = 0, pentru i = k + 1 : m.)<br />

) 1/2<br />

i=k x2 i<br />

1. σ = sgn(x k ) · (∑ m<br />

2. u k = σ + x k ; u i = x i , pentru i = k + 1 : m<br />

3. β = σu k<br />

% Vectorul transformat<br />

4. x k = −σ; x i = 0, pentru i = k + 1 : m<br />

Comentarii. Subliniem încă o dată că reflectorul U k nu se formează niciodată<br />

ca matrice, ci este complet <strong>de</strong>finit numai prin intermediul vectorului u (ale cărui<br />

prime k − 1 componente sunt nule) precum şi al scalarului β. Ultimele componente<br />

u i , i = k + 1 : m, ale lui u se memorează natural pe poziţiile elementelor anulate<br />

din x, după aplicarea transformării (vezi paşii 2 şi 4). Componenta u k şi scalarul<br />

β se memorează separat. Numărul <strong>de</strong> operaţii necesar este N op ≈ 2(m − k) (plus o<br />

extragere <strong>de</strong> radical), vezi pasul 1.<br />

♦<br />

Implementarea 5 algoritmului 3.2 ţine seama <strong>de</strong> următoarele consi<strong>de</strong>rente specifice.<br />

1 ◦ . Pentru a evita eventualele <strong>de</strong>păşiri în virgulă mobilă, posibile dacă elementele<br />

x i , i = k : m, au valori absolute foarte mari sau foarte mici, <strong>calcul</strong>ul normei<br />

euclidiene <strong>de</strong> la pasul 1 se asociază cu scalarea vectorului corespunzător, e.g. prin<br />

raportare la M = max i=k:m |x i |. (Pentru indicaţii mai precise, vezi secţiunea 3.1.2.)<br />

2 ◦ . Dacă în situaţia <strong>de</strong> la punctul 1 ◦ rezultă M = 0 sau σ = 0, i.e. toate<br />

componentele x i , i = k : m, ale vectorului dat x sunt <strong>de</strong>ja nule, atunci convenim<br />

să consi<strong>de</strong>răm U k = I m şi să semnalăm această situaţie punând β = 0. (Matricea<br />

unitate I m este ortogonală şi poate fi asimilată cu un reflector ”impropriu”). Aceeaşi<br />

convenţie se adoptă dacă algoritmul 3.2 este apelat pentru k = m.<br />

3 ◦ . Deoarece vectorul Househol<strong>de</strong>r u este esenţial <strong>de</strong>terminat numai ca direcţie,<br />

la pasul 2 se poate face scalarea acestuia, e.g. luând<br />

2 ′ . u k = 1 + x k<br />

σ ; u i = x i<br />

σ , i = k + 1 : m.<br />

Se ve<strong>de</strong> uşor că în acest caz rezultă β = u k , <strong>de</strong>ci organizarea procedurală a <strong>calcul</strong>elor<br />

se simplifică, în particular se memorează separat un singur număr 6 . (Creşterea<br />

numărului <strong>de</strong> operaţii este fără importanţă.) Rezumând cele <strong>de</strong> mai sus, obţinem<br />

5 Convenim j ca funcţia sgn : R → R utilizată în <strong>algoritmi</strong>i ce urmează este <strong>de</strong>finită <strong>de</strong><br />

−1, dacă x < 0<br />

sgn(x) =<br />

. Atragem atenţia că utilizarea unor funcţii sgn pre<strong>de</strong>finite în diverse<br />

limbaje <strong>de</strong> nivel înalt (pentru care <strong>de</strong> regulă sgn(0) = 0) poate conduce la rezultate eronate.<br />

6 Alternativ, u poate fi scalat astfel încât u k = 1. Această posibilitate va fi discutată<br />

1, dacă x ≥ 0<br />

mai<br />

<strong>de</strong>parte.


130 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

% Forma implementabilă a algoritmului 3.2.<br />

1. β = 0<br />

2. Dacă k < m<br />

1. σ = (∑ m<br />

) 1/2<br />

i=k x2 i<br />

2. Dacă σ ≠ 0<br />

1. σ ← sgn(x k )σ<br />

2. x i ← u i = x i /σ, pentru i = k : m<br />

3. β ← u k = 1 + x k<br />

% Componenta k a vectorului transformat<br />

4. x k = −σ<br />

Pe scurt, la pasul 2.1 are loc <strong>calcul</strong>ul normei, căreia mai <strong>de</strong>parte i se atribuie<br />

semnul corespunzător, iar la pasul 2.2.2 are loc scalarea vectorului Househol<strong>de</strong>r u.<br />

Componentele u i , i = k + 1 : m, care constituie partea esenţială a vectorului u, se<br />

memorează pe poziţiile corespunzătoare din x. În final, se <strong>calcul</strong>ează şi se memorează<br />

separat scalarul β = u k , iar componenta <strong>de</strong> indice k a vectorului transformat<br />

este returnată pe poziţia corespunzătoare x k , vezi (3.16).<br />

Observaţia 3.1 În unele aplicaţii apar reflectori modificaţi U k, <strong>de</strong> forma (3.8), în<br />

care, spre <strong>de</strong>osebire <strong>de</strong> (3.9), vectorul Househol<strong>de</strong>r u are ultimele k − 1 componente<br />

nule, i.e.<br />

u = [ u 1 . . . u m−k+1 0 . . . 0 ] T . (3.17)<br />

În consecinţă, matricea U k are acum structura<br />

[ ]<br />

Ũ1 0<br />

U k = , (3.18)<br />

0 I k−1<br />

<strong>de</strong>ci, în procesul <strong>de</strong> aplicare a transformării x ← U k x, premultiplicarea cu U k<br />

nu modifică ultimele k − 1 componente ale lui x. De asemenea, este clar că prin<br />

alegerea a<strong>de</strong>cvată a vectorului Househol<strong>de</strong>r u, putem genera un reflector modificat<br />

U k astfel încât primele m −k componente ale vectorului transformat să fie nule, i.e.<br />

(U k x) i = 0, i = 1 : m − k. Scrierea <strong>algoritmi</strong>lor <strong>de</strong> transformare şi generare a<br />

reflectorilor modificaţi, perfect similari cu <strong>algoritmi</strong>i 3.1 şi 3.2 stabiliţi anterior, este<br />

propusă ca exerciţiu.<br />

♦<br />

Proceduri <strong>de</strong> <strong>calcul</strong> cu reflectori<br />

În problemele <strong>de</strong> <strong>calcul</strong> <strong>numeric</strong> relativ simple, <strong>algoritmi</strong>i 3.1 şi 3.2 (ultimul, sub<br />

forma sa implementabilă) pot fi utilizaţi ca atare. În practica profesională, <strong>calcul</strong>ele<br />

se organizează procedural, exploatând faptul că <strong>algoritmi</strong>i menţionaţi sunt<br />

vectorizaţi în mod natural.<br />

Pentru început, observăm că, în acord cu (3.10), partea ”activă” a unui reflector<br />

U k <strong>de</strong> indice k este întot<strong>de</strong>auna un reflector <strong>de</strong> indice 1 care acţionează asupra unui<br />

vector <strong>de</strong> dimensiune a<strong>de</strong>cvată. De aceea, în continuare vom consi<strong>de</strong>ra k = 1.<br />

AA. Fie x ∈ R m un vector dat. Generarea unui reflector U 1 astfel încât (U 1 x) i =<br />

0, i = 2 : m, adică<br />

U 1 x = −σe 1 , (3.19)<br />

se face utilizând forma implementabilă a algoritmului 3.2 în care punem k = 1.


3.1.<br />

TRANSFORMĂRI ORTOGONALE 131<br />

⎡<br />

⎢<br />

⎣<br />

⎤<br />

x 1<br />

x 2<br />

⎥<br />

. ⎦<br />

x m<br />

U 1<br />

−→<br />

⎡<br />

⎢<br />

⎣<br />

⎤<br />

−σ<br />

u 2<br />

⎥<br />

. ⎦<br />

u m<br />

⎡<br />

⎢<br />

⎣<br />

x 1<br />

.<br />

x k−1<br />

x k<br />

x k+1<br />

.<br />

x m<br />

⎤<br />

⎥<br />

⎦<br />

U k<br />

−→<br />

⎡<br />

⎢<br />

⎣<br />

x 1<br />

.<br />

x k−1<br />

−σ<br />

u k+1<br />

.<br />

u m<br />

⎤<br />

⎥<br />

⎦<br />

Fig. 3.2: Efectul aplicării procedurii RFG asupra vectorului x ∈ R m ; în stânga,<br />

β = RFG(x); în dreapta, β = RFG(x(k : m))<br />

RFG<br />

% Se dă x ∈ R m . Se generează un reflector U 1 cu proprietatea<br />

(3.19) şi se aplică transformarea. Partea esenţială u i ,<br />

i = 2 : m, a vectorului Househol<strong>de</strong>r u se memorează pe<br />

poziţiile corespunzătoare din x. La aplicarea ulterioară a<br />

transformării se consi<strong>de</strong>ră u 1 = β.<br />

1. β = 0<br />

2. Dacă m > 1 atunci<br />

1. σ = ‖x‖ % NRM2<br />

2. Dacă σ ≠ 0 atunci<br />

1. Dacă x 1 ≠ 0 atunci σ ← sgn(x 1 )σ<br />

2. x i ← u i = x i /σ, pentru i = 1 : m % SCAL<br />

3. β ← u 1 = 1 + x 1<br />

4. x 1 ← −σ<br />

Comentarii. La pasul 2.1 nu am explicitat modul <strong>de</strong> <strong>calcul</strong> al normei euclidiene<br />

pentru a aminti necesitatea scalării lui x. La pasul 2.2.2 are loc scalarea lui u, specifică<br />

procedurii RFG. Având în ve<strong>de</strong>re consi<strong>de</strong>rente <strong>de</strong> eficienţă, la paşii menţionaţi<br />

se recomandă utilizarea procedurilor NRM2 şi SCAL din BLAS. Observăm că dacă<br />

vectorul dat x este nul sau are o singură componentă, atunci algoritmul returnează<br />

β = 0, ceea ce, conform convenţiei adoptate anterior, înseamnă că U 1 = I m .<br />

Modul <strong>de</strong> apel al procedurii <strong>de</strong> generare (evi<strong>de</strong>nţiind argumentele <strong>de</strong> intrare şi<br />

ieşire) este [u, β, x] = RFG(x). Pentru a sublinia că, după cum am spus, partea<br />

esenţială u i , i = 2 : m, a vectorului Househol<strong>de</strong>r este returnată în x, mai <strong>de</strong>parte<br />

vom nota<br />

β = RFG(x),<br />

în care x apare ca tablou <strong>de</strong> intrare/ieşire. În consecinţă, execuţia instrucţiunilor<br />

β = RFG(x), respectiv β = RFG(x(k : m)), are efectul indicat în figura 3.2. ♦<br />

AA. Fie acum U 1 un reflector dat, generat <strong>de</strong> RFG, iar x ∈ R m un vector<br />

arbitrar. Aplicarea transformării<br />

x ← U 1 x (3.20)


132 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Transformare Funcţie Mod <strong>de</strong> apel Apel ”rapid” Obs.<br />

Reflector<br />

U<br />

<strong>de</strong>f 1 x = −σe 1 [u, β, x] = RFG(x) β = RFG(x)<br />

U 1 = (u, β)<br />

u 1 = β<br />

x ∈ R m x ← U 1 x x = RF(u, β, x) RF(u, β, x)<br />

Reflector<br />

modificat U 1 x = −σe m [u, β, x] = mRFG(x) β = mRFG(x)<br />

<strong>de</strong>f<br />

u m = β<br />

U 1 = (u, β) x ← U 1 x x = mRF(u, β, x) mRF(u, β, x)<br />

x ∈ R m<br />

Tabelul 3.1: Proceduri <strong>de</strong> <strong>calcul</strong> cu reflectori<br />

se face având în ve<strong>de</strong>re algoritmul 3.1 precum şi convenţia specifică <strong>de</strong> memorare<br />

a vectorului Househol<strong>de</strong>r u. Notând α = −ν şi ţinând seama că u 1 = β, vectorul<br />

transformat poate fi <strong>calcul</strong>at efectuând numai adunări şi înmulţiri.<br />

RF<br />

% Se dau un reflector U 1 generat <strong>de</strong> RFG şi un vector<br />

x ∈ R m . Se aplică transformarea x ← U 1 x.<br />

1. Dacă β ≠ 0 atunci<br />

1. t = u 1<br />

2. u 1 = β<br />

3. α = −( ∑ m<br />

i=1 u ix i )/β % DOT<br />

4. x i ← x i + αu i , pentru i = 1 : m % SAXPY<br />

5. u 1 = t<br />

Comentarii. Deoarece β = 0 semnalează că U 1 = I m , transformarea se aplică<br />

efectiv numai dacă β ≠ 0. Prima componentă u 1 a lui u nu este alterată, <strong>de</strong>oarece<br />

ea conţine informaţii <strong>de</strong>spre vectorul transformat în procesul <strong>de</strong> generare a reflectorului.<br />

Modul <strong>de</strong> apel al procedurii este x = RF(u, β, x). Deoarece transformarea se<br />

efectuează întot<strong>de</strong>auna pe loc în x, vom scrie simplu RF(u, β, x). ♦<br />

Procedurile <strong>de</strong> <strong>calcul</strong> cu reflectori modificaţi se scriu similar. De exemplu, generarea<br />

unui reflector (modificat) U 1 astfel încât (U 1 x) i = 0, i = 1 : m − 1, adică<br />

U 1 x = −σe m ,<br />

se face înlocuind pur şi simplu x 1 cu x m în RFG. (Desigur, acum partea esenţială<br />

a vectorului Househol<strong>de</strong>r u este u i , i = 1 : m − 1, iar u m = β.) Scrierea <strong>de</strong>taliată<br />

a procedurilor <strong>de</strong> generare şi aplicare a reflectorilor modificaţi, notate mai <strong>de</strong>parte<br />

mRFG şi respectiv mRF, este propusă cititorului ca exerciţiu.<br />

Procedurile <strong>de</strong> <strong>calcul</strong> cu reflectori sunt prezentate sintetic în tabelul 3.1.<br />

Subliniem că, în general, procedurile <strong>de</strong> generare şi aplicare a reflectorilor apar<br />

în perechi, modificarea convenţiei <strong>de</strong> memorare a vectorului Househol<strong>de</strong>r din RFG<br />

antrenând după sine o modificare corespunzătoare în RF.<br />

Ilustrăm utilizarea procedurilor prin două exemple simple, dar extrem <strong>de</strong> importante<br />

pentru întreaga expunere ulterioară.


3.1.<br />

TRANSFORMĂRI ORTOGONALE 133<br />

Exemplul 3.3 Se dă o matrice A ∈ R m×n . Vom <strong>de</strong>termina un reflector<br />

U 1 ∈ R m×m astfel încât elementele subdiagonale din prima coloană a matricei<br />

B = U 1 A să fie nule; apoi, vom <strong>calcul</strong>a matricea transformată A ← B = U 1 A.<br />

Deoarece transformarea se aplică la stânga, partiţionăm A pe coloane. Notând<br />

a j = A(:, j), j = 1 : n, trebuie să avem U 1 a 1 = −σe 1 , <strong>de</strong>ci U 1 se <strong>de</strong>termină aplicând<br />

procedura RFG primei coloane a 1 a matricei A. Totodată are loc şi transformarea<br />

acestei coloane, i.e. scalarul −σ este returnat pe prima poziţie a 11 . În continuare<br />

transformarea celorlalte coloane a j , j = 2 : n, se face aplicând repetat procedura<br />

RF. Prin urmare, rezultatul dorit se obţine pe loc în A utilizând algoritmul<br />

QR 1 1. β = RFG(A(:, 1))<br />

2. Pentru j = 2 : n<br />

1. RF(A(:, 1), β, A(:, j)).<br />

Desigur, reflectorul U 1 obţinut la pasul 1 poate fi aplicat mai <strong>de</strong>parte unei alte<br />

matrice, atâta timp cât partea esenţială A(2 : m, 1) a vectorului Househol<strong>de</strong>r u<br />

precum şi scalarul β sunt disponibili. De exemplu, dacă C ∈ R l×m , atunci transformarea<br />

la dreapta C ← CU 1 se efectuează partiţionând C pe linii, i.e.<br />

1. Pentru i = 1 : l<br />

1. RF(A(:, 1), β, C(i, :)).<br />

♦<br />

Exemplul 3.4 Se dă o matrice A ∈ R m×n . Vom <strong>de</strong>termina un reflector<br />

Z 1 ∈ R n×n astfel încât elementele nediagonale din prima linie a matricei B = AZ 1<br />

să fie nule; apoi vom <strong>calcul</strong>a matricea transformată A ← B = AZ 1 .<br />

Deoarece transformarea se aplică la dreapta, partiţionăm A pe linii. Raţionând<br />

la fel ca mai sus, algoritmul <strong>de</strong> <strong>calcul</strong> este<br />

LQ 1 1. β = RFG(A(1, :))<br />

1. Pentru i = 2 : m<br />

1. RF(A(1, :), β, A(i, :)).<br />

Pentru a evi<strong>de</strong>nţia avantajele organizării procedurale, propunem cititorului să<br />

scrie <strong>de</strong>taliat <strong>algoritmi</strong>i <strong>de</strong> <strong>calcul</strong> stabiliţi mai sus, înlocuind apelurile la procedurile<br />

RFG şi RF cu secvenţele <strong>de</strong> instrucţiuni ”scalare” corespunzătoare. Având în<br />

ve<strong>de</strong>re expunerea ulterioară, menţionăm că aceşti <strong>algoritmi</strong> efectuează prima etapă<br />

<strong>de</strong> triangularizare a matricei A prin transformări ortogonale la stânga şi respectiv<br />

la dreapta (vezi secţiunile 3.3 şi 3.6).<br />

3.1.2 Rotaţii<br />

După cum se ştie, în cazul m = 2 o rotaţie (plană) <strong>de</strong> unghi θ se reprezintă prin<br />

matricea<br />

[ ]<br />

cosθ − sinθ<br />

P =<br />

. (3.21)<br />

sinθ cosθ<br />

În cazul general m ≥ 2, vom adopta următoarea <strong>de</strong>finiţie.<br />


134 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Definiţia 3.2 Fixăm doi întregi i ≠ k ∈ 1 : m. O matrice P ki ∈ R m×m <strong>de</strong> forma<br />

⎡<br />

⎤<br />

I k−1 c s<br />

P ki =<br />

⎢ I i−k−1<br />

⎥<br />

⎣ −s c ⎦ , un<strong>de</strong> c2 + s 2 = 1 (3.22)<br />

I m−i<br />

se numeşte rotaţie <strong>de</strong> ordinul m în planul (k, i) sau transformare Givens 7 .<br />

Se constată imediat că orice rotaţie P ki este o matrice ortogonală.<br />

Rotaţiile P ki cu structura precizată mai sus au două proprietăţi importante.<br />

AA. Fiind date o rotaţie P ki şi un vector x ∈ R m , aplicarea transformării P ki ,<br />

i.e. <strong>calcul</strong>ul vectorului transformat y = P ki x, se face extrem <strong>de</strong> simplu. Din (3.22)<br />

se ve<strong>de</strong> că P ki modifică numai elementele lui x cu aceiaşi indici, <strong>de</strong>ci <strong>calcul</strong>ele se<br />

<strong>de</strong>sfăşoară avantajos pe loc în x, utilizând următoarea procedură.<br />

Algoritmul 3.3 (Se dau o rotaţie P ki şi un vector x ∈ R m . Se<br />

aplică transformarea x ← P ki x).<br />

1. t = x k<br />

2. x k = ct + sx i<br />

3. x i = cx i − st<br />

Numărul <strong>de</strong> operaţii necesar este N op = 6.<br />

Aplicarea transformării B = P ki A, un<strong>de</strong> A ∈ R m×n este o matrice cu n coloane,<br />

se face utilizând algoritmul 3.3 pentru actualizarea fiecărei coloane.<br />

% Se aplică transformarea A ← P ki A<br />

1. Pentru j = 1 : n<br />

1. a j ← P ki a j<br />

Aplicarea transformării C = APki T se face similar, partiţionând A pe linii.<br />

În legatură cu algoritmul 3.3, este important să reţinem că, spre <strong>de</strong>osebire <strong>de</strong><br />

reflectori, rotaţiile nu sunt matrice simetrice. Mai precis, transformarea x ← Pki Tx<br />

diferă <strong>de</strong> transformarea x ← P ki x, consi<strong>de</strong>rată mai sus, prin semnul scalarului s.<br />

AA. La fel ca în cazul reflectorilor, generarea rotaţiilor vizează introducerea <strong>de</strong><br />

zerouri într-un vector. Mai precis, fiind dat un vector x ∈ R m , putem <strong>de</strong>termina<br />

o rotaţie P ki astfel încât componenta i a vectorului transformat să fie nulă, i.e.<br />

(P ki x) i = 0.<br />

Propoziţia 3.2 Fixăm doi întregi i ≠ k ∈ 1 : m şi fie x ∈ R m un vector astfel<br />

încât<br />

r 2 <strong>de</strong>f<br />

= x 2 k + x2 i ≠ 0. (3.23)<br />

7 Deşi cunoscute din secolul trecut şi utilizate <strong>de</strong> Jacobi, Rotaţiile au fost introduse în <strong>calcul</strong>ul<br />

<strong>numeric</strong> <strong>de</strong> W. Givens în 1954. Structura (3.22) corespun<strong>de</strong> cazului i > k, iar în (3.21) avem<br />

P = P 12 cu c = cos θ, s = −sin θ. Subliniem că, în accepţiunea noastră, o rotaţie este <strong>de</strong>finită <strong>de</strong><br />

două numere reale c, s, satisfăcând condiţia c 2 + s 2 = 1. Evi<strong>de</strong>nt, în acest fel se evită utilizarea<br />

în <strong>calcul</strong>e a funcţiilor trigonometrice.


3.1.<br />

TRANSFORMĂRI ORTOGONALE 135<br />

Numerele reale<br />

c = x k<br />

r , s = x i<br />

r<br />

<strong>de</strong>finesc o rotaţie P ki <strong>de</strong> ordin m în planul (k, i) astfel încât<br />

(P ki x) l =<br />

{ xl , pentru l ≠ k, i<br />

r, pentru l = k<br />

0, pentru l = i.<br />

(3.24)<br />

(3.25)<br />

Demonstraţia este imediată observând că avem<br />

[ ] [ ] [<br />

c s xk r<br />

=<br />

−s c x i 0<br />

]<br />

, (3.26)<br />

precum şi c 2 + s 2 = 1.<br />

Precizând (<strong>de</strong>ocamdată arbitrar) semnul lui r, relaţiile (3.23) şi (3.24) conduc<br />

la următorul algoritm <strong>de</strong> <strong>calcul</strong> al rotaţiei P ki cu proprietatea cerută.<br />

Algoritmul 3.4 (Se dau i ≠ k ∈ 1 : m şi un vector x ∈ R m . Se<br />

<strong>calcul</strong>ează o rotaţie P ki astfel încât (P ki x) i = 0).<br />

1. r = √ x 2 k + x2 i<br />

2. c = x k /r, s = x i /r<br />

% vectorul transformat<br />

3. x k = r; x i = 0<br />

Numărul <strong>de</strong> operaţii necesar este N op = 6.<br />

Semnificaţia geometrică a rotaţiei P ki <strong>calcul</strong>ate <strong>de</strong> algoritmul 3.4 apare în figura<br />

3.3, un<strong>de</strong> m = 2, k = 1, i = 2.<br />

Implementarea algoritmului 3.4 ţine seama <strong>de</strong> următoarele consi<strong>de</strong>rente.<br />

1 ◦ . La pasul 1 se recomandă scalarea componentelor x k şi x i , <strong>de</strong> exemplu prin<br />

împărţire la N = |x k | + |x i |.<br />

2 ◦ . Dacă N = 0 sau r = 0, i.e. ambele componente x k şi x i sunt <strong>de</strong>ja nule,<br />

atunci se ia P ki = I m , punând c = 1, s = 0.<br />

3 ◦ . Semnul lui r se alege astfel încât r şi cel mai mare (în valoare absolută)<br />

dintre cele două numere x k şi x i să aibă acelaşi semn.<br />

Această convenţie, adoptată în BLAS, nu este importantă în sine, dar are avantajul<br />

<strong>de</strong> a permite reconstrucţia <strong>numeric</strong> stabilă a parametrilor c, s, dintr-un singur<br />

număr z. (Desigur, în acest fel <strong>de</strong>vine posibilă memorarea rotaţiei P ki pe poziţia<br />

elementului x i anulat prin aplicarea transformării la pasul 3). Precizările necesare<br />

vor fi făcute mai <strong>de</strong>parte.<br />

Observaţia 3.2 Reţinem că, <strong>de</strong>şi rotaţiile sunt transformări consi<strong>de</strong>rabil mai<br />

simple <strong>de</strong>cât reflectorii, ele sunt în acelaşi timp şi mai puţin eficiente <strong>de</strong>cât aceştia,<br />

întrucât o rotaţie permite anularea unei singure componente a vectorului transformat.<br />

(Tocmai <strong>de</strong> aceea rotaţiile se utilizează mai ales în probleme cu date structurate,<br />

asupra cărora ele au un efect <strong>de</strong> ”rezoluţie fină” a zerourilor.)<br />

În caz <strong>de</strong> nevoie, un efect similar cu al reflectorului U k <strong>de</strong>terminat <strong>de</strong> algoritmul<br />

3.2 poate fi obţinut utilizând o secvenţă <strong>de</strong> rotaţii, e.g.<br />


136 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

2<br />

✻<br />

x 2<br />

x 1<br />

r<br />

✚ ✚✚✚✚✚✚✚✚❃x<br />

✲<br />

P 12 x<br />

Fig. 3.3: Efectul aplicării unei rotaţii P 12 asupra unui vector x ∈ R 2<br />

✲<br />

1<br />

P k = P km . . . P k,k+2 P k,k+1 , (3.27)<br />

în care rotaţiile P ki se <strong>de</strong>termină succesiv (aplicând algoritmul 3.4) pentru a anula<br />

componentele corespunzătoare x i , i = k + 1 : m. (Scrierea algoritmului <strong>de</strong> <strong>calcul</strong><br />

este propusă ca exerciţiu.) Alternativ, în acelaşi scop poate fi utilizată secvenţa<br />

P k = P k,k+1 P k+1,k+2 . . . P m−1,m , (3.28)<br />

în care rotaţiile P ki anulează aceleaşi componente în ordine inversă, adică x i ,<br />

i = m : −1 : k + 1.<br />

Menţionăm că în practică se utilizează frecvent secvenţe <strong>de</strong> rotaţii disjuncte care<br />

au proprietăţi <strong>numeric</strong>e mai bune, vezi problemele 3.14 şi 3.22 8 .<br />

♦<br />

Proceduri <strong>de</strong> <strong>calcul</strong> cu rotaţii<br />

În continuare dăm câteva indicaţii privind organizarea procedurală a <strong>calcul</strong>elor cu<br />

rotaţii 9 . Deoarece partea activă a unei rotaţii P ki <strong>de</strong> forma (3.22) este evi<strong>de</strong>nt o<br />

rotaţie plană ce acţionează asupra unui vector x ∈ R 2 , în continuare vom consi<strong>de</strong>ra<br />

m = 2 şi vom nota P 12 = P.<br />

AA. Fie x ∈ R 2 un vector dat. Generarea unei rotaţii P astfel încât (Px) 2 = 0,<br />

adică [ ][ ] [ ]<br />

c s x1 r<br />

= , (3.29)<br />

−s c x 2 0<br />

se face ţinând seama <strong>de</strong> indicaţiile <strong>de</strong> implementare ce însoţesc algoritmul 3.4.<br />

ROTG<br />

% Se dă x ∈ R 2 . Se generează o rotaţie P cu proprietatea<br />

(3.29) şi se aplică transformarea. Totodată, pe poziţia elementului<br />

anulat x 2 se returnează scalarul z, pe baza căruia<br />

este posibilă reconstrucţia <strong>numeric</strong> stabilă a parametrilor<br />

c, s.<br />

1. r = ‖x‖<br />

2. Dacă r = 0 atunci<br />

8 Două rotaţii P ki , P lj se numesc disjuncte dacă toţi indicii sunt diferiţi.<br />

9 Subliniem că, întrucât operează asupra unor vectori cu două componente, procedurile <strong>de</strong> <strong>calcul</strong><br />

cu rotaţii sunt <strong>de</strong> tip scalar.


3.1.<br />

TRANSFORMĂRI ORTOGONALE 137<br />

1. c = 1, s = 0<br />

altfel<br />

2. Dacă |x 2 | ≥ |x 1 | atunci<br />

1. r ← sgn(x 2 )r<br />

altfel<br />

2. r ← sgn(x 1 )r<br />

3. c = x 1 /r, s = x 2 /r<br />

4. x 1 = r<br />

% <strong>calcul</strong>ul lui z<br />

5. Dacă c = 0 atunci<br />

1. z = 1<br />

altfel dacă |x 2 | ≥ |x 1 | atunci<br />

2. z = 1/c<br />

altfel<br />

3. z = s<br />

6. x 2 = z<br />

Modul <strong>de</strong> apel al procedurii <strong>de</strong> generare este [c, s, x 1 , x 2 ] = ROTG(x 1 , x 2 ).<br />

AA. Fie acum P o rotaţie dată, generată <strong>de</strong> ROTG, iar x ∈ R 2 un vector<br />

arbitrar. Aplicarea transformării<br />

x ← Px (3.30)<br />

se face direct numai dacă parametrii c, s sunt disponibili ca atare; în caz contrar, în<br />

prealabil are loc reconstrucţia lor pe baza scalarului z, utilizând secvenţa următoare.


138 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Transformare Funcţie Mod <strong>de</strong> apel Apel ”rapid” Obs.<br />

a ← r<br />

Rotaţie Px = re 1 [c, s, a, b] = ROTG(a, b) [c, s] = ROTG(a, b)<br />

b ← z<br />

= [(c, s) ] x ← Px<br />

a<br />

x =<br />

b<br />

x ← P T x<br />

P <strong>de</strong>f<br />

[a, b] = ROT(c, s, a, b)<br />

[a, b] = ROT(c, −s, a, b)<br />

ROT(c, s, a, b)<br />

ROT(c, −s, a, b)<br />

Tabelul 3.2: Proceduri <strong>de</strong> <strong>calcul</strong> cu rotaţii. (N.B. Semnificaţia lui z este precizată<br />

în text)<br />

% Reconstrucţia perechii (c, s).<br />

1. Dacă z = 1 atunci<br />

1. c = 0, s = 1<br />

altfel dacă |z| > 1 atunci<br />

2. c = 1/z, s = √ 1 − c 2<br />

altfel<br />

3. s = z, c = √ 1 − s 2<br />

Procedura <strong>de</strong> transformare propriu-zisă coinci<strong>de</strong> în esenţă cu algoritmul 3.3.<br />

ROT<br />

% Se aplică transformarea x ← Px.<br />

1. t = x 1<br />

2. x 1 ← ct + sx 2<br />

3. x 2 ← cx 2 − st<br />

Modul <strong>de</strong> apel al procedurii este [x 1 , x 2 ] = ROT(c, s, x 1 , x 2 ).<br />

Procedurile <strong>de</strong> <strong>calcul</strong> cu rotaţii sunt prezentate sintetic în tabelul 3.2. (Şi în<br />

cazul rotaţiilor, ca şi al reflectorilor, mai <strong>de</strong>parte vom utiliza notaţiile procedurale<br />

prescurtate indicate în penultima coloană a tabelului.)<br />

3.2 Transformări unitare<br />

În această secţiune vom prezenta principalele transformări unitare utilizate în <strong>calcul</strong>ele<br />

cu matrice complexe. Având în ve<strong>de</strong>re că proprietăţile structurale ale acestor<br />

transformări sunt aceleaşi cu proprietăţile similare ale transformărilor ortogonale<br />

<strong>de</strong>scrise în secţiunea anterioară, expunerea va fi orientată în principal asupra aspectelor<br />

procedurale specifice.<br />

3.2.1 Reflectori complecşi<br />

Consi<strong>de</strong>răm spaţiul complex C m cu produsul scalar (x, y) = y H x şi norma euclidiană<br />

m∑<br />

‖x‖ = (x H x) 1/2 = ( |x i | 2 ) 1/2 .<br />

i=1


3.2.<br />

TRANSFORMĂRI UNITARE 139<br />

Im ✻<br />

Γ<br />

✬✩ ✘✾<br />

0 <br />

τ = 1<br />

✫✪β = 2<br />

‖u‖ 2 Re<br />

✲<br />

Fig. 3.4: Cercul Γ în planul complex<br />

Amintim că o matrice Q ∈ C m×m se numeşte unitară dacă Q H Q = I m .<br />

Fie u ∈ C m un vector Househol<strong>de</strong>r, u ≠ 0. Consi<strong>de</strong>răm matrice complexe <strong>de</strong><br />

forma<br />

not<br />

U 1 = Q H 1 = I m − uuH<br />

β , (3.31)<br />

respectiv<br />

Q 1 = I m − τuu H , (3.32)<br />

un<strong>de</strong> β şi τ sunt doi parametri legaţi prin relaţia τ = ¯β −1 . Avem<br />

Q H 1 Q 1 = (I m − ¯τuu H )(I m − τuu H ) = I m − (τ + ¯τ)uu H + |τ| 2 u(u H u)u H ,<br />

<strong>de</strong>ci matricea Q 1 este unitară dacă şi numai dacă<br />

2Reτ = |τ| 2 ‖u‖ 2 , (3.33)<br />

i.e. scalarul τ aparţine cercului Γ din planul complex care trece prin origine şi are<br />

raza egală cu 1/‖u‖ 2 (vezi figura 3.4). Pe <strong>de</strong> altă parte, matricea Q 1 este hermitică<br />

dacă şi numai dacă τ ∈ R. Asociind cele două proprietăţi, pentru τ = 0 obţinem<br />

Q 1 = I m , iar pentru<br />

τ = 1 β = 2<br />

‖u‖ 2, (3.34)<br />

din (3.31) sau (3.32) obţinem reflectorii hermitici care constituie generalizarea directă<br />

a reflectorilor reali din (3.8).<br />

Pentru toate celelalte valori τ ∈ Γ (τ ≠ 0 şi τ ≠ 2/‖u‖ 2 ), matricele <strong>de</strong> forma<br />

(3.32) sunt unitare şi <strong>de</strong> aceea se numesc (abuziv dar comod) reflectori complecşi.<br />

Subliniem că, în această accepţiune mai largă, reflectorii complecşi nu sunt hermitici,<br />

<strong>de</strong>ci necesită o manipulare relativ mai atentă <strong>de</strong>cât omologii lor reali (acum<br />

not<br />

U 1 = Q H 1 ≠ Q 1 !).<br />

AA. Fie x ∈ C m un vector dat. Vom <strong>de</strong>termina un reflector Q 1 astfel încât<br />

(Q H 1 x) i = 0, i = 2 : m, i.e.<br />

Q H 1 x = −σe 1, (3.35)<br />

un<strong>de</strong> σ ∈ C este un scalar încă ne<strong>de</strong>terminat. Deoarece matricea Q 1 este unitară<br />

trebuie să avem ‖Q H 1 x‖ = ‖x‖, <strong>de</strong>ci modulul lui σ este fixat, mai precis |σ| = ‖x‖.<br />

Din consi<strong>de</strong>rente <strong>de</strong> stabilitate <strong>numeric</strong>ă, vom alege<br />

σ = x 1<br />

‖x‖ (3.36)<br />

|x 1 |


140 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

sau<br />

(Reţinem că în primul caz σ ∈ C, iar în al doilea σ ∈ R.)<br />

În continuare scriem ca <strong>de</strong> obicei<br />

un<strong>de</strong><br />

σ = sgn(Rex 1 )‖x‖. (3.37)<br />

Q H 1 x = (I m − uuH )x = x − νu, (3.38)<br />

β<br />

ν = uH x<br />

β . (3.39)<br />

Prin urmare, relaţia (3.35) are loc dacă şi numai dacă u = (x + σe 1 )/ν, sau pe<br />

componente<br />

u 1 = x 1 + σ<br />

ν<br />

De asemenea, trebuie să avem<br />

β = uH x<br />

ν<br />

; u i = x i<br />

, i = 2 : m. (3.40)<br />

ν<br />

= (xH + ¯σe T 1 )x<br />

|ν| 2 = ‖x‖2 + ¯σx 1<br />

|ν| 2 ,<br />

un<strong>de</strong>, conform celor spuse mai sus, ‖x‖ 2 = |σ| 2 , <strong>de</strong>ci<br />

β = ¯σ¯ν<br />

x 1 + σ<br />

. (3.41)<br />

ν<br />

Pentru a <strong>de</strong>termina complet reflectorul U 1 cu proprietatea (3.35) rămâne să<br />

precizăm valoarea parametrului <strong>de</strong> scalare ν ≠ 0 din (3.40) şi (3.41).<br />

a) Dacă luăm ν = 1 şi alegem σ din (3.36) (sau din (3.37)), atunci obţinem<br />

analogul complex al algoritmului 3.1.<br />

b) Pe <strong>de</strong> altă parte, dacă dorim simplificarea relaţiei (3.41), atunci sunt posibile<br />

două alegeri, i.e. ν = σ şi ν = x 1 + σ, care conduc la<br />

{<br />

u 1 = 1 + x 1<br />

σ ; u i = x i<br />

σ , i = 2 : m<br />

(3.42)<br />

β = u 1<br />

şi respectiv ⎧<br />

⎪⎨<br />

⎪ ⎩<br />

u 1 = 1; u i = x i<br />

x 1 + σ , i = 2 : m<br />

τ = 1 + x 1<br />

σ , (β = 1¯τ ). (3.43)<br />

În practica <strong>numeric</strong>ă actuală se întâlnesc două versiuni <strong>de</strong> implementare a relaţiilor<br />

<strong>de</strong> <strong>calcul</strong> stabilite mai sus.<br />

• În LINPACK [XIII] se asociază relaţiile (3.36) şi (3.42). În consecinţă, parametrul<br />

β = u 1 rezultă real, <strong>de</strong>ci reflectorul obţinut este hermitic, Q H 1 = Q 1 . În<br />

schimb, prima componentă a vectorului transformat<br />

x 1 ← −σ


3.2.<br />

TRANSFORMĂRI UNITARE 141<br />

este complexă. Procedura <strong>de</strong> generare a reflectorului hermitic Q 1 diferă <strong>de</strong> procedura<br />

reală RFG numai prin modul <strong>de</strong> <strong>calcul</strong> al lui σ, vezi (3.36).<br />

•• În LAPACK [XV] se asociază relaţiile (3.37) şi (3.43). Instrumentul fundamental<br />

<strong>de</strong> lucru este acum reflectorul complex Q 1 , în care parametrul τ rezultă<br />

complex; în schimb faptul că u 1 = 1 şi σ ∈ R poate fi exploatat avantajos în multe<br />

situaţii concrete. Procedura <strong>de</strong> generare a reflectorului Q 1 este următoarea.<br />

CRFG<br />

% Se dă x ∈ C m . Se generează un reflector complex Q 1 cu proprietatea<br />

(3.35) şi se aplică transformarea. Componentele<br />

u i , i = 2 : m, ale vectorului Househol<strong>de</strong>r u se memorează<br />

pe poziţiile corespunzătoare din x. La aplicarea ulterioară<br />

a transformării se consi<strong>de</strong>ră u 1 = 1.<br />

1. τ = 0<br />

2. Dacă m > 1 atunci<br />

1. σ = ‖x‖<br />

2. Dacă σ ≠ 0 atunci<br />

1. Dacă Re(x 1 ) ≠ 0 atunci σ ← sgn(Rex 1 )σ<br />

2. x i ← u i = x i /(x 1 + σ), pentru i = 1 : m<br />

3. τ ← (x 1 + σ)/σ<br />

4. x 1 ← −σ<br />

Comentarii. Calculul normei euclidiene la pasul 2.1 se poate face utilizând funcţia<br />

complexă CNRM2 din BLAS 1.<br />

♦<br />

AA. Fie acum x ∈ C m un vector arbitrar, iar Q 1 un reflector dat. Aplicarea<br />

transformărilor<br />

x ← Q H 1 x, x ← Q 1x (3.44)<br />

se face ţinând seama <strong>de</strong> relaţiile (3.38), (3.39) precum şi <strong>de</strong> tipul reflectorului consi<strong>de</strong>rat.<br />

• Dacă Q 1 este un reflector hermitic, atunci cele două transformări (3.44) coincid,<br />

iar procedura corespunzătoare diferă <strong>de</strong> procedura reală RF numai prin utilizarea<br />

produsului scalar complex la pasul 1.1, vezi (3.39).<br />

•• Dacă Q 1 este un reflector complex, generat <strong>de</strong> procedura CRFG, atunci se<br />

ţine seama că prima componentă u 1 = 1 a vectorului Househol<strong>de</strong>r nu este memorată<br />

ca atare. Scrierea procedurii <strong>de</strong> transformare corespunzătoare primei relaţii (3.44),<br />

<strong>de</strong> exemplu notată CRF, este propusă ca exerciţiu.<br />

Procedurile <strong>de</strong> <strong>calcul</strong> cu reflectori complecşi sunt prezentate în tabelul 3.3 10 .<br />

La fel ca în cazul real, tipic procedura CRFG se utilizează pentru a introduce<br />

zerouri într-o anumită coloană a unei matrice A, iar procedura CRF se utilizează<br />

pentru a transforma în mod corespunzător celelalte coloane.<br />

Presupunând că tabloul A e dimensionat a<strong>de</strong>cvat, în general există patru tipuri<br />

<strong>de</strong> transformări posibile, două la stânga (QA şi Q H A) şi două la dreapta (AQ şi<br />

AQ H ). În primul caz A se partiţionează pe coloane şi fiecărei coloane i se aplică<br />

11<br />

transformarea corespunzătoare. În al doilea caz A se partiţionează pe linii.<br />

10 Procedurile <strong>de</strong> <strong>calcul</strong> cu reflectori complecşi modificaţi, e.g. CmRFG etc. se scriu similar cu<br />

cazul real. Detaliile sunt lăsate în sarcina cititorului interesat.<br />

11 Pentru a acoperi toate aceste situaţii cu o singură procedură CLARF, în LAPACK (ca şi în


142 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Transformare Funcţie Mod <strong>de</strong> apel Apel ”rapid” Obs.<br />

Reflector<br />

Q<br />

complex<br />

1 x = −σe τ ∈ C<br />

1 [u, τ, x] = CRFG(x) τ = CRFG(x)<br />

σ ∈ R<br />

<strong>de</strong>f<br />

Q 1 = (τ, u)<br />

x ∈ C m<br />

x ← Q H 1 x<br />

x ← Q 1 x<br />

x = CRF(u, τ, x)<br />

x = CRF(u, ¯τ, x)<br />

CRF(u, τ, x)<br />

CRF(u, ¯τ, x)<br />

Tabelul 3.3: Proceduri <strong>de</strong> <strong>calcul</strong> cu reflectori complecşi. Procedurile <strong>de</strong> <strong>calcul</strong> cu<br />

reflectori hermitici sunt similare cu RFG şi RF<br />

3.2.2 Rotaţii complexe<br />

Consi<strong>de</strong>răm spaţiul complex C 2 cu norma euclidiană ‖x‖ = (|x 1 | 2 + |x 2 | 2 ) 1/2 .<br />

O rotaţie complexă este o matrice <strong>de</strong> forma<br />

[ ]<br />

c s<br />

P = , (3.45)<br />

−¯s ¯c<br />

în care parametrii c, s satisfac relaţia<br />

|c| 2 + |s| 2 = 1. (3.46)<br />

Se verifică uşor că matricea P este unitară, i.e. P H P = I 2 .<br />

AA. Fie x ∈ C 2 un vector dat. Vom <strong>de</strong>termina o rotaţie complexă P astfel<br />

încât [ ][ ] [ ]<br />

c s x1 r<br />

= , (3.47)<br />

−¯s ¯c x 2 0<br />

un<strong>de</strong> r este un scalar astfel încât |r| = ‖x‖. O analiză simplă arată că aici, ca şi în<br />

cazul reflectorilor complecşi, sunt posibile două opţiuni.<br />

• Putem alege r complex, e.g.<br />

şi în acest caz obţinem<br />

r = x 1<br />

‖x‖, (3.48)<br />

|x 1 |<br />

c = |x 1|<br />

‖x‖ , s = x 1<br />

|x 1 |<br />

¯x 2<br />

‖x‖ , (3.49)<br />

<strong>de</strong>ci parametrul c rezultă real pozitiv. Procedura <strong>de</strong> <strong>calcul</strong> este următoarea.<br />

CROTG<br />

% Se dă x ∈ R 2 . Se generează o rotaţie complexă P cu proprietatea<br />

(3.47) şi se efectuează transformarea.<br />

1. Dacă |x 1 | = 0 atunci<br />

1. c = 0, s = 1<br />

BLAS3) se utilizează opţiunile TRANS şi SIDE, vezi secţiunea 1.11. Subliniem că urmărirea acestor<br />

<strong>de</strong>talii, aparent pur tehnice, este esenţială pentru asigurarea corectitudinii şi optimizarea <strong>calcul</strong>atorie<br />

a <strong>algoritmi</strong>lor <strong>de</strong> <strong>calcul</strong> obţinuţi.


3.3. TRIANGULARIZAREA ORTOGONALĂ 143<br />

Transformare Funcţie Mod <strong>de</strong> apel Apel ”rapid” Obs.<br />

Rotaţie<br />

c ∈ R<br />

Px = re<br />

complexă 1 [c, s, a, b] = CROTG(a, b) [c, s] = CROTG(a, b)<br />

r ∈ C<br />

= [(c, s) ] x ← Px<br />

a<br />

x =<br />

b<br />

x ← P H x<br />

P <strong>de</strong>f<br />

[a, b] = CROT(c, s, a, b)<br />

[a, b] = CROT(¯c, −s, a, b)<br />

CROT(c, s, a, b)<br />

CROT(¯c, −s, a, b)<br />

Tabelul 3.4: Proceduri <strong>de</strong> <strong>calcul</strong> cu rotaţii complexe<br />

2. x 1 ← r = x 2 , x 2 = 0<br />

altfel<br />

3. α = x 1 / |x 1 |<br />

4. ρ = ‖x‖<br />

5. c = |x 1 | / ρ, s = α¯x 2 / ρ<br />

6. x 1 ← r = αρ, x 2 = 0<br />

•• Alternativ, putem alege r real, <strong>de</strong> exemplu<br />

şi în acest caz ambii parametri<br />

r = sgn(Rex 1 )‖x‖ (3.50)<br />

c = ¯x 1<br />

r , s = ¯x 2<br />

r<br />

(3.51)<br />

rezultă complecşi. (Menţionăm că în practică se întâlnesc ambele opţiuni (3.48) şi<br />

(3.50), implementate sub diverse forme relativ sofisticate.)<br />

AA. Fie acum P o rotaţie complexă dată, generată <strong>de</strong> CROTG, iar x ∈ C 2 un<br />

vector arbitrar. Procedura <strong>de</strong> transformare<br />

x ← Px, (3.52)<br />

<strong>de</strong> exemplu notată CROT, se scrie cu uşurinţă în maniera algoritmului 3.3, dar,<br />

<strong>de</strong>sigur, ţinând seama <strong>de</strong> forma actuală (3.45) a lui P.<br />

Procedurile <strong>de</strong> <strong>calcul</strong> cu rotaţii complexe sunt prezentate sintetic în tabelul 3.4.<br />

3.3 Triangularizarea ortogonală<br />

În această secţiune vom <strong>de</strong>scrie principalele proceduri <strong>de</strong> triangularizare a unei<br />

matrice A ∈ C m×n prin transformări unitare <strong>de</strong> echivalenţă la stânga. În cazul real<br />

A ∈ R m×n , în acelaşi scop se utilizează transformări ortogonale. Pentru concizia<br />

expunerii vom consi<strong>de</strong>ra ambele cazuri în paralel.<br />

Teorema 3.1 Oricare ar fi A ∈ C m×n , există o matrice unitară U not<br />

= Q H ∈ C m×m<br />

astfel încât matricea<br />

UA = R, respectiv Q H A = R (3.53)


144 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

este superior triunghiulară.<br />

În cazul real A ∈ R m×n , matricea <strong>de</strong> transformare U = Q T poate fi aleasă reală<br />

şi ortogonală, <strong>de</strong>ci R rezultă reală.<br />

Pe scurt, orice matrice este unitar echivalentă (la stânga) cu o matrice superior<br />

triunghiulară. A doua relaţie arată că A poate fi scrisă sub forma unui produs<br />

A = QR, un<strong>de</strong> Q este unitară, iar R este superior triunghiulară. În <strong>calcul</strong>ul <strong>numeric</strong>,<br />

această relaţie se numeşte factorizare QR, <strong>de</strong> aceea procedurile <strong>de</strong> <strong>calcul</strong> stabilite<br />

pe baza relaţiei fundamentale (3.53) vor fi notate cu sigla QR. (Asupra factorizării<br />

QR vom reveni pe larg în secţiunea următoare.)<br />

Demonstraţia va fi constructivă, conducând la o procedură <strong>de</strong> triangularizare<br />

ortogonală a matricei A utilizând reflectori sau rotaţii. Pentru precizare, în cele ce<br />

urmează alegem prima posibilitate.<br />

În cazul real, ne referim la faptele stabilite în secţiunea 3.1.1 şi pentru claritate<br />

consi<strong>de</strong>răm succesiv două situaţii cu semnificaţii structurale distincte.<br />

În cazul m > n matricea <strong>de</strong> transformare va fi un produs <strong>de</strong> reflectori, i.e.<br />

U = Q T = U n . . .U 2 U 1 ,<br />

un<strong>de</strong> reflectorii U k ce se <strong>de</strong>termină prin <strong>meto<strong>de</strong></strong>le cunoscute pentru a introduce<br />

zerourile necesare în coloanele corespunzătoare a k , k = 1 : n, ale matricei A.<br />

În consecinţă, procedura <strong>de</strong> triangularizare are n etape. Notăm A 1 = A, un<strong>de</strong><br />

A = [a 1 a 2 . . . a n ].<br />

Etapa 1. Dacă elementele a i1 , i = 2 : m, nu sunt toate nule, atunci conform<br />

propoziţiei 3.1, există un reflector U 1 ∈ R m×m <strong>de</strong> ordinul m şi indice 1, astfel încât<br />

(U 1 a 1 ) i = 0, i = 2 : m.<br />

În virtutea acestui fapt, matricea transformată<br />

⎡<br />

A 2 = U 1 A 1 = [U 1 a 1 U 1 a 2 . . . U 1 a n ] =<br />

⎢<br />

⎣<br />

r 11 r 12 . . . r 1n<br />

0 a (2)<br />

22 . . . a (2)<br />

2n<br />

0 a (2)<br />

32 . . .<br />

. . .<br />

a (2)<br />

3n<br />

0 a (2)<br />

m2 . . . a (2)<br />

mn<br />

⎤<br />

⎥<br />

⎦<br />

are toate elementele subdiagonale ale primei coloane egale cu zero, i.e. este superior<br />

triunghiulară în prima coloană. Dacă a i1 = 0 pentru i = 2 : m, atunci luăm<br />

pur şi simplu U 1 = I m şi trecem la etapa următoare. (Matricea unitate I m este<br />

ortogonală !)<br />

Etapa k, k = 2 : n. Presupunem că după <strong>de</strong>sfăşurarea primelor k − 1 etape ale<br />

procedurii am obţinut matricea<br />

A k = U k−1 . . .U 2 U 1 A


3.3. TRIANGULARIZAREA ORTOGONALĂ 145<br />

superior triunghiulară în primele k − 1 coloane, i.e.<br />

A k = [a (k)<br />

1 . . . a (k)<br />

k<br />

⎡<br />

. . . a (k)<br />

n ] = ⎢<br />

⎣<br />

r 11 r 12 . . . r 1,k−1 r 1k . . . r 1n<br />

r 22 . . . r 2,k−1 r 2k . . . r 2n<br />

. .. . . .<br />

r k−1,k−1 r k−1,k<br />

. . . r k−1,n<br />

.<br />

⎥<br />

. ⎦<br />

a (k)<br />

kk<br />

. . . a (k)<br />

kn<br />

0 a (k)<br />

k+1,k . . . a(k) k+1,n<br />

.<br />

.<br />

a (k)<br />

mk<br />

. . . a (k)<br />

mn<br />

Acum, dacă elementele a (k)<br />

ik<br />

, i = k + 1 : m, nu sunt toate nule, atunci există un<br />

reflector U k ∈ R m×m <strong>de</strong> ordinul m şi indice k, astfel încât<br />

(U k a (k)<br />

k ) i = 0, i = k + 1 : m.<br />

(Altfel, luăm U k = I m şi trecem la etapa următoare.) Tinând cont <strong>de</strong> faptul că<br />

orice reflector <strong>de</strong> indice k nu modifică un vector ale cărui ultime m −k+1 elemente<br />

sunt nule (vezi (3.11), un<strong>de</strong> ν = 0), rezultă că matricea<br />

A k+1 = U k A k = [U k a (k)<br />

1 . . . U k a (k)<br />

k<br />

. . . U k a (k)<br />

n ]<br />

are primele k − 1 coloane nemodificate, iar în coloana k elementele subdiagonale<br />

sunt nule; prin urmare A k+1 este superior triunghiulară în primele k coloane. De<br />

asemenea, <strong>de</strong>oarece reflectorul este <strong>de</strong> indice k, primele k − 1 linii ale lui A k rămân<br />

nemodificate.<br />

Aşadar, procedura <strong>de</strong> anulare a elementelor subdiagonale poate fi iniţializată,<br />

ca în etapa 1, şi, o dată pornită, poate fi continuată, ca în etapa k. Astfel, când<br />

m > n, după n etape, obţinem matricea<br />

R <strong>de</strong>f<br />

= A n+1 = U n U n−1 . . . U 2 U 1 A =<br />

un<strong>de</strong> R ′ ∈ R n×n este superior triunghiulară <strong>de</strong> ordin n.<br />

[<br />

R<br />

′<br />

0<br />

⎤<br />

]<br />

, (3.54)<br />

În cazul m ≤ n, procedând similar, după m−1 etape obţinem matricea superior<br />

trapezoidală<br />

R <strong>de</strong>f<br />

= A m = U m−1 . . .U 2 U 1 A = [ R ′ S ], (3.55)<br />

un<strong>de</strong> R ′ ∈ R m×m este superior triunghiulară <strong>de</strong> ordin m, iar S ∈ R m×(n−m) este<br />

un bloc dreptunghiular fără particularităţi <strong>de</strong> structură.<br />

Demonstraţia teoremei în cazul real este încheiată.<br />

În cazul complex raţionamentul este i<strong>de</strong>ntic, iar <strong>de</strong>taliile pot fi completate cu<br />

uşurinţă <strong>de</strong> cititorul interesat prin referire la secţiunea 3.2.1.<br />

♦<br />

Observaţia 3.3 Atât enunţul cât şi <strong>de</strong>monstraţia teoremei 3.1 au un caracter<br />

procedural, în sensul că matricea R rezultată în urma procesului <strong>de</strong> triangularizare


146 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

nu trebuie să fie neapărat superior triunghiulară. De exemplu, în cazul m = n, matricea<br />

A poate fi adusă la forma inferior triunghiulară utilizând reflectorii modificaţi<br />

din observaţia 3.1. Această posibilitate va fi discutată în finalul secţiunii următoare.<br />

De asemenea, transformările unitare <strong>de</strong> echivalenţă pot fi aplicate la dreapta matricei<br />

A, după cum vom arăta în secţiunea 3.6. În toate cazurile, tehnica <strong>de</strong> lucru este<br />

aceeaşi, iar alegerea procedurii <strong>de</strong> triangularizare a<strong>de</strong>cvate este dictată <strong>de</strong> structura<br />

problemei consi<strong>de</strong>rate.<br />

♦<br />

A. Proceduri <strong>de</strong> triangularizare cu reflectori<br />

Procedura <strong>de</strong> triangularizare ortogonală <strong>de</strong>gajată pe parcursul <strong>de</strong>monstraţiei <strong>de</strong><br />

mai sus este similară cu procedura <strong>de</strong> eliminare gaussiană, cunoscută din capitolul<br />

anterior, şi, la fel ca aceasta, se poate <strong>de</strong>sfăşura pe loc în tabloul A, astfel încât în<br />

final matricea R să fie memorată în triunghiul superior al lui A.<br />

În cazul real, relaţiile (3.54) şi (3.55) conduc la următoarea schemă <strong>de</strong> <strong>calcul</strong>.<br />

QR RF<br />

% Triangularizarea matricei A utilizând reflectori<br />

1. Pentru k = 1 : min (m − 1, n)<br />

1. Se <strong>de</strong>termină U k a.î. (U k A) ik = 0, i = k + 1 : m<br />

2. A ← U k A.<br />

Dacă matricea A este monică, i.e. are coloane in<strong>de</strong>pen<strong>de</strong>nte, atunci la fiecare<br />

etapă elementele a ik , i = k : m, ale matricei curente A nu sunt toate nule. În<br />

consecinţă, pentru a <strong>de</strong>termina reflectorul U k (adică vectorul Househol<strong>de</strong>r u k şi<br />

scalarul β k ), la pasul 1.1 se utilizează algoritmul 3.2, aplicat vectorului x = A(:, k).<br />

(Componentele nenule ale vectorilor Househol<strong>de</strong>r u k vor fi notate u ik , i = k : m.)<br />

Pentru <strong>calcul</strong>ul transformării <strong>de</strong> la pasul 1.2 se utilizează algoritmul 3.1 aplicat<br />

vectorilor x = A(:, j), j = k + 1 : n. Combinând i<strong>de</strong>ile <strong>de</strong> mai sus, rezultă imediat<br />

% Versiunea primară a algoritmului <strong>de</strong> triangularizare cu reflectori<br />

1. Pentru k = 1 : min (m − 1, n)<br />

% se <strong>de</strong>termină transformarea U k<br />

) 1/2<br />

i=k a2 ik<br />

1. σ = sgn(a kk ) · (∑ m<br />

2. u kk = a kk + σ; u ik = a ik , pentru i = k + 1 : m<br />

3. β k = σu kk<br />

% se aplică U k<br />

4. Pentru j = k + 1 : n<br />

1. ν = ( ∑ m<br />

i=k u ika ij )/β k<br />

2. a ij ← a ij − νu ik , pentru i = k : m<br />

% coloana k<br />

5. a kk = −σ; a ik = 0, pentru i = k + 1 : m<br />

Comentarii. Algoritmul necesită aproximativ N QR = 2(mn 2 − n 3 /3) operaţii,<br />

care în principal se consumă la pasul 1.4 pentru actualizarea coloanelor A(k : m, j),<br />

j = k + 1 : n, ale matricei ”rămase”. În particular, dacă m = n, atunci<br />

N QR = (4/3)n 3 este dublu faţă <strong>de</strong> algoritmul <strong>de</strong> eliminare gaussiană. ♦


3.3. TRIANGULARIZAREA ORTOGONALĂ 147<br />

În general, fie acum A ∈ C m×n o matrice oarecare. Pentru uniformizarea scrierii,<br />

<strong>de</strong>f<br />

în cazul m ≤ n completăm şirul <strong>de</strong> transformări din (3.55) cu U m = I m . De asemenea,<br />

notăm s = min(m, n), precum şi U k = Q H k , un<strong>de</strong> Q k sunt reflectorii complecşi<br />

(în particular hermitici) utilizaţi pentru anularea elementelor subdiagonale la<br />

etapele k = 1 : s. Cu aceste notaţii, relaţiile (3.54) şi (3.55) pot fi scrise împreună<br />

sub forma (3.53), un<strong>de</strong><br />

U = Q H = Q H s . . .QH 2 QH 1 , (3.56)<br />

iar schema <strong>de</strong> triangularizare <strong>de</strong>vine<br />

QR<br />

% Schemă generală <strong>de</strong> triangularizare QR<br />

1. Pentru k = 1 : s<br />

1. Se generează Q H k a.î. (QH k A) ik = 0, i = k + 1 : m<br />

2. A ← Q H k A.<br />

• În cazul real sau în cazul utilizării reflectorilor hermitici <strong>de</strong> forma (3.31) avem<br />

Q H k = Q k, iar implementarea schemei QR are la bază procedurile RFG şi RF din<br />

tabelul 3.1. Componentele u ik , i = k + 1 : m, ale vectorilor Househol<strong>de</strong>r u k se<br />

memorează natural pe poziţiile elementelor anulate, iar scalarii β k se memorează<br />

într-un vector suplimentar, ca în următoarea diagramă corespunzătoare situaţiei <strong>de</strong><br />

după pasul k<br />

⎡<br />

⎤<br />

r 11 r 12 . . . r 1k r 1,k+1 . . . r 1n<br />

u 21 r 22 . . . r 2k r 2,k+1 . . . r 2n<br />

. . .. . . . u k1 u k2 . . . r kk r k,k+1 . . . r kn<br />

u k+1,1 u k+1,2 . . . u k+1,k a (k+1)<br />

k+1,k+1 . . . a(k+1) k+1,n<br />

⎢<br />

⎥<br />

⎣ . . . . . ⎦<br />

u m1 u m2 . . . u mk a (k+1)<br />

m,k+1<br />

. . . a (k+1)<br />

mn<br />

[<br />

]<br />

β 1 β 2 . . . β k<br />

Algoritmul rezultat se redactează astfel.<br />

Algoritmul 3.5 (QR – triangularizare ortogonală cu reflectori hermitici)<br />

(Se dă A ∈ C m×n . Se efectuează triangularizarea ortogonală a<br />

matricei A, i.e. Q H A = R, un<strong>de</strong> Q H = Q s . . . Q 2 Q 1 , iar Q k sunt reflectori<br />

hermitici. Partea esenţială u k (k + 1 : m) a vectorilor Househol<strong>de</strong>r<br />

u k se memorează pe poziţiile corespunzătoare A(k + 1 : m, k). La aplicarea<br />

ulterioară a transformărilor se ţine seama că u kk = β k , k = 1 : s.<br />

Elementele nenule ale matricei superior triunghiulare R suprascriu elementele<br />

corespunzătoare din triunghiul superior al matricei A.)<br />

1. Pentru k = 1 : s<br />

1. β k = 0<br />

2. Dacă k < m atunci<br />

1. σ = ‖A(k : m, k)‖


148 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

2. Dacă σ ≠ 0 atunci<br />

1. Dacă a kk ≠ 0 atunci σ ← a kk<br />

|a kk | σ<br />

2. a ik ← u ik = a ik /σ, pentru i = k : m<br />

3. β k ← u kk = 1 + a kk<br />

4. Pentru j = k + 1 : n<br />

1. α = − ( ∑ m<br />

i=k ūika ij )/β k<br />

2. a ij ← a ij + αu ik , pentru i = k : m<br />

% elementul diagonal<br />

5. a kk = −σ<br />

Comentarii. În cazul real, algoritmul 3.5 necesită N QR operaţii 12 şi este <strong>numeric</strong><br />

stabil, după cum vom arăta în secţiunea 3.8. Modul <strong>de</strong> apel este [A, β] = QR(A),<br />

un<strong>de</strong> β este vectorul real cu componentele β k , k = 1 : s, iar A apare ca tablou<br />

<strong>de</strong> intrare-ieşire. Subliniem că algoritmul 3.5 nu <strong>calcul</strong>ează explicit reflectorii Q k<br />

din (3.56), şi cu atât mai puţin matricea <strong>de</strong> transformare Q H , ci doar memorează<br />

(extrem <strong>de</strong> economic) toate elementele necesare pentru <strong>de</strong>finirea acestora. ♦<br />

Exemplul 3.5 În cazul matricelor cu structură specială, algoritmul general prezentat<br />

mai sus se adaptează în mod corespunzător, având în ve<strong>de</strong>re conservarea structurii<br />

şi exploatarea acesteia [ ] în scopul reducerii numărului <strong>de</strong> operaţii. În acest sens<br />

R<br />

fie matricea A + = , în care blocul li<strong>de</strong>r R ∈ C<br />

C<br />

n×n este <strong>de</strong>ja superior triunghiular,<br />

iar C ∈ C (m−n)×n este un bloc dat cu l = m − n ≥ 1 linii. Schema <strong>de</strong><br />

triangularizare ortogonală este<br />

[ ]<br />

Q H R+<br />

A + = , Q<br />

0<br />

H = Q H n . . .QH 2 QH 1 ,<br />

în care Q k sunt reflectori <strong>de</strong>finiţi <strong>de</strong> vectorii Househol<strong>de</strong>r<br />

u k = [0 . . . 0 u kk 0 . . . 0 u n+1,k . . . u mk ] T .<br />

La fiecare etapă, elementele β k = u kk şi u ik , i = n + 1 : m, se <strong>de</strong>termină ca în<br />

algoritmul 3.5 pentru a anula elementele corespunzătoare din coloana k a blocului<br />

C. În plus, datorită structurii suplimentare <strong>de</strong> zerouri, aplicarea transformării lasă<br />

nemodificate liniile i = k + 1 : n ale matricei A + , <strong>de</strong>ci conservă structura superior<br />

triunghiulară a blocului li<strong>de</strong>r. În consecinţă, numărul <strong>de</strong> operaţii se reduce la<br />

2(m − n)n 2 . Detaliile <strong>de</strong> implementare şi analiza unor cazuri particulare semnificative<br />

sunt propuse în problema 3.20.<br />

♦<br />

•• În cazul utilizării reflectorilor complecşi <strong>de</strong> forma generală (3.32),<br />

implementarea schemei QR se face utilizând direct procedurile CRFG şi CRF<br />

din tabelul 3.3.<br />

12 În cazul complex, notând N = mn 2 − n 3 /3, algoritmul 3.5 cere N adunări complexe şi N<br />

înmulţiri complexe. Deoarece o adunare complexă este echivalentă cu 2 adunări (reale), iar o<br />

înmulţire complexă este echivalentă cu două adunări şi patru înmulţiri, algoritmul 3.5 cere 4N<br />

adunări şi 4N înmulţiri, adică 8N (sau 4N QR ) operaţii reale (flopi).


3.4. FACTORIZAREA QR 149<br />

CQR<br />

% Algoritmul <strong>de</strong> triangularizare ortogonală cu reflectori complecşi,<br />

i.e. Q H A = R, un<strong>de</strong> Q H = Q H s . . . QH 2 QH 1 .<br />

1. Pentru k = 1 : s<br />

1. τ k = CRFG(A(k : m, k))<br />

2. Pentru j = k + 1 : n<br />

1. CRF(A(k : m, k), τ k , A(k : m, j))<br />

Modul <strong>de</strong> apel este [τ, A] = CQR(A), un<strong>de</strong> τ este acum vectorul complex cu<br />

componentele τ k , k = 1 : s.<br />

B. Proceduri <strong>de</strong> triangularizare cu rotaţii<br />

Procesul <strong>de</strong> triangularizare <strong>de</strong>finit prin relaţia (3.53) poate fi implementat alternativ<br />

utilizând rotaţii.<br />

De exemplu, în cazul real, pentru anularea elementelor subdiagonale se utilizează<br />

secvenţe <strong>de</strong> rotaţii P k <strong>de</strong> forma (3.26), în care la fiecare etapă k rotaţiile P ki se<br />

<strong>de</strong>termină utilizând algoritmul 3.4 pentru a introduce zerourile necesare în poziţiile<br />

corespunzătoare a ik , i = k + 1 : m, ale matricei curente A. Actualizarea coloanelor<br />

următoare se face utilizând algoritmul 3.3.<br />

Procedura <strong>de</strong> triangularizare se poate <strong>de</strong>sfăşura pe loc în tabloul A, utilizând<br />

următoarea schemă <strong>de</strong> <strong>calcul</strong>.<br />

QR ROT<br />

% Triangularizarea matricei A utilizând rotaţii<br />

1. Pentru k = 1 : min (m − 1, n)<br />

1. Pentru i = k + 1 : m<br />

1. Se <strong>de</strong>termină P ki astfel încât (P ki A) ik = 0<br />

2. A ← P ki A<br />

Detaliile <strong>de</strong> justificare precum şi scrierea algoritmului în forma sa implementabilă<br />

sunt propuse ca exerciţii. Menţionăm că numărul <strong>de</strong> operaţii efectuat aici este dublu<br />

faţă <strong>de</strong> algoritmul similar care utilizează reflectori, <strong>de</strong> aceea acesta din urmă este<br />

în general preferabil. În cazul complex, schema <strong>de</strong> mai sus rămâne valabilă, cu<br />

menţiunea că rotaţiile P ki se <strong>calcul</strong>ează ca în secţiunea 3.2.2.<br />

3.4 Factorizarea QR<br />

În această secţiune vom utiliza procedurile <strong>de</strong> triangularizare ortogonală stabilite<br />

în secţiunea anterioară pentru a construi factorizarea QR a unei matrice A ∈ C m×n<br />

<strong>de</strong> formă generală. Notăm ca <strong>de</strong> obicei s = min(m, n).<br />

În cazul m ≥ n din (3.53) şi (3.56) rezultă<br />

[ R<br />

′<br />

A = QR, R =<br />

0<br />

] }n<br />

}m − n<br />

(3.57)<br />

un<strong>de</strong> matricea<br />

Q = Q 1 Q 2 . . . Q n (3.58)


150 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

este unitară iar R este superior triunghiulară ca în (3.54).<br />

m = n atunci R = R ′ .) Partiţionând Q conform cu R, i.e.<br />

(În particular, dacă<br />

din (3.57) <strong>de</strong>ducem<br />

Q = [ Q ′<br />

}{{}<br />

n<br />

Q ′′<br />

}{{}<br />

m−n<br />

], (3.59)<br />

A = Q ′ R ′ , (3.60)<br />

un<strong>de</strong> acum Q ′ are coloanele ortogonale, pe scurt Q ′H Q ′ = I n , iar R ′ este pătrată.<br />

Am <strong>de</strong>monstrat astfel prima parte a următorului rezultat fundamental.<br />

Teorema 3.2 Orice matrice A ∈ C m×n cu m ≥ n poate fi scrisă sub forma (3.60),<br />

un<strong>de</strong> Q ′ ∈ C m×n are coloane ortogonale, iar R ′ ∈ C n×n este superior triunghiulară.<br />

Prin <strong>de</strong>finiţie, relaţia (3.60) constituie factorizarea QR a matricei A. Dacă A<br />

este monică, atunci R ′ rezultă inversabilă şi reciproc. În acest caz, factorizarea<br />

QR este unică dacă în plus impunem condiţia ca factorul triunghiular R ′ să aibă<br />

elemente diagonale (reale şi) pozitive.<br />

Demonstraţie. Pentru a <strong>de</strong>monstra a doua afirmaţie, să ne amintim că matricea<br />

A este monică dacă şi numai dacă Ax ≠ 0, oricare ar fi x ∈ C n , x ≠ 0, <strong>de</strong>ci<br />

x H A H Ax = ‖Ax‖ 2 > 0 pentru orice x ≠ 0, adică matricea hermitică G = A H A<br />

este pozitiv <strong>de</strong>finită. Atunci, conform teoremei <strong>de</strong> factorizare Cholesky, există şi<br />

este unică matricea R 1 superior triunghiulară cu elemente diagonale pozitive astfel<br />

încât G = R1 HR 1. Fie Q 1 = AR1 −1 . Avem<br />

Q H 1 Q 1 = R −H<br />

1 A H AR −1<br />

1 = R −H<br />

1 R H 1 R 1R −1<br />

1 = I n ,<br />

adică Q 1 are coloanele ortogonale, şi în plus A = Q 1 R 1 . Prin urmare, unicitatea<br />

factorizării QR rezultă din unicitatea factorizării Cholesky, i.e. dacă R ′ satisface<br />

condiţia din enunţ atunci R ′ = R 1 şi Q ′ = Q 1 . (Condiţia ca elementele diagonale<br />

ale lui R ′ să fie pozitive poate fi întot<strong>de</strong>auna satisfăcută, dar, <strong>de</strong> obicei, nu prezintă<br />

interes în practică.)<br />

♦<br />

Observaţia 3.4 În general, matricea hermitică pozitiv semi<strong>de</strong>finită G = A H A<br />

se numeşte gramian al (coloanelor) matricei A. Demonstraţia teoremei 3.2 arată<br />

că dacă matricea A este monică, atunci factorul triunghiular R ′ al lui A coinci<strong>de</strong><br />

în esenţă cu factorul Cholesky R 1 al lui G. În principiu, acest rezultat extrem <strong>de</strong><br />

important poate fi exploatat în două sensuri.<br />

a) Factorizarea QR a matricei A poate fi <strong>de</strong>terminată relativ economic efectuând<br />

în prealabil factorizarea Cholesky a matricei G. Schema <strong>de</strong> <strong>calcul</strong>, <strong>de</strong>dusă direct<br />

din <strong>de</strong>monstraţia teoremei amintite, este următoarea<br />

QR Ch<br />

1. Se formează G = A H A<br />

2. Se <strong>calcul</strong>ează R 1 efectuând factorizarea Cholesky G = R1 H R 1<br />

3. Se <strong>calcul</strong>ează Q 1 = AR1 −1 rezolvând sistemul superior<br />

triunghiular Q 1 R 1 = A


3.4. FACTORIZAREA QR 151<br />

Trebuie însă să subliniem că această metodă, <strong>de</strong>şi conceptual extrem <strong>de</strong> simplă,<br />

nu este recomandabilă din punct <strong>de</strong> ve<strong>de</strong>re <strong>numeric</strong> <strong>de</strong>oarece matricea G, rezultată<br />

la pasul 1 prin ”ridicarea la pătrat” a lui A, este rău condiţionată, vezi mai <strong>de</strong>parte<br />

propoziţia 3.5. În consecinţă, rezultatele <strong>calcul</strong>ate la paşii 2 şi 3 sunt afectate <strong>de</strong> erori<br />

străine <strong>de</strong> problemă şi eventual catastrofale, in<strong>de</strong>pen<strong>de</strong>nt <strong>de</strong> calitatea <strong>algoritmi</strong>lor<br />

utilizaţi. Ca regulă generală, formarea gramianului G = A H A trebuie sistematic<br />

evitată în favoarea operării directe asupra matricei date A.<br />

b) O serie <strong>de</strong> probleme <strong>de</strong> <strong>calcul</strong>, vizând <strong>de</strong> exemplu actualizarea unor factorizări<br />

LU sau Cholesky, pot fi reformulate în termenii unei factorizări QR echivalente şi<br />

rezolvate în consecinţă aplicând procedurile <strong>numeric</strong> stabile bazate pe utilizarea<br />

transformărilor ortogonale. Spre <strong>de</strong>osebire <strong>de</strong> abordarea <strong>de</strong> la punctul a), această<br />

i<strong>de</strong>e, care constituie baza unei întregi familii <strong>de</strong> <strong>meto<strong>de</strong></strong> <strong>de</strong> <strong>calcul</strong>, tradiţional numite<br />

”<strong>de</strong> rădăcină pătrată”, este larg aplicată în practică.<br />

♦<br />

Exemplul 3.6 Pentru a ilustra i<strong>de</strong>ea <strong>de</strong> bază a <strong>algoritmi</strong>lor <strong>de</strong> rădăcină pătrată,<br />

fie G = R H R o matrice hermitică pozitiv <strong>de</strong>finită al cărei factor Cholesky superior<br />

triunghiular R ∈ C n×n este cunoscut. Problema <strong>de</strong> actualizare a factorizării<br />

Cholesky constă în a <strong>calcul</strong>a factorul Cholesky R + al matricei modificate<br />

G + = G + C H C,<br />

în care C ∈ C l×n este o matrice dată. În particular, dacă l = 1, i.e. C = cT este<br />

un vector linie, atunci G + este o modificare <strong>de</strong> rang 1 a lui G.<br />

Această problemă poate fi rezolvată extrem <strong>de</strong> simplu, fără a forma explicit G + ,<br />

observând că<br />

[ ]<br />

G + = R H R + C H C = [R H C H R<br />

] = A<br />

C<br />

H + A +,<br />

i.e. G + este gramianul matricei A din exemplul 3.5. În consecinţă, factorul Cholesky<br />

căutat R + poate fi <strong>de</strong>terminat efectuând triangularizarea ortogonală a matricei A + ,<br />

construite direct cu elementele date R şi C.<br />

O i<strong>de</strong>e asemănătore se aplică pentru a efectua actualizarea factorizării Cholesky<br />

în cazul unei modificări <strong>de</strong> rang 2, i.e.<br />

G + = G + dc H + cd H + cc H ,<br />

un<strong>de</strong> c, d ∈ C n sunt doi vectori (coloană) daţi.<br />

Dacă matricea A este monică, atunci factorul ortogonal Q ′<br />

semnificaţie geometrică remarcabilă. Din (3.60) rezultă<br />

♦<br />

al lui A are o<br />

y not<br />

= Ax = Q ′ (R ′ x), ∀x ∈ C n , (3.61)<br />

un<strong>de</strong> R ′ este superior triunghiulară inversabilă. Prin urmare, coloanele matricelor<br />

A şi Q ′ generează acelaşi subspaţiu liniar S not<br />

= ImA. Mai precis, prin ipoteză A are<br />

coloanele in<strong>de</strong>pen<strong>de</strong>nte, <strong>de</strong>ci constituie o bază a lui S, iar prin construcţie Q ′ are<br />

coloanele ortogonale, <strong>de</strong>ci constituie o bază ortogonală a lui S. Proiectorul ortogonal<br />

pe S este P 1 = A(A H A) −1 A H sau, mai simplu, P 1 = Q ′ Q ′H . (Prin <strong>calcul</strong> direct


152 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

S ⊥<br />

✻<br />

q 3<br />

✲<br />

✟ q 2<br />

✟<br />

✟ ✟✟✟✟✟✟✟✟ q 1<br />

✟✟✙<br />

S ✟<br />

✟<br />

✟<br />

✟<br />

✟<br />

✟<br />

✟<br />

✟ Fig. 3.5: Baze ortogonale pentru ImA şi KerA H . Q = [q 1 q 2 | q 3 ], m = 3, n = 2<br />

se verifică uşor că P1 2 = P 1 şi P1<br />

H = P 1 , iar faptul că ImP 1 = S este evi<strong>de</strong>nt.<br />

Echivalenţa celor două expresii ale lui P 1 rezultă din (3.60).)<br />

În mod similar, matricea Q ′′ ∈ C m×(m−n) (care, în (3.59), completează Q ′ până<br />

la o matrice unitară Q), constituie o bază ortogonală a subspaţiului complementar<br />

S ⊥ = KerA H . Proiectorul ortogonal pe S ⊥ este P 2 = Q ′′ Q ′′H şi, în plus, avem<br />

P 1 + P 2 = I m .<br />

Pe scurt, partiţia (3.59) a matricei unitare Q corespun<strong>de</strong> <strong>de</strong>scompunerii ortogonale<br />

fundamentale<br />

C m = ImA ⊕ KerA H , (3.62)<br />

furnizând baze ortogonale pentru ambele subspaţii. Cazul m = 3, n = 2 este ilustrat<br />

în figura 3.5. În consecinţă, orice vector b ∈ Cm se scrie unic sub forma b = b 1 +b 2 ,<br />

un<strong>de</strong> b i = P i b, i = 1 : 2, sunt proiecţiile ortogonale ale lui b pe S şi, respectiv, S ⊥ .<br />

În cazul m < n, din (3.53) şi (3.56) rezultă<br />

A = QR, R = [R ′ S], (3.63)<br />

un<strong>de</strong> Q = Q 1 Q 2 . . . Q m este unitară, iar R este superior trapezoidală ca în (3.55).<br />

Utilizând partiţia conformă A = [A ′ B] obţinem factorizarea<br />

A ′ = QR ′ , (3.64)<br />

un<strong>de</strong>, evi<strong>de</strong>nt, A ′ = A [m] este submatricea li<strong>de</strong>r principală a matricei A.<br />

Dacă A ′ este inversabilă, atunci R ′ are aceeaşi proprietate, iar din (3.64) şi<br />

B = QS rezultă B = A ′ (R ′ ) −1 S. Altfel spus, între coloanele matricei A există<br />

relaţia B = A ′ X, un<strong>de</strong> X = (R ′ ) −1 S este soluţia sistemului triunghiular R ′ X = S,<br />

prin urmare matricea<br />

[ ]<br />

−X<br />

N =<br />

I m−n<br />

constituie o bază (neortogonală) a subspaţiului N not<br />

= KerA ∈ C n . (Se constată<br />

imediat că A este epică şi AN = 0.)<br />

Trebuie însă să observăm că, în absenţa unei strategii a<strong>de</strong>cvate <strong>de</strong> pivotare a<br />

coloanelor, condiţia <strong>de</strong> inversabilitate menţionată mai sus nu este în<strong>de</strong>plinită, astfel


3.4. FACTORIZAREA QR 153<br />

încât în cazul m < n, utilitatea practică a procedurii <strong>de</strong> triangularizare ortogonală<br />

(la stânga) precum şi a factorizării QR asociate sunt limitate.<br />

Având în ve<strong>de</strong>re rezultatele teoretice stabilite mai sus, care evi<strong>de</strong>nţiază clar<br />

importanţa factorizării QR, în continuare ne vom concentra atenţia asupra aspectelor<br />

procedurale privind <strong>calcul</strong>ul şi aplicaţiile practice ale acestei factorizări.<br />

3.4.1 Acumularea transformărilor<br />

În cazul m ≥ n, factorizarea QR a matricei A poate fi <strong>de</strong>terminată utilizând procedurile<br />

<strong>de</strong> triangularizare ortogonală stabilite în secţiunea anterioară. Într-a<strong>de</strong>văr,<br />

în urma execuţiei acestor proceduri, factorul triunghiular R ′ se obţine ca atare în<br />

triunghiul superior al matricei A iar, în acord cu relaţiile (3.58) şi (3.59), factorul<br />

ortogonal Q ′ poate fi <strong>calcul</strong>at sub forma<br />

[ ]<br />

[ ]<br />

Q ′ In In<br />

= Q = Q<br />

0 1 Q 2 . . .Q n , (3.65)<br />

0<br />

aplicând următoarea schemă caracteristică <strong>de</strong> acumulare a transformărilor.<br />

GQR<br />

% Acumularea primelor n coloane Q ′ ale matricei<br />

Q = Q[ 1 Q 2 .]. . Q n , m ≥ n.<br />

1. Q ′ In<br />

=<br />

0<br />

2. Pentru k = n : −1 : 1<br />

1. Q ′ ← Q k Q ′<br />

Cu referire la algoritmul 3.5, implementarea schemei GQR este simplă. Ţinând<br />

seama <strong>de</strong> particularităţile <strong>de</strong> structură ale matricei Q ′ şi utilizând elementele <strong>de</strong>finitorii<br />

ale transformărilor Q k , memorate în triunghiul inferior strict al matricei A<br />

precum şi în vectorul β, procesul <strong>de</strong> <strong>calcul</strong> poate fi organizat astfel încât Q ′ să<br />

rezulte pe loc în tabloul A 13 .<br />

Algoritmul 3.6 (GQR) (Utilizând ieşirea algoritmului 3.5, se efectuează<br />

acumularea pe loc în A a primelor n coloane Q ′ ale matricei<br />

Q = Q 1 Q 2 . . .Q s , un<strong>de</strong> Q k sunt reflectori hermitici. Se presupune<br />

m ≥ n.)<br />

1. Pentru j = 2 : n<br />

1. a ij = 0, pentru i = 1 : j − 1<br />

2. Pentru k = n : −1 : 1<br />

1. Dacă β k ≠ 0 atunci<br />

1. a kk ← u kk = β k<br />

2. Pentru j = k + 1 : n<br />

1. α = − ( ∑ m<br />

i=k ūika ij ) /β k<br />

2. a ij ← a ij + αu ik , pentru i = k : m<br />

13 În caz <strong>de</strong> nevoie, factorul triunghiular R ′ sau chiar întregul tablou A sunt în prealabil salvate.<br />

Acest mod <strong>de</strong> lucru se justifică având în ve<strong>de</strong>re că, în general, un anumit algoritm <strong>de</strong> <strong>calcul</strong> trebuie<br />

să manevreze un număr cât mai mic <strong>de</strong> tablouri <strong>de</strong> lucru.


154 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

% coloana k<br />

3. a ik ← −a ik , i = k : m<br />

4. a kk = 1 + a kk<br />

altfel<br />

5. a ik = 0, pentru i = k + 1 : m<br />

6. a kk = 1<br />

Comentarii. În cazul real, algoritmul 3.6 necesită N QR operaţii, care (la fel ca<br />

în algoritmul 3.5) se consumă pentru actualizarea coloanelor la pasul 2.1.2. Modul<br />

<strong>de</strong> apel este A = GQR(A, β). Reţinem că <strong>de</strong>terminarea explicită a factorizării<br />

QR a matricei A prin apelarea succesivă a procedurilor QR şi GQR necesită în<br />

total 2N QR operaţii, <strong>de</strong>ci este relativ costisitoare. Pentru utilizare în capitolele<br />

următoare, sintaxa unei astfel <strong>de</strong> proceduri <strong>de</strong> factorizare QR este [Q, R] = FQR(A)<br />

(lăsăm cititorului micile <strong>de</strong>talii <strong>de</strong> implementare).<br />

♦<br />

În contextul procedurii <strong>de</strong> triangularizare CQR, care utilizează reflectori complecşi,<br />

schema <strong>de</strong> acumulare GQR rămâne evi<strong>de</strong>nt valabilă. Implementarea ei ”directă”, bazată<br />

pe aplicarea la pasul 2 a procedurii <strong>de</strong> transformare CRF pentru actualizarea coloanelor<br />

lui Q ′ , este extrem <strong>de</strong> simplă.<br />

GCQR % Acumularea primelor n coloane Q ′ ale matricei Q = Q 1Q 2 . . . Q n,<br />

m ≥ n, un<strong>de</strong> Q k sunt reflectori complecşi.<br />

1. Pentru j = 1 : n<br />

1. q ij = 0, pentru i = 1 : m<br />

2. q jj = 1<br />

2. Pentru k = n : −1 : 1<br />

1. Pentru j = 1 : n<br />

1. CRF(A(k : m,k), ¯τ k , Q(k : m, j))<br />

Subliniem însă că procedura GCQR în forma scrisă mai sus este neeficientă <strong>de</strong>oarece<br />

nu exploatează structura specială a matricei Q ′ care, pe măsura aplicării transformărilor<br />

la pasul 2, se ”umple” progresiv, începând cu ultima coloană. (Un <strong>calcul</strong> simplu arată<br />

că, în cazul m = n, algoritmul GCQR necesită N op = 2n 3 operaţii complexe, adică cu<br />

50% mai mult <strong>de</strong>cât algoritmul 3.6.) Modificările necesare pentru a corecta acest <strong>de</strong>fect,<br />

permiţând totodată formarea lui Q ′ pe loc în tabloul A, pot fi aduse <strong>de</strong> către cititorul<br />

interesat, eventual după o analiză comparativă cu algoritmul 3.6.<br />

Matricea Q ′′ , care completează Q ′ până la o matrice unitară, poate fi <strong>calcul</strong>ată<br />

sub forma<br />

[ ]<br />

[ ]<br />

Q ′′ 0<br />

0<br />

= Q = Q<br />

I 1 Q 2 . . . Q n , (3.66)<br />

m−n I m−n<br />

utilizând o schemă <strong>de</strong> acumulare similară, dar mai puţin eficientă. (Evi<strong>de</strong>nt, acum<br />

tabloul A trebuie extins cu m − n coloane necesare pentru a memora Q ′′ .) 14<br />

În final, subliniem că formarea matricelor Q ′ , Q ′′ sau Q prin acumularea transformărilor<br />

este relativ costisitoare. De aceea, în contextul aplicaţiilor consi<strong>de</strong>rate<br />

în acest capitol, se recomandă evitarea acestui <strong>calcul</strong> în favoarea utilizării formei<br />

factorizate (3.58) a matricei Q, furnizată ca atare <strong>de</strong> <strong>algoritmi</strong>i <strong>de</strong> triangularizare<br />

QR.<br />

14 În cazul m < n, cu referire la (3.64), <strong>calcul</strong>ul matricei Q se poate face apelând direct procedura<br />

GQR sub forma A(:,1 : m) = GQR(A(:,1 : m), β). După execuţie, rezultatul dorit Q suprascrie<br />

blocul li<strong>de</strong>r A ′ al matricei A.


3.4. FACTORIZAREA QR 155<br />

3.4.2 Aplicarea transformărilor<br />

În practică, matricea unitară Q H generată sub forma (3.56) <strong>de</strong> procedurile <strong>de</strong> triangularizare<br />

ortogonală aplicate matricei A, se utilizează pentru a transforma în<br />

mod a<strong>de</strong>cvat o altă matrice dată B. Ca regulă generală, cele patru tipuri <strong>de</strong> transformări<br />

posibile, două la stânga (Q H B şi QB) şi două la dreapta (BQ şi BQ H ), se<br />

efectuează pe loc în B fără a forma explicit matricele Q H sau Q.<br />

Aplicarea transformărilor<br />

şi<br />

B ← Q H B = Q H s . . . Q H 2 Q H 1 B (3.67)<br />

B ← QB = Q 1 Q 2 . . . Q s B (3.68)<br />

se face partiţionând B pe coloane.<br />

În cazul (3.67), schema <strong>de</strong> <strong>calcul</strong> este evi<strong>de</strong>nt următoarea.<br />

MQR % Aplicarea transformării B ← Q H B, un<strong>de</strong> Q = Q 1 Q 2 . . . Q s .<br />

1. Pentru k = 1 : s<br />

1. B ← Q H k B<br />

Cu referire la algoritmul 3.5, implementarea schemei MQR are la bază o procedură<br />

<strong>de</strong> tip RF pentru actualizarea fiecărei coloane a matricei B. Desigur, la<br />

pasul 1.1, transformarea se aplică efectiv numai dacă β k ≠ 0, utilizând vectorul<br />

Househol<strong>de</strong>r u k memorat în A(k : m, k).<br />

Algoritmul 3.7 (MQR) (Se dă B ∈ C m×p . Utilizând ieşirea algoritmului<br />

3.5, se aplică transformarea B ← Q H B, un<strong>de</strong> Q = Q 1 Q 2 . . .Q s ,<br />

iar Q k sunt reflectori hermitici.)<br />

1. Pentru k = 1 : s<br />

1. Dacă β k ≠ 0 atunci<br />

1. t = a kk<br />

2. a kk ← u kk = β k<br />

3. Pentru j = 1 : p<br />

1. α = − ( ∑ m<br />

i=k ūikb ij )/β k<br />

2. b ij ← b ij + αu ik , pentru i = k : m<br />

4. a kk = t<br />

Comentarii. În cazul real cu m ≥ n, algoritmul 3.7 necesită N op = pN m operaţii,<br />

un<strong>de</strong> am notat cu N m = 2n(2m − n) numărul <strong>de</strong> operaţii necesar pentru a aplica<br />

transformarea (3.67) unui vector b cu m componente.<br />

♦<br />

În contextul procedurii <strong>de</strong> triangularizare CQR, schema MQR se implementează astfel.<br />

MCQR<br />

% Aplicarea transformării B ← Q H B, un<strong>de</strong> Q = Q 1Q 2 . . . Q s, iar<br />

Q k sunt reflectori complecşi.<br />

1. Pentru k = 1 : s<br />

1. Pentru j = 1 : p<br />

1. CRF(A(k : m,k), τ k , B(k : m, j))


156 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

În cazul (3.68) se proce<strong>de</strong>ază analog. Dacă Q k sunt reflectori hermitici, atunci<br />

algoritmul rezultat diferă <strong>de</strong> algoritmul 3.7 numai prin ordinea <strong>de</strong> aplicare a transformărilor.<br />

Având în ve<strong>de</strong>re simplificarea redactării unor proceduri ulterioare, vom<br />

presupune că ambele transformări (3.67) şi (3.68) pot fi efectuate apelând o singură<br />

procedură, al cărei mod <strong>de</strong> apel este B = MQR(TRANS, A, β, B), un<strong>de</strong> TRANS<br />

este o variabilă logică cu valorile ’da’ în cazul (3.67), respectiv ’nu’ în cazul (3.68).<br />

Scrierea acestei proceduri (din care jumătatea ’da’ coinci<strong>de</strong> cu algoritmul 3.7) consituie<br />

un exerciţiu uşor.<br />

Aplicarea transformărilor la dreapta B ← BQ şi B ← BQ H se face partiţionând<br />

B pe linii şi ţinând seama <strong>de</strong> precizările făcute în finalul secţiunii 3.2.1. Scrierea<br />

procedurii corespunzătoare, <strong>de</strong> exemplu notată MQRd, este propusă ca exerciţiu.<br />

(La nevoie, cele două proceduri MQR şi MQRd pot fi reunite într-una singură<br />

introducând o variabilă suplimentară SIDE, aşa cum se proce<strong>de</strong>ază în LAPACK.)<br />

În concluzia expunerii <strong>de</strong> până acum, subliniem că procedurile <strong>de</strong> triangularizare,<br />

acumulare şi transformare, notate generic QR, GQR şi MQR, apar întot<strong>de</strong>auna în<br />

triplete, orice modificare a procedurii fundamentale <strong>de</strong> triangularizare QR, în ceea<br />

ce priveşte <strong>calcul</strong>ul şi memorarea transformărilor Q k , k = 1 : s, antrenând după sine<br />

modificări corespunzătoare în procedurile asociate GQR şi MQR. Având în ve<strong>de</strong>re<br />

recomandările făcute în finalul secţiunii prece<strong>de</strong>nte, procedura <strong>de</strong> acumulare GQR<br />

se utilizează numai în caz <strong>de</strong> strictă necesitate. Aproape întot<strong>de</strong>auna, obiectivele<br />

urmărite prin <strong>calcul</strong> pot fi atinse utilizând procedura <strong>de</strong> transformare MQR care<br />

operează direct cu forma factorizată a matricei Q.<br />

3.4.3 Triangularizarea ortogonală la nivel <strong>de</strong> bloc<br />

I<strong>de</strong>ea procedurilor bloc <strong>de</strong> triangularizare ortogonală este aceeaşi cu a procedurilor<br />

bloc <strong>de</strong> factorizare LU, <strong>de</strong>scrise în secţiunea 2.4. La fel ca acolo, utilizarea acestui<br />

tip <strong>de</strong> proceduri este indicată pe <strong>calcul</strong>atoarele cu memorie ierarhică.<br />

Pentru precizare, în continuare ne vom referi la procedura CQR care efectuează<br />

triangularizarea matricei A, partiţionată pe coloane, utilizând reflectori complecşi.<br />

După cum am văzut, această procedură este bogată în operaţii vectoriale, iar efortul<br />

principal <strong>de</strong> <strong>calcul</strong> se consumă la pasul 1.2 pentru actualizarea coloanelor următoare.<br />

Având în ve<strong>de</strong>re accelerarea acestui proces pe seama reducerii numărului <strong>de</strong> apeluri<br />

la memoria principală, procedura bloc operează asupra matricei A partiţionate în<br />

blocuri <strong>de</strong> coloane, cu scopul <strong>de</strong> a efectua operaţiile indicate utilizând procedurile<br />

<strong>de</strong> înmulţire <strong>matriceal</strong>ă (la nivel <strong>de</strong> bloc) <strong>de</strong> tip GEMM din BLAS 3.<br />

Consi<strong>de</strong>răm A ∈ C m×n cu m ≥ n şi n = νn b , un<strong>de</strong> n b e dimensiunea comună a<br />

blocurilor (<strong>de</strong> coloane), iar ν este numărul total <strong>de</strong> blocuri. Procedura <strong>de</strong> triangularizare<br />

la nivel <strong>de</strong> bloc are ν etape. (Pentru simplitate, în continuare indicele <strong>de</strong><br />

etapă va fi omis.)<br />

La prima etapă, are loc triangularizarea primului bloc al matricei A, efectuând<br />

transformarea A ← Q H b A. În consecinţă, se consi<strong>de</strong>ră partiţia A = [A b B], un<strong>de</strong><br />

şi se proce<strong>de</strong>ază astfel:<br />

A b = A(1 : m, 1 : n b ), B = A(1 : m, n b + 1 : n) (3.69)


3.4. FACTORIZAREA QR 157<br />

Bl 1<br />

1. Se generează Q b a.î. Q H b A b = R b este superior triunghiulară<br />

2. Se formează Q b<br />

3. Se aplică transformarea B ← Q H b B<br />

Evi<strong>de</strong>nt, la pasul 1 se aplică procedura uzuală CQR blocului A b . Matricea Q b<br />

rezultată este <strong>de</strong> forma<br />

Q b = Q 1 Q 2 . . . Q nb , (3.70)<br />

un<strong>de</strong> Q i = I m − τ i u i u H i sunt reflectorii complecşi <strong>de</strong>terminaţi pentru a introduce<br />

zerouri subdiagonale în coloanele i = 1 : n b ale blocului A b . Problema constă în<br />

găsirea unei forme <strong>de</strong> reprezentare a lui Q b la pasul 2, a<strong>de</strong>cvate accelerării execuţiei<br />

pasului 3 15 .<br />

La o etapă ulterioară l ∈ 2 : ν, matricea curentă A este superior triunghiulară<br />

în primele k − 1 coloane, un<strong>de</strong> k = (l − 1)n b + 1, prin urmare<br />

[ ] R<br />

′<br />

S<br />

A = ,<br />

0 Ã<br />

un<strong>de</strong> matricea R ′ este superior triunghiulară <strong>de</strong> ordin k − 1, iar à = A(k : m, k : n)<br />

este matricea ”rămasă”. Acum are loc triangularizarea blocului următor efectuând<br />

transformarea A ← Q H b A, un<strong>de</strong><br />

Q b = Q k Q k+1 . . .Q k+nb −1,<br />

iar fiecare reflector Q i are o structură <strong>de</strong> tip (3.10), <strong>de</strong>ci<br />

[ ]<br />

Ik−1 0<br />

Q b = .<br />

0 ˜Qb<br />

În consecinţă, se consi<strong>de</strong>ră partiţia à = [Ãb ˜B], un<strong>de</strong> acum<br />

à b = A(k : m, k : k + n b − 1),<br />

˜B = A(k : m, k + nb : n),<br />

şi se aplică procedura Bl 1 cu noile date. Matricea ˜Q b rezultată este <strong>de</strong> forma<br />

˜Q b = ˜Q 1 ˜Q2 . . . ˜Q nb ,<br />

iar problemele <strong>de</strong> <strong>calcul</strong> la paşii 2 şi 3 sunt aceleaşi ca mai sus.<br />

Pentru precizare, în continuare ne vom referi la partiţia (3.69) şi vom <strong>de</strong>scrie<br />

cele două tipuri <strong>de</strong> reprezentări structurate ale matricelor Q b <strong>de</strong> tip (3.70), utilizate<br />

15 Procedurile uzuale <strong>de</strong> tip vectorial, expuse în secţiunile anterioare, nu satisfac acest <strong>de</strong>zi<strong>de</strong>rat.<br />

Aplicarea succesivă a transformărilor Q i , i = 1 : n b , în maniera MQR, este eficientă (numărul<br />

<strong>de</strong> operaţii este 2n b (2m − n b )(n − n b )) dar nu conduce la operaţii <strong>matriceal</strong>e implementabile în<br />

BLAS 3. Pe <strong>de</strong> altă parte, formarea explicită a matricei Q b prin acumularea transformărilor<br />

în maniera GQR este costisitoare, totodată Q b rezultă nestructurată, <strong>de</strong>ci produsul <strong>matriceal</strong><br />

B ← Q H b B cere 2m2 (n − n b ) operaţii, un<strong>de</strong> tipic, m ≫ n b , adică cu un ordin mai mult <strong>de</strong>cât<br />

este necesar. În plus, un asemenea mod <strong>de</strong> lucru cere un spaţiu consi<strong>de</strong>rabil pentru memorarea<br />

matricei Q b .<br />

De aceea, în practică, se utilizează reprezentări speciale ale matricelor <strong>de</strong> tip Q b care poartă<br />

numele <strong>de</strong> reflectori bloc şi care vor fi <strong>de</strong>scrise în continuare.


158 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

în practică. (Indicele b va fi omis.) Aceste reprezentări se numesc reflectori bloc, iar<br />

elementele lor <strong>de</strong>finitorii se construiesc exploatând relaţia recurentă<br />

Q = Q 1 , Q ← Q + = QQ i , i = 2 : n b .<br />

a. Reprezentarea WY este <strong>de</strong> forma Q H = I − WY H , respectiv<br />

Q = I − Y W H , (3.71)<br />

un<strong>de</strong> W, Y ∈ C m×n b<br />

sunt două matrice ce urmează a fi <strong>de</strong>terminate.<br />

Iniţial avem Q = I − τ 1 u 1 u H 1 , <strong>de</strong>ci putem lua<br />

Mai <strong>de</strong>parte putem scrie<br />

<strong>de</strong>ci<br />

W = u 1 , Y = τ 1 u 1 .<br />

Q + = QQ i = (I − Y W H )(I − τ i u i u H i ) =<br />

= I − Y W H − τ i (I − Y W H )u i u H i =<br />

= I − [ ] [ ]<br />

W<br />

Y z H<br />

i =<br />

= I − Y + W H + ,<br />

u H i<br />

W + = [W u i ], Y + = [Y z i ],<br />

un<strong>de</strong> z i = τ i (I − Y W H )u i . Matricea W, formată prin alăturarea vectorilor Househol<strong>de</strong>r<br />

u i , este produsă şi memorată ca atare <strong>de</strong> către procedura CQR pe poziţiile<br />

subdiagonale din tabloul A b . (Întrucât primele i − 1 componente ale vectorilor<br />

Househol<strong>de</strong>r u i sunt nule, iar u ii = 1, W este chiar inferior trapezoidală unitate.)<br />

În consecinţă, reprezentarea WY este complet <strong>de</strong>finită <strong>de</strong> tabloul Y , a cărui procedură<br />

<strong>de</strong> formare (vezi pasul 2 al schemei Bl 1 ) este următoarea.<br />

% Formarea lui Y<br />

1. Y (:, 1) = τ 1 u 1<br />

2. Pentru i = 2 : n b<br />

1. Y (:, i) = (τ i u i ) − Y (W H (τ i u i ))<br />

La pasul 3 al procedurii Bl 1 , reflectorul bloc în reprezentarea WY se aplică<br />

matricei B conform schemei<br />

respectiv<br />

B ← Q H B = (I − WY H )B = B − W(Y H B), (3.72)<br />

1. N = Y H B<br />

2. B ← B − WN<br />

Ambele produse se efectuează utilizând GEMM şi cer 4mn b (n − n b ) operaţii. Singurul<br />

neajuns al reprezentării WY constă în necesitatea formării tabloului <strong>de</strong> lucru<br />

suplimentar Y <strong>de</strong> dimensiune m × n b , relativ mare.


3.4. FACTORIZAREA QR 159<br />

b. Reprezentarea W 2 T sau triunghiulară este <strong>de</strong> forma Q H = I −WT H W H ,<br />

respectiv<br />

Q = I − WTW H (3.73)<br />

un<strong>de</strong>, după cum vom ve<strong>de</strong>a, W este acelaşi ca mai sus, iar T ∈ C n b×n b<br />

rezultă<br />

superior triunghiulară.<br />

Iniţial avem Q = I − τ 1 u 1 u H 1 , <strong>de</strong>ci putem lua<br />

Mai <strong>de</strong>parte putem scrie<br />

<strong>de</strong>ci avem<br />

W = u 1 , T = τ 1 .<br />

Q + = QQ i = (I − WTW H )(I − τ i u i u H i ) =<br />

= I − WTW H − τ i u i u H i + W(τ i TW H u i )u H i =<br />

= I − [ ] [ ][ ]<br />

T t<br />

W u i W<br />

H<br />

i<br />

0 τ i u H =<br />

i<br />

= I − W + T + W+<br />

H<br />

W + = [W u i ], T + =<br />

[ ] T ti<br />

,<br />

0 τ i<br />

un<strong>de</strong> t i = −τ i T(W H u i ).<br />

Procedura <strong>de</strong> formare a tabloului triunghiular T, care <strong>de</strong>fineşte complet reprezentarea<br />

W 2 T, este următoarea.<br />

% Formarea lui T<br />

1. T(1, 1) = τ 1<br />

2. Pentru i = 2 : n b<br />

1. T(1 : i − 1, i) = −τ i T(W H u i )<br />

2. T(i, i) = τ i<br />

La pasul 3 al procedurii Bl 1 , reflectorul bloc în reprezentarea W 2 T se aplică<br />

matricei B conform schemei<br />

respectiv<br />

B ← Q H B = (I − WTW H )B = B − WT(W H B), (3.74)<br />

1. N = W H B<br />

2. N ← T H N<br />

3. B ← B − WN<br />

O analiză simplă arată că în acest caz este suficient un singur tablou <strong>de</strong> lucru <strong>de</strong><br />

dimensiune n b × n, relativ mică. În primele n b coloane ale acestuia se formează T,<br />

iar în coloanele următoare se <strong>de</strong>pune produsul intermediar N = W H B. (Subliniem<br />

că blocurile T utilizate în etapele succesive ale procedurii <strong>de</strong> triangularizare nu se<br />

memorează, ci se formează pe măsură ce sunt necesare.) Numărul <strong>de</strong> operaţii este<br />

(4m+n b )n b (n−n b ). Creşterea numărului <strong>de</strong> operaţii este compensată <strong>de</strong> memorarea<br />

mai compactă a reprezentării triunghiulare.<br />

Combinând i<strong>de</strong>ile <strong>de</strong> mai sus, procedura <strong>de</strong> triangularizare ortogonală la nivel<br />

<strong>de</strong> bloc poate fi rezumată astfel.


160 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

CQR Bl<br />

% Triangularizare la nivel <strong>de</strong> bloc, utilizând reflectori complecşi.<br />

1. Pentru k = 1 : n b : min(n, m)<br />

1. f = min(k + n b − 1, n)<br />

2. A b = A(k : m, k : f)<br />

3. τ(k : f) = CQR(A b )<br />

4. A(k : m, k : f) = A b<br />

5. Dacă f < n atunci<br />

% Formarea lui T<br />

1. T(k, k) = τ k<br />

2. Pentru i = k + 1 : f<br />

1. T(k : i − 1, i) = −τ i T(W H u i )<br />

2. T(i, i) = τ i<br />

% aplicarea transformării<br />

3. B = A(k : m, f + 1 : n)<br />

4. N = W H B<br />

5. N ← T H N<br />

6. B ← B − WN<br />

7. A(k : m, f + 1 : n) = B<br />

În redactarea <strong>de</strong> mai sus, A b este tabloul <strong>de</strong> lucru din memoria rapidă în care<br />

se efectuează triangularizarea blocului curent, iar B şi N sunt blocurile utilizate <strong>de</strong><br />

GEMM în procesul <strong>de</strong> aplicare a transformării. (În caz <strong>de</strong> necesitate, blocul B poate<br />

fi tratat sub formă partiţionată.) Amintim că tabloul W este format şi memorat<br />

ca atare în triunghiul strict inferior al blocului A b obţinut la pasul 1.3. Evi<strong>de</strong>nt, în<br />

cazul n b = 1 procedura <strong>de</strong> mai sus se reduce la CQR. Instrucţiunile 1.2, 1.4, 1.5.3<br />

şi 1.5.7 efectuează transferul datelor între memoria principală şi cea rapidă.<br />

În final, subliniem că procedurile <strong>de</strong> acumulare şi transformare GCQR şi<br />

MCQR pot fi <strong>de</strong> asemenea reformulate la nivel <strong>de</strong> bloc, procedând în esenţă ca la<br />

pasul 1.5 al algoritmului <strong>de</strong> mai sus.<br />

3.4.4 Alte <strong>meto<strong>de</strong></strong> <strong>de</strong> ortogonalizare<br />

Factorizarea QR a unei matrice monice A ∈ C m×n poate fi <strong>calcul</strong>ată utilizând procedurile<br />

<strong>de</strong> ortogonalizare <strong>de</strong> tip Gram-Schmidt, care constituie analogul schemelor<br />

compacte Crout şi Doolittle, cunoscute din secţiunea 2.4.<br />

Consi<strong>de</strong>rând relaţia A = Q ′ R şi partiţionând A şi Q ′ pe coloane, putem scrie<br />

⎡<br />

⎤<br />

r 11 . . . r 1j . . . r 1n<br />

. ..<br />

. .<br />

. .<br />

[a 1 . . . a j . . .a n ] = [q 1 . . . q j . . . q n ]<br />

r jj . . . r jn<br />

.<br />

⎢<br />

⎣<br />

. ⎥ .. . ⎦<br />

r nn<br />

Egalând primele coloane avem<br />

a 1 = q 1 r 11 ,


3.4. FACTORIZAREA QR 161<br />

un<strong>de</strong> vectorul q 1 este normat, i.e. ‖q 1 ‖ = 1, <strong>de</strong>ci r 11 = ‖a 1 ‖ şi q 1 = a 1 /r 11 . În<br />

general avem<br />

a j = q 1 r 1j + . . . + q j−1 r j−1,j + q j r jj ,<br />

un<strong>de</strong> q k ⊥ q j , <strong>de</strong>ci q H k a j = r kj , k = 1 : j − 1, iar q j este şi el normat, <strong>de</strong>ci<br />

∑j−1<br />

r jj = ‖a j − q k r kj ‖.<br />

Procedura <strong>de</strong> ortogonalizare Gram-Schmidt astfel obţinută este următoarea.<br />

k=1<br />

GS<br />

% Procedura Gram-Schmidt (schema jk)<br />

1. Pentru j = 1 : n<br />

1. q j = a j<br />

2. Pentru k = 1 : j − 1<br />

1. r kj = qk Hq j<br />

3. q j ← q j − ∑ j−1<br />

k=1 q kr kj<br />

4. r jj = ‖q j ‖<br />

5. q j ← q j /r jj<br />

Prin rearanjarea buclelor procedurii GS şi actualizarea coloanei curente q j imediat<br />

după <strong>calcul</strong>ul unui coeficient r kj , se obţine procedura <strong>de</strong> ortogonalizare Gram-<br />

Schmidt modificată.<br />

MGS<br />

% Procedura Gram-Schmidt modificată (schema kj)<br />

1. Pentru k = 1 : n<br />

1. q k = a k<br />

2. Pentru k = 1 : n<br />

1. r kk = ‖q k ‖<br />

2. q k ← q k /r kk<br />

3. Pentru j = k + 1 : n<br />

1. r kj = q H k q j<br />

2. q j ← q j − q k r kj<br />

Aici este important să subliniem că, <strong>de</strong>şi cele două proceduri sunt echivalente din<br />

punct <strong>de</strong> ve<strong>de</strong>re matematic, iar numărul <strong>de</strong> operaţii este acelaşi în ambele cazuri,<br />

N GS = 2mn 2 , totuşi performanţele lor <strong>numeric</strong>e sunt diferite. Procedura GS este<br />

<strong>numeric</strong> instabilă atât ca mijloc <strong>de</strong> <strong>calcul</strong> al factorizării QR cât şi ca metodă <strong>de</strong><br />

rezolvare a problemei CMMP. În schimb, procedura MGS furnizează o factorizare<br />

QR satisfăcătoare (în sensul că, <strong>de</strong> regulă, vectorii <strong>calcul</strong>aţi q j rezultă ortogonali<br />

în precizia <strong>de</strong> lucru) şi constituie totodată un algoritm <strong>numeric</strong> stabil pentru rezolvarea<br />

problemei CMMP. De aceea, în multe situaţii, procedura MGS (implementată<br />

îngrijit) poate constitui o alternativă viabilă faţă <strong>de</strong> perechea QR, GQR,<br />

relativ mai costisitoare.


162 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

3.4.5 Factorizarea QL<br />

În unele aplicaţii matricea A este adusă la forma inferior triunghiulară în raport cu<br />

diagonala secundară care începe din colţul dreapta-jos, i.e.<br />

Q H A = L, (3.75)<br />

un<strong>de</strong> l ij = 0, i < m − n + j, j = 1 : n, iar Q este unitară. (Pentru simplitate am<br />

presupus m ≥ n.)<br />

Procesul <strong>de</strong> triangularizare parcurge coloanele în ordine inversă, începând cu<br />

ultima şi anulează elementele situate <strong>de</strong>asupra diagonalei secundare utilizând reflectori<br />

modificaţi. Notând reflectorii cu indicele coloanei în care se păstrează vectorii<br />

Househol<strong>de</strong>r corespunzători, putem scrie<br />

iar procedura <strong>de</strong> <strong>calcul</strong> poate fi rezumată astfel.<br />

QL<br />

Q H = Q H 1 Q H 2 . . . Q H n , (3.76)<br />

% Schema <strong>de</strong> triangularizare QL, cazul m ≥ n<br />

1. Pentru k = n : −1 : 1<br />

1. Se generează Q k a.î. (Q H k A) ik = 0, i = 1 : m − n + k − 1<br />

2. A ← Q H k A<br />

La pasul 1.1 se utilizează o procedură <strong>de</strong> tip mRFG (vezi tabelul 3.1), iar la<br />

pasul 1.2 se modifică numai primele m − n + k elemente din coloanele j = 1 : k − 1,<br />

utilizând procedura corespunzătoare mRF.<br />

Aplicaţiile procedurii <strong>de</strong> triangularizare QL sunt perfect similare cu aplicaţiile<br />

<strong>de</strong>scrise mai sus ale procedurii QR (vezi problemele 3.42, 3.43).<br />

3.5 Rezolvarea problemei CMMP<br />

Revenim acum la problema (3.4) din secţiunea introductivă a acestui capitol şi, pentru<br />

generalitate, consi<strong>de</strong>răm versiunea ei complexă. Fie A ∈ C m×n o matrice dată şi<br />

b ∈ C m un vector arbitrar. Problema CMMP constă în <strong>de</strong>terminarea pseudosoluţiei<br />

x ∗ ∈ C n a sistemului Ax = b astfel încât norma euclidiană a reziduului r = b − Ax<br />

să fie minimă, i.e.<br />

‖b − Ax ∗ ‖ = min ‖b − Ax‖. (3.77)<br />

x∈Cn În primul rând, vom stabili condiţiile în care problema (3.77) este bine <strong>de</strong>finită,<br />

i.e. are o soluţie unică.<br />

Teorema 3.3 Oricare ar fi vectorul b ∈ C m , problema (3.77) are o soluţie unică<br />

dacă şi numai dacă matricea A ∈ C m×n este monică, i.e. m ≥ n şi rangA = n.<br />

În acest caz, pseudosoluţia în sensul CMMP a sistemului Ax = b poate fi scrisă<br />

în forma<br />

x ∗ = A + b, (3.78)<br />

în care matricea A + ∈ C n×m este prin <strong>de</strong>finiţie pseudoinversa lui A şi are expresia<br />

A + = (A T A) −1 A T (3.79)


3.5. REZOLVAREA PROBLEMEI CMMP 163<br />

Demonstraţie. Vom stabili pe rând a) existenţa şi b) unicitatea pseudosoluţiei x ∗ .<br />

a) Pentru a <strong>de</strong>monstra existenţa, nu e necesar să presupunem că matricea A<br />

este monică. Consi<strong>de</strong>răm subspaţiul S = ImA şi fie S ⊥ = KerA H complementul<br />

său ortogonal în C m . Vectorul b poate fi scris în mod unic sub forma b = b 1 + b 2 ,<br />

un<strong>de</strong> b 1 ∈ S şi b 2 ∈ S ⊥ sunt proiecţiile ortogonale ale lui b pe S şi respectiv S ⊥ .<br />

Avem<br />

r = b − Ax = b 2 + (b 1 − Ax), (3.80)<br />

un<strong>de</strong> b 1 ∈ S, Ax ∈ S implică b 1 − Ax ∈ S, <strong>de</strong>ci b 2 şi b 1 − Ax sunt ortogonali,<br />

∀x ∈ C n , vezi figura 3.6. Aplicând teorema lui Pitagora obţinem<br />

‖b − Ax‖ 2 = ‖b 1 − Ax + b 2 ‖ 2 = ‖b 1 − Ax‖ 2 + ‖b 2 ‖ 2 ≥ ‖b 2 ‖ 2 , ∀x ∈ C n . (3.81)<br />

Întrucât b 1 ∈ S = ImA, există (cel puţin) un x ∗ ∈ C n astfel încât<br />

Ax ∗ = b 1 , (3.82)<br />

iar din (3.81) se ve<strong>de</strong> că orice astfel <strong>de</strong> x ∗ are proprietatea (3.77) şi reciproc.<br />

Existenţa pseudosoluţiei x ∗ este <strong>de</strong>monstrată.<br />

Relaţia (3.82) arată că cea mai bună aproximare b ∗ = Ax ∗ a lui b pe S = ImA<br />

coinci<strong>de</strong> cu proiecţia ortogonală b 1 , <strong>de</strong>ci b ∗ = b 1 există întot<strong>de</strong>auna şi este unic<br />

<strong>de</strong>terminată oricare ar fi A. Această afirmaţie constituie lema proiecţiei ortogonale<br />

şi reprezintă generalizarea unui fapt binecunoscut din geometria elementară. Pe<br />

scurt (vezi (3.77) şi figura 3.6), distanţa minimă <strong>de</strong> la un punct b la un subspaţiu<br />

S este lungimea (euclidiană) a perpendicularei duse din b pe S.<br />

Consi<strong>de</strong>raţiile geometrice <strong>de</strong> mai sus pot fi exprimate analitic. Notând<br />

r ∗ = b − Ax ∗ , din (3.80) şi (3.82) se ve<strong>de</strong> că r ∗ = b 2 , un<strong>de</strong> b 2 ∈ S ⊥ = KerA H ,<br />

<strong>de</strong>ci A H r ∗ = 0. Prin urmare avem<br />

[ ] [ ] [ ]<br />

Im A r<br />

∗ b<br />

A H 0 x ∗ = , (3.83)<br />

0<br />

<strong>de</strong> un<strong>de</strong>, eliminând r ∗ între cele două ecuaţii, rezultă<br />

A H Ax ∗ = A H b. (3.84)<br />

b) Din (3.82), pseudosoluţia x ∗ e unic <strong>de</strong>terminată dacă şi numai dacă<br />

A(x − x ′ ) = 0 implică x = x ′ , adică KerA = {0}, sau, echivalent, A este monică.<br />

În acest caz, gramianul G = A H A este o matrice pozitiv <strong>de</strong>finită, <strong>de</strong>ci inversabilă<br />

(vezi <strong>de</strong>monstraţia teoremei 3.2), iar din (3.84) rezultă imediat (3.78) şi (3.79). ♦<br />

Observaţia 3.5 Sistemul liniar (3.83), <strong>de</strong> ordin m+n, se numeşte sistemul extins<br />

asociat problemei CMMP. Matricea acestui sistem este hermitică <strong>de</strong> semn ne<strong>de</strong>finit<br />

şi are o structură particulară remarcabilă. Prin rezolvarea acestui sistem putem<br />

<strong>calcul</strong>a atât pseudosoluţia x ∗ cât şi reziduul <strong>de</strong> normă minimă r ∗ . Procedurile <strong>de</strong><br />

<strong>calcul</strong> corespunzătoare vor fi expuse mai jos 16 .<br />

16 În principiu, sistemul extins poate fi rezolvat utilizând procedurile <strong>de</strong> factorizare cvasidiagonală<br />

<strong>de</strong>scrise în secţiunea 2.10, dar acestea nu sunt eficiente în cazul <strong>de</strong> faţă <strong>de</strong>oarece nu<br />

exploatează structura specială a sistemului consi<strong>de</strong>rat (vezi problema 3.52).


164 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

S = ImA<br />

b 2<br />

❈❈❖<br />

✻ ❈<br />

b ❈ b − Ax<br />

❈<br />

❈<br />

❈<br />

❈<br />

❙♦ ❈<br />

✏ ✏✏✏ ✏✶<br />

✁ ✁✁✁✁✁✁✁✁✁✕ b 1<br />

❳ ❙b 1 ❈ − Ax<br />

❳ ❳ ❳❳❳ ❙ ❈<br />

Ax ❳❳3 ❙❈<br />

T = S ⊥<br />

Fig. 3.6: Lema proiecţiei ortogonale<br />

Sistemul liniar (3.84), <strong>de</strong> ordin n, se numeşte sistemul <strong>de</strong> ecuaţii normale, pe<br />

scurt sistemul normal asociat problemei CMMP. Dacă matricea A e monică, gramianul<br />

G este o matrice hermitică pozitiv <strong>de</strong>finită, iar pseudosoluţia x ∗ coinci<strong>de</strong> cu<br />

soluţia sistemului normal. La fel ca în observaţia 3.4, această echivalenţă poate fi<br />

exploatată în două sensuri.<br />

a) Pseudosoluţia x ∗ a sistemului Ax = b poate fi <strong>de</strong>terminată prin rezolvarea<br />

sistemului normal asociat. Schema <strong>de</strong> <strong>calcul</strong> este următoarea:<br />

S Ch<br />

1. Se formează c = A H b<br />

2. Se formează G = A H A<br />

3. Se efectuează factorizarea Cholesky G = R H 1 R 1<br />

4. Se <strong>calcul</strong>ează x ∗ rezolvând succesiv sistemele<br />

triunghiulare R H 1 y = c şi R 1x ∗ = y.<br />

Trebuie însă să subliniem că, la fel ca în observaţia 3.4, această metodă (<strong>de</strong>şi<br />

relativ economică şi extrem <strong>de</strong> compactă) nu este recomandabilă din punct <strong>de</strong> ve<strong>de</strong>re<br />

<strong>numeric</strong>, <strong>de</strong>oarece matricea G = A H A este rău condiţionată. Cu precauţie, ea poate<br />

fi avută în ve<strong>de</strong>re, în special dacă m ≫ n, iar economia <strong>de</strong> memorie realizată prin<br />

formarea lui G constituie un obiectiv esenţial.<br />

b) Soluţiile unor sisteme liniare cu matrice pozitiv <strong>de</strong>finite având structură <strong>de</strong><br />

gramian pot fi <strong>de</strong>terminate aplicând i<strong>de</strong>ea <strong>algoritmi</strong>lor <strong>de</strong> rădăcină pătrată bazaţi<br />

pe utilizarea transformărilor unitare (vezi observaţia 3.4). Acest mod <strong>de</strong> lucru,<br />

frecvent utilizat în practica actuală, este ilustrat prin problema 3.46. ♦<br />

3.5.1 Calculul pseudosoluţiei<br />

Având în ve<strong>de</strong>re teorema 3.3, peste tot mai <strong>de</strong>parte vom presupune că matricea<br />

A ∈ C m×n este monică.


3.5. REZOLVAREA PROBLEMEI CMMP 165<br />

Rezolvarea problemei CMMP se poate face utilizând informaţia furnizată <strong>de</strong><br />

algoritmul <strong>de</strong> triangularizare ortogonală QR, i.e.<br />

[ R<br />

Q H ′<br />

A =<br />

0<br />

] }n<br />

}m − n , QH = Q H n . . . QH 2 QH 1 , (3.85)<br />

un<strong>de</strong> Q este unitară, iar R ′ este superior triunghiulară inversabilă. Aplicând transformarea<br />

Q H ambilor membri ai sistemului Ax = b şi notând<br />

[ ]<br />

Q H d<br />

′ }n<br />

b = d, d =<br />

d ′′ }m − n , (3.86)<br />

obţinem sistemul unitar echivalent<br />

[ R<br />

′<br />

0<br />

]<br />

x =<br />

[ d<br />

′<br />

d ′′ ] }n<br />

}m − n . (3.87)<br />

În general, în (3.87) avem d ′′ ≠ 0, <strong>de</strong>ci sistemul dat Ax = b este incompatibil.<br />

Pentru a <strong>de</strong>termina pseudosoluţia x ∗ , consi<strong>de</strong>răm reziduul r = b − Ax. Din<br />

(3.87) rezultă<br />

[ ] d<br />

Q H r =<br />

′ − R ′ x<br />

d ′′ , (3.88)<br />

un<strong>de</strong> matricea Q H este unitară, <strong>de</strong>ci ‖r‖ = ‖Q H r‖. Prin urmare<br />

‖r‖ 2 = ‖Q H r‖ 2 = ‖d ′ − R ′ x‖ 2 + ‖d ′′ ‖ 2 ≥ ‖d ′′ ‖ 2 , ∀x ∈ C n . (3.89)<br />

Efectuând minimizarea în raport cu x indicată în (3.77) obţinem<br />

R ′ x ∗ = d ′ , (3.90)<br />

<strong>de</strong>ci soluţia în sens CMMP a sistemului supra<strong>de</strong>terminat Ax = b coinci<strong>de</strong> cu soluţia<br />

sistemului superior triunghiular nesingular reprezentat <strong>de</strong> primele n ecuaţii din<br />

(3.87) 17 . Pe scurt, avem<br />

x ∗ = [(R ′ ) −1 0]Q H b (3.91)<br />

sau echivalent<br />

x ∗ = (R ′ ) −1 Q ′H b. (3.92)<br />

Procedural, soluţia problemei CMMP (3.77) este <strong>de</strong>terminată <strong>de</strong> relaţiile (3.86)<br />

şi (3.90). Ţinând cont <strong>de</strong> structura lui Q H din (3.85), se ve<strong>de</strong> uşor că transformările<br />

(3.86) pot fi efectuate (pe loc în b), utilizând o procedură <strong>de</strong> tip MQR. Schema <strong>de</strong><br />

<strong>calcul</strong> astfel obţinută este următoarea<br />

SQR<br />

% Calculul pseudosoluţiei x = A + b<br />

1. Pentru k = 1 : n<br />

1.b ← Q H k b<br />

2. Se rezolvă sistemul triunghiular R ′ x = b(1 : n)<br />

17 Raţionamentul <strong>de</strong> mai sus constituie o nouă <strong>de</strong>monstraţie, <strong>de</strong> data aceasta constructivă, a<br />

teoremei 3.3. Relaţiile (3.80-3.82) şi (3.88-3.90) se corespund în mod evi<strong>de</strong>nt.


166 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Cu referire la algoritul 3.5, care utilizează reflectori hermitici, implementarea<br />

schemei SQR are loc astfel.<br />

Algoritmul 3.8 (SQR – problema liniară a celor mai mici pătrate)<br />

(Se dă un vector b ∈ C m . Utilizând ieşirea algoritmului 3.5, se <strong>calcul</strong>ează<br />

în x soluţia în sens CMMP a sistemului liniar Ax = b. Se presupune că<br />

matricea A este monică.)<br />

% se aplică transformările vectorului b<br />

1. Pentru k = 1 : n<br />

1. t = a kk<br />

2. a kk ← u kk = β k<br />

3. α = − ( ∑ m<br />

i=k ūikb i )/β k<br />

4. b i ← b i + αu ik , pentru i = k : m<br />

5. a kk = t<br />

% <strong>calcul</strong>ul soluţiei problemei CMMP<br />

2. Pentru k = n : −1 : 1<br />

1. x k = (b k − ∑ n<br />

j=k+1 a kjx j )/a kk<br />

Comentarii. În cazul real, algoritmul 3.8 necesită N op = N m + n 2 = 4mn − n 2<br />

operaţii. Modul <strong>de</strong> apel este x = SQR(A, β, b). Reţinem că <strong>de</strong>terminarea pseudosoluţiei<br />

prin apelarea succesivă a procedurilor QR şi SQR necesită asimptotic N QR<br />

operaţii, i.e. principalul efort <strong>de</strong> <strong>calcul</strong> se consumă pentru triangularizarea ortogonală<br />

a matricei A.<br />

♦<br />

În cazul utilizării algoritmului CQR, implementarea schemei SQR este următoarea.<br />

SCQR<br />

% Calculul pseudosoluţiei.<br />

1. Pentru k = 1 : s<br />

1. CRF(A(k : m, k), τ k , b(k : m))<br />

2. x = UTRIS(A(1 : n,:), b(1 : n))<br />

Pe baza informaţiilor furnizate <strong>de</strong> schema SQR, putem <strong>calcul</strong>a uşor şi reziduul<br />

<strong>de</strong> normă minimă r ∗ = b −Ax ∗ , obţinând astfel soluţia completă a sistemului extins<br />

(3.83). Din (3.88) şi (3.90) obţinem imediat<br />

[ ]<br />

r ∗ 0<br />

= Q<br />

d ′′ , (3.93)<br />

în care d ′′ are semnificaţia din (3.86). Prin urmare, având în ve<strong>de</strong>re că vectorul<br />

transformat b ← d = Q H b a fost <strong>de</strong>ja <strong>calcul</strong>at la pasul 1, r ∗ poate fi obţinut (pe loc<br />

în b) completând schema SQR cu secvenţa<br />

3. b(1 : n) = 0<br />

4. Pentru k = n : −1 : 1<br />

1. b ← Q k b


3.5. REZOLVAREA PROBLEMEI CMMP 167<br />

În rezumat, fiind date matricea A şi vectorul b, <strong>calcul</strong>ul pseudosoluţiei x ∗ a<br />

sistemului Ax = b şi al reziduului <strong>de</strong> normă minimă r ∗ constă în triangularizarea<br />

ortogonală a matricei A, urmată <strong>de</strong> aplicarea schemei SQR completată aşa cum am<br />

spus mai sus. Utilizând procedurile cunoscute QR, MQR şi UTRIS, algoritmul<br />

<strong>de</strong> <strong>calcul</strong> se redactează concis astfel.<br />

CMMP<br />

% Rezolvarea completă a problemei CMMP.<br />

0. [A, β] = QR(A)<br />

1. b = MQR( ′ da ′ , A, β, b)<br />

2. x = UTRIS(A(1 : n, :), b(1 : n))<br />

3. b(1 : n) = 0<br />

4. b = MQR( ′ nu ′ , A, β, b)<br />

Subliniem că la pasul 2 pseudosoluţia x ∗ nu se <strong>calcul</strong>ează pe locul membrului<br />

drept b, tocmai având în ve<strong>de</strong>re utilizarea acestui spaţiu la paşii 3 şi 4 pentru<br />

memorarea lui r ∗ . Deseori în practică, pentru aprecierea gradului <strong>de</strong> incompatibilitate<br />

a sistemului Ax = b, este suficient <strong>calcul</strong>ul normei ρ = ‖r ∗ ‖. Evi<strong>de</strong>nt,<br />

avem ρ = ‖b(n + 1 : m)‖, un<strong>de</strong> b este vectorul transformat obţinut la pasul 1 al<br />

procedurilor SQR sau CMMP.<br />

3.5.2 Calculul proiecţiilor<br />

În numeroase aplicaţii prezintă interes <strong>calcul</strong>ul proiecţiilor ortogonale b 1 şi b 2 ale<br />

unui vector b pe subspaţiile S = ImA şi respectiv S ⊥ = KerA H .<br />

Din <strong>de</strong>monstraţia teoremei 3.5 (vezi figura 3.6) a rezultat că proiecţia b 2 a lui b pe<br />

S ⊥ coinci<strong>de</strong> cu reziduul <strong>de</strong> normă minimă r ∗ , <strong>de</strong>ci se <strong>calcul</strong>ează aplicând procedura<br />

CMMP din care pasul 2 se omite 18 .<br />

În mod similar proiecţia b 1 a lui b pe S, care coinci<strong>de</strong> cu vectorul <strong>de</strong> cea mai<br />

bună aproximaţie b ∗ = Ax ∗ , are expresia<br />

[ ]<br />

b ∗ d<br />

′<br />

= Q , (3.94)<br />

0<br />

<strong>de</strong>ci se <strong>calcul</strong>ează aplicând aceeaşi procedură CMMP în care pasul 3 se înlocuieşte<br />

cu<br />

3 ′ . b(n + 1 : m) = 0.<br />

Subliniem că, pentru siguranţa <strong>calcul</strong>ului, proiecţiile b 1 = b ∗ şi b 2 = r ∗ se<br />

<strong>de</strong>termină întot<strong>de</strong>auna utilizând relaţiile (3.86), (3.93) şi (3.94), în care au loc numai<br />

transformări ortogonale. În special, nu se recomandă utilizarea relaţiilor ”evi<strong>de</strong>nte”<br />

b ∗ = Ax ∗ şi r ∗ = b − Ax ∗ sau b 1 + b 2 = b, aparent mai simple, <strong>de</strong>oarece acestea din<br />

urmă pot conduce la erori catastrofale <strong>de</strong> anulare prin scă<strong>de</strong>re. De asemenea, este<br />

esenţial să reţinem că <strong>de</strong>terminarea proiecţiilor precum şi <strong>calcul</strong>ul pseudosoluţiei<br />

se efectuează operând direct asupra vectorului b, fără a forma explicit proiectorii<br />

ortogonali P 1 , P 2 sau pseudoinversa A + .<br />

18 Tocmai în virtutea acestei semnificaţii geometrice remarcabile, reziduul r ∗ = b − Ax ∗ poate fi<br />

<strong>calcul</strong>at fără a <strong>de</strong>termina în prealabil pseudosoluţia x ∗ . În general, toate <strong>calcul</strong>ele se fac utilizând<br />

exclusiv informaţiile obţinute la paşii 0 şi 1 ai procedurii CMMP, fără nici o referire la datele<br />

iniţiale A, b care, <strong>de</strong> altfel, au şi fost distruse.


168 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

3.5.3 Problema CMMP cu membru drept multiplu<br />

Fie acum A ∈ C m×n o matrice dată şi B ∈ C m×p o matrice arbitrară cu p coloane,<br />

un<strong>de</strong> p ≥ 1. Problema rezolvării în sensul CMMP a sistemului cu membru drept<br />

multiplu AX = B constă în <strong>de</strong>terminarea pseudosoluţiei X ∗ ∈ C n×p astfel încât<br />

norma Frobenius a reziduului <strong>matriceal</strong> R = B − AX să fie minimă, pe scurt<br />

‖B − AX ∗ ‖ F =<br />

min<br />

X∈C n×p ‖B − AX‖ F. (3.95)<br />

Analiza acestei probleme este simplă. Partiţionând matricele B, X şi R pe<br />

coloane, cu notaţii clare putem scrie r j = b j −Ax j , j = 1 : p. Pe <strong>de</strong> altă parte, prin<br />

<strong>de</strong>finiţia normei Frobenius avem<br />

‖R‖ 2 F =<br />

p∑<br />

‖r j ‖ 2 . (3.96)<br />

j=1<br />

În consecinţă, problema <strong>de</strong> minimizare (3.95) este echivalentă cu p probleme CMMP<br />

<strong>de</strong> tip (3.77), având aceeaşi matrice A şi membri drepţi diferiţi, i.e.<br />

‖b j − Ax ∗ j ‖ = min<br />

x∈C n ‖b j − Ax‖, j = 1 : p. (3.97)<br />

Prin urmare, dacă matricea A este monică, atunci conform teoremei 3.3 fiecare<br />

problemă (3.97) are o soluţie unică x ∗ j = A + b j , j = 1 : p, iar matricea<br />

X ∗ = [x ∗ 1 . . . x∗ p ], rezultată prin agregarea acestora constituie soluţia unică<br />

X ∗ = A + B (3.98)<br />

a problemei (3.95).<br />

Procedural, pseudosoluţia X ∗ ∈ C n×p se <strong>calcul</strong>ează simplu, efectuând o singură<br />

dată triangularizarea ortogonală a matricei A şi aplicând apoi repetat algoritmul<br />

<strong>de</strong> rezolvare SQR fiecărei coloane B(:, j), j = 1 : p, a matricei B. Dacă<br />

în plus se doreşte <strong>calcul</strong>ul reziduului <strong>de</strong> normă Frobenius minimă R ∗ = B − AX ∗ ,<br />

atunci se aplică procedura CMMP în care vectorul b se înlocuieşte peste tot cu matricea<br />

B. Desigur, în acest nou context pot fi aplicate avantajos (pe <strong>calcul</strong>atoarele<br />

cu memorie ierarhică) procedurile bloc <strong>de</strong> triangularizare ortogonală şi aplicare a<br />

transformărilor, expuse în secţiunea 3.4.4.<br />

3.5.4 Calculul pseudoinversei<br />

Matricea pseudoinversă A + , <strong>de</strong>finită prin (3.78) are multe proprietăţi interesante<br />

şi, în principiu, poate fi <strong>calcul</strong>ată în multe feluri.<br />

În primul rând, utilizând relaţia (3.79), constatăm imediat că<br />

1 ◦ A + A = I n<br />

2 ◦ AA + = (AA + ) H .<br />

Prima relaţie afirmă că A + este o inversă la stânga a matricei A; în particular,<br />

rangA + = n, <strong>de</strong>ci A + este epică. A doua relaţie, în combinaţie cu prima, arată


3.5. REZOLVAREA PROBLEMEI CMMP 169<br />

că matricea hermitică P 1 = AA + coinci<strong>de</strong> cu proiectorul ortogonal pe subspaţiul<br />

S = ImA. Prin urmare, relaţiile 1 ◦ şi 2 ◦ <strong>de</strong>termină unic matricea A + cu expresia<br />

(3.79). Din nefericire, (3.79) este improprie din punct <strong>de</strong> ve<strong>de</strong>re <strong>numeric</strong>, <strong>de</strong>oarece<br />

implică inversarea gramianului G = A H A.<br />

În al doilea rând, punând B = I m din (3.98) găsim X ∗ = A + . Prin urmare,<br />

având în ve<strong>de</strong>re (3.95), A + este soluţia unică a problemei <strong>de</strong> minimizare<br />

‖I m − AA + ‖ F =<br />

min<br />

X∈C n×m ‖I m − AX‖ F . (3.99)<br />

Nici această constatare, <strong>de</strong>şi teoretic extrem <strong>de</strong> interesantă, nu are însă utilitate<br />

<strong>calcul</strong>atorie. Determinarea lui A + prin rezolvarea sistemului AX = I m utilizând<br />

procedura CMMP este evi<strong>de</strong>nt neeficientă, <strong>de</strong>oarece aplicarea transformărilor <strong>de</strong> la<br />

pasul 1 nu ţine seama <strong>de</strong> structura specială a membrului drept B = I m .<br />

În sfârşit, din (3.78), prin i<strong>de</strong>ntificare cu (3.91), (3.92) rezultă<br />

A + = [(R ′ ) −1 0]Q H , respectiv A + = (R ′ ) −1 Q ′H , (3.100)<br />

în care apar direct elementele factorizării QR a matricei A. În consecinţă, A +<br />

poate fi <strong>calcul</strong>ată efectuând triangularizarea ortogonală a matricei A şi utilizând<br />

informaţia astfel obţinută pentru a explicita oricare dintre relaţiile (3.100).<br />

a) În primul caz se <strong>calcul</strong>ează inversa matricei triunghiulare R′ şi apoi se aplică<br />

transformarea Q H la dreapta inversei extinse cu zerouri, utilizând o procedură <strong>de</strong><br />

tip MQRd.<br />

b) În al doilea caz se acumulează matricea Q′ utilizând procedura GQR şi apoi<br />

se rezolvă sistemul superior triunghiular R ′ A + = Q ′H 19 .<br />

Detaliile <strong>de</strong> implementare precum şi analiza <strong>algoritmi</strong>lor <strong>de</strong> <strong>calcul</strong> astfel obţinuţi<br />

sunt propuse cititorului ca exerciţii.<br />

Întrucât matricea A + este rareori necesară ca atare în <strong>calcul</strong>e, iar formarea sa<br />

explicită este costisitoare, în practică se recomandă evitarea <strong>de</strong>terminării lui A + în<br />

favoarea rezolvării în sens CMMP a unui sistem AX = B <strong>de</strong>finit în mod a<strong>de</strong>cvat. O<br />

observaţie similară este valabilă relativ la proiectorii P 1 şi P 2 . Calculul proiecţiilor<br />

se face direct, după cum am arătat în secţiunea 3.5.2.<br />

3.5.5 Alte <strong>meto<strong>de</strong></strong> <strong>de</strong> rezolvare a problemei CMMP<br />

Calculul pseudosoluţiei x ∗ a sistemului Ax = b se poate face utilizând factorizarea<br />

QR a matricei furnizată <strong>de</strong> procedura Gram-Schmidt modificată din secţiunea 3.4.4.<br />

Pe scurt, avem A = Q ′ R ′ , un<strong>de</strong> ambele matrice Q ′ şi R ′ sunt formate explicit <strong>de</strong><br />

procedura MGS, iar relaţia (3.92) spune că x ∗ = (R ′ ) −1 Q ′H b. Partiţionând Q ′ pe<br />

coloane, schema <strong>de</strong> <strong>calcul</strong> este următoarea.<br />

SMGS<br />

% Calculul pseudosoluţiei.<br />

1. Pentru j = 1 : n<br />

1. x j ← d j = q H j b<br />

2. Se rezolvă sistemul triunghiular R ′ x = d ′<br />

19 Amintim că procedura GQR <strong>calcul</strong>ează Q ′ pe loc în A. Prin urmare, matricea Y = (A + ) H<br />

poate fi obţinută tot în A, rezolvând sistemul inferior triunghiular Y (R ′ ) H = Q ′ .


170 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Numărul <strong>de</strong> operaţii este N op = 2mn + n 2 , prin urmare <strong>calcul</strong>ul pseudosoluţiei<br />

prin apelarea succesivă a procedurilor MGS şi SMGS cere asimptotic N GS > N QR<br />

operaţii.<br />

Desigur, procedura <strong>de</strong> triangularizare ortogonală este mai economică <strong>de</strong>oarece<br />

nu formează explicit matricea Q ′ , totuşi simplitatea procedurii MGS este uneori<br />

atractivă. Realmente neplăcută aici este absenţa matricei <strong>de</strong> completare Q ′′ pe<br />

care procedura MGS nu o poate <strong>calcul</strong>a. În consecinţă, <strong>calcul</strong>ul reziduului <strong>de</strong> normă<br />

minimă nu se poate face acum <strong>de</strong>cât pe baza relaţiei r ∗ = b − Ax ∗ , ceea ce necesită<br />

păstrarea unor copii ale datelor <strong>de</strong> intrare A, b. În plus, dacă sistemul Ax = b este<br />

”aproape” compatibil, i.e. vectorii b şi b ∗ = Ax ∗ sunt apropiaţi, atunci <strong>calcul</strong>ul<br />

lui r ∗ este ameninţat <strong>de</strong> erori catastrofale şi, <strong>de</strong> aceea, trebuie efectuat lucrând în<br />

dublă precizie (vezi secţiunea 2.7).<br />

3.6 Sisteme liniare sub<strong>de</strong>terminate<br />

Rezolvarea sistemelor liniare sub<strong>de</strong>terminate necesită o procedură specifică <strong>de</strong> triangularizare<br />

ortogonală la dreapta, pe care o vom expune în prima parte a acestei<br />

secţiuni. În continuare vom construi factorizarea LQ corespunzătoare, iar în final<br />

vom prezenta procedura <strong>de</strong> rezolvare a problemelor CMMP <strong>de</strong> tip (3.5).<br />

3.6.1 Triangularizarea ortogonală la dreapta<br />

Propoziţia 3.3 Oricare ar fi A ∈ C m×n , există o matrice unitară V H not<br />

= Z ∈<br />

C n×n astfel încât matricea<br />

AV H = L, respectiv AZ = L, (3.101)<br />

este inferior triunghiulară.<br />

În cazul real A ∈ R m×n , matricea <strong>de</strong> transformare V T = Z poate fi aleasă (reală<br />

şi) ortogonală, <strong>de</strong>ci L rezultă reală.<br />

Pe scurt, orice matrice A este unitar echivalentă la dreapta cu o matrice inferior<br />

triunghiulară. Prima relaţie arată că A poate fi scrisă sub forma unui produs<br />

A = LV , un<strong>de</strong> V este unitară, iar L este inferior triunghiulară. În <strong>calcul</strong>ul <strong>numeric</strong><br />

o relaţie <strong>de</strong> acest tip se numeşte factorizare LQ, <strong>de</strong> aceea procedurile <strong>de</strong> <strong>calcul</strong><br />

stabilite pe baza relaţiei fundamentale (3.101) vor fi notate cu sigla LQ.<br />

Demonstraţia rezultă imediat aplicând teorema 3.1 matricei B = A H .<br />

Într-a<strong>de</strong>văr, dacă V A H = R este superior triunghiulară, atunci are loc (3.101),<br />

un<strong>de</strong> L = R H este evi<strong>de</strong>nt inferior triunghiulară 20 .<br />

♦<br />

Având în ve<strong>de</strong>re că operaţia <strong>de</strong> transpunere şi conjugare este costisitoare, în<br />

practica profesională se operează direct asupra matricei date A ∈ C m×n . Notăm ca<br />

<strong>de</strong> obicei s = min(m, n) şi fie Z k reflectorii utilizaţi în scopul anulării elementelor<br />

20 Corespon<strong>de</strong>nţa A → A H se numeşte dualitate, iar rezultatele şi relaţiile asociate prin această<br />

corespon<strong>de</strong>nţă se numesc duale. De exemplu, relaţiile (3.53) şi (3.101) sunt duale.


3.6. SISTEME LINIARE SUBDETERMINATE 171<br />

situate la dreapta diagonalei principale, din liniile matricei A, la etapele k = 1 : s.<br />

Similar cu (3.56), matricea <strong>de</strong> transformare are structura<br />

iar schema <strong>de</strong> triangularizare este următoarea<br />

V H = Z = Z 1 Z 2 . . . Z s (3.102)<br />

LQ<br />

% Schemă generală <strong>de</strong> triangularizare LQ<br />

1. Pentru k = 1 : s<br />

1. Se generează Z k a.î. (AZ k ) kj = 0, j = k + 1 : n<br />

2. A ← AZ k .<br />

• În cazul real sau în cazul utilizării reflectorilor hermitici (Z k = Zk H ), componentele<br />

v kj , j = k + 1 : n, ale vectorilor Househol<strong>de</strong>r v k se memorează natural pe<br />

poziţiile elementelor anulate. Algoritmul rezultat poate fi redactat astfel.<br />

Algoritmul 3.9 (LQ – triangularizare ortogonală la dreapta cu reflectori<br />

hermitici) (Se dă A ∈ C m×n . Se efectuează triangularizarea<br />

ortogonală la dreapta a matricei A, i.e. AZ = L, un<strong>de</strong> Z = Z 1 Z 2 . . .Z s ,<br />

iar Z k sunt reflectori hermitici. Partea esenţială v k (k+1 : n) a vectorilor<br />

Househol<strong>de</strong>r v k se memorează pe poziţiile corespunzătoare A(k, k + 1 : n).<br />

La aplicarea ulterioară a transformărilor se ţine seama că v kk = β k ,<br />

k = 1 : s. Elementele nenule ale matricei inferior triunghiulare L<br />

suprascriu elementele corespunzătoare din triunghiul inferior al matricei<br />

A.)<br />

1. Pentru k = 1 : s<br />

1. β k = 0<br />

2. Dacă k < n atunci<br />

1. σ = ‖A(k, k : n)‖<br />

2. Dacă σ ≠ 0 atunci<br />

1. Dacă a kk ≠ 0 atunci σ ← ākk<br />

|a kk | σ<br />

2. a kj ← v kj = ā kj /σ, pentru j = k : n<br />

3. β k ← v kk = 1 + a kk<br />

4. Pentru i = ( k + 1 : m<br />

∑n<br />

)<br />

1. α = −<br />

j=k a ijv kj /β k<br />

2. a ij ← a ij + α¯v kj , pentru j = k : n<br />

% elementul diagonal<br />

5. a kk = −¯σ<br />

Comentarii. În cazul real algoritmul 3.9 necesită N LQ = 2nm 2 − m 3 /3 operaţii<br />

şi este <strong>numeric</strong> stabil, după cum vom arăta în secţiunea 3.8. Modul <strong>de</strong> apel este<br />

[A, β] = LQ(A), un<strong>de</strong> β este vectorul real cu componentele β k , k = 1 : s, iar A<br />

apare ca tablou <strong>de</strong> intrare-ieşire.<br />

♦<br />

•• În cazul utilizării reflectorilor complecşi, <strong>de</strong>taliile sunt propuse cititorului ca<br />

exerciţiu.


172 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

3.6.2 Factorizarea LQ<br />

În această secţiune construim factorizarea LQ a unei matrice A ∈ C m×n <strong>de</strong> formă<br />

generală.<br />

În cazul m ≤ n, relaţiile (3.101) şi (3.102) pot fi scrise sub forma<br />

un<strong>de</strong> matricea<br />

A = LV, L = [ L ′<br />

}{{}<br />

m<br />

}{{}<br />

0<br />

n−m<br />

], (3.103)<br />

V = Z H m . . .Z H 2 Z H 1 (3.104)<br />

este unitară, iar L ′ este inferior triunghiulară <strong>de</strong> ordin m. Partiţionând V = Z H<br />

conform cu L, i.e.<br />

[ ] V<br />

′ }m<br />

V =<br />

V ′′ }n − m , Z = [ }{{}<br />

Z′ }{{}<br />

Z ′′ ] (3.105)<br />

m n−m<br />

din (3.103) <strong>de</strong>ducem<br />

A = L ′ V ′ , (3.106)<br />

un<strong>de</strong> evi<strong>de</strong>nt V ′ = Z ′H are liniile ortogonale, i.e. V ′ V ′H = I m .<br />

Propoziţia 3.4 Orice matrice A ∈ C m×n cu m ≤ n poate fi scrisă sub forma<br />

(3.106), un<strong>de</strong> V ′ ∈ C m×n are liniile ortogonale, iar L ′ ∈ C m×m este inferior<br />

triunghiulară. Prin <strong>de</strong>finiţie, relaţia (3.106) constituie factorizarea LQ a matricei<br />

A. Dacă A este epică, atunci L ′ rezultă inversabilă şi reciproc.<br />

Demonstraţia ultimei afirmaţii este evi<strong>de</strong>ntă. Mai mult, dacă A este epică,<br />

atunci matricea hermitică G = AA H este pozitiv <strong>de</strong>finită, prin urmare consi<strong>de</strong>rând<br />

factorizarea Cholesky G = L 1 L H 1 şi <strong>de</strong>finind V 1 = L −1<br />

1 A, putem stabili cu uşurinţă<br />

unicitatea factorizării LQ, în care factorul triunghiular L ′ are elementele diagonale<br />

pozitive.<br />

♦<br />

În general, matricea hermitică pozitiv semi<strong>de</strong>finită G = AA H se numeşte gramian<br />

al (liniilor) lui A. Observaţia 3.4 se reformulează corespunzător în noul context.<br />

Dacă matricea A este epică, atunci matricea Z ′′ din (3.105) are o semnificaţie<br />

geometrică remarcabilă. Din (3.101) sau (3.103) rezultă AZ = [L ′ 0], un<strong>de</strong> Z are<br />

structura (3.105), <strong>de</strong>ci<br />

AZ ′′ = 0. (3.107)<br />

Mai mult, Z ′′ ∈ C n×(n−m) are coloanele ortogonale, <strong>de</strong>ci constituie o bază ortogonală<br />

a subspaţiului N = KerA. Proiectorul ortogonal pe N este P 2 = Z ′′ Z ′′H .<br />

În mod similar, matricea Z ′ ∈ C n×m (care, în (3.105), completează Z ′′ până<br />

la o matrice ortogonală) constituie o bază ortogonală a subspaţiului complementar<br />

N ⊥ = ImA H . Proiectorul ortogonal pe S este P 1 = A H (AA H ) −1 A sau mai simplu<br />

P 1 = Z ′ Z ′H . Pe scurt, partiţia (3.105) corespun<strong>de</strong> <strong>de</strong>scompunerii ortogonale<br />

C n = ImA H ⊕ KerA. (3.108)


3.6. SISTEME LINIARE SUBDETERMINATE 173<br />

Acumularea transformărilor<br />

În cazul m ≤ n, factorizarea LQ a matricei A poate fi <strong>de</strong>terminată utilizând procedura<br />

<strong>de</strong> triangularizare ortogonală la dreapta din secţiunea anterioară. Factorul<br />

triunghiular L ′ se obţine ca atare în triunghiul inferior al matricei A, iar factorul<br />

ortogonal V ′ poate fi <strong>calcul</strong>at sub forma<br />

V ′ = [I m 0]V = [I m 0]Z H m . . . Z H 2 Z H 1 , (3.109)<br />

aplicând următoarea schemă evi<strong>de</strong>ntă <strong>de</strong> acumulare a transformărilor.<br />

GLQ % Acumularea primelor n linii V ′ ale matricei V = Z H , m ≤ n.<br />

1. V ′ = [I n 0]<br />

2. Pentru k = m : −1 : 1<br />

1. V ′ ← V ′ Z H k<br />

Cu referire la algoritmul 3.9, <strong>calcul</strong>ul poate fi organizat pe loc în tabloul A,<br />

iar procedura poate fi scrisă cu uşurinţă <strong>de</strong> cititorul interesat. Menţionăm însă că<br />

formarea explicită a matricelor V ′ sau Z ′ , Z ′′ etc. este <strong>de</strong> regulă contraindicată.<br />

Aproape întot<strong>de</strong>auna forma factorizată (3.102) este suficientă.<br />

Aplicarea transformărilor<br />

La fel ca în secţiunea 3.4, matricea unitară Z generată <strong>de</strong> algoritmul <strong>de</strong> triangularizare<br />

LQ aplicat matricei A se utilizează pentru a transforma a<strong>de</strong>cvat o altă<br />

matrice dată B.<br />

Aplicarea transformării<br />

se face partiţionând B pe coloane:<br />

B ← ZB = Z 1 Z 2 . . . Z s B (3.110)<br />

MLQ % Aplicarea transformării B ← ZB, un<strong>de</strong> Z = Z 1 Z 2 . . . Z s .<br />

1. Pentru k = s : −1 : 1<br />

1. B ← Z k B<br />

Procedând în acelaşi spirit, toate rezultatele din secţiunea 3.4 pot fi reformulate<br />

în contextul factorizării LQ. Stabilirea versiunii la nivel <strong>de</strong> bloc a procedurii <strong>de</strong><br />

triangularizare la dreapta precum şi a procedurilor <strong>de</strong> ortogonalizare Gram-Schmidt<br />

sunt propuse cititorului ca exerciţii.<br />

Factorizarea RQ<br />

În unele aplicaţii matricea A este adusă la forma superior triunghiulară în raport<br />

cu diagonala secundară care începe din colţul dreapta-jos, i.e.<br />

AZ = R, (3.111)<br />

un<strong>de</strong> r ij = 0, j < n − m + i, i = 1 : m, iar Z este unitară. (Pentru simplitate am<br />

presupus m ≤ n.)


174 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

Procesul <strong>de</strong> triangularizare la dreapta parcurge liniile în ordine inversă, începând<br />

cu ultima şi anulează elementele situate la stânga diagonalei secundare utilizând<br />

reflectori modificaţi. Notând reflectorii cu indicele liniei în care se păstrează vectorii<br />

Househol<strong>de</strong>r corespunzători, putem scrie<br />

iar procedura <strong>de</strong> <strong>calcul</strong> poate fi rezumată astfel.<br />

Z = Z m . . .Z 2 Z 1 , (3.112)<br />

RQ<br />

% Schema <strong>de</strong> triangularizare RQ, cazul n > m<br />

1. Pentru k = m : −1 : 1<br />

1. Se generează Z k a.î. (AZ k ) kj = 0, j = 1 : n − m + k − 1<br />

2. A ← AZ k<br />

La pasul 1.1 se utilizează o procedură <strong>de</strong> tip mRFG (vezi tabelul 3.1), iar la<br />

pasul 1.2 se modifică numai primele n − m + k elemente din liniile i = 1 : k − 1,<br />

utilizând procedura corespunzătoare mRF.<br />

Aplicaţiile procedurii <strong>de</strong> triangularizare RQ sunt perfect similare cu aplicaţiile<br />

<strong>de</strong>scrise mai sus ale procedurii LQ.<br />

3.6.3 Rezolvarea sistemelor sub<strong>de</strong>terminate<br />

Revenim acum la problema (3.5) din secţiunea introductivă a acestui capitol. Fie<br />

A ∈ C m×n şi b ∈ C n . Problema constă în <strong>de</strong>terminarea soluţiei normale a sistemului<br />

Ax = b, i.e. a unui vector x ∗ ∈ C n astfel încât<br />

‖x ∗ ‖ = min ‖x‖. (3.113)<br />

Ax=b<br />

Condiţiile <strong>de</strong> existenţă şi unicitate ale soluţiei normale pot fi formulate astfel.<br />

Teorema 3.4 Oricare ar fi b ∈ R m , problema (3.113) are o soluţie unică dacă şi<br />

numai dacă A este epică, i.e. m ≤ n şi rangA = m.<br />

În acest caz, soluţia normală x ∗ a sistemului Ax = b poate fi scrisă în forma<br />

x ∗ = A + b, (3.114)<br />

în care matricea A + este prin <strong>de</strong>finiţie (pseudo)inversa normală a lui A şi are<br />

expresia<br />

A + = A T (AA T ) −1 . (3.115)<br />

Demonstraţia rezultă uşor (cel puţin în cazul real) utilizând <strong>meto<strong>de</strong></strong>le clasice <strong>de</strong><br />

minimizare cu restricţii (problema (3.113) este extrem <strong>de</strong> simplă). Noi vom proceda<br />

direct, stabilind pe rând a) unicitatea şi b) existenţa globală a soluţiei x ∗ .<br />

a) Pentru a <strong>de</strong>monstra unicitatea, nu e necesar să presupunem că matricea A<br />

este epică, ci doar că<br />

b ∈ ImA, (3.116)<br />

i.e. mulţimea X a soluţiilor sistemului Ax = b nu e vidă. Desigur, în limbaj<br />

geometric, X este planul (sau varietatea liniară) <strong>de</strong> ecuaţie Ax = b. Mai precis,


3.6. SISTEME LINIARE SUBDETERMINATE 175<br />

N = KerA<br />

”planul”<br />

Ax = b<br />

✑ ✑✑✑✑✑✑✑✑ ✑ ✑✑✑✑✑✑✑✑ x<br />

x 2<br />

✘ ✘ ✘ ✘✘✘ ✘ ✘✘✘ ✘ ✘✘✘ ✘ ✘✘✘ ✘✘✿<br />

✁ ✁✁✁✁✕<br />

✑<br />

✑<br />

✑<br />

✲✁ ✁✁✁✁✕<br />

✑<br />

N ⊥ 0 ✑<br />

x ✑<br />

✑<br />

∗ = x 1<br />

✑<br />

✑<br />

✑<br />

✑<br />

✑<br />

✑<br />

✑ ✑<br />

✑ Fig. 3.7: Forma generală a soluţiilor sistemului sub<strong>de</strong>terminat Ax = b<br />

teorema 1.3 din capitolul 1 afirmă că X = x 0 + KerA, un<strong>de</strong> x 0 este o soluţie particulară.<br />

În consecinţă, conform lemei proiecţiei ortogonale, soluţia x∗ a problemei<br />

(3.113) coinci<strong>de</strong> cu piciorul perpendicularei din origine pe planul X şi ca atare este<br />

unic <strong>de</strong>terminată, vezi figura 3.7.<br />

La fel ca în <strong>de</strong>monstraţia teoremei 3.3, aceste consi<strong>de</strong>raţii geometrice pot fi<br />

exprimate analitic. Planul X este paralel cu subspaţiul N = KerA, <strong>de</strong>ci x ∗ ⊥ KerA<br />

sau x ∗ ∈ N ⊥ = ImA H , i.e. există (cel puţin) un y ∗ ∈ C m astfel încât x ∗ = A H y ∗ .<br />

(În interpretare variaţională, y∗ este vectorul multiplicatorilor Lagrange asociaţi<br />

restricţiilor egalitate Ax = b din (3.113).) În <strong>de</strong>finitiv avem<br />

[ ] [ ] [<br />

In A H x<br />

∗ 0<br />

A 0 −y ∗ =<br />

b<br />

<strong>de</strong> un<strong>de</strong>, eliminând x ∗ rezultă<br />

]<br />

, (3.117)<br />

AA H y ∗ = b, x ∗ = A H y ∗ . (3.118)<br />

b) Existenţa globală a lui x ∗ este asigurată, i.e. (3.116) are loc oricare ar fi<br />

b ∈ C m , dacă şi numai dacă A este epică. În acest caz, matricea G = AA H este<br />

pozitiv <strong>de</strong>finită <strong>de</strong>ci inversabilă, iar (3.114) şi (3.115) rezultă din (3.118). ♦<br />

Observaţia 3.6 Sistemul extins (3.117) şi sistemul normal (3.118) au o semnificaţie<br />

similară cu cea a sistemelor (3.83) şi respectiv (3.84) din observaţia anterioară. Si<br />

aici gramianul G = AA H este o matrice rău condiţionată, astfel încât, în general,<br />

<strong>calcul</strong>ul soluţiei normale prin rezolvarea sistemului (3.118) nu este recomandabil. ♦<br />

Calculul soluţiei normale<br />

Rezolvarea problemei <strong>de</strong> minimizare cu restricţii (3.113) se poate face utilizând<br />

informaţiile furnizate <strong>de</strong> algoritmul <strong>de</strong> triangularizare ortogonală<br />

AZ = [L ′ 0], Z = Z 1 Z 2 . . . Z m , (3.119)


176 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

un<strong>de</strong> Z este unitară, iar L ′ este inferior triunghiulară inversabilă. Notăm<br />

x = Zu, u =<br />

[<br />

u<br />

′<br />

u ′′ ]<br />

}m<br />

}n − m<br />

(3.120)<br />

şi scriem sistemul Ax = b sub forma echivalentă<br />

[ ]<br />

[L ′ u<br />

′<br />

0]<br />

u ′′ = b, (3.121)<br />

Relaţia <strong>de</strong> mai sus arată că, în procesul <strong>de</strong> minimizare din (3.113), vectorul u ′ = u ′∗<br />

este fixat prin<br />

Lu ′∗ = b, (3.122)<br />

iar u ′′ este liber.<br />

Pentru a <strong>de</strong>termina soluţia normală x ∗ , consi<strong>de</strong>răm (3.120), un<strong>de</strong> Z este ortogonală,<br />

<strong>de</strong>ci ‖Zu‖ = ‖u‖. Avem<br />

‖x‖ 2 = ‖Zu‖ 2 = ‖u ′∗ ‖ 2 + ‖u ′′ ‖ 2 ≥ ‖u ′∗ ‖ 2 . (3.123)<br />

Efectuând minimizarea în raport cu u ′′ , obţinem evi<strong>de</strong>nt<br />

u ′′∗ = 0. (3.124)<br />

Prin urmare soluţia normală este<br />

x ∗ = Z<br />

[<br />

(L ′ ) −1 b<br />

0<br />

]<br />

, (3.125)<br />

sau<br />

x ∗ = Z ′ (L ′ ) −1 b. (3.126)<br />

Ţinând seama <strong>de</strong> structura matricei Z din (3.119), se ve<strong>de</strong> uşor că transformarea<br />

(3.125) poate fi efectuată pe loc în x utilizând o procedură <strong>de</strong> tip MLQ. Schema <strong>de</strong><br />

<strong>calcul</strong> este următoarea<br />

SLQ<br />

% Calculul soluţiei normale x = A + b<br />

1. Se rezolvă sistemul triunghiular L ′ x(1 : m) = n<br />

2. x(m + 1 : n) = 0<br />

3. Pentru k = m : −1 : 1<br />

x ← Z k x<br />

Cu referire la algoritmul 3.9, care utilizează reflectori hermitici, implementarea<br />

schemei <strong>de</strong> mai sus are loc astfel.<br />

Algoritmul 3.10 (SLQ – rezolvarea sistemelor sub<strong>de</strong>terminate) (Se<br />

dă un vector b ∈ C m . Utilizând ieşirea algoritmului 3.9, se <strong>calcul</strong>ează<br />

soluţia normală x a sistemului liniar Ax = b. Se presupune că matricea<br />

A este epică.)


3.7. CONDIŢIONAREA PROBLEMELOR CMMP 177<br />

% se rezolvă sistemul inferior triunghiular (3.122)<br />

1. Pentru k = 1 : m<br />

1. x k = (b k − ∑ k−1<br />

j=1 a kjx j )/a kk<br />

% <strong>calcul</strong>ul soluţiei normale<br />

2. x(m + 1 : n) ← 0<br />

3. Pentru k = m : −1 : 1<br />

1. t = a kk<br />

2. a kk = β( k<br />

∑n<br />

)<br />

3. α ← −<br />

j=k v kjx j /β k<br />

4. Pentru j = k : n<br />

1. x j ← x j + αv kj<br />

5. a kk = t<br />

Calculul proiecţiilor (pe ImA H şi KerA), rezolvarea sistemelor sub<strong>de</strong>terminate<br />

cu membru drept multiplu precum şi <strong>calcul</strong>ul pseudoinversei normale A + se fac<br />

adaptând în mod corespunzător metodologia din secţiunea 3.5. Desigur, acum A +<br />

este o inversă la dreapta a lui A, i.e. AA + = I.<br />

3.7 Condiţionarea problemelor CMMP<br />

În această secţiune prezentăm câteva rezultate privind sensibilitatea soluţiilor problemelor<br />

<strong>de</strong> <strong>calcul</strong> abordate anterior în raport cu variaţia datelor <strong>de</strong> intrare 21 .<br />

3.7.1 Preliminarii<br />

Consi<strong>de</strong>răm sistemul liniar<br />

Ax = b, (3.127)<br />

un<strong>de</strong> A ∈ R m×n este o matrice dată, iar b ∈ R n este un vector arbitrar. Notăm<br />

r = rangA şi presupunem că matricea A este <strong>de</strong> rang maxim, i.e. r = s, un<strong>de</strong><br />

s = min(m, n) 22 . În consecinţă, conform teoremelor 3.5 şi 3.6, sistemul (3.127) are<br />

o soluţie în sens CMMP unică<br />

x ∗ = A + b, (3.128)<br />

un<strong>de</strong> matricea A + are expresii diferite după cum m ≥ n sau m ≤ n.<br />

Având în ve<strong>de</strong>re concizia expunerii, în cele ce urmează vom adopta o terminologie<br />

precum şi notaţii cât mai uniforme. Vom spune că A + este inversa (în sens<br />

21 Deoarece această tematică are un caracter pur matematic, i.e. nu vizează calitatea <strong>algoritmi</strong>lor<br />

<strong>de</strong> <strong>calcul</strong>, pe parcurs vom utiliza formulele cele mai convenabile pentru scopul propus.<br />

22 O proprietate P <strong>de</strong>finită pe R m×n se numeşte tipică dacă este generică şi structural stabilă,<br />

adică are loc ”aproape peste tot” (în afara unei varietăţi algebrice) şi se conservă oricare ar fi<br />

micile variaţii ale (elementelor) matricei consi<strong>de</strong>rate.<br />

De exemplu, în cazul m = n, proprietatea <strong>de</strong> inversabilitate este generică (are loc peste tot<br />

în afara varietăţii <strong>de</strong>finite <strong>de</strong> ecuaţia <strong>de</strong>tA = 0) şi structural stabilă (dacă <strong>de</strong>tA ≠ 0, atunci<br />

<strong>de</strong>t(A + E) ≠ 0, oricare ar fi perturbaţia E suficient <strong>de</strong> mică). Pe scurt, matricele inversabile sunt<br />

tipice în R n×n . Similar, matricele <strong>de</strong> rang maxim sunt tipice în R m×n .


178 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

CMMP a) matricei A şi vom <strong>de</strong>fini numărul <strong>de</strong> condiţionare (la inversare) al lui A<br />

prin<br />

κ(A) = ‖A‖‖A + ‖, (3.129)<br />

un<strong>de</strong> ‖ · ‖ = ‖ · ‖ 2 este norma spectrală, indusă <strong>de</strong> norma (vectorială) euclidiană<br />

‖x‖ = (x T x) 1/2 , adică<br />

‖A‖ <strong>de</strong>f<br />

= max ‖Ax‖. (3.130)<br />

‖x‖=1<br />

Desigur, în cazul m = n avem A + = A −1 , <strong>de</strong>ci (3.129) se reduce la <strong>de</strong>finiţia cunoscută<br />

a lui κ(A) din secţiunea 2.7 23 .<br />

Direct din (3.129) şi (3.130),<br />

(i) dacă matricea A este ortogonală, atunci κ(A) = 1, i.e. matricele ortogonale<br />

sunt perfect condiţionate la inversare.<br />

Pe <strong>de</strong> altă parte, norma euclidiană precum şi norma spectrală sunt ortogonal<br />

invariante, <strong>de</strong>ci<br />

(ii) transformările ortogonale nu modifică condiţionarea datelor, i.e.<br />

κ(A) = κ(Q T AZ), oricare ar fi matricele ortogonale Q şi Z.<br />

avem<br />

Proprietăţile remarcabile (i) şi (ii) explică folosirea intensivă a matricelor ortogonale<br />

în <strong>calcul</strong>ul <strong>numeric</strong>. (Aceleaşi proprietăţi <strong>de</strong> invarianţă apar şi în norma<br />

Frobenius ‖ · ‖ F , care este şi ea ortogonal invariantă. Numărul <strong>de</strong> condiţionare<br />

evaluat folosind această normă este notat κ F (A).)<br />

Revenim acum la sistemul (3.127), în care prin ipoteză matricea A este <strong>de</strong> rang<br />

maxim şi facem următoarele precizări.<br />

• În cazul m ≥ n matricea A este monică, iar A+ = (A T A) −1 A T este epică.<br />

Evi<strong>de</strong>nt, avem A + A = I n , <strong>de</strong>ci A + este o inversă la stânga a lui A, dar AA + ≠ I m ,<br />

mai precis P 1 = AA + şi P 2 = I m − P 1 sunt proiectorii (ortogonali) pe subspaţiile<br />

S = ImA şi respectiv S ⊥ = KerA. De asemenea, este a<strong>de</strong>vărat că ‖A‖ 2 = ‖A T A‖<br />

sau, pe scurt,<br />

‖A‖ 2 = ‖G‖, (3.131)<br />

un<strong>de</strong> matricea simetrică G = A T A este gramianul (coloanelor) matricei A.<br />

•• În cazul m ≤ n matricea A este epică, iar A+ = A T (AA T ) −1 este monică.<br />

Evi<strong>de</strong>nt, acum avem AA + = I m , <strong>de</strong>ci A + este o inversa la dreapta a lui A, iar<br />

P 1 = A + A şi P 2 = I m − P 1 sunt proiectorii pe subspaţiile N ⊥ = ImA T şi respectiv<br />

N = KerA. De asemenea, are loc relaţia (3.131), un<strong>de</strong> matricea G = AA T este<br />

gramianul (liniilor) matricei A.<br />

Putem acum formula concis primele noastre rezultate.<br />

Propoziţia 3.5 Dacă A ∈ R m×n este <strong>de</strong> rang maxim, atunci<br />

un<strong>de</strong> G este gramianul matricei A.<br />

κ(G) = κ 2 (A), (3.132)<br />

23 Acolo am evaluat κ(A) utilizând normele ‖ · ‖ 1 sau ‖ · ‖ ∞, relativ mai simple. În acelaşi scop,<br />

aici vom utiliza norma spectrală, care, după cum ştim din capitolul 1, este ortogonal invariantă.<br />

Anticipând rezultate din capitolul 5, precizăm că în general norma spectrală ‖A‖ coinci<strong>de</strong> cu<br />

valoarea singulară maximă a matricei A, notată <strong>de</strong> obicei σ 1 , iar numărul <strong>de</strong> condiţionare este<br />

κ(A) = σ 1 /σ r ≥ 1, un<strong>de</strong> σ r este cea mai mică valoare singulară nenulă a lui A.


3.7. CONDIŢIONAREA PROBLEMELOR CMMP 179<br />

Demonstraţie. Notăm cu H gramianul lui A + . În cazul m ≥ n, A+ este epică,<br />

<strong>de</strong>ci<br />

H = A + (A + ) T = (A T A) −1 A T A(A T A) −1 = (A T A) −1 = G −1 .<br />

Aplicând acum (3.131) lui A + găsim<br />

‖A + ‖ 2 = ‖H‖ = ‖G −1 ‖, (3.133)<br />

<strong>de</strong>ci (3.132) rezultă direct, utilizând <strong>de</strong>finiţia lui κ(G) precum şi relaţiile (3.131) şi<br />

(3.133). Cazul m ≤ n este similar; <strong>de</strong>sigur acum H = (A + ) T A + . ♦<br />

Propoziţia 3.6 Dacă A ∈ R m×n este <strong>de</strong> rang maxim, atunci matricea  = A + E<br />

are aceeaşi proprietate, oricare ar fi perturbaţia E astfel încât<br />

‖E‖ < κ −1 (A)‖A‖. (3.134)<br />

Demonstraţie. În cazul m ≥ n putem scrie  = (I m + EA + )A, un<strong>de</strong>, conform<br />

unui rezultat cunoscut, matricea I m + EA + este inversabilă dacă ‖EA + ‖ < 1. Dar<br />

întot<strong>de</strong>auna avem ‖EA + ‖ ≤ ‖E‖ · ‖A + ‖. Prin urmare, dacă (3.134) are loc, atunci<br />

A şi  sunt echivalente (la stânga), <strong>de</strong>ci  rezultă monică o dată cu A. În cazul<br />

m ≤ n scriem  = A(I n + A + E) şi raţionăm similar.<br />

♦<br />

Propoziţia 3.5 arată că sistemele normale (3.84) şi (3.118) 24 sunt mult mai<br />

rău condiţionate <strong>de</strong>cât sistemul dat (3.127) şi explică <strong>de</strong> ce <strong>de</strong>terminarea soluţiei<br />

x ∗ prin rezolvarea acestor sisteme este întot<strong>de</strong>auna contraindicată din punct <strong>de</strong><br />

ve<strong>de</strong>re <strong>numeric</strong>. Propoziţia 3.6 arată că soluţia x ∗ este robustă, i.e. continuă să<br />

fie bine <strong>de</strong>finită chiar dacă matricea A a sistemului (3.127) suferă perturbaţii E<br />

relativ importante. Conform relaţiei (3.134), aceste perturbaţii sunt strict limitate<br />

în normă numai <strong>de</strong> κ(A). Pentru orientare, dacă κ(A) = 10 3 , atunci κ(G) = 10 6 ,<br />

<strong>de</strong>ci la rezolvarea în simplă precizie (i.e. cu t = 7 cifre zecimale semnificative) a<br />

sistemului normal se pierd aproape toate cifrele semnificative. Pe <strong>de</strong> altă parte, dacă<br />

‖A‖ ≈ 1, atunci perturbaţiile admisibile în A sunt numai <strong>de</strong> ordinul ‖E‖ < 10 −3 .<br />

Concluziile obţinute mai sus subliniază importanţa <strong>de</strong>osebită a numărului <strong>de</strong><br />

condiţionare κ(A) pentru caracterizarea din punct <strong>de</strong> ve<strong>de</strong>re <strong>numeric</strong> a problemei<br />

(3.127). În continuare vom preciza aceste concluzii, efectuând analiza cantitativă a<br />

sensibilităţii (locale) a soluţiei x ∗ în raport cu perturbaţiile datelor. În consecinţă,<br />

vom consi<strong>de</strong>ra sistemul perturbat<br />

(A + E)x = b + f, (3.135)<br />

în care perturbaţiile E şi f sunt relativ mici în raport cu nivelul maxim admisibil,<br />

e.g. avem<br />

‖E‖ ≤ ǫ A ‖A‖, ‖f‖ ≤ ǫ b ‖b‖, (3.136)<br />

un<strong>de</strong> tipic ǫ A şi ǫ b sunt <strong>de</strong> acelaşi ordin <strong>de</strong> mărime şi, în orice caz, ǫ A < κ −1 (A).<br />

Notând cu ˆx ∗ soluţia în sens CMMP a sistemului perturbat (3.136), problema<br />

<strong>de</strong> analiză a sensibilităţii constă pe scurt în a evalua diferenţa ∆x = ˆx ∗ − x ∗ .<br />

24 A căror matrice este evi<strong>de</strong>nt G = A T A, respectiv G = AA T .


180 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

b ✚❃<br />

r ∗ = b 2<br />

✚✚✚✚✚✚ θ<br />

✚ b 1 = Ax ∗<br />

Fig. 3.8: θ este unghiul dintre vectorul b şi subspaţiul ImA<br />

3.7.2 Sensibilitatea pseudosoluţiei<br />

Consi<strong>de</strong>răm sistemul (3.127) în care presupunem că A ∈ R m×n este monică, iar<br />

A T b ≠ 0.<br />

Teorema 3.5 Sensibilitatea relativă a pseudosoluţiei x ∗ ≠ 0 a sistemului (3.127)<br />

în raport cu perturbaţiile (3.136) poate fi evaluată acoperitor prin<br />

‖ˆx ∗ − x ∗ ‖<br />

‖x ∗ ‖<br />

un<strong>de</strong> θ are semnificaţia din figura 3.8.<br />

≤ (κ 2 (A)tgθ + κ(A))ǫ A + κ(A)<br />

cos θ ǫb , (3.137)<br />

Demonstraţie. Conform teoremei 3.5, pseudosoluţia ˆx ∗ = x ∗ + ∆x a sistemului<br />

perturbat (3.135) satisface relaţia<br />

(A T + E T )(A + E)(x ∗ + ∆x) = (A T + E T )(b + f).<br />

Desfăcând parantezele şi ţinând seama că A T Ax ∗ = A T b, obţinem<br />

(A T E + E T A)x ∗ + (A T A)∆x = E T b + A T f + . . . ,<br />

un<strong>de</strong> + . . . indică termeni neglijabili în primă aproximaţie, ca produs a două cantităţi<br />

mici. Prin urmare putem scrie<br />

∆x = (A T A) −1 E T (b − Ax ∗ ) − A + Ex ∗ + A + f, (3.138)<br />

un<strong>de</strong> evi<strong>de</strong>nt A T A = G este gramianul lui A, iar b − Ax ∗ = r ∗ este reziduul <strong>de</strong><br />

normă minimă. Evaluând în normă ambii membri ai relaţiei (3.138), găsim<br />

‖∆x‖ ≤ ‖G −1 ‖ · ‖E‖ · ‖r ∗ ‖ + ‖A + ‖ · ‖E‖ · ‖x ∗ ‖ + ‖A + ‖ · ‖f‖,<br />

<strong>de</strong> un<strong>de</strong>, ţinând seama <strong>de</strong> relaţiile (3.133) şi (3.136), rezultă imediat<br />

(<br />

‖∆x‖<br />

‖x ∗ ‖ ≤ ‖A + ‖ 2 ‖A‖ 2 ‖r ∗ )<br />

‖<br />

‖A‖ · ‖x ∗ ‖ + ‖A+ ‖ · ‖A‖ ǫ A + ‖A + ‖b‖<br />

‖ · ‖A‖<br />

‖A‖ · ‖x ∗ ‖ ǫb .<br />

În sfârşit, avem b 1 = Ax ∗ , <strong>de</strong>ci ‖b 1 ‖ ≤ ‖A‖ · ‖x ∗ ‖, iar din figura 3.8 se ve<strong>de</strong> că<br />

‖r ∗ ‖<br />

‖b 1 ‖ = tgθ,<br />

‖b‖<br />

‖b 1 ‖ = 1<br />

cosθ .


3.7. CONDIŢIONAREA PROBLEMELOR CMMP 181<br />

Demonstraţia este terminată.<br />

♦<br />

Observaţia 3.7 Putem obţine uşor o evaluare mai fină <strong>de</strong>cât (3.137), ţinând<br />

seama că în (3.138) perturbaţiile E şi f acţionează diferenţiat. În acest scop scriem<br />

E = E 1 + E 2 , un<strong>de</strong> E α = P α E, α = 1 : 2, sunt proiecţiile (coloanelor) lui<br />

E pe subspaţiile S şi respectiv S ⊥ . Avem A + E = A + E 1 (<strong>de</strong>oarece A + P 2 =<br />

= A + (I − AA + ) = 0) precum şi E T r ∗ = E2 T r ∗ (<strong>de</strong>oarece r ∗ = P 2 b iar P 2 este<br />

proiector ortogonal, i.e. P2 2 = P 2 şi P2 T = P 2). În mod similar avem f = f 1 + f 2 ,<br />

un<strong>de</strong> f α = P α f, α = 1 : 2, iar A + f = A + f 1 . Prin urmare, relaţia (3.138) poate fi<br />

scrisă sub forma echivalentă, dar mai precisă<br />

∆x = G −1 E T 2 r ∗ − A + E 1 x ∗ + A + f 1 , (3.139)<br />

un<strong>de</strong> E 1 , E 2 şi f 1 apar acum ca perturbaţii in<strong>de</strong>pen<strong>de</strong>nte, iar f 2 a dispărut. Prin<br />

urmare, dacă în locul relaţiei (3.136) consi<strong>de</strong>răm că pentru α = 1 : 2 avem<br />

atunci concluzia teoremei este<br />

‖ˆx ∗ − x ∗ ‖<br />

‖x ∗ ‖<br />

‖P α E‖ ≤ ǫ A α ‖A‖, ‖P α f‖ ≤ ǫ b α‖b‖, (3.140)<br />

≤ κ(A)<br />

( )<br />

ǫ A 1 + ǫb 1<br />

+ κ 2 (A)tgθ ǫ A 2<br />

cosθ<br />

. (3.141)<br />

Mai <strong>de</strong>parte vom utiliza relaţiile (3.137) şi (3.141) sub forma relativ mai simplă<br />

‖ˆx ∗ − x ∗ ‖<br />

‖x ∗ ‖<br />

≤ ǫ 1 κ(A) + ǫ 2 κ 2 (A)tgθ, (3.142)<br />

un<strong>de</strong>, în acord cu (3.140), ǫ α , α = 1 : 2, reprezintă estimări (în norma spectrală)<br />

ale perturbaţiilor datelor A şi b la nivelul subspaţiilor S şi S ⊥ .<br />

♦<br />

În esenţă, relaţia (3.142) arată că, din punctul <strong>de</strong> ve<strong>de</strong>re al sensibilităţii pseudosoluţiei<br />

x ∗ , există două clase distincte <strong>de</strong> probleme CMMP, având caracteristici<br />

<strong>numeric</strong>e net diferite.<br />

• Prima clasă conţine problemele CMMP ”aproape” compatibile, la care reziduul<br />

r ∗ este mic în normă faţă <strong>de</strong> membrul drept b, <strong>de</strong>ci θ ≈ 0. În acest caz, al doilea<br />

termen din (3.142) este neglijabil, <strong>de</strong>ci practic sensibilitatea locală a pseudosoluţiei<br />

x ∗ este proporţională cu numărul <strong>de</strong> condiţionare κ(A) al lui A. În particular, dacă<br />

m = n, atunci avem exact r ∗ = 0 şi θ = 0, iar (3.142) se reduce la relaţia (2.47)<br />

stabilită în secţiunea 2.7. Concluziile <strong>de</strong> acolo se aplică evi<strong>de</strong>nt şi aici.<br />

•• A doua clasă <strong>de</strong> probleme CMMP corespun<strong>de</strong> sistemelor (3.127) cu reziduu<br />

<strong>de</strong> normă minimă r ∗ mare în normă faţă <strong>de</strong> membrul drept b 25 . În acest caz al<br />

doilea termen din (3.142) este evi<strong>de</strong>nt dominant, <strong>de</strong>ci practic sensibilitatea locală<br />

a pseudosoluţiei x ∗ este proporţională cu pătratul numărului <strong>de</strong> condiţionare κ(A).<br />

Aceste probleme, specific <strong>de</strong> tip CMMP, sunt consi<strong>de</strong>rabil mai dificile din punct <strong>de</strong><br />

ve<strong>de</strong>re <strong>numeric</strong> <strong>de</strong>cât cele din prima clasă şi necesită luarea unor măsuri speciale<br />

<strong>de</strong> precauţie (vezi secţiunea următoare).<br />

25 Această situaţie poate fi uşor <strong>de</strong>tectată în practică <strong>calcul</strong>ând ‖b‖ şi ρ = ‖r ∗ ‖, vezi comentariile<br />

la algoritmul 3.8. Subliniem că în acest caz sensibilitatea pseudosoluţiei x ∗ <strong>de</strong>pin<strong>de</strong> nu numai <strong>de</strong><br />

matricea A a sistemului (3.127) ci şi <strong>de</strong> membrul drept b (prin intermediul lui θ).


182 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

În orice caz, relaţia (3.142) subliniază că elementul <strong>de</strong>terminant în stabilirea<br />

sensibilităţii pseudosoluţiei este numărul <strong>de</strong> condiţionare κ(A), <strong>de</strong> aceea în practică<br />

se recomandă insistent evaluarea lui κ(A) în cursul procesului <strong>de</strong> <strong>calcul</strong>. Desigur,<br />

dacă am efectuat triangularizarea ortogonală Q T A = R a lui A, atunci, beneficiind<br />

<strong>de</strong> invarianţa ortogonală a normei spectrale, avem<br />

κ(A) = κ(R), (3.143)<br />

<strong>de</strong>ci κ(A) poate fi estimat extrem <strong>de</strong> simplu, utilizând estimatorul <strong>de</strong> condiţie pentru<br />

matrice triunghiulare <strong>de</strong>scris în secţiunea 2.7. Acelaşi rezultat poate fi obţinut<br />

aplicând procedura <strong>de</strong> triangularizare ortogonală cu pivotarea coloanelor, <strong>de</strong>scrisă<br />

în secţiunea 3.9. În acest caz, o (sub)evaluare a lui κ(A) poate fi obţinută prin simplă<br />

inspecţie, sub forma ˆκ(A) = r 11 /r nn , un<strong>de</strong> r kk , k = 1 : n, sunt elementele diagonale<br />

ale factorului triunghiular R, dispuse pe diagonală în ordine <strong>de</strong>screscătoare.<br />

Pe <strong>de</strong> altă parte, reexaminând formula fundamentală (3.142), este util să reţinem<br />

că influenţa perturbaţiilor E şi f asupra pseudosoluţiei x ∗ <strong>de</strong>pin<strong>de</strong> <strong>de</strong> localizarea<br />

acestora în raport cu subspaţiile S şi S ⊥ . De exemplu, dacă ImE ⊂ ImA, atunci evi<strong>de</strong>nt<br />

E 2 = P 2 E = 0, <strong>de</strong>ci sensibilitatea lui x ∗ este dictată <strong>de</strong> κ(A) (iar nu <strong>de</strong> κ 2 (A)),<br />

chiar dacă reziduul r ∗ este important. În unele aplicaţii, aceste circumstanţe pot fi<br />

realizate printr-o ”filtrare” prealabilă a<strong>de</strong>cvată a datelor <strong>de</strong> intrare, dar discutarea<br />

acestor tehnici <strong>de</strong>păşeşte scopurile expunerii <strong>de</strong> faţă. În altă ordine <strong>de</strong> i<strong>de</strong>i, este<br />

evi<strong>de</strong>nt că perturbaţiile inerente datorate erorilor <strong>de</strong> rotunjire acţionează în general<br />

aleator şi în orice caz nediferenţiat în raport cu S şi S ⊥ , astfel încât <strong>de</strong> fapt<br />

<strong>de</strong>pen<strong>de</strong>nţa <strong>de</strong> κ 2 (A) nu poate fi niciodată eliminată complet în situaţiile practice,<br />

indiferent <strong>de</strong> măsurile <strong>de</strong> precauţie luate.<br />

În rezumat, sensibilitatea pseudosoluţiei este <strong>de</strong>terminată <strong>de</strong> condiţionarea matricei<br />

A precum şi <strong>de</strong> clasa θ a problemei CMMP consi<strong>de</strong>rate. De asemenea, ea<br />

<strong>de</strong>pin<strong>de</strong> <strong>de</strong> tipul structural al perturbaţiilor consi<strong>de</strong>rate.<br />

3.7.3 Sensibilitatea soluţiei normale<br />

Consi<strong>de</strong>răm sistemul (3.127) în care presupunem că matricea A ∈ R m×n este epică,<br />

iar b ≠ 0.<br />

Teorema 3.6 Sensibilitatea relativă a soluţiei normale x ∗ ≠ 0 a sistemului (3.127)<br />

poate fi evaluată acoperitor prin<br />

‖ˆx ∗ − x ∗ ‖<br />

‖x ∗ ‖<br />

≤ ǫ 1 κ(A), un<strong>de</strong> ǫ 1 = 2ǫ A + ǫ b . (3.144)<br />

Demonstraţie. Procedăm ca în <strong>de</strong>monstraţia teoremei 3.5. Conform cu teorema<br />

3.4, soluţia normală ˆx ∗ = x ∗ + ∆x a sistemului perturbat (3.135) satisface relaţiile<br />

(A + E)(x ∗ + ∆x) = b + f, x ∗ + ∆x = (A T + E T )(y ∗ + ∆y),<br />

un<strong>de</strong> Ax ∗ = b şi x ∗ = A T y ∗ . Prin urmare, în primă aproximaţie avem<br />

A∆x + Ex ∗ = f, ∆x = A T ∆y + E T y ∗ .


3.8. STABILITATEA ALGORITMILOR DE TRIANGULARIZARE 183<br />

Eliminând ∆y între aceste relaţii şi notând A + = A T (AA T ) −1 , obţinem<br />

∆x = (I n − A + A)E T y ∗ − A + Ex ∗ + A + f, (3.145)<br />

un<strong>de</strong> y ∗ = (AA T ) −1 b = (A + ) T x ∗ , iar în paranteza din membrul drept recunoaştem<br />

proiectorul ortogonal P 2 = I n − A + A pe subspaţiul N = KerA. Deoarece P 2 este o<br />

matrice simetrică cu valorile proprii 0 şi 1, avem ‖P 2 ‖ = 1. În consecinţă, evaluând<br />

în normă ambii membri ai relaţiei (3.145), găsim 26<br />

‖∆x‖ ≤ ‖E‖ · ‖A + ‖ · ‖x ∗ ‖ + ‖A + ‖ · ‖E‖ · ‖x ∗ ‖ + ‖A + ‖ · ‖f‖,<br />

<strong>de</strong> un<strong>de</strong>, ţinând seama <strong>de</strong> (3.136), rezultă (3.145).<br />

♦<br />

Observaţia 3.8 Consi<strong>de</strong>rând proiecţiile E α = EP α , α = 1 : 2, ale liniilor matricei<br />

E pe subspaţiile N ⊥ şi N şi procedând ca în observaţia 3.7, putem şi aici scrie mai<br />

precis<br />

∆x = (I n − A + A)E T 2 y∗ − A + E 1 x ∗ + A + f. (3.146)<br />

Având însă în ve<strong>de</strong>re structura extrem <strong>de</strong> simplă a relaţiei (3.145), utilitatea practică<br />

a acestei precizări este aici limitată.<br />

♦<br />

În esenţă, relaţia (3.144) spune că sensibilitatea locală a soluţiei normale x ∗ este<br />

proporţională cu numărul <strong>de</strong> condiţionare κ(A) al matricei A.<br />

Având în ve<strong>de</strong>re că, în ipoteza teoremei 3.6, sistemele sub<strong>de</strong>terminate sunt<br />

întot<strong>de</strong>auna compatibile, relaţia (3.144) poate fi consi<strong>de</strong>rată caz particular al relaţiei<br />

(3.137), în care r ∗ = 0, <strong>de</strong>ci θ = 0. Observăm totuşi că <strong>de</strong>monstraţiile celor două<br />

teoreme se bazează pe relaţii diferite, iar coeficientul 2 din (3.144) nu apare în<br />

(3.137). Prin urmare, apelul la (3.137) oferă mai curând o confirmare intuitivă,<br />

<strong>de</strong>cât o justificare fermă a relaţiei (3.144). În rest, implicaţiile practice ale relaţiei<br />

(3.144) sunt similare cu cele cunoscute din secţiunea 2.7.<br />

În rezumat, sensibilitatea soluţiei normale este dictată numai <strong>de</strong> condiţionarea<br />

matricei A. În acest sens, problema rezolvării sistemelor sub<strong>de</strong>terminate este relativ<br />

simplă.<br />

3.8 Stabilitatea <strong>numeric</strong>ă a <strong>algoritmi</strong>lor <strong>de</strong><br />

triangularizare ortogonală<br />

În această secţiune oferim câteva informaţii <strong>de</strong> bază privind stabilitatea <strong>numeric</strong>ă a<br />

<strong>algoritmi</strong>lor <strong>de</strong> <strong>calcul</strong> prezentaţi anterior în acest capitol. De asemenea, sprijiniţi pe<br />

analiza sensibilităţii problemelor <strong>de</strong> <strong>calcul</strong> din secţiunea prece<strong>de</strong>ntă, facem câteva<br />

consi<strong>de</strong>raţii privind acurateţea soluţiilor <strong>calcul</strong>ate şi <strong>de</strong>scriem o procedură <strong>de</strong> rafinare<br />

iterativă a acestor soluţii.<br />

26 Amintim că, în norma spectrală avem întot<strong>de</strong>auna ‖A‖ = ‖A T ‖.


184 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

3.8.1 Stabilitatea <strong>numeric</strong>ă a <strong>algoritmi</strong>lor <strong>fundamentali</strong><br />

În general, analiza stabilităţii <strong>numeric</strong>e a <strong>algoritmi</strong>lor <strong>de</strong> <strong>calcul</strong> din acest capitol nu<br />

prezintă dificultăţi <strong>de</strong> esenţă, ci numai obstacole pur tehnice. În principiu, începând<br />

cu <strong>algoritmi</strong>i <strong>de</strong> bază 3.1-3.4, întregul proces <strong>de</strong> <strong>calcul</strong> se reduce la o succesiune<br />

<strong>de</strong>terminată <strong>de</strong> operaţii aritmetice elementare, inclusiv extrageri <strong>de</strong> radical, pentru<br />

care erorile <strong>de</strong> rotunjire sunt <strong>de</strong> ordinul ε M ≈ 10 −t , un<strong>de</strong> t este precizia <strong>de</strong> lucru,<br />

adică numărul <strong>de</strong> cifre zecimale semnificative, vezi capitolul 0. Prin urmare, efectul<br />

(cumulat al) acestor erori asupra rezultatelor obţinute în urma unui proces <strong>de</strong> <strong>calcul</strong><br />

liniar poate fi apreciat utilizând parametrul generic<br />

γ cm = cmε M , (3.147)<br />

un<strong>de</strong> m reprezintă numărul <strong>de</strong> operaţii efectuate, iar c este o constantă <strong>de</strong> ordinul<br />

unităţii, în general diferită <strong>de</strong> la caz la caz. Aici este esenţial să subliniem că întreaga<br />

tehnică <strong>de</strong> analiză inversă a erorilor constă în a converti acest efect direct al erorilor<br />

<strong>de</strong> rotunjire asupra soluţiei <strong>calcul</strong>ate în perturbaţii echivalente la nivelul datelor.<br />

În consecinţă, algoritmul analizat este (invers) <strong>numeric</strong> stabil dacă soluţia <strong>calcul</strong>ată<br />

coinci<strong>de</strong> cu soluţia exactă a problemei <strong>de</strong> <strong>calcul</strong> cu datele ”puţin” perturbate 27 .<br />

Rezultatele analizei pot fi sintetizate astfel. (Pentru <strong>de</strong>monstraţii şi rezultate<br />

adiţionale, vezi [IX].)<br />

1 ◦ . Fie x ∈ R m un vector dat. Vectorul Househol<strong>de</strong>r û, <strong>calcul</strong>at <strong>de</strong> procedura<br />

RFG, este apropiat <strong>de</strong> vectorul Househol<strong>de</strong>r exact u, i.e.<br />

û = u + ∆u, un<strong>de</strong> ‖∆u‖ ≤ γ cm . (3.148)<br />

Subliniem că acest rezultat se datorează exclusiv alegerii judicioase a semnului<br />

lui σ <strong>de</strong> la pasul 2.2.1.<br />

2 ◦ . Fie x ∈ R m un vector dat, U 1 un reflector <strong>de</strong>finit <strong>de</strong> vectorul Househol<strong>de</strong>r<br />

u, iar y = U 1 x. Vectorul transformat ŷ, <strong>calcul</strong>at <strong>de</strong> procedura RF, utilizând un<br />

vector Househol<strong>de</strong>r aproximativ û <strong>de</strong> tip (3.148) satisface relaţia<br />

ŷ = (U 1 + ∆U)x, un<strong>de</strong> ‖∆U‖ F ≤ γ cm . (3.149)<br />

În continuare, utilizând rezultatele fundamentale 1 ◦ şi 2 ◦ , se poate <strong>de</strong>monstra<br />

afirmaţia următoare. (Vezi schema <strong>de</strong> <strong>calcul</strong> MQR din secţiunea 3.4.)<br />

3 ◦ Fie A ∈ R m×n o matrice dată, Q T = U s . . . U 2 U 1 o secvenţă <strong>de</strong> s reflectori<br />

<strong>de</strong>finiţi <strong>de</strong> vectorii Househol<strong>de</strong>r u k , k = 1 : s, iar B = Q T A. Matricea transformată<br />

ˆB, <strong>calcul</strong>ată utilizând schema <strong>de</strong> <strong>calcul</strong><br />

1. B = A<br />

2. Pentru k = 1 : s<br />

1. B ← U k B<br />

cu vectori Househol<strong>de</strong>r aproximativi û k <strong>de</strong> tip (3.148), satisface relaţia<br />

ˆB = Q T (A + ∆A), un<strong>de</strong> ‖∆A‖ F ≤ sγ cm ‖A‖ F . (3.150)<br />

27 Peste tot mai <strong>de</strong>parte noţiunea <strong>de</strong> stabilitate <strong>numeric</strong>ă a unui algoritm concret va fi înţeleasă<br />

în acest sens, <strong>de</strong>ci este implicit legată <strong>de</strong> o anume problemă <strong>de</strong> <strong>calcul</strong> precizată.


3.8. STABILITATEA ALGORITMILOR DE TRIANGULARIZARE 185<br />

Pe scurt, algoritmul <strong>de</strong> aplicare a unei secvenţe <strong>de</strong> reflectori este (invers) <strong>numeric</strong><br />

stabil, iar perturbaţia echivalentă relativă la nivelul matricei date A este<br />

ǫ A = sγ cm , (3.151)<br />

un<strong>de</strong> s este lungimea secvenţei, m este ordinul reflectorilor iar c este o constantă <strong>de</strong><br />

ordinul unităţii.<br />

Pe baza proprietăţii generale 3 ◦ se poate <strong>de</strong>monstra că<br />

4 ◦ Algoritmul <strong>de</strong> triangularizare ortogonală QR este <strong>numeric</strong> stabil. Mai precis,<br />

dacă ˆR este matricea superior triunghiulară <strong>calcul</strong>ată (în cazul m ≥ n), atunci<br />

există o matrice ortogonală ˆQ astfel încât<br />

ˆQ T (A + ∆A) = ˆR, un<strong>de</strong> ‖∆A‖ F ≤ nγ cm ‖A‖ F . (3.152)<br />

O afirmaţie similară este valabilă relativ la algoritmul LQ <strong>de</strong> triangularizare ortogonală<br />

la dreapta precum şi la toţi <strong>algoritmi</strong>i <strong>de</strong> <strong>calcul</strong> <strong>de</strong>rivaţi (cum ar fi GQR,<br />

MQR, SQR etc.). Subliniem că, în ultimă instanţă, toate procedurile menţionate<br />

sunt <strong>de</strong> tip 3 ◦ , un<strong>de</strong> parametrii s = min(m, n) şi m iau valori a<strong>de</strong>cvate. În consecinţă<br />

5 ◦ Procedurile SQR (respectiv CMMP) şi SLQ, care <strong>calcul</strong>ează pseudosoluţia şi<br />

respectiv soluţia normală x ∗ a sistemului Ax = b, sunt <strong>numeric</strong> stabile. Perturbaţiile<br />

echivalente relative la nivelul datelor sunt <strong>de</strong> ordinul<br />

(SQR) ǫ A,b = nγ cm , (m ≥ n), (3.153)<br />

şi respectiv<br />

(SLQ) ǫ A,b = mγ cn , (m ≤ n). (3.154)<br />

Rezultate asemănătoare sunt valabile pentru procedurile <strong>de</strong> <strong>calcul</strong> ce utilizează<br />

reflectori bloc, respectiv rotaţii 28 .<br />

3.8.2 Acurateţea soluţiilor <strong>calcul</strong>ate<br />

Vom combina acum rezultatele privind sensibilitatea soluţiilor <strong>de</strong> tip CMMP, stabilite<br />

în secţiunea 3.7, cu estimările perturbaţiilor echivalente la nivelul datelor, introduse<br />

<strong>de</strong> procedurile <strong>de</strong> <strong>calcul</strong> analizate mai sus. În acest fel vom obţine evaluări a<br />

priori ale acurateţei soluţiilor <strong>calcul</strong>ate, i.e. ale abaterilor relative ale acestor soluţii<br />

faţă <strong>de</strong> soluţiile exacte.<br />

• Consi<strong>de</strong>răm problema <strong>calcul</strong>ului pseudosoluţiei x ∗ a sistemului (3.127), în care<br />

matricea A este monică. Dacă rezolvăm această problemă utilizând procedura<br />

SQR, bazată pe algoritmul <strong>de</strong> triangularizare ortogonală QR, atunci în virtutea<br />

stabilităţii <strong>numeric</strong>e inverse a acestei proceduri, pseudosoluţia <strong>calcul</strong>ată ˆx ∗ coinci<strong>de</strong><br />

cu soluţia exactă a problemei (3.127) cu datele perturbate în acord cu (3.153).<br />

Aplicând teorema 3.5 (vezi relaţiile (3.137)) conchi<strong>de</strong>m că<br />

‖ˆx ∗ − x ∗ ‖<br />

‖x ∗ ‖<br />

≤ ǫ 1 κ(A) + ǫ 2 κ 2 (A)tgθ, (3.155)<br />

28 În cazul secvenţelor <strong>de</strong> rotaţii disjuncte, estimarea (3.151) este in<strong>de</strong>pen<strong>de</strong>ntă <strong>de</strong> lungimea<br />

secvenţei [IX].


186 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

un<strong>de</strong> {<br />

not<br />

ǫ 1 = ǫ A + ǫb<br />

cos θ = nγ cm(1 + 1<br />

not<br />

ǫ 2 = ǫ A tgθ = nγ cm tgθ.<br />

cos θ ),<br />

(3.156)<br />

Relaţia (3.155) arată că în final acurateţea soluţiei <strong>calcul</strong>ate x ∗ <strong>de</strong>pin<strong>de</strong> atât <strong>de</strong><br />

condiţionarea κ(A) şi clasa θ ale problemei CMMP consi<strong>de</strong>rate, cât şi <strong>de</strong> nivelul<br />

erorilor ǫ α , α = 1 : 2, introduse <strong>de</strong> algoritmul folosit pentru rezolvarea ei. Conform<br />

relaţiilor (3.155) şi (3.136), acest nivel este <strong>de</strong>terminat <strong>de</strong> dimensiunile m, n ale<br />

problemei precum şi <strong>de</strong> precizia <strong>de</strong> lucru ε M conţinută implicit <strong>de</strong> parametrul generic<br />

γ cm (vezi (3.147)).<br />

În general, evaluările <strong>de</strong> tip (3.155), (3.156) sunt extrem <strong>de</strong> acoperitoare, dar<br />

totodată au marele merit <strong>de</strong> a sublinia că în situaţiile dificile (care, după cum am<br />

văzut, pot fi <strong>de</strong>tectate relativ uşor în practică) sunt necesare acţiuni suplimentare<br />

(vizând e.g. lucrul în dublă precizie, rafinarea iterativă a soluţiei <strong>calcul</strong>ate ˆx ∗ etc.),<br />

chiar dacă aceasta se obţine utilizând un algoritm <strong>numeric</strong> stabil cum este SQR.<br />

•• Consi<strong>de</strong>răm acum problema, relativ mai simplă, a <strong>calcul</strong>ului soluţiei normale<br />

x ∗ a sistemului (3.127), în care matricea A este epică. Conform relaţiilor (3.154) şi<br />

(3.144), soluţia normală <strong>calcul</strong>ată ˆx ∗ satisface o relaţie <strong>de</strong> forma<br />

un<strong>de</strong><br />

‖ˆx ∗ − x ∗ ‖<br />

‖x ∗ ‖<br />

≤ ǫ 1 κ(A), (3.157)<br />

ǫ 1<br />

not<br />

= 2ǫ A + ǫ b = mγ cm . (3.158)<br />

Menţionăm că, în practică, acurateţea soluţiei <strong>calcul</strong>ate în acest mod se dove<strong>de</strong>şte<br />

<strong>de</strong> cele mai multe ori satisfăcătoare.<br />

3.8.3 Scalarea problemei CMMP<br />

Consi<strong>de</strong>răm sistemul liniar (3.127), în care matricea A este monică. La fel ca în<br />

secţiunea 2.8, scalarea acestui sistem constă în înlocuirea sa cu sistemul echivalent<br />

D 1 AD 2˜x = D 1 b, (3.159)<br />

în care D 1 şi D 2 sunt matrice inversabile (în particular diagonale sau triunghiulare)<br />

alese în mod a<strong>de</strong>cvat.<br />

Matricea D 2 realizează scalarea coloanelor lui A, iar introducerea ei se reduce la<br />

schimbarea <strong>de</strong> variabilă x = D 2˜x. Prin urmare D 2 nu alterează pseudosoluţia în sens<br />

CMMP a sistemului consi<strong>de</strong>rat, mai precis dacă ˜x ∗ este pseudosoluţia sistemului<br />

scalat, atunci pseudosoluţia sistemului iniţial poate fi recuperată utilizând relaţia<br />

x ∗ = D 2˜x ∗ .<br />

Din contra, matricea D 1 , care realizează scalarea liniilor lui A, atrage după sine<br />

modificarea normei din R m în raport cu care se formulează problema CMMP şi <strong>de</strong>ci<br />

a pseudosoluţiei corespunzătoare. Într-a<strong>de</strong>văr, notând cu ˜r = D 1b −D 1 Ax reziduul<br />

sistemului scalat, avem ˜r = D 1 r, <strong>de</strong>ci<br />

‖˜r‖ 2 = r T Sr not<br />

= ‖r‖ 2 S, S = D T 1 D 1 ,


3.8. STABILITATEA ALGORITMILOR DE TRIANGULARIZARE 187<br />

în care ‖ · ‖ S este noua normă <strong>de</strong>terminată <strong>de</strong> alegerea matricei D 1 . Problema<br />

CMMP în raport cu norma ‖ · ‖ S se numeşte problema CMMP pon<strong>de</strong>rată, iar<br />

rezolvarea ei se face aplicând sistemului scalat tehnicile <strong>de</strong> <strong>calcul</strong> expuse anterior.<br />

Subliniem că pseudosoluţia ˜x ∗ astfel obţinută nu coinci<strong>de</strong> cu pseudosoluţia<br />

x ∗ a problemei CMMP în norma standard (corespunzătoare alegerii D 1 = I m ).<br />

În consecinţă, scalarea pe linii în problemele CMMP la care se doreşte <strong>calcul</strong>ul<br />

pseudosoluţiei x ∗ este interzisă. Pe <strong>de</strong> altă parte, în multe probleme, alegerea lui<br />

D 1 este impusă <strong>de</strong> tipul zgomotelor <strong>de</strong> măsură asociate problemei CMMP (vezi<br />

exemplul 3.2), iar în acest context matricea S are o semnificaţie statistică precisă.<br />

În problemele care privesc rezolvarea în sens CMMP a sistemelor sub<strong>de</strong>terminate<br />

Ax = b, în care matricea A este epică, situaţia se inversează. Matricea D 1<br />

realizează o simplă scalare (pe linii) a sistemului <strong>de</strong> restricţii Ax = b şi ca atare este<br />

permisă întot<strong>de</strong>auna. Din contra, matricea D 2 modifică norma din R n consi<strong>de</strong>rată<br />

la <strong>de</strong>finirea soluţiei normale, mai precis<br />

‖˜x‖ 2 = x T Tx not<br />

= ‖x‖ 2 T, T = D −T<br />

2 D −1<br />

2 ,<br />

<strong>de</strong> aceea scalarea pe coloane a sistemelor sub<strong>de</strong>terminate la care se doreşte <strong>calcul</strong>ul<br />

soluţiei normale în raport cu norma standard este interzisă.<br />

Din punctul <strong>de</strong> ve<strong>de</strong>re al <strong>calcul</strong>ului <strong>numeric</strong>, alegerea matricelor <strong>de</strong> scalare D 1 ,<br />

D 2 urmăreşte echilibrarea sistemului în sensul uniformizării nivelului <strong>de</strong> eroare<br />

în elementele matricei A. În acest scop se recomandă evaluarea erorilor iniţiale<br />

E = [ǫ ij ] care afectează elementele lui A precum şi <strong>de</strong>terminarea matricelor D 1 , D 2<br />

astfel încât elementele matricei scalate D 1 ED 2 să aibă acelaşi ordin <strong>de</strong> mărime ǫ.<br />

(Dacă matricea A este cunoscută exact, atunci se poate lua ǫ ij = ε M a ij .) Pentru<br />

<strong>de</strong>talii vezi [XIII].<br />

3.8.4 Rafinarea iterativă a soluţiei CMMP<br />

Consi<strong>de</strong>răm din nou problema CMMP (3.127), în care matricea A este monică.<br />

Pentru simplitate, în continuare omitem indicele superior ∗ , notând soluţiile în sens<br />

CMMP x ∗ şi ˆx ∗ cu x şi respectiv ˆx.<br />

Presupunem că am obţinut soluţia aproximativă ˆx, utilizând procedura CMMP,<br />

bazată pe algoritmul <strong>de</strong> triangularizare ortogonală<br />

A ← Q T A =<br />

[<br />

R1<br />

0<br />

]<br />

, Q T = U n . . . U 2 U 1 . (3.160)<br />

În general, problema rafinării iterative a soluţiei aproximative ˆx constă în construcţia<br />

recurentă a unui şir ˆx k , k = 0, 1, 2, . . ., convergent (în precizia <strong>de</strong> lucru)<br />

către soluţia exactă x a problemei <strong>de</strong> <strong>calcul</strong> consi<strong>de</strong>rate.<br />

În cazul m = n, ştim din secţiunea 2.8 că un pas al procesului <strong>de</strong> rafinare se<br />

<strong>de</strong>sfăşoară conform următoarei scheme <strong>de</strong> principiu. (Pentru simplitate, omitem<br />

indicele <strong>de</strong> iterare k.)<br />

% Se dă ˆx. Se <strong>de</strong>termină aproximaţia următoare ˆx + .<br />

1. Se <strong>calcul</strong>eaza reziduul r = b − Aˆx<br />

2. Se <strong>de</strong>termină corecţia ∆x rezolvând sistemul A∆x = r<br />

3. Se actualizează aproximaţia ˆx ← ˆx + = ˆx + ∆x


188 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

În cazul m > n, schema <strong>de</strong> mai sus este, în principiu, aplicabilă ca atare sistemului<br />

(3.127), dar ea se dove<strong>de</strong>şte eficientă numai dacă acest sistem este aproape compatibil,<br />

i.e. θ ≈ 0 (vezi discuţia din secţiunea 3.7.2). În caz contrar, influenţa reziduului<br />

asupra soluţiei este <strong>de</strong>terminantă (în acord cu relaţiile (3.137) şi (3.138)), <strong>de</strong>ci<br />

rafinarea iterativă trebuie să se facă corectând simultan evoluţia ambelor mărimi.<br />

Altfel spus, în problemele specific CMMP, cu reziduu mare, schema <strong>de</strong> corecţie<br />

prezentată mai sus trebuie aplicată nu sistemului dat (3.127), ci sistemului extins<br />

(3.83).<br />

În consecinţă, presupunând dată o soluţie aproximativă (ˆx, ˆr) a sistemului extins,<br />

în primul rând vom <strong>calcul</strong>a reziduul corespunzător<br />

[ ] [ ] [ ] [ ]<br />

s b Im A<br />

= −<br />

t 0 A T , (3.161)<br />

0<br />

ˆrˆx<br />

iar apoi vom <strong>de</strong>termina corecţiile ∆r şi ∆x rezolvând sistemul<br />

[ ] [ ] [ ]<br />

Im A ∆r s<br />

A T = . (3.162)<br />

0 ∆x t<br />

Desigur, în acest scop vom folosi triangularizarea ortogonală (3.160) a matricei A,<br />

<strong>de</strong>ja <strong>calcul</strong>ată în urma aplicării procedurii CMMP, iar soluţia (∆r, ∆x) va fi obţinută<br />

în locul membrului drept (s, t).<br />

Pentru a ve<strong>de</strong>a cum este posibil acest lucru, consi<strong>de</strong>răm prima ecuaţie (3.162),<br />

i.e. ∆r + A∆x = s, pe care o premultiplicăm cu Q T , vezi (3.160). Notând<br />

Q T ∆r = z, efectuând pe loc în s transformarea<br />

s ← Q T s (3.163)<br />

şi utilizând pentru vectorii z şi s partiţii a<strong>de</strong>cvate, putem scrie<br />

[ ] [ ] [ ]<br />

z1 R1 s1<br />

+ ∆x = ,<br />

z 2 0 s 2<br />

<strong>de</strong> un<strong>de</strong> <strong>de</strong>ducem imediat<br />

R 1 ∆x = s 1 − z 1 , z 2 = s 2 . (3.164)<br />

În continuare, pentru a <strong>de</strong>termina z 1 şi ∆x, consi<strong>de</strong>răm a doua ecuaţie (3.148),<br />

i.e. A T ∆r = t. Aici avem ∆r = Qz, iar din (3.160) rezultă A T Q = [R1 T 0], <strong>de</strong>ci<br />

R T 1 z 1 = t. (3.165)<br />

Acum este clar că <strong>de</strong>zi<strong>de</strong>ratele formulate mai sus relativ la rezolvarea sistemului<br />

extins (3.162) pot fi realizate procedând în ordinea (3.163), (3.165), (3.164), după<br />

care ∆r rezultă utilizând relaţia<br />

[ ]<br />

z1<br />

∆r = Q . (3.166)<br />

z 2<br />

În rezumat, schema <strong>de</strong> <strong>calcul</strong> pentru un pas al procesului <strong>de</strong> rafinare iterativă<br />

aplicat sistemului extins (3.83) este următoarea.


3.9. DESCOMPUNEREA ORTOGONALĂ COMPLETĂ 189<br />

% Se dau (ˆr, ˆx). Se <strong>de</strong>termină aproximaţia următoare<br />

(ˆr, ˆx) ← (ˆr + , ˆx + ) = (ˆr, ˆx) + (∆r, ∆x) .<br />

% se <strong>calcul</strong>ează reziduul (3.161)<br />

1. s = (b − Aˆx) − ˆr<br />

2. t = −A T ˆr<br />

% se rezolvă sistemul extins (3.162)<br />

3. s ← Q T s<br />

4. z 1 = R −T t<br />

5. s 1 ← s 1 − z 1<br />

6. t ← ∆x = R −1 s 1<br />

7. s 1 = z 1<br />

8. s ← ∆r = Qs<br />

% se actualizează aproximaţia<br />

9. ˆr ← ˆr + = ˆr + ∆r<br />

10. ˆx ← ˆx + = ˆx + ∆x<br />

Implementarea schemei se face <strong>de</strong> regulă lucrând în precizie mixtă. Reziduul<br />

(s, t) se <strong>calcul</strong>ează în precizie dublă, apoi se rotunjeşte la precizia <strong>de</strong> lucru în care se<br />

fac restul <strong>calcul</strong>elor. Condiţia <strong>de</strong> oprire a algoritmului este ‖∆x‖ ∞ , ‖∆r‖ ∞ ≤ cε M ,<br />

sau efectuarea unui număr maxim <strong>de</strong> iteraţii. Practic, schema e utilă atunci când<br />

problema nu este prea rău condiţionată. Pentru amănunte consultaţi [].<br />

3.9 Descompunerea ortogonală completă<br />

Procedurile <strong>de</strong> triangularizare ortogonală prezentate în secţiunile anterioare constituie<br />

instrumente eficiente şi <strong>numeric</strong> stabile <strong>de</strong> rezolvare a problemelor <strong>de</strong> tip<br />

CMMP cu matrice A ∈ C m×n <strong>de</strong> rang maximal, r = s. (Peste tot mai <strong>de</strong>parte vom<br />

nota r = rangA, iar s va avea semnificaţia obişnuită s = min(m, n).) În aceasta<br />

secţiune vom consi<strong>de</strong>ra cazul general r ≤ s şi vom <strong>de</strong>scrie un set <strong>de</strong> proceduri (directe),<br />

capabile să <strong>de</strong>termine rangul efectiv al matricei A în prezenţa erorilor <strong>de</strong><br />

rotunjire şi să utilizeze această informaţie.<br />

Subliniem că, în general, <strong>de</strong>terminarea rangului unei matrice A cu mijloace<br />

<strong>de</strong> <strong>calcul</strong> <strong>numeric</strong> presupune luarea unei <strong>de</strong>cizii inerent afectate <strong>de</strong> riscuri privind<br />

structura lui A. Totodată, această <strong>de</strong>cizie influenţează <strong>de</strong>cisiv şi ireversibil întregul<br />

proces <strong>de</strong> <strong>calcul</strong> ulterior. Având în ve<strong>de</strong>re reducerea riscurile menţionate, actualmente<br />

se consi<strong>de</strong>ră că cel mai sigur instrument <strong>de</strong> <strong>de</strong>terminare a rangului este <strong>de</strong>scompunerea<br />

valorilor singulare (DVS), care va fi prezentată pe larg în capitolul 5.<br />

(Construcţia acestei <strong>de</strong>scompuneri are la bază tehnici iterative <strong>de</strong> <strong>de</strong>terminare a valorilor<br />

proprii, care vor fi <strong>de</strong>zvoltate în capitolul următor.) Din această perspectivă,<br />

procedura (directă) <strong>de</strong> triangularizare ortogonală completă prezentată în continuare<br />

apare ca fiind relativ elementară şi ca atare se aplică în situaţiile în care simplitatea<br />

primează iar <strong>de</strong>ciziile <strong>de</strong> rang nu sunt critice. În esenţă, procedura se <strong>de</strong>sfăşoară în<br />

trei etape.<br />

În prima etapă are loc triangularizarea ortogonală a matricei date A, utilizând<br />

o strategie a<strong>de</strong>cvată <strong>de</strong> pivotare (permutare) a coloanelor, cu scopul <strong>de</strong> a evi<strong>de</strong>nţia


190 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

în colţul dreapta-jos al factorului triunghiular R partea neglijabilă, corespunzătoare<br />

eventualului <strong>de</strong>fect <strong>de</strong> rang.<br />

În a doua etapă are loc <strong>de</strong>terminarea rangului prin ”trunchierea” lui R, adică<br />

prin i<strong>de</strong>ntificarea şi eliminarea părţii sale neglijabile. Desigur, într-un <strong>calcul</strong> i<strong>de</strong>al cu<br />

precizie infinită, această parte se anulează exact, dar în <strong>calcul</strong>ul practic acest lucru<br />

nu se realizează niciodată datorită (i) erorilor iniţiale cu care elementele matricei A<br />

au fost <strong>calcul</strong>ate sau <strong>de</strong>terminate experimental şi reprezentate în <strong>calcul</strong>ator precum<br />

şi (ii) erorilor <strong>de</strong> rotunjire comise pe parcursul procesului <strong>de</strong> <strong>calcul</strong>. Prin urmare,<br />

în realitate, este întot<strong>de</strong>auna necesară corectarea forţată a rezultatului <strong>calcul</strong>at ˆR<br />

şi tocmai acest lucru se face prin trunchierea menţionată. Desigur, în acest scop<br />

este necesar un criteriu <strong>de</strong> <strong>de</strong>cizie, care în principiu este formulat <strong>de</strong> utilizator în<br />

funcţie <strong>de</strong> situaţia concretă precum şi <strong>de</strong> obiectivele urmărite prin <strong>calcul</strong>. Indicaţii<br />

mai precise vor fi date la momentul potrivit.<br />

În a treia etapă (în anumite situaţii, facultativă) matricea superior trapezoidală<br />

rămasă după trunchierea lui R este adusă la forma superior triunghiulară printr-o<br />

procedură <strong>de</strong> tip RQ (vezi secţiunea 3.6.2).<br />

Trecem acum la <strong>de</strong>scrierea succintă a etapelor procedurii <strong>de</strong> triangularizare completă,<br />

după care vom prezenta câteva aplicaţii ale acesteia în legătură cu problema<br />

generală CMMP.<br />

3.9.1 Triangularizarea ortogonală cu pivotarea coloanelor<br />

Teorema 3.7 Fie A ∈ C m×n . Există o matrice unitară U = Q H ∈ C m×m precum<br />

şi o matrice <strong>de</strong> permutare Π astfel încât matricea<br />

Q H AΠ = R (3.167)<br />

este superior triunghiulară, iar pentru fiecare k = 1 : s sunt satisfăcute condiţiile<br />

|r kk | 2 ≥<br />

min(j,m)<br />

∑<br />

i=k<br />

|r ij | 2 , j = k + 1 : n. (3.168)<br />

În consecinţă, |r 11 | ≥ |r 22 | ≥ . . . ≥ |r ss |, i.e. elementele diagonale ale matricei R<br />

sunt ordonate <strong>de</strong>screscător.<br />

Relaţia (3.167) afirmă că matricele A şi R sunt ortogonal echivalente, în particular<br />

au acelaşi rang. Prin urmare, dacă A este <strong>de</strong> rang r ≤ s, atunci în mod<br />

necesar r kk = 0, k = r + 1 : s, <strong>de</strong>ci în virtutea relaţiilor (3.168) ultimele m − r linii<br />

ale lui R sunt nule. În consecinţă,<br />

Corolar 3.1 După o permutare convenabilă Π a coloanelor sale, orice matrice<br />

A ∈ C m×n <strong>de</strong> rang r este echivalentă (la stânga) cu o matrice superior trapezoidală,<br />

i.e.<br />

[ ] T<br />

Q H AΠ = , (3.169)<br />

0<br />

un<strong>de</strong> T = R(1 : r, :), iar blocul li<strong>de</strong>r T(:, 1 : r) este inversabil.<br />

r coloane ale matricei AΠ sunt in<strong>de</strong>pen<strong>de</strong>nte.<br />

În consecinţă, primele


3.9. DESCOMPUNEREA ORTOGONALĂ COMPLETĂ 191<br />

Având în ve<strong>de</strong>re că situaţia din corolar nu poate fi realizată exact, în continuare<br />

ne vom concentra atenţia asupra condiţiilor (3.168). Problema <strong>de</strong>terminării rangului<br />

va fi discutată ulterior.<br />

Demonstraţia teoremei 3.7. Procedura <strong>de</strong> triangularizare ortogonală cu pivotare<br />

are s etape. Fie A 1 = A. Vom <strong>de</strong>termina matricea unitară<br />

Q H = Q H s . . . QH 2 QH 1 (3.170)<br />

procedând ca în secţiunea 3.3 (vezi <strong>de</strong>monstraţia teoremei 3.1), dar acţionând la<br />

fiecare etapă k = 1 : s asupra unei matrice A k Π k , cu coloanele permutate în scopul<br />

satisfacerii condiţiei (3.168).<br />

Ţinând seama <strong>de</strong> invarianţa normei euclidiene în raport cu transformările unitare<br />

(3.170), aceasta înseamnă că la etapa k, în poziţia pivot (adică în coloana k) trebuie<br />

să se găsească acea coloană j ≥ k a tabloului curent A k pentru care norma euclidiană<br />

a vectorului A k (k : m, j) este maximă. Pe scurt, notând<br />

ρ (k)<br />

j = ‖A k (k : m, j)‖, j = k : n, (3.171)<br />

strategia <strong>de</strong> pivotare a coloanelor este<br />

1. Se <strong>de</strong>termină cel mai mic j k astfel încât ρ (k)<br />

j k<br />

2. Dacă j k ≠ k<br />

1. A k (:, k) ↔ A k (:, j k ).<br />

= max j=k:n ρ (k)<br />

j<br />

După permutare, procedura <strong>de</strong> triangularizare continuă ca <strong>de</strong> obicei, i.e. are loc<br />

generarea reflectorului Q H k care anulează elementele subdiagonale din coloana k şi<br />

aplicarea sa coloanelor următoare. Astfel se obţine tabloul transformat<br />

A k+1 = Q H k (A kΠ k ), (3.172)<br />

asupra căruia se va opera similar la etapa următoare. În final, matricea R = A s+1<br />

este superior triunghiulară şi satisface (3.168).<br />

♦<br />

Având în ve<strong>de</strong>re implementarea eficientă a procedurii <strong>de</strong>scrise, ţinem seama <strong>de</strong><br />

invarianţa normelor (3.171) în raport cu transformările (3.172) şi constatăm că<br />

(ρ (k)<br />

j<br />

) 2 = (ρ (k+1)<br />

j ) 2 + |a (k+1)<br />

kj<br />

| 2 . (3.173)<br />

Prin urmare, <strong>calcul</strong>ul repetat şi costisitor al normelor (3.171) poate fi evitat, utilizând<br />

în schimb relaţiile <strong>de</strong> actualizare relativ simple 29<br />

(<br />

(k+1)<br />

)2<br />

ρ (k+1)<br />

j = ρ (k) √ |a<br />

kj<br />

|<br />

j<br />

√1 − . (3.174)<br />

Întregul proces <strong>de</strong> <strong>calcul</strong> se <strong>de</strong>sfăşoară pe loc în tabloul A conform următoarei<br />

scheme <strong>de</strong> principiu.<br />

29 Subliniem că <strong>de</strong>şi scrierea (3.174) evită <strong>de</strong>păşirile superioare, totuşi utilizarea ei nu este lipsită<br />

<strong>de</strong> riscuri dacă |a (k+1)<br />

kj | şi ρ (k)<br />

j au valori apropiate. În acest caz, pentru siguranţă se recomandă<br />

re<strong>calcul</strong>area normelor ρ (k+1)<br />

j , j = k + 1 : n, vezi [XIII, pag. 9.17].<br />

ρ (k)<br />

j


192 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

QRP<br />

% Schema <strong>de</strong> triangularizare ortogonală cu pivotarea coloanelor<br />

% iniţializarea normelor<br />

1. Pentru j = 1 : n<br />

1. ρ j = ‖A(:, j)‖<br />

2. Pentru k = 1 : s<br />

% strategia <strong>de</strong> pivotare<br />

1. Se <strong>de</strong>termină cel mai mic j k a.î. ρ jk = max j=k:n ρ j<br />

2. Dacă j k ≠ k<br />

1. A(:, k) ↔ A(:, j k )<br />

2. ρ jk ↔ ρ k<br />

% procedura <strong>de</strong> triangularizare ortogonală<br />

3. Se <strong>de</strong>termină Q H k a.î. (QH k A) ik = 0, i = k + 1 : m<br />

4. A ← Q H k A<br />

% actualizarea normelor<br />

( )<br />

|akj | 2,<br />

5. ρ j ← ρ j<br />

√1 − pentru j = k + 1 : n<br />

ρ j<br />

În ceea ce priveşte permutările <strong>de</strong> coloane, ele pot fi memorate într-un vector π<br />

astfel încât π k = j k , k = 1 : s, la fel ca în procedurile <strong>de</strong> eliminare gaussiană din<br />

capitolul 2. Pentru a putea i<strong>de</strong>ntifica direct poziţia în tabloul iniţial A a coloanelor<br />

matricei (permutate) AΠ, aici vom aplica o convenţie <strong>de</strong> memorare diferită. Vectorul<br />

π este iniţializat cu indicii coloanelor lui A în ordinea naturală, iar conţinutul<br />

său este actualizat după fiecare permutare <strong>de</strong> coloane efectuată. Forma finală a<br />

procedurii <strong>de</strong> triangularizare se obţine aplicând algoritmul 3.5 la paşii 2.3, 2.4 şi<br />

plasând instrucţiunea 2.5 la locul potrivit.<br />

Algoritmul 3.11 (QRP) (Se dă A ∈ C m×n . Se efectuează triangularizarea<br />

ortogonală cu pivotarea coloanelor a matricei A utilizând<br />

reflectori hermitici, i.e. Q H AΠ = R, vezi algoritmul 3.5. Permutările<br />

<strong>de</strong> coloane se memorează în vectorul π astfel încât dacă în final π k = j,<br />

atunci coloana k a lui AΠ a fost coloana j a lui A.)


3.9. DESCOMPUNEREA ORTOGONALĂ COMPLETĂ 193<br />

1. Pentru j = 1 : n % iniţializarea normelor<br />

1. ρ j = ‖A(:, j)‖<br />

2. π j = j<br />

2. Pentru k = 1 : s<br />

1. Se <strong>de</strong>termină cel mai mic j k a.î. ρ jk = max j=k:n ρ j<br />

2. Dacă j k ≠ k % pivotare<br />

1. A(:, k) ↔ A(:, j k )<br />

2. ρ jk ↔ ρ k<br />

3. π jk ↔ π k<br />

3. β k = 0 % triangularizare<br />

4. Dacă k < m atunci<br />

1. σ = ‖A(k : m, k)‖<br />

2. Dacă σ ≠ 0<br />

1. Dacă a kk ≠ 0 atunci σ ← a kk<br />

|a kk | σ<br />

2. a ik ← u ik = a ik /σ, pentru i = k : m<br />

3. β k ← u kk = 1 + a kk<br />

4. Pentru j = k + 1 : n<br />

1. α = − ( ∑ m<br />

i=k ūika ij )/β k<br />

2. a ij ← a ij + αu ik , pentru i = k : m<br />

% actualizarea normei<br />

3. ρ j ← ρ j<br />

√1 −<br />

5. a kk = −σ<br />

(<br />

|akj |<br />

ρ j<br />

) 2<br />

Comentarii. Pe parcursul procesului <strong>de</strong> <strong>calcul</strong>, normele ρ j se memorează în β j ,<br />

fiind suprascrise pe măsură ce nu mai sunt necesare; pentru claritate, nu am mai<br />

indicat explicit acest lucru.<br />

Modul <strong>de</strong> apel al procedurii este [A, β, π] = QRP(A).<br />

♦<br />

Dacă matricea A este monică, atunci aplicaţiile algoritmului 3.11 sunt similare cu<br />

aplicaţiile algoritmului 3.5. În plus, după cum am menţionat în secţiunea anterioară,<br />

ordonarea coloanelor lui A în acord cu (3.168) permite estimarea rapidă (ca ordin <strong>de</strong><br />

mărime) a numărului <strong>de</strong> condiţionare 30 ˆκ(A) = |r 11 | / |r nn |. Dacă matricea A este<br />

epică, atunci din nou în virtutea ordonării (3.168), blocul li<strong>de</strong>r R ′ din (3.63) rezultă<br />

în mod necesar inversabil, <strong>de</strong>ci construcţia unor baze pentru subspaţiile N = KerA<br />

şi N ⊥ = ImA H precum şi <strong>de</strong>terminarea unei soluţii particulare a sistemului Ax = b<br />

se poate face aproape prin inspecţie.<br />

De aceea, mai <strong>de</strong>parte ne vom concentra atenţia asupra cazului general în care<br />

matricea A nu este <strong>de</strong> rang maxim.<br />

3.9.2 Determinarea rangului<br />

Aplicăm procedura QRP matricei date A şi consi<strong>de</strong>răm matricea superior triunghiulară<br />

<strong>calcul</strong>ată<br />

Q H AΠ = ˆR. (3.175)<br />

30 Tipic, această relaţie furnizează o subevaluare <strong>de</strong> 2–3 ori mai mică <strong>de</strong>cât valoarea a<strong>de</strong>vărată<br />

κ(A).


194 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

În cazul m ≥ n, ˆR are structura<br />

⎡<br />

ˆR<br />

not<br />

=<br />

⎣<br />

R 1 R 12<br />

0 ˆR2<br />

0 0<br />

}{{}<br />

r<br />

}{{}<br />

n−r<br />

⎤<br />

⎦<br />

} r<br />

} n − r<br />

} m − n<br />

(3.176)<br />

în care elementele satisfac relaţiile (3.168), blocul li<strong>de</strong>r R 1 este superior triunghiular<br />

inversabil, dar blocul ˆR 2 nu rezultă nul datorită erorilor <strong>de</strong> <strong>calcul</strong> inerente. Pentru a<br />

<strong>de</strong>termina rangul r al matricei A, trebuie să efectuăm corect trunchierea factorului<br />

triunghiular ˆR, punând<br />

ˆR 2 = 0, (3.177)<br />

în acord cu (3.169), în care evi<strong>de</strong>nt matricea superior trapezoidală rămasă este<br />

T = [R 1 R 12 ]. (3.178)<br />

În cazul m < n se proce<strong>de</strong>ază similar.<br />

Pe scurt, <strong>de</strong>terminarea rangului r constă în a <strong>de</strong>ci<strong>de</strong> care este primul element<br />

neglijabil <strong>de</strong> pe diagonala lui ˆR. Strategia recomandată în LINPACK [XIII] presupune<br />

scalarea prealabilă a liniilor şi coloanelor lui A astfel încât erorile la nivel<br />

<strong>de</strong> element să fie <strong>de</strong> acelaşi ordin <strong>de</strong> mărime ǫ (vezi secţiunea 3.8.3). În acest caz,<br />

prin <strong>de</strong>finiţie, rangul <strong>numeric</strong> (sau efectiv) al lui A este primul întreg k ∈ 1 : s astfel<br />

încât<br />

|r k+1,k+1 | ≤ ǫ|r 11 |. (3.179)<br />

Mai <strong>de</strong>parte, vom presupune mereu că rangul <strong>numeric</strong> <strong>de</strong>terminat în acord cu<br />

criteriul <strong>de</strong> <strong>de</strong>cizie (3.179) coinci<strong>de</strong> cu rangul ”a<strong>de</strong>vărat” r al lui A 31 . Subliniem<br />

că, în urma acestei trunchieri ”corecte”, se recuperează forma superior trapezoidală<br />

(3.169), iar numărul <strong>de</strong> condiţionare al matricei A (<strong>de</strong> rang r ≤ s) poate fi estimat<br />

ca fiind<br />

ˆκ(A) = |r 11|<br />

|r rr | < ǫ−1 . (3.180)<br />

Relaţia (3.169) are câteva aplicaţii specifice extrem <strong>de</strong> importante. Notând<br />

Q ′ = Q(:, 1 : r) primele r coloane ale matricei unitare Q = Q 1 Q 2 . . . Q s , din (3.169)<br />

obţinem imediat factorizarea QR cu pivotarea coloanelor<br />

AΠ = Q ′ T. (3.181)<br />

În virtutea structurii lui T, matricea Q ′ constituie o bază ortogonală a subspaţiului<br />

S = ImA, generat <strong>de</strong> primele r coloane ale matricei AΠ sau, echivalent,<br />

<strong>de</strong> coloanele π k , k = 1 : r, ale lui A (vezi comentariile <strong>de</strong> început la algoritmul<br />

3.11). Altfel spus, o dată cu <strong>de</strong>terminarea rangului, în (3.181) a avut loc selecţia<br />

31 Realizarea practică a acestei coinci<strong>de</strong>nţe este condiţionată <strong>de</strong> alegerea judicioasă a toleranţei<br />

ǫ. (Valoarea ǫ = 0 nu este interzisă, dar <strong>de</strong> obicei conduce la <strong>de</strong>cizia r = s.) Pe <strong>de</strong> altă parte,<br />

gradul <strong>de</strong> siguranţă al <strong>de</strong>ciziei <strong>de</strong> rang poate fi nesatisfăcător, mai ales dacă modulele r kk scad<br />

uniform, fără să înregistreze vreun ”salt” semnificativ. În asemenea situaţii dificile se recomandă<br />

<strong>de</strong>terminarea rangului pe baza <strong>de</strong>scompunerii valorilor singulare, vezi capitolul 5.


3.9. DESCOMPUNEREA ORTOGONALĂ COMPLETĂ 195<br />

unui set <strong>de</strong> r coloane liniar in<strong>de</strong>pen<strong>de</strong>nte ale matricei iniţiale A, iar Q ′ constituie<br />

”versiunea” lor ortogonalizată. În mod corespunzător, matricea Q′′ = Q(:, r+1 : n)<br />

constituie o bază ortogonală a subspaţiului complementar S ⊥ = KerA H . (Vom<br />

folosi sintaxa [Q, R, π] = FQRP(A) pentru apelul procedurii <strong>de</strong> <strong>calcul</strong> al factorizării<br />

QR cu pivotarea coloanelor; implementarea este lăsată cititorului, cu menţiunea că<br />

acumularea transformărilor ortogonale este i<strong>de</strong>ntică cu aceea din algoritmul GQR.)<br />

Pe <strong>de</strong> altă parte, consi<strong>de</strong>rând gramianul G = A H A şi ţinând seama <strong>de</strong> (3.181),<br />

în care matricea Q ′ are coloanele ortogonale, <strong>de</strong>ducem<br />

Π T GΠ = T H T. (3.182)<br />

Această relaţie se numeşte factorizare Cholesky cu pivotare şi afirmă că, după<br />

o permutare congruentă a liniilor şi coloanelor sale, orice matrice hermitică pozitiv<br />

semi<strong>de</strong>finită G <strong>de</strong> rang r admite o factorizare Cholesky în care factorul superior<br />

trapezoidal T are structura (3.178) 32 .<br />

În multe situaţii constatările <strong>de</strong> mai sus prezintă un interes intrinsec. Având în<br />

ve<strong>de</strong>re abordarea problemei generale CMMP, <strong>de</strong>scriem în continuare ultima fază a<br />

procedurii <strong>de</strong> triangularizare ortogonală completă.<br />

3.9.3 Triangularizarea ortogonală completă<br />

Corolar 3.2 Fie A ∈ C m×n , <strong>de</strong> rang r ≤ s. Există două matrice unitare<br />

U = Q H ∈ C m×m şi Z = V H ∈ R n×n precum şi o matrice <strong>de</strong> permutare Π astfel<br />

încât matricea<br />

Q H AΠZ = S (3.183)<br />

are structura<br />

S =<br />

[<br />

S<br />

′<br />

0<br />

0 0<br />

}{{} }{{}<br />

r n−r<br />

]<br />

} r<br />

} m − r<br />

în care blocul li<strong>de</strong>r S ′ ∈ C r×r este superior triunghiular inversabil.<br />

(3.184)<br />

Demonstraţia este simplă. Consi<strong>de</strong>răm matricea superior trapezoidală T din<br />

(3.178) şi o aducem la forma triunghiulară utilizând transformări unitare la dreapta.<br />

Această etapă se numeşte compresie şi poate fi efectuată în multe feluri. De exemplu,<br />

aplicând o procedură <strong>de</strong> tip RQ (vezi secţiunea 3.6.2), obţinem<br />

în care S 1 este superior triunghiulară iar<br />

TZ = [S 1 0], (3.185)<br />

Z = Z r . . .Z 2 Z 1 . (3.186)<br />

Acum relaţiile (3.183) şi (3.184) rezultă aplicând Z la dreapta în (3.169) şi ţinând<br />

seama <strong>de</strong> (3.185). Evi<strong>de</strong>nt, matricea S ′ not<br />

= S 1 rezultă inversabilă, transformările<br />

32 Subliniem că această factorizare poate fi <strong>calcul</strong>ată direct, aplicând matricei G procedura<br />

CHOLDC din LINPACK [XIII].


196 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

unitare Q şi Z au expresiile (3.168) şi respectiv (3.186), iar Π este permutarea<br />

produsă <strong>de</strong> procedura QRP.<br />

♦<br />

Cu referire la o matrice superior trapezoidală oarecare A ∈ C m×n cu m < n,<br />

schema <strong>de</strong> triangularizare RQ este următoarea.<br />

TZRQ<br />

% Schema <strong>de</strong> compresie la dreapta, cazul m < n<br />

1. Pentru k = m : −1 : 1<br />

1. Se <strong>de</strong>termină Z k a.î. (AZ k ) kj = 0, j = m + 1 : n<br />

2. A ← AZ k<br />

Desigur, liniile lui A sunt parcurse în ordine inversă, începând cu ultima, iar<br />

anularea elementelor are în ve<strong>de</strong>re conservarea structurii preexistente <strong>de</strong> zerouri.<br />

În consecinţă, reflectorii Z k sunt <strong>de</strong> tipul celor din exemplul 3.5, dar aici vectorii<br />

Househol<strong>de</strong>r sunt notaţi v k , iar partea lor esenţială v kj , j = m+1 : n, este memorată<br />

pe poziţiile elementelor anulate din liniile lui A, la fel ca în algoritmul 3.9. Procedura<br />

rezultată din combinarea acestor i<strong>de</strong>i se redactează astfel.<br />

Algoritmul 3.12 (TZRQ) (Se dă A ∈ C m×n superior trapezoidală<br />

cu m < n. Se efectuează compresia la dreapta a matricei A utilizând o<br />

procedură <strong>de</strong> tip RQ cu reflectori hermitici, i.e. A ← AZ = [R 0], un<strong>de</strong><br />

Z = Z m . . .Z 2 Z 1 , iar R rezultă superior triunghiulară. Partea esenţială<br />

v kj , j = m + 1 : n, a vectorilor Househol<strong>de</strong>r se memorează pe poziţiile<br />

corespunzătoare A(k, m + 1 : n) din tabloul A. La aplicarea ulterioară<br />

a transformărilor se ţine seama că v kk = β k , k = 1 : m.)<br />

1. Pentru k = m : −1 : 1<br />

1. β k = 0<br />

(<br />

1. σ = |a kk | 2 + ∑ ) 1/2<br />

n<br />

j=m+1 |a kj| 2<br />

2. Dacă σ ≠ 0<br />

1. Dacă a kk ≠ 0 atunci σ ← ākk<br />

|a kk | σ<br />

2. a kj ← v kj = ā kj /σ, pentru j = k, m + 1 : n<br />

3. β k ← v kk = 1 + a kk<br />

4. Pentru i = ( 1 : k − 1<br />

1. α = − a ik v kk + ∑ n<br />

j=m+1 a ijv kj<br />

)/β k<br />

2. a ij ← a ij + α¯v kj , pentru j = k, m + 1 : n<br />

5. a kk = −¯σ<br />

Comentarii. În cazul real, algoritmul cere 2m 2 (n − m) operaţii. Modul <strong>de</strong> apel<br />

este [A, β] = TZRQ(A).<br />

♦<br />

În sinteza întregii expuneri <strong>de</strong> până acum, procedura <strong>de</strong> triangularizare ortogonală<br />

completă, corespunzătoare relaţiilor (3.183) şi (3.184), este următoarea.<br />

QRX<br />

% Procedura <strong>de</strong> triangularizare ortogonală completă a matricei<br />

A ∈ C m×n ; ǫ este o toleranţă dată, utilizată la <strong>de</strong>terminarea<br />

rangului.<br />

% triangularizarea ortogonală cu pivotarea coloanelor<br />

1. [A, β, π] = QRP(A)


3.9. DESCOMPUNEREA ORTOGONALĂ COMPLETĂ 197<br />

% trunchierea şi <strong>de</strong>terminarea rangului<br />

2. k = 1<br />

3. C^at timp k ≤ s şi |a kk | > ǫ|a 11 |<br />

1. k ← k + 1<br />

4. r = k − 1<br />

% compresia la dreapta<br />

5. [A(1 : r, :), γ] = TZRQ(A(1 : r, :))<br />

Modul <strong>de</strong> apel este [r, A, β, π, γ] = QRX(A, ǫ). Subliniem că toată informaţia<br />

<strong>de</strong>spre transformările unitare Q şi Z, generate la paşii 1 şi 5, este memorată (extrem<br />

<strong>de</strong> compact) în tabloul A.<br />

3.9.4 Descompunerea ortogonală completă<br />

Pentru a facilita expunerea, notăm X = ΠZ şi scriem relaţiile (3.183) şi (3.184) sub<br />

forma<br />

[ ] S<br />

′<br />

0<br />

A = Q X<br />

0 0<br />

H . (3.187)<br />

Partiţionând Q şi X conform cu S, obţinem<br />

A = Q ′ S ′ X ′H , (3.188)<br />

un<strong>de</strong> matricele Q ′ = Q(:, 1 : r) şi X ′ = X(:, 1 : r) au coloanele ortogonale, iar S ′<br />

este superior triunghiulară inversabilă <strong>de</strong> ordin r = rangA ≤ s.<br />

Relaţia (3.188) constituie <strong>de</strong>scompunerea ortogonală completă a matricei<br />

A ∈ C m×n şi reprezintă, în cazul general r ≤ s = min(m, n), echivalentul factorizărilor<br />

QR şi LQ (sau RQ), specifice matricelor <strong>de</strong> rang maxim. Subliniem că,<br />

<strong>de</strong>şi <strong>de</strong>scompunerea (3.188) este relativ elementară şi are un evi<strong>de</strong>nt caracter procedural,<br />

totuşi ea constituie un instrument preţios <strong>de</strong> rezolvare a numeroase probleme<br />

<strong>de</strong> <strong>calcul</strong>, în general inabordabile prin <strong>meto<strong>de</strong></strong> ”clasice”, <strong>de</strong> tip Cholesky sau Gram-<br />

Schmidt. În plus, performanţele <strong>numeric</strong>e ale <strong>algoritmi</strong>lor bazaţi pe această <strong>de</strong>scompunere<br />

sunt apropiate <strong>de</strong> performanţele <strong>algoritmi</strong>lor similari, <strong>de</strong>rivaţi pe baza<br />

<strong>de</strong>scompunerii valorilor singulare din capitolul 5.<br />

Aplicaţiile <strong>de</strong>scompunerii ortogonale complete sunt extrem <strong>de</strong> variate (vezi problemele<br />

3.61–3.63, precum şi capitolul 5). Ne vom mulţumi aici să menţionăm că,<br />

la fel ca în secţiunile 3.4 şi 3.6.2, matricele Q ′ şi Q ′′ = Q(:, r + 1 : m) constituie<br />

baze ortogonale pentru subspaţiile <strong>de</strong>scompunerii C m = ImA ⊕ KerA H , iar matricele<br />

X ′ şi X ′′ = X(:, r + 1 : n) joacă un rol similar relativ la <strong>de</strong>scompunerea<br />

C n = ImA H ⊕ KerA. Vom insista mai mult numai asupra problemei generale<br />

CMMP, care constituie pentru noi un subiect inedit.<br />

3.9.5 Problema generală CMMP<br />

Consi<strong>de</strong>răm sistemul liniar Ax = b, în care A ∈ C m×n este o matrice dată, nu<br />

neapărat <strong>de</strong> rang maxim, iar b ∈ C m este un vector arbitrar. Problema generală


198 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

CMMP, pe scurt CMMPX, constă în <strong>de</strong>terminarea pseudosoluţiei normale a sistemului<br />

Ax = b, i.e. a unui vector x ∗ ∈ C n astfel încât<br />

‖x ∗ ‖ = min ‖x‖, (3.189)<br />

x∈X ∗<br />

un<strong>de</strong> X ∗ este mulţimea pseudosoluţiilor cu proprietatea (3.77). Teorema următoare<br />

arată că problema CMMPX este întot<strong>de</strong>auna bine formulată.<br />

Teorema 3.8 Oricare ar fi vectorul b ∈ C m , problema CMMPX are o soluţie unică<br />

x ∗ ∈ C n . Pseudosoluţia normală a sistemului Ax = b poate fi scrisă sub forma<br />

x ∗ = A + b, (3.190)<br />

un<strong>de</strong>, prin <strong>de</strong>finiţie, matricea A + ∈ C n×m este pseudoinversa normală (sau Moore-<br />

Penrose) a lui A.<br />

Demonstraţie. Conform părţii a) a teoremei 3.3, sistemul Ax = b are întot<strong>de</strong>auna<br />

pseudosoluţii care satisfac sistemul Ax = b 1 , un<strong>de</strong> b 1 ∈ S = ImA, vezi (3.82).<br />

Conform părţii a) a teoremei 3.4, acest sistem are întot<strong>de</strong>auna o soluţie normală<br />

unică x ∗ ∈ N ⊥ = ImA H . Altfel spus, restricţia lui A la N ⊥ , văzută ca aplicaţie<br />

liniară A <strong>de</strong> la N ⊥ la S este inversabilă. Inversa A −1 : S → N ⊥ , prelungită cu 0<br />

pe S ⊥ , constituie pseudoinversa A + a lui A.<br />

♦<br />

Pseudosoluţia normală x ∗ a sistemului Ax = b, poate fi <strong>de</strong>terminată utilizând<br />

informaţia furnizată <strong>de</strong> procedura <strong>de</strong> triangularizare ortogonală completă<br />

[ ] S<br />

Q H ′<br />

0<br />

AΠZ = , (3.191)<br />

0 0<br />

în care matricele Q şi ΠZ sunt unitare, iar S ′ este superior triunghiulară inversabilă<br />

<strong>de</strong> ordin r = rangA. Aplicând transformarea Q H ambilor membri ai sistemului şi<br />

notând<br />

[ ] [ ]<br />

Q H d<br />

′<br />

u<br />

′<br />

b =<br />

d ′′ , x = ΠZ<br />

u ′′ , (3.192)<br />

obţinem sistemul ortogonal echivalent<br />

[ S<br />

′<br />

0<br />

0 0<br />

] [ u<br />

′<br />

u ′′ ]<br />

=<br />

[ d<br />

′<br />

d ′′ ]<br />

. (3.193)<br />

La fel ca în secţiunea 3.5.1, pentru a <strong>de</strong>termina pseudosoluţiile consi<strong>de</strong>răm<br />

reziduul<br />

[ ] d<br />

Q H r =<br />

′ − S ′ u ′<br />

d ′′ , (3.194)<br />

în care matricea Q este unitară, <strong>de</strong>ci minimul normei ‖r‖ = ‖Q H r‖ se atinge pentru<br />

S ′ u ′∗ = d ′ . În continuare, la fel ca în secţiunea 3.6.3, din (3.192), în care matricea<br />

ΠZ este unitară, rezultă u ′′∗ = 0. Prin urmare, pseudosoluţia normală a sistemului<br />

Ax = b este unic <strong>de</strong>terminată prin relaţia<br />

[ ]<br />

x ∗ (S<br />

= ΠZ<br />

′ ) −1 d ′<br />

, (3.195)<br />

0


3.10. RUTINE LAPACK ŞI MATLAB 199<br />

sau<br />

[ (S<br />

x ∗ = ΠZ<br />

′ ) −1 0<br />

0 0<br />

]<br />

Q H b, (3.196)<br />

din care expresia pseudoinversei A + este evi<strong>de</strong>ntă.<br />

Exploatând forma factorizată a transformărilor unitare Q H şi Z, schema <strong>de</strong><br />

<strong>calcul</strong> al pseudosoluţiei normale se stabileşte imediat.<br />

SQRX<br />

% Calculul pseudosoluţiei normale x = A + b<br />

1. Pentru k = 1 : s<br />

1. b = Q H k b<br />

2. Se rezolvă sistemul triunghiular S ′ x(1 : r) = b(1 : r) % r = rangA<br />

3. x(r + 1 : n) = 0<br />

4. Pentru k = 1 : r<br />

x ← Z k x<br />

5. x ← Πx<br />

Detalierea procedurii <strong>de</strong> permutare, necesare la pasul 5 pentru plasarea componentelor<br />

lui x pe poziţiile naturale, precum şi completarea schemei SQRX în scopul<br />

obţinerii reziduului <strong>de</strong> normă minimă r ∗ = b − Ax ∗ sau a vectorului <strong>de</strong> cea mai<br />

bună aproximaţie b ∗ = Ax ∗ sunt propuse cititorului ca exerciţii.<br />

3.10 Rutine LAPACK şi MATLAB<br />

Primele implementări profesionale şi <strong>de</strong> largă circulaţie ale procedurilor <strong>de</strong> triangularizare<br />

ortogonală au fost rutinele xQRDC şi xQRSL din LINPACK, care corespund<br />

(ca organizare şi tip <strong>de</strong> reflectori) procedurilor QRP (algoritmul 3.11) şi CMMP din<br />

secţiunile 3.9 şi, respectiv, 3.5.<br />

În LAPACK procedurile <strong>de</strong> <strong>calcul</strong> sunt mai diversificate.<br />

Pentru fiecare dintre cele 4 scheme <strong>de</strong> triangularizare standard zz = (’QR’, ’QL’,<br />

’LQ’ sau ’RQ’) 33 există câte trei rutine <strong>de</strong> <strong>calcul</strong>, care efectuează triangularizarea<br />

propriu-zisă, acumularea şi aplicarea transformărilor; numele rutinelor se obţin<br />

adăugând literele ’F’, ’G’ şi respectiv ’M’ la combinaţia zz. Rutinele operează cu<br />

matrice <strong>de</strong> formă generală (GE), unitare sau ortogonale (yy = ’UN’, ’OR’).<br />

De exemplu, rutinele din clasa QR se numesc xGEQRF, xyyGQR, xyyMQR şi corespund<br />

versiunilor la nivel <strong>de</strong> bloc ale procedurilor CQR, GCQR, respectiv MCQR<br />

din secţiunile 3.3 şi 3.4. (Amintim că în LAPACK se operează cu reflectori în scrierea<br />

Q 1 = I − τuu H , vezi secţiunea 3.2.) Numele celorlalte rutine se formează analog.<br />

Pentru <strong>calcul</strong>ul <strong>de</strong>scompunerii ortogonale complete din secţiunea 3.9 se utilizează<br />

rutinelexGEQPF şixTZRQF, care corespund schemelor QRP, respectiv TZRQ din text.<br />

Rezolvarea problemelor <strong>de</strong> tip CMMP <strong>de</strong> rang maxim, relativ la sistemele Ax = b<br />

sau A H x = b se efectuează cu driverul xGELS, iar pentru rezolvarea problemei generale<br />

CMMP se utilizează driverul expert xGELSX. (Primul reuneşte versiunile bloc<br />

ale schemelor SQR şi SLQ din secţiunile 3.5 şi 3.6, iar al doilea corespun<strong>de</strong> schemei<br />

SQRX din secţiunea 3.9.) Un al treilea driver (xGELSS) utilizează <strong>de</strong>scompunerea<br />

valorilor singulare.<br />

33 Pentru convenţiile <strong>de</strong> compunere a numelor rutinelor LAPACK, a se reve<strong>de</strong>a secţiunea 2.12.


200 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

În MATLAB, funcţia qr realizează triangularizarea ortogonală (în diverse versiuni)<br />

a matricei A. Organizarea riguroasă a spaţiului <strong>de</strong> memorie (specifică implementărilor<br />

LINPACK şi LAPACK) este <strong>de</strong> regulă sacrificată în favoarea unei manipulări<br />

mai como<strong>de</strong> <strong>de</strong> către utilizator, dar performanţele <strong>numeric</strong>e sunt aceleaşi.<br />

Apelul R = qr(A) <strong>calcul</strong>ează factorul superior triunghiular R returnând totodată,<br />

în partea inferioară a aceluiaşi tablou, vectorii Househol<strong>de</strong>r corespunzători reflectorilor<br />

Q 1 , . . . , Q n . Prin [Q,R] = qr(A) se acumulează în plus Q, iar comanda<br />

[Q,R,P] = qr(A) efectuează triangularizarea ortogonală cu pivotare, formând totodată<br />

explicit matricele Q şi P = Π.<br />

Rezolvarea în sens CMMP a sistemului liniar Ax = b, cu m ≠ n se face utilizând<br />

comanda x=A\b, un<strong>de</strong> \ este operatorul <strong>de</strong> împărţire la stânga. (Dacă m > n,<br />

atunci x este pseudosoluţia sistemului Ax = b, iar dacă m < n, atunci x este o<br />

soluţie particulară a aceluiaşi sistem.)<br />

3.11 Probleme<br />

P 3.1 În planul R2 se dă vectorul x = [3 4] T şi se consi<strong>de</strong>ră reflectorul elementar<br />

U = I − 2uu T , un<strong>de</strong> ‖u‖ = 1.<br />

a. Fie u = e 1. Să se construiască vectorul transformat y = Ux şi să se reprezinte grafic<br />

transformarea. Ce modificări apar dacă u = e 2 <br />

b. Să se <strong>de</strong>termine vectorul Househol<strong>de</strong>r normat u astfel încât Ux = ρe 1. Câte soluţii<br />

există Cât rezultă ρ <br />

c. Explicaţi <strong>de</strong> ce în <strong>calcul</strong>e este mai bine să presupunem că vectorul u nu este neapărat<br />

normat, introducând scalarul β ca în (3.8). Rezolvaţi din nou punctul b aplicând algoritmul<br />

3.2 şi observând că ρ = −σ. Justificaţi alegerea semnului lui σ recomandată în text. Ce<br />

se întâmplă dacă x = [3 10 −5 ] <br />

d. Aplicaţi în acest caz simplu indicaţiile <strong>de</strong> implementare ce însoţesc algoritmul<br />

3.2. Arătaţi cum se face scalarea vectorului Househol<strong>de</strong>r u = [u 1 u 2] T astfel încât să<br />

obţinem u 1 = β, respectiv u 1 = 1. Verificaţi că în fiecare caz are loc transformarea dorită<br />

Ux = −σe 1.<br />

e. Ilustraţi grafic diversele situaţii semnificative întâlnite la punctele b–d.<br />

P 3.2 Rezolvaţi problema anterioară în R 3 , consi<strong>de</strong>rând <strong>de</strong> exemplu vectorii x = [3 4 0] T<br />

sau x = [3 4 5] T .<br />

P 3.3 Fie x, y ∈ R m doi vectori daţi. În ce condiţii există un scalar ρ şi un reflector U<br />

astfel încât Ux = ρy Ce restricţii apar dacă impunem condiţia suplimentară ρ = 1 <br />

Scrieţi <strong>algoritmi</strong>i <strong>de</strong> generare a reflectorului U în cele două situaţii.<br />

P 3.4 Fie x ∈ R m un vector dat, x ≠ 0.<br />

a. Să se <strong>de</strong>termine un reflector U astfel încât prima coloană Ue 1 a lui U să fie un<br />

multiplu scalar <strong>de</strong> x, i.e. Ue 1 = ρx. Cât trebuie să fie ρ Câte soluţii există <br />

b. Ce semnificaţie geometrică au celelalte coloane Ue j, j = 2 : m, ale lui U <br />

c. Scrieţi algoritmul <strong>de</strong> <strong>calcul</strong> al unei baze ortogonale B = [b 1 b 2 . . . b m] a lui R m ,<br />

un<strong>de</strong> b 1 = x este un vector dat, ‖x‖ = 1.<br />

d. Reformulaţi în mod avantajos punctele a–c <strong>de</strong> mai sus în cazul în care vectorul<br />

dat x are primele k − 1 componente nule, i.e. x i = 0, i = 1 : k − 1. Precizaţi structura<br />

lui U precum şi structura bazei ortogonale B astfel obţinute. Ilustraţi grafic construcţia,<br />

consi<strong>de</strong>rând m = 3, k = 2.<br />

e. Reveniţi la punctul a şi încercaţi să <strong>de</strong>terminaţi U astfel încât Ue m = ρx. Ce se<br />

schimbă la punctele b–d


3.11. PROBLEME 201<br />

P 3.5 Fie x ∈ R m un vector dat, x ≠ 0.<br />

a. Să se construiască m − 1 vectori liniar in<strong>de</strong>pen<strong>de</strong>nţi y j astfel încât x T y j = 0,<br />

j = 2 : m.<br />

b. Cum se construiesc vectorii <strong>de</strong> la punctul a dacă în plus ei trebuie să fie ortogonali<br />

doi câte doi, i.e. yi T y j = 0, i ≠ j (Indicaţie. Asimilând x T cu o matrice cu o singură<br />

linie, problema constă în a construi o bază ortogonală a subspaţiului N = Kerx T , i.e. o<br />

matrice Y ∈ R m×(m−1) cu coloane ortogonale astfel încât x T Y = 0. Se ţine seama <strong>de</strong><br />

punctul b al problemei anterioare.)<br />

c. Utilizând rezultatele <strong>de</strong> la punctele a şi b, <strong>de</strong>scrieţi mulţimea tuturor soluţiilor<br />

ecuaţiei x T y = 1. Ilustraţi grafic situaţia în cazul m = 2, consi<strong>de</strong>rând <strong>de</strong> exemplu x = e 1<br />

şi x = [3 4] T .<br />

d. Determinaţi soluţia normală y ∗ a ecuaţiei x T y = 1. Arătaţi că y ∗ este <strong>de</strong> forma<br />

αx şi precizaţi interpretarea geometrică a lui y ∗ . (Indicaţie. Orice vector y ∈ R m poate fi<br />

scris unic sub forma y = αx + P m<br />

i=2<br />

βiyi, un<strong>de</strong> yi, i = 2 : m, sunt vectorii <strong>de</strong> la punctele<br />

a sau b.)<br />

e. Scrieţi <strong>algoritmi</strong>i <strong>de</strong> <strong>calcul</strong> ce rezolvă punctele b şi d. Ce simplificări apar dacă<br />

‖x‖ = 1 <br />

P 3.6 Se dau doi vectori x, y ∈ R m , x ≠ 0.<br />

a. Determinaţi pseudosoluţia α ∗ a sistemului αx = y, astfel încât norma euclidiană a<br />

reziduului ρ(α) not<br />

= ‖y − αx‖ să fie minimă. Evaluaţi r ∗ = y − α ∗ x şi ρ(α ∗ ) = ‖r ∗ ‖.<br />

b. Scrieţi algoritmul <strong>de</strong> <strong>calcul</strong> corespunzător şi găsiţi interpretarea geometrică a vectorilor<br />

y ∗ = α ∗ x şi r ∗ .<br />

c. Reluaţi punctul a presupunând că x i = 0, i = 2 : m. Ce simplificări apar Puteţi<br />

realiza această condiţie aplicând o transformare a<strong>de</strong>cvată T ambilor vectori daţi x şi y <br />

Cum trebuie să fie T pentru ca funcţia ρ(α) să rămână neschimbată (”invariantă”) <br />

P 3.7 Consi<strong>de</strong>raţi un reflector U = I − 2uu T , ‖u‖ = 1.<br />

a. Calculaţi <strong>de</strong>tU.<br />

b. Determinaţi valorile şi vectorii proprii ai lui U.<br />

c. Determinaţi n vectori v i, i = 1 : n, astfel încât Uv i = e i şi Ue i = v i, i = 1 : n.<br />

Observaţie. În general, se numeşte reflector elementar (nu neapărat ortogonal) orice<br />

matrice U ∈ R m×m <strong>de</strong> forma U = I m − 2uv T , în care u, v ∈ R m sunt doi vectori astfel<br />

încât v T u = 1. Multe dintre proprietăţile reflectorilor (ortogonali) consi<strong>de</strong>rate mai sus se<br />

păstrează (sau se reformulează a<strong>de</strong>cvat) în acest cadru mai general.<br />

P 3.8 Arătaţi că orice matrice <strong>de</strong> permutare elementară este un reflector.<br />

P 3.9 Fie S ∈ R m×m o matrice simetrică pozitiv <strong>de</strong>finită, arbitrară dar fixată. Se<br />

consi<strong>de</strong>ră spaţiul vectorial R m cu produsul scalar (x, y) S = y T Sx şi norma euclidiană<br />

‖x‖ 2 S = (x,x) S. Doi vectori x,y ∈ R m se numesc S-ortogonali dacă (x,y) S = 0. Matricea<br />

A se numeşte S-simetrică dacă (y, Ax) S = (Ay, x) S, ∀x, y ∈ R m , adică SA = A T S sau<br />

A = S −1 A T S. Matricea U ∈ R m×m se numeşte S-ortogonală dacă păstrează produsul<br />

scalar (·, ·) S, i.e. (Ux, Uy) S = (x,y) S, ∀x, y ∈ R m , adică U T SU = S.<br />

a. Să se arate că orice matrice S-ortogonală este asemenea cu o matrice ortogonală.<br />

Să se <strong>de</strong>ducă <strong>de</strong> aici că, în general, după o transformare <strong>de</strong> coordonate convenabilă,<br />

proprietăţile geometrice ale spaţiului R m dotat cu produsul scalar (·, ·) S se reduc la proprietăţile<br />

euclidiene ”uzuale”.<br />

b. Să se <strong>de</strong>finească noţiunea <strong>de</strong> S-reflector elementar şi să se studieze principalele<br />

proprietăţi ale acestui tip <strong>de</strong> transformări. Cum se implementează avantajos <strong>algoritmi</strong>i <strong>de</strong><br />

generare şi aplicare a reflectorilor S-ortogonali


202 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

P 3.10 Păstrăm aceeaşi terminologie ca în problema anterioară chiar dacă matricea simetrică<br />

(inversabilă) S este <strong>de</strong> semn ne<strong>de</strong>finit. În particular, fie S = J, un<strong>de</strong><br />

» –<br />

Ip 0<br />

J = , p + q = m. (3.197)<br />

0 −I q<br />

Observaţie. Spaţiul R m cu produsul scalar ”ne<strong>de</strong>finit” (·, ·) J se numeşte spaţiu pseudoeuclidian<br />

(sau spaţiu hiperbolic) <strong>de</strong> signatură (p, q). Mulţimea vectorilor din R m cu<br />

proprietatea<br />

pX mX<br />

‖x‖ 2 J = 0 ⇔ x 2 i − x 2 i = 0 (3.198)<br />

i=1<br />

i=p+1<br />

se numeşte con izotrop 34 .<br />

a. Fie x ∈ R m un vector dat, iar U un J-reflector <strong>de</strong> forma<br />

U = I m − uuT J<br />

β , β = 1 2 ‖u‖2 J. (3.199)<br />

Să se scrie algoritmul <strong>de</strong> aplicare a transformării x ← y = Ux şi să se verifice prin <strong>calcul</strong><br />

direct că ‖Ux‖ J = ‖x‖ J.<br />

b. Fie x ∈ R m un vector dat. Să se stabilească în ce condiţii există un J-reflector <strong>de</strong><br />

forma (3.199) astfel încât<br />

Ux = −σe 1, σ ∈ R − {0} (3.200)<br />

şi să se scrie algoritmul <strong>de</strong> generare a lui U. Discuţie.<br />

c. Fie S o matrice simetrică inversabilă. Să se stabilească în ce condiţii S admite<br />

factorizări <strong>de</strong> forma S = R T JR sau S = L T JL, în care R şi L sunt matrice superior,<br />

respectiv inferior triunghiulare. Să se scrie <strong>algoritmi</strong>i <strong>de</strong> factorizare Cholesky ”cu semn”,<br />

corespunzători celor două relaţii <strong>de</strong> mai sus.<br />

d. Arătaţi că dacă există două matrice pătrate A şi B (nu neapărat triunghiulare)<br />

astfel încât S = A T JA = B T JB, atunci există o matrice J-ortogonală Q astfel încât<br />

B = QA. Altfel spus, oricare doi factori ”cu semn” ai lui S sunt J-ortogonal echivalenţi.<br />

P 3.11 În planul R2 se dă vectorul x = [3 4] T şi se consi<strong>de</strong>ră rotaţia plană P = P 12 cu<br />

parametrii c, s.<br />

a. Fie c = √ 3/2, s = 1/2. Să se <strong>calcul</strong>eze vectorul transformat y = Px şi să se<br />

reprezinte grafic transformarea.<br />

b. Să se <strong>de</strong>termine c, s astfel încât Px = re 1. Câte soluţii există Cât rezultă r <br />

P 3.12 Fie x, y ∈ R m doi vectori daţi. În ce condiţii există un scalar ρ şi o rotaţie P ki<br />

astfel încât P ki x = ρy <br />

P 3.13 Fie P o rotaţie plană. Calculaţi <strong>de</strong>tP şi <strong>de</strong>terminaţi valorile şi vectorii proprii ai<br />

matricei P.<br />

P 3.14 Fie x ∈ R m un vector dat.<br />

a. Scrieţi <strong>algoritmi</strong>i <strong>de</strong> generare a unei secvenţe <strong>de</strong> rotaţii P astfel încât Px = re 1.<br />

Analizaţi diversele variante posibile.<br />

b. Acelaşi enunţ, utilizând o grupare convenabilă a rotaţiilor în secvenţe <strong>de</strong> rotaţii<br />

disjuncte (vezi observaţia 3.2).<br />

P 3.15 Se dă o matrice A ∈ R m×m . Să se scrie <strong>algoritmi</strong>i <strong>de</strong> aplicare a transformărilor<br />

A ← PA şi A ← AP T , un<strong>de</strong> P sunt secvenţele <strong>de</strong> rotaţii generate în problema 3.14.<br />

34 Cel mai simplu exemplu este planul Lobacevski R 2 cu p = 1, q = 1. Spaţiul Minkovsky din<br />

teoria relativităţii este R 4 cu p = 1, q = 3. În acest caz (3.198) se numeşte con <strong>de</strong> lumină, iar<br />

transformările J-ortogonale formează grupul Poincaré al lui R 4 .


3.11. PROBLEME 203<br />

P 3.16 O matrice P <strong>de</strong> forma<br />

»<br />

P =<br />

c<br />

−s<br />

−s<br />

c<br />

–<br />

, c 2 − s 2 = 1<br />

se numeşte rotaţie hiperbolică (plană) 35 .<br />

a. Arătaţi că P este o transformare J-ortogonală, i.e. P T JP = J. Cât este J <br />

b. Fie x ∈ R 2 un vector dat. În ce condiţii există o rotaţie hiperbolică astfel încât<br />

Px = re 1, respectiv Px = re 2 Scrieţi algoritmul <strong>de</strong> generare a lui P şi discutaţi<br />

aplicabilitatea lui practică 36 .<br />

P 3.17 În planul C2 se dă vectorul x = [1 + i 2 + i] T .<br />

a. Să se <strong>de</strong>termine un reflector complex Q astfel încât Qx = −σe 1.<br />

b. Să se <strong>de</strong>termine o rotaţie complexă P astfel încât Px = re 1.<br />

P 3.18 Formulaţi şi rezolvaţi versiunile complexe ale problemelor anterioare 3.3–3.10 şi<br />

3.12–3.14, semnalând în fiecare caz modificările <strong>de</strong> notaţie şi <strong>de</strong> terminologie introduse.<br />

P 3.19 Demonstraţi că orice matrice ortogonală se poate exprima ca produs <strong>de</strong> reflectori<br />

elementari.<br />

» – R<br />

P 3.20 Scrieţi algoritmul <strong>de</strong> triangularizare ortogonală a matricei A + = , în care<br />

C<br />

blocul R este superior triunghiular <strong>de</strong> ordin n, iar C ∈ R (m−n)×n este un bloc oarecare.<br />

Evaluaţi numărul <strong>de</strong> operaţii. Precizaţi ce simplificări apar în următoarele cazuri<br />

a. m − n = 1, i.e. C = c T este un vector linie;<br />

b. R este superior bidiagonală, respectiv superior Hessenberg;<br />

c. C este superior triunghiulară.<br />

P 3.21 Cum procedaţi dacă blocul li<strong>de</strong>r R al matricei A + din problema prece<strong>de</strong>ntă este<br />

inferior triunghiular Scrieţi algoritmul corespunzător.<br />

P 3.22 Scrieţi algoritmul <strong>de</strong> triangularizare cu rotaţii a unei matrice A ∈ R m×n , utilizând<br />

diverse strategii <strong>de</strong> anulare a elementelor subdiagonale (vezi problema 3.14).<br />

P 3.23 Scrieţi algoritmul <strong>de</strong> triangularizare cu rotaţii a unei matrice A ∈ R n×n a) superior<br />

Hessenberg, b) tridiagonale.<br />

În al doilea caz, presupuneţi că A este memorată împachetat (prin trei vectori). Ce<br />

dificultăţi apar în ceea ce priveşte memorarea informaţiei generate <strong>de</strong> algoritm <br />

P 3.24 Fie R ∈ R n×n o matrice superior triunghiulară, iar b, c ∈ R n doi vectori. Scrieţi<br />

un algoritm eficient <strong>de</strong> triangularizare a matricei A + = R + bc T , i.e. Q T A + = R +, un<strong>de</strong><br />

R + este superior triunghiulară.<br />

Fie k ∈ 1 : n − 1. Cum procedaţi dacă ultimele n − k elemente ale vectorului b sunt<br />

nule <br />

P 3.25 Cum procedaţi în problema prece<strong>de</strong>ntă dacă A + = R + BC T , un<strong>de</strong> B, C ∈ R n×p ,<br />

cu p > 1 <br />

P 3.26 Se consi<strong>de</strong>ră relaţia P + = A T PA + C T C, un<strong>de</strong> A ∈ R n×n şi C ∈ R l×n sunt două<br />

matrice date, iar P = R T R este o matrice pozitiv <strong>de</strong>finită al cărei factor Cholesky superior<br />

triunghiular R este cunoscut. Scrieţi o procedură (<strong>de</strong> tip rădăcină pătrată) care <strong>calcul</strong>ează<br />

factorul Cholesky R + al matricei P +, fără a forma explicit P +.<br />

35 Denumirea se justifică observând că putem întot<strong>de</strong>auna consi<strong>de</strong>ra c = chξ, s = −shξ.<br />

36 Observaţi că rotaţia hiperbolică este o transformare simetrică.


204 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

P 3.27 Ce simplificări apar în problema prece<strong>de</strong>ntă dacă A este superior Hessenberg, iar<br />

C = c T este un vector linie având numai ultima componentă nenulă <br />

P 3.28 Fie A ∈ R m×n monică, cu m > n. Utilizând informaţia furnizată <strong>de</strong> algoritmul <strong>de</strong><br />

triangularizare cu reflectori U n . . . U 2U 1A = R, scrieţi algoritmul <strong>de</strong> acumulare a primelor<br />

p coloane ale matricei Q = U 1U 2 . . . U n, un<strong>de</strong> p ∈ 1 : m este un întreg dat. Calculaţi<br />

numărul <strong>de</strong> operaţii în funcţie <strong>de</strong> p. Cum memoraţi rezultatul Discutaţi cazul în care<br />

matricea A nu este neapărat monică.<br />

P 3.29 Aceeaşi problemă ca mai sus, utilizând algoritmul <strong>de</strong> triangularizare ortogonală<br />

cu rotaţii.<br />

P 3.30 Fie Q matricea din problema 3.28. Precizaţi care dintre schemele următoare<br />

realizează mai eficient acumularea lui Q şi <strong>de</strong> ce.<br />

1. Q = I m 1. Q = I m<br />

2. Pentru k = 1 : n 2. Pentru k = n : −1 : 1<br />

1. Q ← QU k 1. Q ← U k Q<br />

P 3.31 a. Construiţi reprezentările WY şi W 2 T ale reflectorilor bloc Q = U 1U 2 . . . U nb ,<br />

consi<strong>de</strong>rând relaţia <strong>de</strong> recurenţă<br />

1. Q = U nb<br />

2. Pentru k = n b − 1 : −1 : 1<br />

1. Q ← U k Q<br />

Ce diferenţe apar faţă <strong>de</strong> soluţia adoptată în secţiunea 3.4.3 <br />

b. Scrieţi reprezentarea W 2 T sub forma Q = I −WS −1 W T , un<strong>de</strong> S −1 = T. Precizaţi<br />

structura şi scrieţi procedura <strong>de</strong> construcţie a matricei S. Care dintre cele două forme <strong>de</strong><br />

reprezentare este preferabilă şi <strong>de</strong> ce <br />

P 3.32 Fie A ∈ R m×n (m > n) o matrice superior Hessenberg. Prezentaţi <strong>algoritmi</strong><br />

pentru:<br />

a. <strong>calcul</strong>ul factorizării QR a matricei A;<br />

b. rezolvarea sistemului liniar supra<strong>de</strong>terminat Ax = b, cu b ∈ R m dat.<br />

c. Cum procedaţi dacă A este bandă <strong>de</strong> lăţime inferioară p > 1 <br />

Utilizaţi reflectori şi rotaţii. Comparaţi cele două versiuni.<br />

P 3.33 Aceeaşi problemă, când A ∈ R m×n este inferior Hessenberg, repectiv bandă <strong>de</strong><br />

lăţime inferioară p.<br />

P 3.34 Fie A ∈ R m×n , m > n, o matrice <strong>de</strong> rang n a cărei factorizare QR este cunoscută,<br />

i.e. A = QR, Q ∈ R m×m , R ∈ R m×n . Fie A + = [A y], cu y ∈ R m . Prezentaţi <strong>algoritmi</strong><br />

pentru<br />

a. <strong>calcul</strong>ul factorizării QR a matricei A +;<br />

b. rezolvarea sistemului A +x + = b, cu b ∈ R m dat.<br />

c. Stabiliţi o relaţie între pseudosoluţiile x ∗ + şi x ∗ ale sistemelor A +x + = b, respectiv<br />

Ax = b.<br />

d. Consi<strong>de</strong>raţi cazul general A + = [A Y ], cu Y ∈ R m×p .<br />

P 3.35 Fie » A ∈ – R m×n , m ≥ n, o matrice <strong>de</strong> rang n a cărei factorizare QR este cunoscută.<br />

z<br />

T<br />

Fie A + = , cu z ∈ R n dat. Arătaţi că coloanele lui A + sunt liniar in<strong>de</strong>pen<strong>de</strong>nte.<br />

A<br />

Prezentaţi <strong>algoritmi</strong> pentru<br />

a. <strong>calcul</strong>ul factorizării QR a matricei A +.


3.11. PROBLEME 205<br />

» – δ<br />

b. rezolvarea sistemului A +x + = b +, un<strong>de</strong> b + = , cu b ∈ R m şi δ ∈ R daţi.<br />

b<br />

c. Stabiliţi o relaţie între pseudosoluţiile x ∗ + şi x ∗ ale sistemelor A +x + = b +, respectiv<br />

Ax = b.<br />

» – Z<br />

d. Consi<strong>de</strong>raţi cazul general A + = , cu Z ∈ R p×n .<br />

A<br />

P 3.36 Scrieţi <strong>algoritmi</strong> eficienţi <strong>de</strong> aplicare a transformărilor B ← Q T B şi B ← QB,<br />

un<strong>de</strong> Q este matricea din problema 3.28 iar B ∈ R m×p este superior sau inferior triunghiulară.<br />

Evaluaţi numărul <strong>de</strong> operaţii în cele patru situaţii.<br />

P 3.37 Aceeaşi problemă ca mai sus, pentru transformările la dreapta, B ← BQ şi<br />

B ← BQ T .<br />

P 3.38 Fie B ∈ R m×p o matrice dată, iar Q = Q 1Q 2 . . . Q n matricea din problema 3.28.<br />

Scrieţi algoritmul <strong>de</strong> aplicare a transformărilor B ← Q T B şi B ← QB la nivel <strong>de</strong> bloc.<br />

P 3.39 Aceeaşi problemă ca mai sus, pentru transformările la dreapta, B ← BQ şi<br />

B ← BQ T .<br />

P 3.40 În condiţiile problemei 3.28, scrieţi un algoritm pentru <strong>calcul</strong>ul vectorului y = Ax,<br />

cu x ∈ R n dat. (N.B. Matricea A a fost distrusă în urma execuţiei algoritmului <strong>de</strong><br />

triangularizare.)<br />

P 3.41 În condiţiile problemei 3.28, scrieţi <strong>algoritmi</strong> pentru<br />

a. rezolvarea sistemului A T Ax = c, cu c ∈ R n dat;<br />

b. <strong>calcul</strong>ul inversei H = (A T A) −1 ;<br />

c. <strong>calcul</strong>ul scalarului α = c T (A T A) −1 c, c ∈ R n .<br />

P 3.42 Scrieţi procedurile GQL şi MQL <strong>de</strong> acumulare şi aplicare a transformărilor generate<br />

<strong>de</strong> algoritmul <strong>de</strong> triangularizare QL.<br />

P 3.43 Scrieţi algoritmul <strong>de</strong> triangularizare ortogonală QL la nivel <strong>de</strong> bloc.<br />

P 3.44 Fie A ∈ R m×n o matrice monică. Scrieţi procedurile <strong>de</strong> ortogonalizare GS şi<br />

MGS care <strong>calcul</strong>ează factorizarea A = Q ′′ L ′′ , un<strong>de</strong> Q ′′ are coloanele ortogonale, iar L ′′<br />

este inferior triunghiulară.<br />

P 3.45 Rezolvaţi problemele 3.24-3.26 înlocuind peste tot matricele superior triunghiulare<br />

R şi R + cu matrice inferior triunghiulare. Reformulaţi în acelaşi spirit problema 3.27.<br />

P 3.46 a. Să se scrie un algoritm eficient <strong>de</strong> rezolvare a sistemului<br />

(G + C T C)x + = c + C T y,<br />

în care G = R T R este o matrice simetrică pozitiv <strong>de</strong>finită al cărei factor Cholesky superior<br />

triunghiular R este cunoscut, iar matricea C ∈ R l×n precum şi vectorii c ∈ R n , y ∈ R l<br />

sunt daţi. Stabiliţi o relaţie între x + şi soluţia x a sistemului Gx = c.<br />

b. Aceeaşi problemă ca mai sus, pentru sistemul A +x + = d, un<strong>de</strong> A + este matricea<br />

din problemele 3.24, 3.25 iar d ∈ R n un vector dat.<br />

P 3.47 Fie A ∈ R m×n monică. Scrieţi algoritmul <strong>de</strong> <strong>calcul</strong> al pseudosoluţiei sistemului<br />

Ax = b cu b ∈ R m dat, utilizând informaţia furnizată <strong>de</strong> algoritmul <strong>de</strong> triangularizare<br />

ortogonală QL.


206 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

P 3.48 Scrieţi algoritmul <strong>de</strong> triangularizare ortogonală la dreapta a matricei A + = [L B],<br />

în care blocul L este inferior triunghiular <strong>de</strong> ordin m iar B ∈ R m×(n−m) este o matrice<br />

oarecare. Precizaţi ce modificări apar dacă<br />

a. n − m = 1, i.e. B = b este un vector;<br />

b. L este inferior bidiagonală, respectiv inferior Hessenberg;<br />

c. B este inferior triunghiulară.<br />

Observaţie. Evi<strong>de</strong>nt, această problemă reprezintă o simplă formulare ”prin dualitate” a<br />

problemei 3.20. Propunem cititorului ca, procedând în mod similar, să obţină şi să rezolve<br />

dualele problemelor 3.21–3.47 (sau ale celor mai interesante dintre acestea), comentând în<br />

fiecare caz paralelismele observate.<br />

P 3.49 Fie A ∈ R m×n o matrice <strong>de</strong> rang maxim.<br />

a. Discutaţi existenţa şi unicitatea inverselor la stânga (dreapta) ale matricei A. Puteţi<br />

<strong>de</strong>scrie printr-o formulă mulţimea acestor inverse <br />

b. Evaluaţi expresiile ‖I m − AA + ‖ F şi ‖I n − A + A‖ F. Ce se schimbă dacă mai sus<br />

înlocuim norma Frobenius cu norma spectrală <br />

P 3.50 a. Fie A ∈ R m×n o matrice monică, iar b ∈ R m , c ∈ R n doi vectori daţi.<br />

Utilizând informaţia furnizată <strong>de</strong> algoritmul <strong>de</strong> triangularizare ortogonală Q T A = R,<br />

scrieţi o procedură care rezolvă (în sensul CMMP) ambele sisteme Ax = b şi A T x = c.<br />

b. Aceeaşi problemă ca mai sus, dacă A este epică, utilizând algoritmul <strong>de</strong> triangularizare<br />

la dreapta AZ = L.<br />

c. Aceleaşi probleme ca mai sus, relativ la sistemele cu membru drept multiplu<br />

AX = B şi A T Y = C, în care B şi C sunt două matrice date, dimensionate corespunzător.<br />

P 3.51 Fie A ∈ R m×n cu m ≠ n. Scrieţi <strong>algoritmi</strong>i <strong>de</strong> triangularizare prin eliminare<br />

gaussiană MA = U, respectiv AN = L şi indicaţi câteva aplicaţii. Ce strategii <strong>de</strong> pivotare<br />

recomandaţi în fiecare caz <br />

» –<br />

» –<br />

Im A<br />

R<br />

′<br />

P 3.52 Fie H =<br />

A H , cu A = Q monică (Q ∈ C m×m , R ′ ∈ R n×n ).<br />

0<br />

0<br />

a. Arătaţi că factorizarea cvasi-diagonală a matricei H este <strong>de</strong> forma THT H = J,<br />

un<strong>de</strong><br />

2<br />

3<br />

J 1<br />

. ..<br />

J n<br />

I m−n<br />

J = 6<br />

4<br />

7<br />

5 , J k =<br />

» 1 1<br />

1 0<br />

–<br />

, k = 1 : n.<br />

b. Arătaţi că H este inversabilă şi<br />

» –<br />

H −1 P2 (A + ) H<br />

=<br />

A + −G −1 ,<br />

un<strong>de</strong> G = A H A, A + = (A H A) −1 A H , P 2 = I − AA<br />

» + . Cât este<br />

–<br />

<strong>de</strong>tH <br />

In A H<br />

c. Formulaţi rezultatele a şi b pentru H = , cu A epică.<br />

A 0<br />

P 3.53 Consi<strong>de</strong>raţi funcţia pătratică F : R n → R <strong>de</strong>finită prin<br />

F(x) = 1 2 xT Gx − x T c,<br />

un<strong>de</strong> G ∈ R n×n este o matrice simetrică pozitiv <strong>de</strong>finită, iar c ∈ R n .<br />

a. Scrieţi condiţiile necesare <strong>de</strong> minim şi arătaţi că F are un punct <strong>de</strong> minim unic<br />

x ∗ ∈ R n care satisface sistemul Gx ∗ ∂F<br />

= c. (Indicaţie:<br />

∂x i<br />

= 0, i = 1 : n.)<br />

b. Scrieţi un algoritm care <strong>calcul</strong>ează x ∗ şi ρ not<br />

= F(x ∗ ).


3.11. PROBLEME 207<br />

P 3.54 Fie A ∈ R m×n , b ∈ R m . De asemenea, fie S ∈ R m×m şi T ∈ R n×n două matrice<br />

pozitiv <strong>de</strong>finite. Consi<strong>de</strong>raţi funcţia pătratică<br />

F(x) = ‖b − Ax‖ 2 S + ‖x‖ 2 T ,<br />

un<strong>de</strong> notaţiile sunt cele din problema 3.9.<br />

a. Arătaţi că F are un punct <strong>de</strong> minim unic x ∗ şi scrieţi un algoritm care <strong>calcul</strong>ează<br />

x ∗ şi ρ = F(x ∗ ).<br />

b. Analizaţi separat problema CMMP pon<strong>de</strong>rată, în care F(x) = ‖b − Ax‖ 2 S. (Aici S<br />

se numeşte tradiţional matrice pon<strong>de</strong>re.)<br />

P 3.55 Consi<strong>de</strong>raţi problema <strong>de</strong> minimizare cu restricţii liniare<br />

F(x ∗ ) = min<br />

Ax=b F(x),<br />

un<strong>de</strong> F este funcţia pătratică din problema 3.53, matricea A ∈ R m×n este epică, iar<br />

b ∈ R m .<br />

a. Scrieţi condiţiile necesare <strong>de</strong> minim utilizând metoda multiplicatorilor Lagrange.<br />

Puteţi arăta că problema consi<strong>de</strong>rată are soluţie unică Analizaţi cazul general în care<br />

matricea G nu este neapărat pozitiv <strong>de</strong>finită.<br />

b. Scrieţi un algoritm care <strong>calcul</strong>ează x ∗ şi ρ = F(x ∗ ).<br />

P 3.56 Fie A ∈ R m×n monică, B ∈ R m×p epică şi b ∈ R m . Rezolvaţi problema CMMP<br />

generalizată<br />

‖y ∗ ‖ 2 = min<br />

Ax+By=b ‖y‖2 .<br />

Observaţie. Dacă p = m şi B = I m, atunci evi<strong>de</strong>nt y = r not<br />

= b − Ax, <strong>de</strong>ci se obţine<br />

problema CMMP din secţiunea 3.5.<br />

P 3.57 Fie A ∈ R m×n monică, C ∈ R l×n epică şi b ∈ R m , d ∈ R l . Rezolvaţi problema<br />

CMMP cu restricţii liniare<br />

‖b − Ax ∗ ‖ = min ‖b − Ax‖.<br />

Cx=d<br />

P 3.58 Consi<strong>de</strong>raţi vectorul <strong>de</strong> permutări π produs <strong>de</strong> algoritmul 3.11 şi fie x ∈ R n .<br />

Scrieţi procedurile <strong>de</strong> permutare pe loc x ← Πx şi x ← Π T x.<br />

P 3.59 Se dau doi vectori b ∈ R m şi c ∈ R n . Scrieţi <strong>algoritmi</strong> <strong>de</strong> <strong>de</strong>terminare a proiecţiilor<br />

ortogonale ale acestor vectori pe subspaţiile <strong>de</strong>scompunerilor ortogonale<br />

R m = ImA ⊕ KerA T şi respectiv R n = ImA T ⊕ KerA, utilizând informaţia furnizată<br />

<strong>de</strong> procedura <strong>de</strong> triangularizare ortogonală QRX.<br />

P 3.60 a. Cu notaţiile din secţiunea 3.9.5, arătaţi că matricea<br />

» –<br />

X not<br />

= A + (S ′ ) −1 0<br />

= ΠZ<br />

Q H<br />

0 0<br />

satisface condiţiile (Moore-Penrose) 1 ◦ AXA = X, 2 ◦ XAX = X, 3 ◦ AX = (AX) H ,<br />

4 ◦ XA = (XA) H .<br />

b. Precizaţi ce formă iau aceste condiţii dacă A este monică (epică).<br />

c. Demonstraţi că 5 ◦ (A + ) H = (A H ) + , 6 ◦ (A + ) + A = A, 7 ◦ A + = (A H A) + A H ,<br />

8 ◦ A + = A H (AA H ) + .<br />

d. Puteţi indica o metodă <strong>de</strong> <strong>calcul</strong> al pseudoinversei unei matrice hermitice (vezi<br />

proprietăţile 7 ◦ şi 8 ◦ ) fără a utiliza triangularizarea ortogonală completă <br />

e. Ţinând seama <strong>de</strong> forma factorizată a matricelor Q şi Z, scrieţi un algoritm pentru<br />

<strong>calcul</strong>ul pseudoinversei A + .


208 CAPITOLUL 3. PROBLEMA CELOR MAI MICI PĂTRATE<br />

P 3.61 a. Arătaţi că orice matrice A ∈ C m×n poate fi scrisă sub oricare din formele<br />

(i) A = Q ′ C, (ii) A = BV ′ , un<strong>de</strong> Q ′ are coloanele ortogonale, C este epică, respectiv B<br />

este monică, iar V ′ are liniile ortogonale.<br />

b. Scrieţi <strong>algoritmi</strong> pentru <strong>de</strong>terminarea factorizărilor (i) şi (ii).<br />

c. Arătaţi că A + = C + (Q ′ ) H , respectiv A + = (V ′ ) H B + .<br />

d. Scrieţi <strong>algoritmi</strong> pentru <strong>calcul</strong>ul pseudoinversei normale a sistemului Ax = b, cu<br />

b ∈ R m dat, utilizând factorizările (i) şi (ii).<br />

P 3.62 O matrice A ∈ C m×n se numeşte (ad-hoc) pseudounitară (sau parţial izometrică)<br />

dacă există două matrice cu coloane ortogonale U ∈ C m×r şi V ∈ C n×r astfel încât<br />

A = UV H .<br />

a. Ce structură au gramienii G 1 = A H A şi G 2 = AA H Interpretare geometrică.<br />

b. Arătaţi că A + = V U H .<br />

c. Arătaţi că o matrice A ∈ C m×n este pseudounitară dacă şi numai dacă A + = A H .<br />

d. Cum se poate testa faptul că o anumită matrice dată A ∈ C m×n este 1) monică,<br />

2) epică, 3) pseudounitară, 4) proiector ortogonal <br />

P 3.63 Fie A ∈ C m×n .<br />

a. Scrieţi un algoritm <strong>de</strong> triangularizare ortogonală la dreapta cu pivotarea liniilor, i.e.<br />

ΠAZ = L, un<strong>de</strong> L rezultă inferior triunghiulară. Precizaţi strategia <strong>de</strong> pivotare utilizată.<br />

b. Indicaţi câteva aplicaţii posibile ale acestui algoritm şi explicaţi <strong>de</strong> ce în practică<br />

algoritmul QRP din secţiunea 3.9 este întot<strong>de</strong>auna suficient.<br />

P 3.64 Fie A ∈ R m×n , B ∈ R m×p monice.<br />

a. Explicaţi <strong>de</strong> ce în general matricea M = [A B] nu este monică. Arătaţi că<br />

ImM = ImA + ImB.<br />

b. Efectuaţi » – triangularizarea ortogonală completă a matricei M, i.e.<br />

S<br />

Q H ′<br />

0<br />

MΠZ = , un<strong>de</strong> S este inversabilă <strong>de</strong> ordin r = rangM. Ce semnificaţie<br />

0 0<br />

geometrică au r şi Q <br />

c. Notăm S = ImA, T = ImB. Utilizând rezultatele <strong>de</strong> la punctul b, precizaţi cum<br />

poate fi verificată condiţia S T T = ∅.<br />

d. I<strong>de</strong>m, indicaţi o bază ortogonală pentru subspaţiul (S + T ) ⊥ .<br />

e. Cum se schimbă concluziile <strong>de</strong> la punctele b–d dacă matricele iniţiale nu sunt<br />

neapărat monice <br />

Pentru exemplificare, fie A = 4<br />

2<br />

1<br />

0<br />

0<br />

3<br />

2<br />

5, B = 4<br />

1 1<br />

0 1<br />

0 0<br />

3<br />

5. Cine sunt S, T şi S + T <br />

P 3.65 Fie A ∈ R m×n , C ∈ R l×n epice.<br />

» – A<br />

a. Explicaţi <strong>de</strong> ce în general matricea N = nu este epică. Arătaţi că<br />

C<br />

KerN = KerA T KerC.<br />

b. Formulaţi ”prin dualitate” şi rezolvaţi punctele b–d din problema prece<strong>de</strong>ntă.<br />

c. Fie x ∈ R n . Scrieţi algoritmul <strong>de</strong> <strong>calcul</strong> al proiecţiilor ortogonale ale lui x pe<br />

subspaţiile N şi N ⊥ , un<strong>de</strong> N = KerA T KerC.<br />

» – 1 0 0<br />

Pentru exemplificare, fie A = [1 0 0], C = . Cine sunt KerA, KerC şi<br />

1 1 0<br />

KerA T KerC

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

Saved successfully!

Ooh no, something went wrong!