metode de calcul numeric matriceal. algoritmi fundamentali
metode de calcul numeric matriceal. algoritmi fundamentali
metode de calcul numeric matriceal. algoritmi fundamentali
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
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