21.07.2014 Views

download - Sisteme de Programare pentru Modelare si Simulare

download - Sisteme de Programare pentru Modelare si Simulare

download - Sisteme de Programare pentru Modelare si Simulare

SHOW MORE
SHOW LESS

Create successful ePaper yourself

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

7. ALGEBRĂ NUMERICĂ LINIARĂ<br />

7.1. Analiză matriceală<br />

De notat că, în MATLAB, indicii matricei încep întot<strong>de</strong>auna cu 1 şi nu cu<br />

0; <strong>de</strong> aici rezultă că elementele matricei A(1, 1), B(1, 1) şi C(1, 1) corespund<br />

mulţimilor matematice (elementele matricelor) A(0, 0), B(0, 0) şi C(0,0).<br />

7.1.1. Urma unei matrice<br />

Urma unei matrice A,<br />

diagonala principală,<br />

n<br />

∑<br />

Ur A = .<br />

i=<br />

1<br />

a i , i<br />

Ur A , este, prin <strong>de</strong>finiţie, suma elementelor <strong>de</strong> pe<br />

Urma produsului a două matrice este in<strong>de</strong>pen<strong>de</strong>ntă <strong>de</strong> ordinea factorilor,<br />

n<br />

∑ ∑<br />

Ur ( A ⋅B)<br />

= a , ⋅b<br />

, = b , ⋅b<br />

, = Ur ( B ⋅ A)<br />

.<br />

i=<br />

1<br />

n<br />

j=<br />

1<br />

i j<br />

j i<br />

De meţionat că urma unei matrice este nealterată <strong>de</strong> o transformare<br />

ortogonală şi că aceasta este totodată şi suma valorilor proprii ale lui A.<br />

În Matlab, se calculează cu funcţia trace(A), care este <strong>si</strong>milară cu<br />

sum(diag(A)).<br />

Con<strong>si</strong><strong>de</strong>rând matricea A=[1 2 3; 4 5 6; 7 8 9], atunci urma acesteia,<br />

calculată cu trace(A), este 15, la fel ca şi cu sum(diag(A)).<br />

n<br />

∑<br />

j=<br />

1<br />

n<br />

∑<br />

i=<br />

1<br />

7.1.2. Calculul normelor vectorilor şi ale matricelor<br />

Conceptele <strong>de</strong> normă vectorială, normă matriceală şi rază spectrală a unei<br />

matrice, joacă un rol important în analiza matriceală.<br />

Prin <strong>de</strong>finiţie, norma euclidiană sau lungimea vectorului x este<br />

T<br />

( x ⋅ x)<br />

1/2<br />

n<br />

1/2 ⎛ 2 ⎞<br />

x = = ⎜ x ⎟<br />

∑ i<br />

⎝ i=<br />

1 ⎠<br />

un<strong>de</strong> x şi x T sunt, prin <strong>de</strong>finiţie:<br />

⎡ x1<br />

⎤<br />

⎢<br />

x<br />

⎥<br />

2 T<br />

x = ⎢ ⎥,<br />

x = [ x1<br />

x2<br />

... xn<br />

].<br />

⎢ ... ⎥<br />

⎢ ⎥<br />

⎣xn<br />

⎦<br />

Normele vectorilor şi ale matricelor se calculează cu funcţia norm, apelată<br />

cu una dintre <strong>si</strong>ntaxele:<br />

j i<br />

i j


Algebră numerică liniară 139<br />

n=norm(X) sau n=norm(X,p),<br />

un<strong>de</strong> p=1, 2, inf, sau fro.<br />

Pentru o matrice, X, sunt <strong>de</strong>finite următoarele tipuri <strong>de</strong> norme:<br />

norma 1 a lui X, respectiv cea mai mare sumă a elementelor <strong>de</strong> pe<br />

N<br />

⎛ ⎞<br />

coloană, X = max⎜∑<br />

x<br />

jk ⎟,<br />

cu 1≤<br />

j ≤ N , calculată cu funcţia<br />

⎝ k=<br />

1 ⎠<br />

norm(X,1), care este egală cu max(sum(abs((X))));<br />

norma 2, sau raza spectrală a lui X, <strong>de</strong>finită prin aceea că toate valorile<br />

proprii (reale, <strong>pentru</strong> matrice real <strong>si</strong>metrice şi complexe, <strong>pentru</strong> matrice<br />

real ne<strong>si</strong>metrice) se înscriu într-un cerc, <strong>de</strong> rază egală cu maximul<br />

valorilor proprii în modul, într-un plan (real sau complex), cu centrul în<br />

X = ρ X = max λ , cu 1 ≤ i ≤ , un<strong>de</strong> ρ este raza<br />

<br />

<br />

origine, respectiv ( ) N<br />

2<br />

spectrală, iar λ i sunt valorile <strong>si</strong>ngulare, calculată cu funcţia norm(X)<br />

sau norm(X,2), egală cu max(svd(X));<br />

norma infinită a lui X, sau cea mai mare sumă a elementelor <strong>de</strong> pe<br />

⎛<br />

N<br />

⎞<br />

linie, respectiv X = max⎜<br />

x ⎟<br />

∑ jk<br />

, cu 1≤<br />

k ≤ N , calculată cu<br />

∞<br />

⎝ j=<br />

1 ⎠<br />

funcţia norm(X,inf), egală cu max(sum(abs((X')))) ;<br />

norma Frobenius, calculată cu funcţia norm(X,’fro’), <strong>de</strong>finită cu<br />

⎛<br />

N<br />

relaţia X = ⎜ x<br />

F<br />

∑<br />

⎝ j,k=<br />

1<br />

sqrt(sum(diag(X'*X))).<br />

jk<br />

⎞<br />

⎟<br />

=<br />

⎠<br />

2<br />

11<br />

i<br />

2<br />

22<br />

x + x + ... + x<br />

2<br />

NN<br />

şi egală cu<br />

Pentru cazul matricelor rare (sparse) sau foarte mari, se recomandă<br />

utilizarea funcţiei normest(X), în locul funcţiei norm(X), sau norm(X,2). Această<br />

funcţie se poate utiliza sub forma [nrm,cnt] = normest(X,tol), un<strong>de</strong> nrm – norma,<br />

cnt – numărul <strong>de</strong> iteraţii, iar tol – eroarea relativă, având valoarea implicită 10 -6 .<br />

Con<strong>si</strong><strong>de</strong>rând matricea X=[1 2 3; 4 5 6; 7 8 9], atunci: norm(X)= 16.8481;<br />

norm(X,1)=18; norm(X,2)= 16.8481; norm(X,'fro')= 16.8819; norm(X,inf)=24, iar<br />

[nrm,cnt] = normest(X,1e-9) conduce la nrm=16.8481, cnt=4.<br />

Pentru un vector V, pot fi <strong>de</strong>finite următoarele tipuri <strong>de</strong> norme:<br />

norma, norma 2 sau lungimea vectorului <strong>de</strong>finită <strong>de</strong> relaţia<br />

<br />

N<br />

2<br />

⎛ ⎞<br />

2 2<br />

2<br />

= ⎜<br />

2 ∑ Vk<br />

⎟ = V1<br />

+ V2<br />

+ ... VN<br />

k=<br />

1<br />

V + se calculează cu<br />

⎝ ⎠<br />

funcţia norm(V) sau norm(V,2) ;<br />

norma <strong>de</strong> gradul p sau lungimea <strong>de</strong> ordinul p, <strong>de</strong>finită cu relaţia


140<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

N<br />

p<br />

⎛ ⎞ p p p<br />

V =<br />

p<br />

⎜<br />

p ∑ Vk<br />

⎟ = V1<br />

+ V2<br />

+ ... +<br />

k=<br />

1<br />

⎝ ⎠<br />

VN<br />

, se calculează cu<br />

norm(V,p), egală cu sum(abs(V).^P)^(1/P);<br />

V = max Vk ,1 ≤ k ≤ ,<br />

valoarea maximă în modul, respectiv ( ) N<br />

este calculată cu funcţia norm(V,inf) ;<br />

valoarea minimă în modul, respective V = min( Vk ),1<br />

≤ k ≤ N<br />

este calculată cu funcţia norm(V,-inf) .<br />

Con<strong>si</strong><strong>de</strong>rând vectorul V=[-10 –12 0 11 15 25], atunci:<br />

norm(V)=34.8569; norm(V,2)= 34.8569; norm(V,3)= 28.4630; norm(V,inf)=25;<br />

norm(V,-inf)=0.<br />

7.1.3. Determinantul unei matrice<br />

O matrice pătrată este o matrice care are numărul <strong>de</strong> linii egal cu numărul<br />

<strong>de</strong> coloane. Dacă tipul său este {n, n}, se spune că matricea este <strong>de</strong> ordinul n. Fie o<br />

A = , cu elementele în R (sau C).<br />

a ij<br />

matrice pătrată <strong>de</strong> ordinul n, [ ]<br />

Determinantul format cu elementele maticei A = [ a ij<br />

], păstrându-le<br />

poziţia, se numeşte <strong>de</strong>terminantul matricei A şi se notează cu<br />

A, a , <strong>de</strong>t A,<br />

<strong>de</strong>t[ ], fiind calculat în Matlab cu funcţia <strong>de</strong>t(A).<br />

ij<br />

a ij<br />

Con<strong>si</strong><strong>de</strong>rând matricele A=[1 2; 3 4] şi B=[1 2 3; 4 5 6; 7 8 9],<br />

<strong>de</strong>terminanţii acestora sunt: <strong>de</strong>t(A)=-2 şi <strong>de</strong>t(B)=0.<br />

O matrice B se numeşte <strong>si</strong>ngulară dacă <strong>de</strong>t(B)=0, iar dacă <strong>de</strong>terminantul<br />

<strong>de</strong>t(A)≠0, matricea A este ne<strong>si</strong>ngulară (sau ne<strong>de</strong>generată).<br />

Determinantul produsului a două matrice pătrate, <strong>de</strong> ordinul n, este egal cu<br />

produsul <strong>de</strong>terminanţilor celor două matrice,<br />

<strong>de</strong>t(A*B)=<strong>de</strong>t(B*A)=<strong>de</strong>t(A)*<strong>de</strong>t(B) .<br />

7.1.4. Rangul unei matrice<br />

Con<strong>si</strong><strong>de</strong>răm o matrice A, dreptunghiulară, mxn şi p, un număr natural,<br />

astfel încât,<br />

p ≤ m,<br />

n<br />

i , i ,..., i<br />

p<br />

. Dacă alegem din A, p linii 1 2 şi p coloane<br />

j<br />

1<br />

, j2,...,<br />

j p<br />

, oarecare, obţinem, înlăturând elementele matricei care nu se găsesc<br />

pe liniile şi coloanele alese, o matrice pătrată, M, <strong>de</strong> ordinul p<br />

(<br />

p = 1,2,...,<br />

q,<br />

q = min( m,<br />

n)<br />

,<br />

∞<br />

−∞<br />

p<br />

,


Algebră numerică liniară 141<br />

⎡ai<br />

j<br />

ai<br />

j<br />

... a ⎤<br />

1 1 1 2<br />

i1<br />

jp<br />

⎢<br />

⎥<br />

= ⎢<br />

ai<br />

j<br />

ai<br />

j<br />

... a<br />

2 1 2 2<br />

i2<br />

j p<br />

M<br />

⎥ .<br />

⎢ ... ... ... ... ⎥<br />

⎢<br />

⎥<br />

⎢a<br />

⎣<br />

ip<br />

j<br />

aip<br />

j<br />

... a<br />

1<br />

2<br />

ip<br />

jp<br />

⎥⎦<br />

În modul acesta, cu liniile şi coloanele matricei A se poate forma un număr<br />

n p m!<br />

n!<br />

<strong>de</strong> C C = m n<br />

p!<br />

( m − p) ! p!<br />

( n − p)!<br />

matrice <strong>de</strong> ordinul p. Determinanţii acestor<br />

matrice se numesc <strong>de</strong>terminanţii <strong>de</strong> ordinul p ai matricei A. Dacă A ≠ 0 , atunci nu<br />

toţi aceşti <strong>de</strong>terminanţi sunt nuli.<br />

Se observă că, dacă toţi <strong>de</strong>terminanţii <strong>de</strong> ordinul s sunt nuli, atunci toţi<br />

<strong>de</strong>terminanţii <strong>de</strong> ordin superior lui s sunt nuli, <strong>de</strong>oarece, <strong>de</strong>zvoltând <strong>de</strong>terminanţii<br />

<strong>de</strong> ordinul s+1, <strong>de</strong> exemplu, după o linie sau coloană, coeficienţii elementelor<br />

respective sunt <strong>de</strong>terminanţi <strong>de</strong> ordinul s, care sunt nuli. Dacă A ≠ 0 , există un<br />

număr r ≤ q = min( m,<br />

n)<br />

, astfel încât cel puţin un <strong>de</strong>terminant al matricei A, <strong>de</strong><br />

ordinul r, este diferit <strong>de</strong> zero şi toţi <strong>de</strong>terminanţii <strong>de</strong> ordin r+1 sunt nuli. Numărul<br />

r, care în<strong>de</strong>plineşte această condiţie, se numeşte rangul matricei A. Dacă A=0,<br />

rangul matricei A este zero, r=0.<br />

Calculul rangului se efectuează cu funcţia r=rank(A) sau r=rank(A,tol),<br />

un<strong>de</strong> tol este eroarea relativă, având valoarea implicită 10 -6 sau tol = max(<strong>si</strong>ze(A))<br />

* norm(A) * eps.<br />

De exemplu, dacă A=[2 3 1 4 -1; 1 4 -2 1 6; 1 -1 3 3 -7], atunci<br />

rangul matricei este rank(A)=2. Toţi <strong>de</strong>terminanţii <strong>de</strong> ordinul trei sunt nuli,<br />

<strong>de</strong>oarece, dacă în matricea A scă<strong>de</strong>m linia a doua din linia întâi, obţinem linia a<br />

treia. Această operaţie, fiind efectuată în toţi <strong>de</strong>terminanţii <strong>de</strong> ordinul trei, arată că<br />

toţi sunt nuli. Rangul matricei este doi, <strong>de</strong>oarece matricea formată cu primele două<br />

linii şi coloane, [2 3; 1 4], are <strong>de</strong>terminantul diferit <strong>de</strong> zero.<br />

Rangul matricei este egal cu ordinul <strong>de</strong>terminantului.<br />

7.1.5. Matricea transpusă<br />

a ij<br />

Con<strong>si</strong><strong>de</strong>rând [ ]<br />

A = , o matrice m × n , <strong>de</strong>ci i = 1 ,2,..., m,<br />

j = 1,2,...<br />

n ,<br />

atunci, prin <strong>de</strong>finiţie, matricea care se obţine din A, prin înlocuirea liniilor cu<br />

coloanele <strong>de</strong> acelaşi rang, se numeşte matricea transpusă şi se notează cu A t sau A T ,<br />

iar în Matlab se calculează şi se notează cu A' sau transp(A). Pentru transpusa<br />

neconjugată, se utilizează transpose(A).<br />

Din <strong>de</strong>finiţie rezultă că [ ]<br />

t<br />

a ji<br />

B = [ 2 3 1 4 -1<br />

1 4 -2 1 6<br />

1 -1 3 3 -7 ],<br />

A = , j = 1 ,2,... n,<br />

i = 1,2,...,<br />

m . Dacă,


142<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

atunci:<br />

B' = [ 2 1 1<br />

3 4 -1<br />

1 -2 3<br />

4 1 3<br />

-1 6 -7].<br />

O matrice pătrată A, se spune că este <strong>si</strong>metrică dacă elementele <strong>si</strong>metrice<br />

faţă <strong>de</strong> diagonala principală sunt egale, a = a şi că este anti<strong>si</strong>metrică dacă<br />

a<br />

= − . Prin urmare:<br />

ij<br />

a ji<br />

ij<br />

o matrice <strong>si</strong>metrică este egală cu transpusa sa, <strong>de</strong>oarece a<br />

ij<br />

= a<br />

ji<br />

;<br />

într-o matrice anti<strong>si</strong>metrică, elementele <strong>de</strong> pe diagonala principală sunt<br />

nule, a ii = 0 (<strong>pentru</strong> a putea satisface <strong>de</strong>finiţia aij<br />

= −a<br />

ji<br />

) ;<br />

transpusa unei matrice anti<strong>si</strong>metrică este opusa matricei iniţiale, A'= -A;<br />

dacă A'= -A atunci, matricea A este anti<strong>si</strong>metrică ;<br />

traspusa transpusei este matricea iniţială, (A') ' = A ;<br />

transpusa sumei a două matrice este suma transpuselor, (A+B) '=A'+B' ;<br />

transpusa produsului a două matrice este (A*B) '= B' * A';<br />

orice matrice pătrată poate fi con<strong>si</strong><strong>de</strong>rată ca suma a două matrice, una<br />

<strong>si</strong>metrică, cealaltă anti<strong>si</strong>metrică, iar această <strong>de</strong>scompunere este unică.<br />

Dată fiind o matrice, cu un număr oarecare <strong>de</strong> linii sau coloane, ale cărei<br />

elemente sunt numere reale sau complexe, conjugata sa este matricea formată prin<br />

înlocuirea fiecărui element cu imaginarul său conjugat. În matematica cla<strong>si</strong>că, se<br />

utilizează notaţia A * .<br />

Matricea adjunctă a unei matrice este conjugata transpusei sale. Conjugata<br />

unei matrice este obţinută prin înlocuirea fiecărui element cu imaginarul său<br />

conjugat.<br />

În general, un număr complex, Z, este scris ca suma dintre o parte reală şi<br />

una imaginară,<br />

Z = x + i*y = real(Z) + i*imag(Z)<br />

astfel încât, conjugatul lui Z este:<br />

conj(Z) = x - i*y = real(Z) - i*imag(Z)<br />

De exemplu, <strong>pentru</strong> matricea X,<br />

X = [1+i 2-i ; 3+2*i 1-2*i]<br />

conjugata este,<br />

conj(X) = [1 - i 2 + i; 3 – 2 i 1 + 2 i].<br />

Se numeşte matrice reală, o matrice care are toate elementele numere reale.<br />

Ţinând seama <strong>de</strong> cele anterioare, rezultă că o matrice reală este egală cu<br />

conjugata sa şi, reciproc, dacă o matrice este egală cu conjugata sa, matricea este<br />

reală.<br />

Matricea conjugată are următoarele proprietăţi evi<strong>de</strong>nte:<br />

ji


Algebră numerică liniară 143<br />

• conj(X+Y)=conj(X)+conj(Y) - conjugata sumei a două matrice este egală<br />

cu suma conjugatelor;<br />

• conj(X*Y)=conj(X)*conj(Y) – conjugata produsului este produsul<br />

conjugatelor;<br />

• transpose(conj(X))= conj(transpose(X)) şi totodată conj(X')= (conj(X))';<br />

• conj(conj(X)) = X.<br />

Matricea adjunctă a unei matrice este conjugata transpusei sale. Dacă,<br />

X =[ 1.0000 + 1.0000i 2.0000 - 1.0000i<br />

3.0000 + 2.0000i 1.0000 - 2.0000i ]<br />

transpusa acestei matrice (neconjugată) este,<br />

XT=transp(X) = [ 1.0000 + 1.0000i 3.0000 + 2.0000i<br />

2.0000 - 1.0000i 1.0000 - 2.0000i ]<br />

iar conjugate transpusei este,<br />

Xa=conj(XT)=conj(transp(X)) = X' = [ 1.0000 - 1.0000i 3.0000 - 2.0000i<br />

2.0000 + 1.0000i 1.0000 + 2.0000i ]<br />

care este matricea adjunctă, notată X + , care se ve<strong>de</strong> că în Matlab este: X + = X'.<br />

Din proprietăţile matricelor transpuse şi ale matricelor conjugate, rezultă<br />

proprietăţile:<br />

• (X+Y)' = X'+Y' ;<br />

• (X*Y)' = Y'*X' ;<br />

• (X')' = X .<br />

Se numeşte matrice hermitică sau autoadjunctă, o matrice pătrată care este<br />

egală cu adjuncta sa, Z + =Z = Z' . În particular, matricea hermitică are toate<br />

elementele <strong>de</strong> pe diagonala principală reale, iar cele <strong>si</strong>metrice faţă <strong>de</strong> această<br />

diagonală sunt imaginar conjugate.<br />

Următoarele matrice sunt hermitice sau autoadjuncte:<br />

Z=[ 1 1-i ; 1+i -3], ZZ=[3 -i 2+3*i ; i 0 5 ; 2-3*i 5 1].<br />

Principalele proprietăţi ale matricelor hermitice sunt:<br />

• dacă o matrice hermitică are toate elementele reale, matricea este <strong>si</strong>metrică,<br />

adică a ij = a ji ;<br />

• suma a două matrice hermitice este tot o matrice hermitică;<br />

• produsul a două matrice hermitice este tot o matrice hermitică, dacă şi<br />

numai dacă, cele două matrice sunt permutabile.<br />

7.1.6. Matricea inversă şi pseudoinversă<br />

Pentru o matrice pătrată A = [ a ij<br />

], <strong>de</strong> ordinul n, ne<strong>si</strong>ngulară, <strong>de</strong>ci <strong>de</strong>t(A)≠0,<br />

matricea <strong>de</strong> ordinul n este


144<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

⎡ A11<br />

A21<br />

An1<br />

⎤<br />

⎢<br />

...<br />

<strong>de</strong>t A <strong>de</strong>t A <strong>de</strong>t A<br />

⎥<br />

⎢<br />

A<br />

⎥<br />

⎢<br />

12 A22<br />

An<br />

2<br />

−<br />

⎥ ⎡ A<br />

1<br />

⎤<br />

A =<br />

...<br />

ji<br />

⎢<strong>de</strong>t<br />

A <strong>de</strong>t A <strong>de</strong>t A⎥<br />

= ⎢ ⎥ ,<br />

⎢<br />

⎥ ⎣<strong>de</strong>t<br />

A<br />

... ... ... ... ⎦<br />

⎢ A1<br />

n A2<br />

n Ann<br />

⎥<br />

⎢<br />

...<br />

⎣<strong>de</strong>t<br />

A <strong>de</strong>t A <strong>de</strong>t A⎥<br />

⎦<br />

un<strong>de</strong> A ji este complementul algebric al lui a ij , din <strong>de</strong>terminantul [ a ij<br />

] şi se numeşte<br />

matricea inversă a matricei A, fiind notată cu A -1 . Notarea matricei inverse cu A -1 este<br />

justificată prin faptul că, în compunerea transformărilor A şi A -1 , acestea se comportă<br />

ca puterile unui număr real sau complex, dacă convenim să notăm transformarea<br />

unitate i, cu A 0 ,<br />

A -1 *A = A*A -1 = A 0 = I = [1] ,<br />

respectiv,<br />

inv(A)*A = A*inv(A) = ones(<strong>si</strong>ze(A)) .<br />

Principalele proprietăţi ale matricei inverse sunt:<br />

• A -1 *A = A*A -1 = A 0 = I = [1] - produsul dintre o matrice şi inversa sa este<br />

egal cu matricea unitate;<br />

• reciproc, dacă avem două matrice, astfel încât A*B = I =[1], atunci una<br />

este inversa celeilalte;<br />

• <strong>de</strong>t(A -1 ) = <strong>de</strong>t(inv(A)) = 1/<strong>de</strong>t(A) - inversa unei matrice proprii este tot o<br />

matrice proprie;<br />

• (A -1 ) -1 = inv(inv(A)) = A - inversa matricei inverse este matricea iniţială;<br />

• (A*B) -1 = B -1 * A -1 , respectiv inv(A*B) = inv(B)*inv(A)<br />

Fie matricele,<br />

A = [ cos (pi/3) -<strong>si</strong>n (pi/3) ; <strong>si</strong>n (pi/3) cos (pi/3) ];<br />

B= [ 1 -1 i ; 0 1 0 ; i 3 1] ,<br />

transpusele sunt,<br />

A' = [ cos (pi/3) <strong>si</strong>n (pi/3) ; -<strong>si</strong>n (pi/3) cos (pi/3) ]<br />

B' = [ 1 0 -i ; -1 1 3 ; -i 0 1 ]<br />

iar inversele sunt,<br />

inv(A) = ( A -1 ) = [ cos (pi/3) <strong>si</strong>n (pi/3) ; -<strong>si</strong>n (pi/3) cos (pi/3) ]<br />

inv(B) = ( B -1 ) = [0.5 0.5 + 1.5 i - 0.5 i ; 0 1 0; - 0.5 i -1.5-0.5 i 0.5 ]<br />

<strong>de</strong> un<strong>de</strong> se verifică uşor că A*inv(A) = [1] şi B*inv(B) = [1] .<br />

Instrucţiunea inv(X), returnează un mesaj <strong>de</strong> avertizare, dacă matricea X<br />

este <strong>si</strong>ngulară sau bandă.<br />

Pseudoinversa sau inversa generalizată, Moore-Penrose, a unei matrice,<br />

se calculează cu funcţia pinv, apelată cu <strong>si</strong>ntaxa:<br />

B=pinv(A),


Algebră numerică liniară 145<br />

sau<br />

B=pinv(A,tol),<br />

un<strong>de</strong> tol este toleranţa, care are valoarea implicită (când lipseşte la apelare),<br />

tol = max(<strong>si</strong>ze(A)) * norm(A) * eps,<br />

cu eps, <strong>de</strong>pinzând <strong>de</strong> acurateţea calculelor în virgulă mobilă.<br />

Se utilizează, <strong>de</strong> regulă, <strong>pentru</strong> rezolvarea <strong>si</strong>stemelor <strong>de</strong> ecuaţii liniare, în<br />

sensul celor mai mici pătrate.<br />

Matricea B este <strong>de</strong> aceleaşi dimen<strong>si</strong>uni ca şi matricea A' şi verifică patru<br />

condiţii:<br />

A∗B∗A = A<br />

B∗A∗B = B<br />

A∗B este hermitică<br />

B∗A este hermitică.<br />

De exemplu, calculul pseudoinversei matricei A=[1 2 3; 4 5 6; 7 8 9],<br />

conduce la,<br />

B = pinv(A) =<br />

[ -0.6389 -0.1667 0.3056<br />

-0.0556 0.0000 0.0556<br />

0.5278 0.1667 -0.1944 ],<br />

A*B*A = A =<br />

[ 1.0000 2.0000 3.0000<br />

4.0000 5.0000 6.0000<br />

7.0000 8.0000 9.0000 ]<br />

B*A*B = B =<br />

[ -0.6389 -0.1667 0.3056<br />

-0.0556 0.0000 0.0556<br />

0.5278 0.1667 -0.1944 ]<br />

iar A*B şi B*A sunt matrice hermitice şi în acest caz sunt egale între ele fiind,<br />

[ 0.8333 0.3333 -0.1667<br />

0.3333 0.3333 0.3333<br />

-0.1667 0.3333 0.8333 ].<br />

Dacă matricea A este pătrată şi ne<strong>si</strong>ngulară, funcţia pinv(A) consumă un<br />

timp <strong>de</strong> calcul mai mare <strong>de</strong>cât inv(A).<br />

Dacă matricea A nu este pătrată sau este pătrată şi <strong>si</strong>ngulară, atunci nu<br />

există inversă, inv(A). În acest caz, pinv(A) are unele, dar nu toate, proprietăţi ale<br />

lui inv(A).<br />

Dacă matricea A are mai multe rânduri <strong>de</strong>cât coloane şi rangul matricei<br />

este mai mic <strong>de</strong>cât minimul dintre rânduri şi coloane, atunci problema celor mai<br />

mici pătrate, <strong>de</strong> minimizare a norm(A*x-b), nu are soluţie unică. Se obţin două<br />

infinităţi <strong>de</strong> soluţii date <strong>de</strong>:<br />

x=pinv(A)*b<br />

şi


146<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

y=A\b,<br />

care se disting prin aceea că norm(x) este mai mică <strong>de</strong>cât norma oricărei alte soluţii, iar<br />

y are, pe cât po<strong>si</strong>bil, componente diferite <strong>de</strong> zero.<br />

De exemplu, matricea generată <strong>de</strong>,<br />

A = magic(8); A = A(:,1:6)<br />

este o matrice <strong>de</strong> 8-pe-6 care are rank(A) = 3.<br />

A = [ 64 2 3 61 60 6<br />

9 55 54 12 13 51<br />

17 47 46 20 21 43<br />

40 26 27 37 36 30<br />

32 34 35 29 28 38<br />

41 23 22 44 45 19<br />

49 15 14 52 53 11<br />

8 58 59 5 4 62 ]<br />

Termenul liber, din partea dreaptă, este:<br />

b = 260*ones(8,1) = [ 260; 260; 260; 260; 260; 260; 260; 260 ].<br />

7.1.7. Bază ortogonală şi bază ortonormală<br />

După cum se cunoaşte, doi vectori x, y sunt ortogonali, dacă produsul lor<br />

scalar este nul.<br />

Înt-un spaţiu euclidian, real sau complex, <strong>de</strong>seori se preferă ca bază un<br />

<strong>si</strong>stem <strong>de</strong> vectori, e 1 , e2,...,<br />

en<br />

, ortogonali doi câte doi , având fiecare norma egală<br />

cu 1,<br />

⎧0,<br />

daca i ≠ j<br />

( ei<br />

, e j ) = ⎨<br />

.<br />

⎩1,<br />

daca i = j<br />

Dacă numai prima condiţie este în<strong>de</strong>plinită, se spune că e 1 , e2,...,<br />

en<br />

formează o bază ortogonală. Dacă sunt în<strong>de</strong>plinite amândouă condiţiile, baza este<br />

ortonormală.<br />

Cu vectorii unei baze oarecare, u 1 , u2,...,<br />

un<br />

, se poate construi întot<strong>de</strong>auna o<br />

bază ortonormală,<br />

⎧0,<br />

daca i ≠ j<br />

( ui<br />

, u j ) = ⎨<br />

⎩1,<br />

daca i = j<br />

iar vectorii bazei sunt ortogonali doi câte doi şi au norma u ( u , u ) = 1.<br />

i<br />

= i i<br />

În Matlab, funcţia care realizează o bază ortogonală <strong>pentru</strong> o matrice A<br />

este orth(A). Ea se apelează cu <strong>si</strong>ntaxa:<br />

Q=orth(A),<br />

în care numărul <strong>de</strong> coloane ale lui Q este egal cu rangul matricei A.<br />

Baza ortogonală are proprietatea că Q'*Q = I .


Algebră numerică liniară 147<br />

Obţinerea unei baze ortogonale, Z, <strong>pentru</strong> un spaţiu nul al matricei A, prin<br />

<strong>de</strong>scompunerea în valori proprii, se face prin funcţia null, apelată prin:<br />

Z = null(A) sau Z=null(A, 'r')<br />

un<strong>de</strong> r este o bază raţională având elemente mici întregi, astfel încât A*Z să aibă<br />

elemente neglijabile, <strong>si</strong>ze(Z,2) = 1, iar Z'*Z = I.<br />

De exemplu, dacă<br />

A=[1 2 3;4 5 6; 7 8 9]<br />

atunci,<br />

z=null(A) = [ -0.4082 ; 0.8165 ; -0.4082 ]<br />

<strong>si</strong>ze(z,2)= 1<br />

z'*z = 1<br />

z=null(A,'r') = [ 1 ; -2 ; 1 ]<br />

Descompunerea unei matrice, A, în ve<strong>de</strong>rea <strong>de</strong>terminării rangului, se face<br />

cu funcţia rref, apelată cu <strong>si</strong>ntaxa,<br />

[R,jb] = rref(A) su [R,jb] = rref(A,TOL)<br />

un<strong>de</strong> r=length(jb) este rangul matricei A, A(:,jb) este matricea luată ca bază la<br />

<strong>de</strong>terminarea rangului; R(1:r,jb) este matricea i<strong>de</strong>ntitate <strong>de</strong> r x r; x(jb), sunt numărul <strong>de</strong><br />

variabile in<strong>de</strong>pen<strong>de</strong>nte; TOL este toleranţa impusă la <strong>de</strong>terminarea rangului.<br />

Dacă A=[1 2 3 4; 5 6 7 8; 9 10 11 12 ; 13 14 15 16; 17 18 19 20]<br />

atunci prin comanda,<br />

[R,jb]=rref(A)<br />

rezultă:<br />

R=[ 1 0 -1 -2 ; 0 1 2 3 ; 0 0 0 0 ; 0 0 0 0 ; 0 0 0 0 ]<br />

jb=[ 1 2 ] ; R(1:2,jb) = [ 1 0 ; 0 1 ]<br />

A(:,jb) = [1 2 ; 5 6 ; 9 10 ; 13 14 ; 17 18 ].<br />

Unghiul dintre două subspaţii este calculat cu funcţia subspace. Prin<br />

urmare, subspace(A,B) dă unghiul dintre coloanele matricei A şi matricei B.<br />

Atunci când A şi B sunt vectori <strong>de</strong> lungime unitară, atunci subspace(A,B)<br />

este i<strong>de</strong>ntic cu acos((A'*B).<br />

Dacă unghiul este mic, atunci cele două subspaţii sunt practic liniar<br />

<strong>de</strong>pen<strong>de</strong>nte. Funcţia este utilă <strong>pentru</strong> evi<strong>de</strong>nţierea diferenţelor ce nu sunt cauzate <strong>de</strong><br />

fluctuaţia erorilor statistice, în două experimente succe<strong>si</strong>ve (A şi B), aplicate<br />

aceluiaşi fenomen fizic.<br />

7.2. Condiţionarea unei matrice<br />

Importanţa cunoaşterii condiţionării unei matrice rezidă în faptul că<br />

rezultatele obţinute prin calcul numeric au întot<strong>de</strong>auna erori <strong>de</strong> rotunjire, fiind, prin<br />

urmare, soluţiile unei probleme perturbate.<br />

Determinarea condiţionării are la bază teoria matematică a perturbaţiilor.<br />

Se spune că o funcţie f(x) este rău condiţionată, dacă <strong>pentru</strong> un x 1, apropiat <strong>de</strong> x,


148<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

funcţia f(x 1 ) diferă mult <strong>de</strong> f(x). Invers, o funcţie se spune că este bine condiţionată,<br />

dacă <strong>pentru</strong> un x 1 apropiat <strong>de</strong> x, funcţia f(x 1 ) este apropiată <strong>de</strong> f(x). Din păcate,<br />

termenii apropiaţi sunt calitativi şi, <strong>pentru</strong> a putea fi cuantificaţi, este necesară<br />

utilizarea numerelor <strong>de</strong> condiţionare.<br />

Numărul <strong>de</strong> condiţionare al unei matrice indică sen<strong>si</strong>bilitatea soluţiei unui<br />

<strong>si</strong>stem <strong>de</strong> ecuaţii liniare şi dă indicaţii <strong>de</strong>spre precizia rezultatelor la inversarea<br />

matricelor şi la rezolvarea ecuaţiilor liniare. O matrice bine condiţionată este o<br />

matrice relativ insen<strong>si</strong>bilă la aceste mici perturbaţii.<br />

Numărul <strong>de</strong> condiţionare al unei matrice, calculat ca raportul dintre cea mai<br />

mare şi cea mai mică valoare <strong>si</strong>ngulară a acesteia, se <strong>de</strong>termină cu funcţia cond,<br />

care se apelează cu <strong>si</strong>ntaxa:<br />

c=cond(X,p)<br />

un<strong>de</strong> c este numărul <strong>de</strong> condiţionare al matricei X, în norma p, care poate fi 1, 2, inf sau<br />

'fro', după norma calculată, astfel încât, norm(X,p) * norm(inv(X),p).<br />

O funcţie mai performantă, care calculează numărul <strong>de</strong> condiţionare, c,<br />

după un algoritm din codul <strong>de</strong> calcul LAPACK, este rcond, care se apelează cu<br />

<strong>si</strong>ntaxa:<br />

c=rcond(X).<br />

Estimarea celui mai mic număr <strong>de</strong> condiţionare se realizează cu funcţia<br />

con<strong>de</strong>st, care se apelează cu <strong>si</strong>ntaxa:<br />

c = con<strong>de</strong>st(X).<br />

Dacă con<strong>si</strong><strong>de</strong>răm, iniţial, <strong>si</strong>stemul <strong>de</strong> ecuaţii:<br />

⎧6⋅<br />

x1<br />

+ 6.917⋅<br />

x2<br />

= 6.543<br />

⎨<br />

⎩ x1<br />

+ 1.152⋅<br />

x2<br />

= 1.095<br />

şi un <strong>si</strong>stem “perturbat”,<br />

⎧6<br />

⋅ x1<br />

+ 6.912⋅<br />

x2<br />

= 6.543<br />

⎨<br />

⎩ x1<br />

+ 1.152⋅<br />

x2<br />

= 1.095<br />

atunci, cu secvenţa Matlab,<br />

A1=[6 6.917; 1 1.152]; A2=[6 6.912; 1 1.152]; c1=cond(A1);<br />

c2=cond(A2);<br />

d1=con<strong>de</strong>st(A1);d2=con<strong>de</strong>st(A2);r1=rcond(A1);r2=rcond(A2);<br />

se obţine:<br />

c1 = 1.7234e+004, c2 = 3.1875e+016, d1 = 2.0845e+004, d2 = Inf,<br />

r1 = 4.7972e-005, r2 = 0,<br />

<strong>de</strong> un<strong>de</strong> rezultă că <strong>si</strong>stemul este rău-condiţionat.<br />

Dacă se rezolvă cele două <strong>si</strong>steme (iniţial <strong>si</strong> perturbat), folo<strong>si</strong>nd secvenţa,<br />

A1=[6 6.917; 1 1.152]; A2=[6 6.912; 1 1.152]; b=[6.543; 1.095];<br />

x1=A1\b; x2=A2\b;


Algebră numerică liniară 149<br />

se obţin soluţiile:<br />

x1=[ 7.3158 -5.4000] ; x2= [Inf Inf];<br />

<strong>de</strong> un<strong>de</strong> se observă diferenţele foarte mari între acestea, datorate slabei condiţionări.<br />

7.3. Generarea unei matrice rare<br />

Generarea unei matrice rare şi afişarea coeficienţilor se realizează cu<br />

funcţia sparse, care se apelează cu una dintre <strong>si</strong>ntaxele:<br />

• S = sparse(A), transformă o matrice plină într-o formă rară, înlăturând<br />

toate elementele egale cu zero, iar dacă o matrice S este <strong>de</strong>ja rară, atunci<br />

sparse(S) înapoiază tot S ;<br />

• S = sparse(i,j,s,m,n,nzmax), foloseşte vectorii i, j şi s <strong>pentru</strong> a genera<br />

matricea <strong>de</strong> m x n, <strong>de</strong> forma S(i(k),j(k)) = s(k), cu spaţii alocate <strong>pentru</strong><br />

nzmax, diferit <strong>de</strong> zero ; vectorii i, j, şi s au toţi aceeaşi lungime, dar sunt<br />

mai mici <strong>de</strong>cât 2^31-1, iar oricare element din s, ce apare şi în i sau j, este<br />

adăugat ;<br />

• S= sparse(i,j,s,m,n), foloseşte nzmax = length(s) ;<br />

• S =sparse(i,j,s), foloseşte m = max(i) şi n = max(j), calculaţi înainte să fie<br />

înlăturate zerourile, <strong>de</strong>ci una dintre coloanele [i j s] poate fi [m n o] ;<br />

• S= sparse(m,n) sau sparse([],[],[],m,n,0), generează ultima matrice rară, <strong>de</strong><br />

forma m x n.<br />

Aplicarea operatorilor specifici Matlab (aritmetici, logici, etc.) pe matricea<br />

rară, <strong>de</strong>temină apariţia unei matrice rare, iar în cazul unor combinaţii <strong>de</strong> matrice<br />

rare şi întregi, se va obţine o matrice întreagă.<br />

Excepţiile apar atunci când rezultatul este o structură rară; <strong>de</strong> exemplu,<br />

A.*S este cel puţin o matrice rară ca şi S.<br />

De exemplu,<br />

S = sparse(1:n,1:n,1)<br />

generează o reprezentare rară, <strong>de</strong> forma n x n, faţă <strong>de</strong><br />

S = sparse(eye(n,n))<br />

care va genera o matrice completă, n x n, cu multe dintre elementele sale egale cu zero.<br />

Utilitatea matricelor rare se relevă la matrice foarte mari, ca <strong>de</strong> exemplu,<br />

cazul unei matrice B = sparse(10000,10000,pi), cu care poate opera Matlabul, pe<br />

când cu matricea completă, full(B), nu poate opera, datorită memoriei insuficiente,<br />

aceasta nece<strong>si</strong>tând 800 megabytes.<br />

Reasamblarea unei matrice rare se face prin succe<strong>si</strong>unea <strong>de</strong> instrucţiuni,<br />

[i,j,s] = find(S); [m,n] = <strong>si</strong>ze(S); S = sparse(i,j,s,m,n);<br />

sau, dacă ultima linie şi coloană are elemente diferite <strong>de</strong> zero,<br />

[i,j,s] = find(S); S = sparse(i,j,s).


150<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

7.4. Ecuaţii liniare<br />

Fie <strong>si</strong>stemul <strong>de</strong> ecuaţii liniare:<br />

a11 ⋅ x1<br />

+ ... + a1<br />

j ⋅ x j + ... + a1n<br />

⋅ xn<br />

= b<br />

...........................................................<br />

a ⋅ x + ... + a ⋅ x + ... + a ⋅ x = b<br />

i1<br />

1<br />

ij<br />

j<br />

...........................................................<br />

a ⋅ x + ... + a ⋅ x + ... + a ⋅ x = b<br />

m1<br />

1<br />

mj<br />

j<br />

in<br />

mn<br />

n<br />

<strong>de</strong> m ecuaţii liniare cu n necunoscute, m şi n fiind două numere naturale oarecare.<br />

Dacă notăm,<br />

⎛a11...<br />

a1<br />

j ... a1n<br />

⎞ ⎛<br />

1<br />

⎞<br />

⎜<br />

⎟<br />

x<br />

⎛b1<br />

⎞<br />

⎜ ⎟ ⎜ ⎟<br />

⎜......................<br />

⎟ ⎜....<br />

⎟ ⎜....<br />

⎟<br />

⎜<br />

⎟ ⎜ ⎟<br />

A = 1...<br />

... ; X ; B =<br />

⎜ ⎟<br />

⎜ai<br />

aij<br />

ain<br />

⎟ =<br />

⎜<br />

x j ⎟<br />

b ;<br />

⎜<br />

i<br />

⎟<br />

⎜<br />

......................<br />

⎟ ⎜....<br />

⎟ ⎜....<br />

⎟<br />

⎜<br />

⎟<br />

⎜ ⎟<br />

1...<br />

...<br />

⎜<br />

⎟<br />

⎝<br />

am<br />

amj<br />

amn<br />

⎠ ⎝ xn<br />

⎠ ⎝bm<br />

⎠<br />

atunci <strong>si</strong>stemul <strong>de</strong> ecuaţii liniare se poate scrie, matriceal, sub forma: A*X = B.<br />

0 0 0<br />

Un şir ordonat <strong>de</strong> numere, x 1 , x2<br />

,..., xn<br />

, care satisfac relaţiile:<br />

0<br />

0<br />

0<br />

i ij j<br />

in n i =<br />

a 1 ⋅ x1<br />

+ ... + a ⋅ x + ... + a ⋅ x = b ; i 1,2,..., m ;<br />

n<br />

se numeşte soluţie a <strong>si</strong>stemului. Numerele x 1 , x2<br />

,..., xn<br />

, care verifică <strong>si</strong>stemul, se mai<br />

numesc şi rădăcinile <strong>si</strong>stemului.<br />

Dacă <strong>si</strong>stemul admite o soluţie unică, se numeşte compatibil <strong>de</strong>terminat, iar<br />

dacă admite cel puţin două soluţii, se numeşte compatibil ne<strong>de</strong>rminat. Dacă<br />

<strong>si</strong>stemul nu are soluţii, este incompatibil.<br />

În cazul în care <strong>si</strong>stemul este compatibil ne<strong>de</strong>terminat, poate avea o<br />

infinitate <strong>si</strong>mplă, dublă, ... , multiplu <strong>de</strong> ordinul r <strong>de</strong> soluţii (sau un număr finit, în<br />

numere întregi).<br />

Deoarece nu toţi a ij sunt nuli, rangul matricei A, cu m linii şi n coloane,<br />

formată cu coeficienţii necunoscutelor, va fi p ≥ 1. Presupunem că unul dintre<br />

<strong>de</strong>terminanţii <strong>de</strong> ordinul p, diferit <strong>de</strong> zero, este chiar<br />

a a ... a<br />

∆<br />

p<br />

a<br />

11<br />

p1<br />

a<br />

12<br />

p2<br />

1p<br />

a21<br />

a22<br />

... a<br />

=<br />

.........................<br />

... a<br />

2 p<br />

pp<br />

i<br />

0<br />

1<br />

m<br />

0<br />

0


Algebră numerică liniară 151<br />

ceea ce este întot<strong>de</strong>auna po<strong>si</strong>bil să se realizeze, schimbând, la nevoie, atât ordinea<br />

ecuaţiilor, cât şi indicii necunoscutelor.<br />

Determinantul ≠ 0 , se numeşte <strong>de</strong>terminantul principal al <strong>si</strong>stemului.<br />

∆ p<br />

Evi<strong>de</strong>nt, există şi alţi <strong>de</strong>terminanţi <strong>de</strong> ordinul p diferiţi <strong>de</strong> zero, însă toţi<br />

<strong>de</strong>terminanţii <strong>de</strong> ordinul p+1, p+2, ..., p+q, cu q=min(m,n) ce se pot forma cu<br />

liniile şi coloanele matricei A, sunt nuli.<br />

Putem întot<strong>de</strong>auna aranja necunoscutele şi schimba ordinea ecuaţiilor,<br />

astfel încât ∆ să fie format cu coeficienţii primelor p necunoscute, luate din<br />

p<br />

primele p ecuaţii.<br />

Ecuaţiile care intervin în formarea <strong>de</strong>terminantului principal se numesc<br />

p<br />

ecuaţii principale, iar necunoscutele x 1 , x2<br />

,..., x n , cu ale căror coeficienţi se<br />

formează <strong>de</strong>terminantul principal, se numesc necunoscute principale.<br />

Celelalte ecuaţii şi necunoscute se numesc secundare.<br />

Se numeşte <strong>de</strong>terminant caracteristic, un <strong>de</strong>terminant <strong>de</strong> ordinul p+1 din<br />

A, obţinut prin completarea <strong>de</strong>terminantului principal, ∆ p , cu o coloană formată<br />

din termenii liberi corespunzători ai ecuaţiilor principale şi cu o linie formată cu<br />

coeficienţii necunoscutelor principale şi cu termenul liber al unei ecuaţii secundare,<br />

b2<br />

( 1)<br />

D p+<br />

1 =<br />

... , … ,<br />

∆ b<br />

a<br />

p+<br />

1,1<br />

....<br />

p<br />

a<br />

p+<br />

1,1<br />

b<br />

b<br />

1<br />

p<br />

p+<br />

1<br />

2<br />

p+ 1<br />

... .<br />

( m−<br />

p)<br />

D =<br />

a<br />

m1<br />

∆<br />

....<br />

p<br />

a<br />

m1<br />

b<br />

b<br />

b<br />

b<br />

1<br />

p<br />

m<br />

Dacă p < m ≤ n (sau p < n ≤ m ) vom putea forma m − p <strong>de</strong>terminanţi,<br />

numiţi <strong>de</strong>terminanţi caracteristici.<br />

Conform teoremei lui Rouché, un <strong>si</strong>stem liniar <strong>de</strong> m ecuaţii cu n<br />

necunoscute este compatibil, dacă şi numai dacă, toţi <strong>de</strong>terminanţii caracteristici<br />

sunt nuli.<br />

Dacă toţi <strong>de</strong>terminanţii caracteristici sunt nuli, dar:<br />

• n>p, există n-p necunoscute secundare, care apar ca parametri în soluţiile<br />

0 0 0<br />

n− p<br />

gă<strong>si</strong>te , x 1 , x2<br />

,..., x p , şi avem ∞ soluţii, iar <strong>si</strong>stemul este compatibil<br />

ne<strong>de</strong>terminat;<br />

• n=p, nu avem necunoscute secundare, iar <strong>si</strong>stemul este compatibil<br />

<strong>de</strong>terminat;<br />

• m=n=p, nu există <strong>de</strong>terminanţi caracteristici (formal putem spune că sunt<br />

nuli),<br />

• <strong>si</strong>stemul este compatibil <strong>de</strong>terminat, cu soluţie unică.


152<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

Dacă cel puţin unul dintre <strong>de</strong>terminanţii caracteristici este diferit <strong>de</strong> zero,<br />

<strong>si</strong>stemul este incompatibil sau impo<strong>si</strong>bil, respectiv nu are soluţii.<br />

Analiza soluţiilor unui <strong>si</strong>stem <strong>de</strong> ecuaţii liniare se poate face mai comod<br />

aplicând teorema Kronecker-Capelli, care se bazează, în esenţă, pe rangul<br />

matricelor A şi B. Dacă notăm p=rang A şi q=rang (A|B), atunci, <strong>pentru</strong> ca<br />

<strong>si</strong>stemul <strong>de</strong> m ecuaţii cu n necunoscute să fie complet compatibil, este suficient ca:<br />

rang A = rang (A|B),<br />

⎛a<br />

... ...<br />

11...<br />

a ...<br />

⎛<br />

11 1 1 1<br />

⎞<br />

1 j a1<br />

⎞<br />

a a j a n b<br />

n<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

⎜......................<br />

⎟<br />

⎜..........................<br />

⎟<br />

⎜<br />

⎟<br />

⎜<br />

⎟<br />

A = ⎜ai1...<br />

aij<br />

... ain<br />

⎟ ; ( A | B) = ⎜ai1...<br />

aij<br />

... ain<br />

bi<br />

⎟ ;<br />

⎜<br />

⎜<br />

⎟<br />

......................<br />

⎟<br />

⎜......................<br />

⎜<br />

⎟<br />

⎟<br />

1...<br />

...<br />

⎜<br />

1...<br />

... ⎟<br />

⎝<br />

am<br />

amj<br />

amn<br />

⎠<br />

am<br />

amj<br />

amn<br />

bm<br />

⎝<br />

⎠<br />

sau în Matlab,<br />

p=rank(A)==rank([A,B]).<br />

Funcţia rank se poate apela şi sub forma:<br />

p=rank(A,tol),<br />

un<strong>de</strong> tol este toleranţa, care are valoarea implicită (când lipseşte la apelare),<br />

tol = max(<strong>si</strong>ze(A)) * norm(A) * eps,<br />

cu eps <strong>de</strong>pinzând <strong>de</strong> acurateţea calculelor în virgulă mobilă.<br />

Dacă:<br />

• m=n=p, <strong>si</strong>stemul este compatibil <strong>de</strong>terminat, cu soluţie unică;<br />

n− p<br />

• p = q < n, <strong>si</strong>stemul este compatibil ne<strong>de</strong>terminat, cu ∞ soluţii;<br />

• p < q, <strong>si</strong>stemul este incompabitil sau ne<strong>de</strong>terminat şi nu va avea nici o<br />

soluţie.<br />

Una dintre meto<strong>de</strong>le <strong>de</strong> rezolvare a <strong>si</strong>stemelor <strong>de</strong> n ecuaţii, cu n<br />

necunoscute, constă în împărţirea matricelor.<br />

Soluţiile unui <strong>si</strong>stem <strong>de</strong> ecuaţii liniare <strong>de</strong> forma,<br />

A*X=B<br />

pot fi <strong>de</strong>terminate în Matlab, prin instrucţiunile:<br />

X=B/A – împărţirea la dreapta<br />

sau<br />

X=A\B – împărţirea la stânga.<br />

De meţionat că împărţirea la stânga este mai rapidă <strong>de</strong>cât împărţirea la<br />

dreapta. Pentru un <strong>si</strong>stem <strong>de</strong> 1000 ecuaţii cu 1000 necunoscute, ai cărui coeficienţi<br />

şi termeni liberi sunt numere aleatoare, cu secvenţa Matlab,<br />

A=rand(1000); B=rand(1000);<br />

tic; X=A\B; ts=toc<br />

tic; X=B/A; td=toc


Algebră numerică liniară 153<br />

s-au obţinut, pe un calculator PC 1.7 MHz, timpi: ts=2.614 s şi td=2.663 s, în cele două<br />

variante <strong>de</strong> împărţire, la stânga şi la dreapta.<br />

O altă cale <strong>de</strong> rezolvare a <strong>si</strong>stemelor <strong>de</strong> n ecuaţii, cu n necunoscute,<br />

constă în folo<strong>si</strong>rea matricei inverse.<br />

Deoarece <strong>de</strong>t(A)≠0, matricea A este ne<strong>si</strong>ngulară şi are <strong>de</strong>ci, o inversă A -1 ,<br />

−<br />

A<br />

A 1 =<br />

ji<br />

<strong>de</strong>t A<br />

calculată în Matlab cu inv(A).<br />

Dacă în <strong>si</strong>stemul, A*X=B, înmulţim la stânga cu A -1 , avem X=A -1 *B,<br />

respectiv în Matlab, X=inv(A)*B.<br />

Reluând acelaşi <strong>si</strong>stem, <strong>de</strong> 1000 ecuaţii cu 1000 necunoscute, cu<br />

coeficienţii şi termenii liberi numere aleatoare, timpul <strong>de</strong> calcul rezultă din,<br />

A=rand(1000); B=rand(1000);<br />

tic; X=inv(A); ti=toc<br />

şi, <strong>pentru</strong> acelaşi calculator, este ti= 2.1430 s.<br />

O serie <strong>de</strong> meto<strong>de</strong> <strong>de</strong> rezolvare a <strong>si</strong>stemelor <strong>de</strong> ecuaţii sunt cunoscute ca<br />

fiind meto<strong>de</strong> prin triunghiularizare. Din această categorie fac parte: factorizarea<br />

Cholesky, factorizarea LU, factorizarea QR etc.<br />

O matrice pătrată A, <strong>de</strong> forma,<br />

⎛a11<br />

a12<br />

... a1n<br />

⎞<br />

⎜<br />

⎟<br />

⎜a21<br />

a22<br />

... a2n<br />

⎟<br />

A = ⎜<br />

.........................<br />

⎟<br />

⎜<br />

⎟<br />

⎝an1<br />

an2<br />

... ann<br />

⎠<br />

poate fi <strong>de</strong>scompusă sub forma,<br />

A = Ls + D +Us,<br />

cu:<br />

⎛ 0 0 ... 0 0 ⎞ ⎛a11<br />

0 ... 0 0 ⎞<br />

⎜<br />

⎟ ⎜<br />

⎟<br />

⎜a21<br />

0 ... 0 0 ⎟ ⎜ 0 a12<br />

... 0 0 ⎟<br />

Ls = ⎜ ... ... ... ... ... ⎟ ; D = ⎜ ... ... ... ... ... ⎟ ;<br />

⎜<br />

⎟ ⎜<br />

⎟<br />

1 2 ... 1 0<br />

⎝ an<br />

an<br />

a<br />

nn− ⎠ 0 0 ... 0<br />

⎝<br />

a nn ⎠<br />

⎛ 0 a12<br />

a13<br />

... a1n<br />

⎞<br />

⎜<br />

⎟<br />

⎜ 0 0 a23<br />

... a2n<br />

⎟<br />

Us = ⎜...<br />

... ... ... ... ⎟<br />

⎜<br />

⎟<br />

0 0 0 ... 0<br />

⎝<br />

⎠<br />

Matricea Ls, care conţine elemente diferite <strong>de</strong> zero numai sub diagonala<br />

principală, se numeşte strict inferior triunghiulară. Similar, matricea Us, care


154<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

conţine elemente diferite <strong>de</strong> zero doar <strong>de</strong>asupra diagonalei principale, se numeşte<br />

strict superior triunghiulară. Matricea D este evi<strong>de</strong>nt diagonală.<br />

O matrice L, <strong>de</strong>finită ca, L=Ls+D se numeşte inferior triunghiulară.<br />

În acest caz, este evi<strong>de</strong>nt că <strong>de</strong>t(L)=<strong>de</strong>t(D) şi, dacă <strong>de</strong>t(D)≠0, atunci există<br />

inversa matricei L, respectiv L -1 , care este <strong>de</strong> forma,<br />

L -1 = L' + D'<br />

şi este <strong>de</strong> asemenea inferior triunghiulară.<br />

Asemănător, dacă U=Us+D şi dacă U -1 există, ea este superior<br />

triunghiulară.<br />

Pentru un <strong>si</strong>stem liniar neomogen, L*x = b, având matricea L a<br />

coeficienţilor <strong>si</strong>stemului inferior triunghiulară,<br />

⎛l11<br />

0 0 ... 0 ⎞ ⎛ x1<br />

⎞ ⎛ b1<br />

⎞<br />

⎜<br />

⎟ ⎜ ⎟ ⎜ ⎟<br />

⎜l21<br />

l22<br />

0 ... 0 ⎟ ⎜ x2<br />

⎟ ⎜b2<br />

⎟<br />

L = ⎜ ... ... ... ... ... ⎟ , x = ⎜ ... ⎟ , b = ⎜ ... ⎟ ,<br />

⎜<br />

⎟ ⎜ ⎟ ⎜ ⎟<br />

1 2 3 ...<br />

⎝ln<br />

ln<br />

ln<br />

l<br />

nn ⎠ ⎝ x n ⎠ ⎝b n ⎠<br />

componentele vectorului x, soluţiile <strong>si</strong>stemului, pot fi gă<strong>si</strong>te prin substituţie înainte,<br />

respectiv:<br />

1<br />

b 1<br />

1 ⎛ m ⎞<br />

1<br />

x1 = ; x 2 = ⋅( b2<br />

− l21<br />

⋅ x1<br />

);<br />

x m = ⋅⎜bm<br />

− lmj<br />

⋅ x ⎟<br />

j ; m = 1,2,..., n.<br />

l11<br />

l22<br />

l ⎜ ∑ − ⎟<br />

mm ⎝ j=<br />

1 ⎠<br />

Un caz mai complicat, dar şi mai instructiv, este cazul în care matricea A<br />

este produsul unei matrice inferior triunghiulare L, cu o matrice superior<br />

triunghiulară U. Prin urmare, avem<br />

A*x = L*U*x = b.<br />

Pentru rezolvare, se introduce un vector auxiliar <strong>de</strong>finit ca<br />

z=U*x<br />

ceea ce face ca ecuaţia iniţială să <strong>de</strong>vină<br />

L*z = b,<br />

care este <strong>de</strong> forma anterioară, având necunoscutele:<br />

1<br />

b 1<br />

1 ⎛ m ⎞<br />

1<br />

z1 = ; z 2 = ⋅( b2<br />

− l21<br />

⋅ z1<br />

);<br />

z m = ⋅⎜bm<br />

− lmj<br />

⋅ z ⎟<br />

j ; m = 1,2,..., n.<br />

l11<br />

l22<br />

l ⎜ ∑ − ⎟<br />

mm ⎝ j=<br />

1 ⎠<br />

Odată vectorul z cunoscut, ecuaţia z=U*x (care este i<strong>de</strong>ntică cu U*x=z)<br />

având,<br />

⎛u11<br />

u12<br />

u13<br />

... u1n<br />

⎞ ⎛ x1<br />

⎞ ⎛ z1<br />

⎞<br />

⎜<br />

⎟ ⎜ ⎟ ⎜ ⎟<br />

⎜ 0 u22<br />

u23<br />

... u2n<br />

⎟ ⎜ x2<br />

⎟ ⎜ z2<br />

⎟<br />

U = ⎜ ... ... ... ... ... ⎟ , x = ⎜ ... ⎟ , z = ⎜ ... ⎟ ,<br />

⎜<br />

⎟ ⎜ ⎟ ⎜ ⎟<br />

0 0 0 ...<br />

⎝<br />

u<br />

nn ⎠ ⎝ x n ⎠ ⎝ z n ⎠


Algebră numerică liniară 155<br />

din care, din ultima linie, rezultă,<br />

z<br />

x n = n ,<br />

u11<br />

şi în general,<br />

1 ⎛ n ⎞<br />

x ⎜<br />

⎟<br />

m = ⋅ zm<br />

− ⋅ ; = , −1,...,1.<br />

⎜ ∑umj<br />

x j m n n<br />

u<br />

⎟<br />

mm ⎝ j=<br />

m+<br />

1 ⎠<br />

Se remarcă faptul că, în acest caz, se utilizează o substituţie înainte şi apoi<br />

o substituţie înapoi.<br />

Cazuri particulare ale acestui caz general sunt atunci când matricea<br />

<strong>si</strong>stemului este o matrice tridiagonală, o matrice tridiagonal <strong>si</strong>metrică sau o matrice<br />

multidiagonală.<br />

O matrice tridiagonală este, prin <strong>de</strong>finiţie, o matrice care are două diagonale<br />

secundare adiacente diagonalei principale, toate cu elemente diferite <strong>de</strong> zero. Se<br />

întâlneşte, <strong>de</strong> regulă, la aproximaţia difuziei multigrupale monodimen<strong>si</strong>onale.<br />

Matricea tridiagonal <strong>si</strong>metrică are elementele <strong>si</strong>metrice nepozitive şi se mai<br />

numeşte şi matrice Stieltjes.<br />

O matrice pătrată <strong>de</strong> ordinul n, multidiagonală, este o matrice cu un număr<br />

m, impar <strong>de</strong> diagonale, m


156<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

R2 = [ 1 1 1 1 1<br />

0 1 2 3 4<br />

0 0 1 3 6<br />

0 0 0 1 4<br />

0 0 0 0 1 ].<br />

Factorizarea Cholesky, <strong>pentru</strong> coeficienţii binomului lui Pascal, îi<br />

aranjează într-o matrice superior triunghiulară.<br />

Dacă matricea nu este pozitiv <strong>de</strong>finită, ca <strong>de</strong> exemplu,<br />

A3=[1 2 3 4;5 6 7 8; 9 10 11 12; 13 14 15 16]<br />

atunci se utilizează apelarea funcţiei chol sub forma,<br />

[R3,p]=chol(A3),<br />

care conduce la,<br />

R3 = [ 1.0000 2.0000 3.0000<br />

0 1.4142 0.7071<br />

0 0 1.2247 ]<br />

p=4,<br />

astfel încât:<br />

R'*R = A(1:q,1:q) , q = p-1.<br />

Rezolvarea unui <strong>si</strong>stem <strong>de</strong> ecuaţii,<br />

A*x=B,<br />

se realizează cu secvenţa Matlab:<br />

R=chol(A); x=R\R’\b.<br />

Pentru o matrice X, factorizarea incompletă Cholesky, aplicabilă <strong>pentru</strong><br />

matrice rare şi factorizarea Cholesky infinită este realizată, în Matlab, cu una dintre<br />

<strong>si</strong>ntaxele:<br />

• R = cholinc(X,dtol), în care, dtol este un scalar nenegativ, ce evi<strong>de</strong>nţiză<br />

toleranţa permisă la factorizarea incompletă, iar dacă dtol=0,, se realizează<br />

factorizarea completă;<br />

• R = cholinc(X,opt), în care, opt poate fi dtol, michol (0 <strong>pentru</strong> factorizarea<br />

Cholesky nemodificată şi 1 <strong>pentru</strong> modificată ) sau rdiag (0, în mod normal<br />

sau 1, când se forţează R ca o matrice cu zero pe diagonala principală);<br />

• R = cholinc(X,'0'), care realizează o factorizare incompletă Cholesky, a<br />

unei matrice rare <strong>si</strong>metric pozitive, care nu garantează existenţa lui R şi<br />

putând apărea un mesaj <strong>de</strong> eroare;<br />

• [R,p] = cholinc(X,'0'), evită mesajul <strong>de</strong> eroare şi dacă p=0, atunci R există,<br />

altfel R'*R corespun<strong>de</strong> cu X , <strong>pentru</strong> primele q=p-1 linii şi coloane;<br />

• R = cholinc(X,'inf'), care produce o factorizare Cholosky infinită, ceea ce<br />

presupune că, la întâlnirea unui pivol egal cu zero, atunci se completează<br />

Inf pe diagonală, iar pe rânduri 0, iar X este pozitiv semi<strong>de</strong>finită, astfel că,<br />

la întâlnirea unui pivot negativ, acesta se înlocuieşte cu Inf.<br />

Modificarea factorizării Cholesky se realizează cu funcţia cholupdate.


Algebră numerică liniară 157<br />

Dacă R=chol(A) este factorizarea Cholesky inţială a matricei A, atunci<br />

R1=cholupdate(R,x) returnează o matrice superior triunghiulară, rezultată din<br />

factorizarea matricei A + X*X', cu X un vector coloană. Funcţia lucrează numai cu<br />

matrice pline, nu rare.<br />

Prin factorizarea LU (lower-upper), o matrice pătrată este <strong>de</strong>scompusă sub<br />

forma produsului a două matrice triunghiulare: una inferior triunghiulară, matricea<br />

L, cu elemente 1 pe diagonala principală şi cealaltă, matricea U, superior<br />

triunghiulară.<br />

Factorizarea LU a unei matrice se realizează în Matlab cu funcţia lu, care<br />

se apelează cu una dintre <strong>si</strong>ntaxele:<br />

• [L,U]=lu(X), când se returnează o matrice superior triunghiulară U şi o<br />

matrice inferior triunghiulară permutată L, astfel încât X=L*U;<br />

• [L,U,P]=lu(X), când se returnează o matrice superior triunghiulară U, o<br />

matrice inferior triunghiulară permutată L şi permutarea matriceală P, astfel<br />

încât L*U=P*X.<br />

Factorizarea LU este utilizată în Matlab <strong>pentru</strong> obţinerea inversei unei<br />

matrice, cu funcţia inv şi <strong>pentru</strong> calculul <strong>de</strong>terminantului, cu funcţia <strong>de</strong>t.<br />

Să con<strong>si</strong><strong>de</strong>răm <strong>si</strong>stemul A*x=b un<strong>de</strong>,<br />

A = [ 1 1 2 1 1 2 b = [ 0<br />

3 -1 -2 1 -2 1 -6<br />

-1 1 3 -1 4 2 6<br />

1 2 -1 2 -1 -3 1<br />

-2 -3 1 -2 -3 -1 6<br />

1 -2 4 2 -1 4 ] -1 ].<br />

Prin factorizarea LU,<br />

[L1,U1] = lu(A) sau [L,U,P] = lu(A)<br />

obţinem:<br />

L1 = [ 0.3333 -0.3636 0.5283 0.5143 0.8676 1.0000<br />

1.0000 0 0 0 0 0<br />

-0.3333 -0.1818 0.4717 1.0000 0 0<br />

0.3333 -0.6364 -0.1132 -0.5429 1.0000 0<br />

-0.6667 1.0000 0 0 0 0<br />

0.3333 0.4545 1.0000 0 0 0 ],<br />

U1 = [ 3.0000 -1.0000 -2.0000 1.0000 -2.0000 1.0000<br />

0 -3.6667 -0.3333 -1.3333 -4.3333 -0.3333<br />

0 0 4.8182 2.2727 1.6364 3.8182<br />

0 0 0 -1.9811 1.7736 0.4717<br />

0 0 0 0 -1.9429 -2.8571<br />

0 0 0 0 0 1.7647 ],


158<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

L = [ 1.0000 0 0 0 0 0<br />

-0.6667 1.0000 0 0 0 0<br />

0.3333 0.4545 1.0000 0 0 0<br />

-0.3333 -0.1818 0.4717 1.0000 0 0<br />

0.3333 -0.6364 -0.1132 -0.5429 1.0000 0<br />

0.3333 -0.3636 0.5283 0.5143 0.8676 1.0000 ],<br />

U = [ 3.0000 -1.0000 -2.0000 1.0000 -2.0000 1.0000<br />

0 -3.6667 -0.3333 -1.3333 -4.3333 -0.3333<br />

0 0 4.8182 2.2727 1.6364 3.8182<br />

0 0 0 -1.9811 1.7736 0.4717<br />

0 0 0 0 -1.9429 -2.8571<br />

0 0 0 0 0 1.7647 ],<br />

P = [ 0 1 0 0 0 0<br />

0 0 0 0 1 0<br />

0 0 0 0 0 1<br />

0 0 1 0 0 0<br />

0 0 0 1 0 0<br />

1 0 0 0 0 0 ].<br />

Se observă că L1*U1 este i<strong>de</strong>ntică cu A, iar L*U este i<strong>de</strong>ntică cu P*A..<br />

Inversa matricei A, calculată cu funcţia inv, este egală cu produsul<br />

inverselor, respectiv:<br />

inv(A) = inv(U1)*inv(L1) şi inv(P*A) = inv(U)*inv(L).<br />

De asemenea, <strong>pentru</strong> <strong>de</strong>terminanţi, sunt valabile relaţiile:<br />

<strong>de</strong>t(A) = <strong>de</strong>t(L1)*<strong>de</strong>t(U1) şi <strong>de</strong>t(P*A) = <strong>de</strong>t(L)*<strong>de</strong>t(U).<br />

Rezolvarea <strong>si</strong>stemelor <strong>de</strong> ecuaţii A*x = b, prin factorizarea Lu, presupune<br />

soluţionarea succe<strong>si</strong>vă a <strong>si</strong>stemelor:<br />

y=L1\b şi x=U1\y,<br />

rezultând,<br />

x = [2 -1 3 -2 1 -3 ].<br />

Pentru o matrice X, factorizarea incompletă LU, luinc, aplicabilă <strong>pentru</strong><br />

matrice rare, este realizată în Matlab cu una dintre <strong>si</strong>ntaxele:<br />

• [L,U,P] = luinc(X,dtol) sau [L,U] = luinc(X,dtol) , în care dtol este un<br />

scalar nenegativ, ce evi<strong>de</strong>nţiază toleranţa permisă la factorizarea LU<br />

incompletă, aplicabilă fiecărei coloane a lui X, iar dacă dtol=0, se<br />

realizează factorizarea LU completă;<br />

• [L,U,P] = luinc(X,opt) sau [L,U] = luinc(X,opt) , în care opt poate fi dtol,<br />

milu (0, <strong>pentru</strong> factorizarea LU nemodificată şi 1, <strong>pentru</strong> modificată) sau<br />

udiag (0, în mod normal sau 1, când se forţează U ca o matrice cu zero pe<br />

diagonala principală);<br />

• [L,U] = luinc(X,'0'), care realizează o factorizare incompletă LU a unei<br />

matrice rare, <strong>si</strong>metric pozitive, fără a da permutarea;


Algebră numerică liniară 159<br />

• [L,U,P] = luinc(X,'0'), prezintă şi matricea <strong>de</strong> permutare şi se bazează pe<br />

algoritmul <strong>de</strong> pivotare parţială.<br />

Factorizarea QR este o <strong>de</strong>scompunere a unei matrice, A, ca produsul<br />

dintre o matrice ortonormală, Q, cu o matrice superior triunghiulară, R, astfel încât<br />

A = Q*R.<br />

Factorizarea QR se utilizează <strong>pentru</strong> rezolvarea <strong>si</strong>stemelor <strong>de</strong> ecuaţii liniare<br />

cu mai multe ecuaţii <strong>de</strong>cât necunoscute. Cea mai bună soluţie a unor astfel <strong>de</strong><br />

<strong>si</strong>steme, A*x = b, în sensul celor mai mici pătrate, este calculată cu x = A\b, care<br />

utilizează implicit această factorizare.<br />

Prin utilizarea factorizării QR, cu funcţia Matlab qr, soluţia este calculată<br />

în doi paşi:<br />

y=Q`*b şi apoi x=R\y.<br />

Apelarea funcţiei qr se poate face cu una dintre <strong>si</strong>ntaxele:<br />

• [Q,R]=qr(A), returnează matricea triunghiular superioară R, <strong>de</strong> aceeaşi<br />

dimen<strong>si</strong>une cu A şi matricea unitară Q, astfel încât, A = Q*R.<br />

• [Q,R,E]=qr(A), returnează matricea <strong>de</strong> permutare E, a matricei<br />

superior triunghiulare R, cu elementele diagonalei <strong>de</strong>screscătoare şi<br />

matricea unitară Q, astfel încât A*E = Q*R, cu menţiunea că, matricea E<br />

are coloanele aranjate în ordinea <strong>de</strong>screscatoare a abs(diag(R));<br />

• [Q,R]=qr(A,0), realizează o <strong>de</strong>scompunere „economică” a matricei A,<br />

care, dacă este <strong>de</strong> mxn, cu m>n, lucrează numai cu primele n coloane;<br />

• [Q,R,E]=qr(A,0), realizează o <strong>de</strong>scompunere „economică” a matricei A,<br />

prezentând şi vectorul <strong>de</strong> permutare E, având coloanele aşezate în ordinea<br />

<strong>de</strong>screscătoare a abs(diag(R)), astfel încât Q*R = A(:,E);<br />

• R = qr(A), returnează numai matricea R, care R = chol(A'*A).<br />

Pentru matrice rare, ver<strong>si</strong>unea QR nu permută coloanele.<br />

Soluţia <strong>si</strong>stemului A*x=b, prin metoda celor mai mici pătrate, bazată pe<br />

<strong>de</strong>scompunerea QR, se află fie într-un pas,<br />

x = R\(R'\(A'*b))<br />

fie succe<strong>si</strong>v,<br />

r = b - A*x<br />

e = R\(R'\(A'*r))<br />

x = x + e;<br />

De exemplu, <strong>de</strong>scompunerea QR a matricei aceleiaşi matrice A, utilizată la<br />

<strong>de</strong>scompunerea LU, conduce la:<br />

Q = [ -0.2425 0.1866 -0.4555 0.2090 -0.5768 0.5679<br />

-0.7276 -0.3466 0.2364 0.4411 -0.1208 -0.2923<br />

0.2425 0.2666 -0.5238 0.5303 0.0392 -0.5595<br />

-0.2425 0.4133 0.0328 -0.5493 -0.4742 -0.4927<br />

0.4851 -0.5999 0.0671 0.0150 -0.6101 -0.1670<br />

-0.2425 -0.4932 -0.6758 -0.4227 0.2325 -0.0919 ],


160<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

R = [ -4.1231 -0.7276 1.4552 -3.1530 1.2127 -1.4552<br />

0 4.4125 -1.1198 0.6132 3.8260 -2.0530<br />

0 0 -5.6239 -1.1158 -2.5818 -4.5909<br />

0 0 0 -1.8541 2.3748 1.8616<br />

0 0 0 0 1.8936 1.7669 ]<br />

astfel încât soluţia se obţine prin,<br />

R\(R'\(A1'*b))<br />

sau secvenţial,<br />

r = b - A*x ; e = R\(R'\(A'*r)) ; x = x + e;<br />

rezultând x = [2 -1 3 -2 1 -3 ], la fel ca şi prin metoda LU.<br />

Modificarea factorizării QR iniţiale se realizează cu funcţia qrupdate, care<br />

se apelează [Q1,R1] = qrupdate(Q,R,U,V), care returnează factorizarea matricei<br />

A + U*V', iar matricele U şi V sunt <strong>de</strong> tipul coloană.<br />

Ştergerea unei coloane din factorizarea QR se realizează cu funcţia<br />

qr<strong>de</strong>lete, care se apelează cu <strong>si</strong>ntaxa:<br />

[Q,R]=qr<strong>de</strong>lete(Q0,R0,j),<br />

un<strong>de</strong> Q0 şi R0 sunt factorizările iniţiale, [Q0,R0]=qr(A), iar Q şi R sunt factorizările<br />

obţinute după ce din matricea A, a fost ştearsă coloana j, respectiv elementele A(:,j).<br />

Inserarea unei coloane în factorizarea QR se realizează cu funcţia<br />

qrinsert, care se apelează cu <strong>si</strong>ntaxa:<br />

[Q,R]=qr<strong>de</strong>lete(Q0,R0,j),<br />

un<strong>de</strong> Q0 şi R0 sunt factorizările iniţiale, [Q0,R0]=qr(A), iar Q şi R sunt factorizările<br />

obţinute după ce, în matricea A, a fost inserată coloana j, respectiv elementele A(:,j),<br />

după ultima coloană a matricei iniţiale.<br />

Gă<strong>si</strong>rea planului <strong>de</strong> rotaţie al unei matrice X, <strong>de</strong> 2 x 2, se realizează cu<br />

funcţia planerot, apelată sub forma [G,Y]=planerot(X), care returnează două<br />

matrice ortogonale, astfel că Y = G*X şi Y(2) = 0.<br />

Realizarea factorizării QZ, <strong>pentru</strong> valori proprii generalizate, se<br />

realizează cu funcţia qz. Apelarea funcţiei se face cu:<br />

• [AA, BB, Q, Z, V] = qz(A,B); <strong>pentru</strong> matricele pătrate A şi B, produce<br />

matricele qua<strong>si</strong>triunghiulare superioare AA şi BB, matricele unitare Q şi<br />

Z, astfel încât Q*A*Z = AA şi Q*B*Z = BB, şi matricea vectorilor<br />

proprii generalizaţi, V.<br />

Dacă matricele iniţiale, A şi B, sunt complexe, atunci AA şi BB sunt<br />

triunghiulare.<br />

Factorizarea unei matrice la forma Hessenberg, se realizează prin funcţia<br />

hess. Forma Hessenberg a unei matrice are elementele <strong>de</strong> sub prima diagonală nule<br />

şi aceleaşi valori proprii, ca matricea originală. Dacă matricea iniţială este


Algebră numerică liniară 161<br />

<strong>si</strong>metrică sau hermitică, atunci matricea Hessenberg are formă tridiagonală. Se<br />

apelează:<br />

• H=hess(A) – aduce la forma Hessenberg, H, matricea iniţială A;<br />

• [H,P]=hess(A) – calculează o matrice unitară P şi o matrice Hessenberg<br />

H, astfel încât A = P*H*P' şi P'*P = eye(<strong>si</strong>ze(P)).<br />

Dacă con<strong>si</strong><strong>de</strong>răm matricea X, <strong>de</strong> test a valorilor proprii, <strong>de</strong> 3 x 3,<br />

X = [ -149 -50 -154 ; 537 180 546 ; -27 -9 -25 ]<br />

forma Hessenberg are elementul (3,1) zero,<br />

hess(X) = [ -149.0000 42.2037 -156.3165<br />

-537.6783 152.5511 -554.9272<br />

0 0.0728 2.4489 ]<br />

Factorizarea unei matrice la forma Schur, se realizează cu funcţia schur.<br />

Descompunerea Schur produce o matrice qua<strong>si</strong>triunghiulară T şi o matrice unitară<br />

U, astfel încât, X = U*T*U' şi U'*U = eye(<strong>si</strong>ze(U)), în care matricea iniţială X,<br />

trebuie să fie pătrată. Sintaxele <strong>de</strong> apelare sunt: [U,T] = schur(X), T = schur(X).<br />

Pentru aceeaşi matrice X, <strong>de</strong> mai sus, <strong>de</strong>scompunera Schur este:<br />

schur(X) = [ 1.0000 7.1119 815.8706<br />

0 2.0000 -55.0236<br />

0 0 3.0000 ].<br />

Pentru matricea X complexă, forma Schur este superior triunghiulară, cu<br />

valorile proprii pe diagonală.<br />

Transformarea matricei <strong>de</strong> ieşire <strong>de</strong> forma Schur, din reală în complexă,<br />

<strong>pentru</strong> o matrice <strong>de</strong> intrare X reală, se face cu funcţia rsf2csf, apelată sub forma:<br />

[U,T]=rsf2csf(U0,T0),<br />

un<strong>de</strong> U0 şi T0 sunt matricele Schur iniţiale din [U0,T0]=schur(X), iar U, T<br />

sunt cele finale, complexe, respectiv o matrice superior triunghiulară, cu valorile<br />

proprii pe diagonală.<br />

Aplicarea meto<strong>de</strong>i celor mai mici pătrate la rezolvarea unui <strong>si</strong>stem <strong>de</strong><br />

ecuaţii liniare omogene, cu restricţii nenegative, se realizează în Matlab <strong>de</strong> către<br />

funcţia lsqnonneg. Aceasta se apelează cu una dintre <strong>si</strong>ntaxele:<br />

• X=lsqnonneg(C,d), cu C şi d reale, care returnează un vector X, ce<br />

minimizează norm(C*X-d), atunci când X >= 0;<br />

• X=lsqnonneg(C,d,x0), utilizează x0 (x0>0) ca punct <strong>de</strong> plecare al soluţiei;<br />

• X=lsqnonneg(C,d,x0,tol) utilizează o toleranţă impusă la aflarea soluţiei;<br />

altfel aceasta este 10*max(<strong>si</strong>ze(C))*norm(C,1)*eps, cu eps=2.2204e-016.<br />

Aplicarea meto<strong>de</strong>i celor mai mici pătrate la rezolvarea unui <strong>si</strong>stem <strong>de</strong><br />

ecuaţii liniare omogene, cu covarianţă oarecare, se realizează în Matlab <strong>de</strong> către<br />

funcţia lscov.<br />

Aceasta se apelează cu una dintre <strong>si</strong>ntaxele:


162<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

• X=lscov(A,B,V), returnează vectorul X, ca soluţie a ecuaţiei A*X=B+E,<br />

un<strong>de</strong> E este o funcţie <strong>de</strong> distribuţie normală, cu media zero şi covarainţa V,<br />

iar matricea A este <strong>de</strong> dimen<strong>si</strong>uni mxn, cu m>n, astfel încât, vectorul X<br />

minimizează (A*X-B)'*inv(V)*(A*X-B) şi soluţia <strong>si</strong>stemului este dată <strong>de</strong><br />

X=inv(A'*inv(V)*A)*A'*inv(V)*B;<br />

• [X,DX]=lscov(A,B,V), returnează erorile standard ale lui X în DX, erori<br />

calculate cu relaţiile<br />

mse=B'*(inv(V)-inv(V)*A*inv(A'*inv(V)*A)*A'*inv(V))*B./(m-n)<br />

dx = sqrt(diag(inv(A'*inv(V)*A)*mse)).<br />

7.5. Vectori şi valori proprii<br />

În foarte multe aplicaţii, apar <strong>si</strong>tuaţii în care se pune problema<br />

<strong>de</strong>terminării acelor valori ale unei constante λ , <strong>pentru</strong> care există soluţii nebanale<br />

ale unui <strong>si</strong>stem <strong>de</strong> ecuaţii liniar omogen, <strong>de</strong> forma:<br />

a11 ⋅ x1<br />

+ ... + a1<br />

j ⋅ x j + ... + a1n<br />

⋅ xn<br />

= λ ⋅ x1<br />

...........................................................<br />

a ⋅ x + ... + a ⋅ x + ... + a ⋅ x = λ ⋅ x<br />

i1<br />

1<br />

ij<br />

j<br />

...........................................................<br />

a ⋅ x + ... + a ⋅ x + ... + a ⋅ x = λ ⋅ x<br />

n1<br />

1<br />

nj<br />

j<br />

<strong>de</strong> n ecuaţii liniare cu n necunoscute, având matricea A <strong>si</strong>metrică.<br />

in<br />

nn<br />

n<br />

n<br />

Dacă un vector x ≠ 0 are proprietatea că A ⋅ x = λ ⋅ x , se spune că x<br />

reprezintă o direcţie proprie a transformării A, iar numărul λ (real sau complex),<br />

este o valoare proprie a acestei transformări.<br />

Denumirea <strong>de</strong> direcţie proprie a transformării este justificată prin aceea că,<br />

dacă x satisface relaţia A ⋅ x = λ ⋅ x , aceeaşi proprietate o va avea orice vector k ⋅ x ,<br />

un<strong>de</strong> k este un număr oarecare, real sau complex. Acest fapt este o consecinţă a<br />

proprietăţilor transformării liniare, A ⋅( k ⋅ x) = k ⋅ A⋅<br />

x = k ⋅λ<br />

⋅ x = λ ⋅( k ⋅ x)<br />

.<br />

O astfel <strong>de</strong> problemă este cunoscută ca o problemă cu valori şi vectori<br />

proprii. Valorile lui λ , <strong>pentru</strong> care există soluţii nebanale, se numesc valori<br />

proprii sau caracteristice ale matricei A a coficienţilor <strong>si</strong>stemului, iar soluţiile<br />

vectori corespunzătoare se cunosc sub <strong>de</strong>numirea <strong>de</strong> vectori proprii sau<br />

caracteristici ai matricei A.<br />

Forma matriceală a <strong>si</strong>stemului A ⋅ x = λ ⋅ x este echivalentă cu,<br />

( A - λ ⋅ I) ⋅ x = 0<br />

un<strong>de</strong> I, este matricea i<strong>de</strong>ntitate, calculabilă în Matlab cu eye(A). Această matrice este<br />

<strong>de</strong>numită uneori şi unitate, are toate elementele <strong>de</strong> pe diagonala principală egale cu 1,<br />

iar celelalte nule. Se mai notează şi cu [1] sau [e], având elementele,<br />

i<br />

n


Algebră numerică liniară 163<br />

⎧0,<br />

dacã i ≠ j<br />

e ij = ⎨<br />

⎩1,<br />

dacã i = j<br />

Acest <strong>si</strong>stem omogen posedă soluţii nebanale, dacă şi numai dacă,<br />

<strong>de</strong>terminantul matricei coeficienţilor se anulează, adică matricea A - λ ⋅ I este<br />

<strong>si</strong>ngulară,<br />

a − λ a ... a<br />

A - λ ⋅ I = P<br />

11<br />

a<br />

21 22<br />

2n<br />

( λ) =<br />

= 0<br />

a<br />

...<br />

n1<br />

a<br />

a<br />

12<br />

− λ<br />

...<br />

n2<br />

Această condiţie nece<strong>si</strong>tă ca λ să fie o rădăcină a ecuaţiei algebrice <strong>de</strong> mai<br />

sus, cunoscută sub <strong>de</strong>numirea <strong>de</strong> ecuaţie caracteristică a transformării A sau<br />

ecuaţie seculară. Fiind <strong>de</strong> gradul n în λ , va avea n rădăcini, fie distincte, fie unele<br />

dintre ele confundate. Aceste rădăcini sau soluţii λ 1 , λ2,...,<br />

λn<br />

, sunt valorile proprii<br />

ale matricei sau transformării A. Polinomul P ( λ)<br />

, se numeşte polinomul<br />

caracteristic al transformării liniare A.<br />

Corespunzător cu fiecare valoare proprie λ k , există cel puţin un vector<br />

soluţie x k , a <strong>si</strong>stemului A ⋅ x = λ ⋅ x , <strong>de</strong>terminat până la o constantă arbitrară.<br />

În continuare, se enunţă principalele teoreme şi proprietăţi ale valorilor<br />

proprii.<br />

Dacă o transformare liniară A, are n direcţii proprii, reprezentate prin<br />

vectorii u 1 , u2,...,<br />

un<br />

, liniar in<strong>de</strong>pen<strong>de</strong>nţi, aceşti vectori pot fi luaţi ca bază a<br />

spaţiului, iar matricea transformării A, în această bază, va avea forma diagonală,<br />

[ λ 1 ,0,..., 0 ; 0,<br />

λ 2 ,..., 0 ; ... ; 0 ,0,...,λn<br />

].<br />

Reciproc, dacă matricea transformării A, în baza u 1 , u2,...,<br />

un<br />

, are formă<br />

diagonală, atunci λ 1 , λ2,...,<br />

λn<br />

sunt valorile proprii, iar u 1 , u2,...,<br />

un<br />

reprezintă<br />

direcţiile proprii corespunzătoare.<br />

Dacă valorile proprii λ 1 , λ2,...,<br />

λn<br />

sunt distincte, direcţiile proprii<br />

corespunzătoare sunt reprezentate prin vectorii u 1 , u2,...,<br />

un<br />

, liniar in<strong>de</strong>pen<strong>de</strong>nţi.<br />

Valorile proprii ale unei transformări liniare autoadjuncte (hermitice), sunt<br />

reale.<br />

La două valori proprii distincte, ale unei transformări autoadjuncte,<br />

corespund două direcţii proprii ortogonale.<br />

Într-un spaţiu euclidian cu n dimen<strong>si</strong>uni (matricea A <strong>de</strong> nxn), o<br />

transformare autoadjunctă (hermitică) are n direcţii proprii, ortogonale, două câte<br />

două. Vectorii e 1 , e2<br />

,..., en<br />

, care reprezintă cele n direcţii proprii ale transformării<br />

A, ortogonale două câte două, pot fi luaţi <strong>de</strong> lungime unitate,<br />

...<br />

...<br />

...<br />

a<br />

a<br />

nn<br />

1n<br />

...<br />

− λ


164<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

( e e )<br />

⎧0,<br />

<strong>pentru</strong> i ≠ j<br />

i , j = ⎨<br />

. Drept consecinţă, matricea A, faţă <strong>de</strong> această bază are<br />

⎩1,<br />

<strong>pentru</strong> i = j<br />

forma diagonală, [ λ 1 ,0,..., 0 ; 0,<br />

λ 2 ,..., 0 ; ... ; 0 ,0,...,λn<br />

].<br />

Un caz particular <strong>de</strong> matrice hermitică îl formează matricele <strong>si</strong>metrice<br />

reale. În acest caz, transformarea are n direcţii proprii ortogonale, două câte două şi<br />

valorile proprii reale. Transformarea se va reprezenta printr-o matrice care poate fi<br />

adusă la forma diagonală. Pe diagonala principală, în noua matrice, vor figura<br />

valorile proprii, nu întot<strong>de</strong>auna distincte.<br />

Valorile proprii ale transformărilor unitare au modulul egal cu 1.<br />

Orice transformare unitară într-un spaţiu euclidian cu n dimen<strong>si</strong>uni are n<br />

direcţii proprii ortogonale, două câte două. Matricea transformării, raportată la<br />

aceste direcţii, va avea formă diagonală.<br />

În Matlab, calculul valorilor şi al vectorilor proprii ai unei matrice pătrate<br />

se realizează cu funcţia eigs, care se apelează cu una dintre <strong>si</strong>ntaxele:<br />

• E=eigs(A) – returnează un vector E, care conţine valorile proprii ale<br />

matricei pătrate A;<br />

• [V,D]=eigs(A) – returnează o matrice diagonală D, care conţine valorile<br />

proprii ale matricei A şi o matrice V, modală, ale cărei coloane sunt<br />

vectorii proprii, astfel încât A*V = V*D;<br />

• [V,D] = eigs(A,'nobalance') – returnează valorile şi vectorii proprii, fără a<br />

executa o balansare, <strong>de</strong>oarece dacă matricea conţine elemente mici,<br />

comparabile cu erorile <strong>de</strong> rotunjire, balansarea le scalează, făcându-le la<br />

fel <strong>de</strong> semnificative ca celelalte elemente ale matricei originale şi, acest<br />

fapt, ar conduce ,în final, la vectori proprii incorecţi.<br />

În cazul matricelor ne<strong>si</strong>metrice <strong>de</strong> ordinul n, <strong>pentru</strong> care A T ≠A (sau în<br />

Matlab A'≠A), dacă valorile proprii sunt distincte, atunci există n vectori proprii,<br />

liniar in<strong>de</strong>pen<strong>de</strong>nţi asociaţi.<br />

Dacă matricea are numai valori proprii <strong>de</strong> ordinul întâi (valorile proprii λ<br />

sunt distincte), atunci vectorii proprii sunt in<strong>de</strong>pen<strong>de</strong>nţi. Dacă vectorii proprii nu<br />

sunt in<strong>de</strong>pen<strong>de</strong>nţi, atunci matricea originală este neregulată.<br />

Dacă valorile proprii ale unei matrice ne<strong>si</strong>metrice <strong>de</strong> ordin n nu sunt toate<br />

distincte, atunci setul <strong>de</strong> vectori proprii asociaţi poate să nu fie <strong>de</strong> rang n. În cazul<br />

în care vectorii proprii ai matricei A ne<strong>si</strong>metrice nu formează un set complet, este<br />

totuşi po<strong>si</strong>bil să gă<strong>si</strong>m un set complet <strong>de</strong> alţi vectori, <strong>de</strong>numiţi vectori principali,<br />

care împreună cu setul vectorilor proprii, vor <strong>de</strong>termina un set complet <strong>de</strong> vectori.<br />

Dacă multiplicitatea unei rădăcini este k, avem n-k+1 vectori proprii şi nu putem<br />

gă<strong>si</strong> mai mult <strong>de</strong>cât k-1 vectori principali in<strong>de</strong>pen<strong>de</strong>nţi.<br />

Şi <strong>pentru</strong> matrice ne<strong>si</strong>metrice există întot<strong>de</strong>auna o matrice Jordan, aproape<br />

diagonală (având valoarea proprie multiplă λ k , pe diagonala principală şi 1, pe<br />

diagonala adiacentă superioară).


Algebră numerică liniară 165<br />

Dacă toate valorile proprii ale matricei A sunt pozitive, matricea A se<br />

numeşte pozitiv <strong>de</strong>finită. Invers, dacă toate valorile proprii ale matricei A sunt<br />

negative, matricea A se numeşte negativ <strong>de</strong>finită.<br />

Valorile şi vectorii proprii generalizaţi <strong>de</strong>termină soluţiile nebanale ale<br />

ecuaţiei:<br />

A ⋅ x = λ ⋅ B ⋅ x<br />

un<strong>de</strong> A şi B sunt matrice pătratice <strong>de</strong> ordinul n, iar λ este un scalar.<br />

Valorile lui λ , care satisfac ecuaţia, se numesc valori proprii generalizate<br />

şi valorile x, corespunzătoare, sunt vectorii proprii generalizaţi.<br />

Dacă B este o matrice ne<strong>si</strong>ngulară, <strong>de</strong>t(B)≠0, adică matrice iversabilă,<br />

problema calculului valorilor şi al vectorilor proprii se reduce la o problemă<br />

standard <strong>de</strong> valori proprii, prin înlocuirea lui A cu B -1 *A, <strong>de</strong>arece ecuaţia este<br />

echivalentă cu:<br />

B -1 .A ⋅ x = λ ⋅ x .<br />

Calculul vectorilor şi valorilor proprii generalizate se realizează cu funcţia<br />

eig, apelată cu <strong>si</strong>ntaxa:<br />

• V=eig(A) – returnează un vector V, care conţine valorile proprii<br />

generalizate;<br />

• [V,D] = eig(A,B) produce o matrice diagonală D, care conţine valorile<br />

proprii ale matricei A şi o matrice V, modală, ale cărei coloane sunt<br />

vectorii proprii, astfel încât A*V = B*V*D;<br />

• [V,D] = eig(A,B,'chol') – se aplică la matricele A, B, <strong>si</strong>metrice, utilizând<br />

factorizarea Cholesky, <strong>pentru</strong> B;<br />

• [V,D] = eig(A,B,'qz') – se aplică la matricele A, B, utilizând factorizarea<br />

QZ.<br />

De exemplu, con<strong>si</strong><strong>de</strong>rând A=[ -2 1 0 ; 1 -2 1; 0 1 -2], atunci<br />

[V,D]=eig(A), conduce la:<br />

V = [ 0.500 -0.707 -0.500 ; -0.707 0.000 -0.707; 0.500 0.707 -<br />

0.500]<br />

D=[ -3.41 0 0; 0 -2.00 0 0 0 -0.59].<br />

Pentru calculul valorilor proprii generalizate se utilizează funcţia eig, care<br />

permite redarea unui set <strong>de</strong> şase valori proprii generalizate şi, în plus, se poate<br />

utiliza şi în cazul matricelor mari şi/sau rare.<br />

Transformarea matricelor <strong>de</strong> ieşire, V şi D, ale funcţiei eig(X), cu X real,<br />

din forma complexă diagonală în forma reală, se realizează cu funcţia cdf2rdf,<br />

apelată sub forma [V,D]=cdf2rdf(V,D). În forma complexă diagonală, matricea D<br />

are valori proprii complexe sub diagonală. În formă reală, valorile proprii<br />

complexe formează un bloc diagonal <strong>de</strong> 2 x 2.<br />

Analiza inţială a acurateţei <strong>de</strong>terminării valorilor proprii se realizează cu


166<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

funcţia balance, apelată cu:<br />

[T,B] = balance(A),<br />

un<strong>de</strong> T şi B sunt transformările <strong>de</strong> <strong>si</strong>milaritate, astfel că B = T\A*T, şi normele pe linii<br />

şi coloane să fie egale. Matricea T este o matrice diagonală <strong>de</strong> permutare.<br />

Calculul valorilor <strong>si</strong>ngulare ale unei matrice se realizează cu funcţia svd,<br />

fiind şi un mijloc <strong>si</strong>gur <strong>de</strong> <strong>de</strong>terminare a rangului unei matrice. Funcţia svd se<br />

apelează cu una dintre <strong>si</strong>ntaxele:<br />

• S1=svd(X), când se returnează un vector S1, care conţine valorile<br />

<strong>si</strong>ngulare ale matricei X;<br />

• [U,S,V]=svd(X), care returnează o matrice diagonală S, cu aceleaşi<br />

dimen<strong>si</strong>uni ca X, având elementele diagonale nenegative (care sunt şi<br />

valorile <strong>si</strong>ngulare), în ordine <strong>de</strong>screscătoare şi matricele unitare U şi V,<br />

astfel încât X= U*S*V' ;<br />

• [U,S,V]=svd(X,0), realizează un calcul mai rapid al valorilor <strong>si</strong>ngulare,<br />

con<strong>si</strong><strong>de</strong>rând, în cazul unei matrice X, <strong>de</strong> m x n, cu m>n, numai primele n<br />

coloane, <strong>pentru</strong> U şi S <strong>de</strong> n x n.<br />

Descompunerea în valori <strong>si</strong>ngulare a matricei X=[1 2;3 4;5 6;7 8] se poate<br />

realiza cu<br />

S1=svd(X) ; [U,S,V]=svd(X) ; [U0,S0,V0]=svd(X,0);<br />

rezultând:<br />

S1 = [ 14.2691 ; 0.6268];<br />

U = [ -0.1525 -0.8226 -0.3945 -0.3800<br />

-0.3499 -0.4214 0.2428 0.8007<br />

-0.5474 -0.0201 0.6979 -0.4614<br />

-0.7448 0.3812 -0.5462 0.0407 ]<br />

S = [ 14.2691 0 ; 0 0.6268 ; 0 0; 0 0 ]<br />

V = [ -0.6414 0.7672 ; -0.7672 -0.6414 ]<br />

U0 = [ -0.1525 -0.8226 ; -0.3499 -0.4214 ; -0.5474 -0.0201; -0.7448<br />

0.3812 ]<br />

S0 = [ 14.2691 0 ; 0 0.6268 ] ; V0 = [ -0.6414 0.7672 ; -0.7672 -<br />

0.6414 ]<br />

Calculul valorilor <strong>si</strong>ngulare generalizate se realizează cu funcţia gsvd.<br />

Funcţia gsvd se apelează cu relaţia<br />

[U,V,X,C,S] = gsvd(A,B),<br />

care returnează matricele unitare U şi V ale matricei, <strong>de</strong> regulă, pătrate X şi matricele<br />

diagonale nenegative C şi S, astfel încât:<br />

A = U*C*X'<br />

B = V*S*X'<br />

C'*C + S'*S = I.<br />

Matricele A şi B trebuie să aibă acelaşi număr <strong>de</strong> coloane, dar pot avea


Algebră numerică liniară 167<br />

număr <strong>de</strong> linii (rânduri) diferite. Dacă A este <strong>de</strong> m x p şi B <strong>de</strong> n x p, atunci U este<br />

<strong>de</strong> m x m, V este <strong>de</strong> n x n şi X este <strong>de</strong> p x q, un<strong>de</strong> q=min(m+n,p).<br />

Funcţia gsvd apelată SIGMA = gsvd(A,B) returnează vectorul valorilor<br />

<strong>si</strong>ngulare generalizate, adică sqrt(diag(C'*C)./diag(S'*S)).<br />

Pentru manipularea valorilor şi a vectorilor proprii ai unor matrice mari sau<br />

rare, calculate cu eigs, se utilizează funcţia svds, în locul funcţiei svd.<br />

Calculul coeficienţilor unui polinom, având date rădăcinile, se realizează<br />

cu funcţia poly, care se apelează cu <strong>si</strong>ntaxele:<br />

• c=poly(r) – când returnează un vector linie, c, conţinând coeficienţii<br />

polinomului, în ordinea <strong>de</strong>screscătoare a puterilor, iar r este un vector ce<br />

conţine rădăcinile polinomului;<br />

• c=poly(A) – returnează coeficienţii c, în ordinea <strong>de</strong>screscătoare, ai<br />

polinomului caracteristic al matricei A, <strong>de</strong> tipul n x n .<br />

Calculul coeficienţilor unui polinom, la care se cunosc valorile proprii, se<br />

realizează cu funcţia polyeig.<br />

Calculul numărului <strong>de</strong> condiţionare, ţinând seama <strong>de</strong> valorile proprii ale<br />

unei matrice, se obţine cu funcţia con<strong>de</strong>ig, care se apelează frecvent,<br />

[V,D,s] = con<strong>de</strong>ig(A)<br />

care este echivalent cu: [V,D] = eig(A); s = con<strong>de</strong>ig(A).<br />

7.6. Funcţii <strong>de</strong> matrice<br />

Exponenţiala unei matrice iniţiale ,X, se calculează cu funcţia expm.<br />

Calculul se face utilizând aproximaţia Pa<strong>de</strong>, iar apelarea cu Y=expm(X), Y fiind<br />

matricea exponenţială a lui X. Dacă X are un set <strong>de</strong> vectori proprii V, cu valorile<br />

proprii corespon<strong>de</strong>nte D, atunci:<br />

[V,D]=eig(X)<br />

expm(X)=V*diag(exp(diag(D)))/V.<br />

De menţionat că, exponenţiala unei matrice, funcţia expm(X), este<br />

diferită <strong>de</strong> funcţia exp(X), care calculează element cu element.<br />

Sunt disponibile trei variante <strong>de</strong> calcul:<br />

• Y=expm1(X), care este i<strong>de</strong>ntică cu expm, iar calculul se face cu<br />

aproximaţia Pa<strong>de</strong>;<br />

• Y=expm2(X), la care calculul exponenţialei este cel cla<strong>si</strong>c, prin serii<br />

Taylor, dar carculul este lent şi cu erori;<br />

• Y=expm3(X), calculul se efectuează prin intermediul vectorilor şi<br />

valorilor proprii şi diagonalizare, dar poate da erori dacă matricea X nu<br />

are un set <strong>de</strong> vectori proprii liniar in<strong>de</strong>pen<strong>de</strong>nţi.


168<br />

SISTEME DE PROGRAMARE PENTRU MODELARE ŞI SIMULARE<br />

Con<strong>si</strong><strong>de</strong>răm matricea X= [ 1 1 0 ; 0 0 2 ; 0 0 -1 ]. Aplicând diversele<br />

funcţii <strong>de</strong> calcul ale exponenţialei, obţinem:<br />

exp(X) = [ 2.7183 2.7183 1.0000<br />

1.0000 1.0000 7.3891<br />

1.0000 1.0000 0.3679 ],<br />

expm(X) = [ .7183 1.7183 1.0862<br />

0 1.0000 1.2642<br />

0 0 0.3679 ].<br />

Pentru acest caz, toate varianteleexpm1, expm2, expm3, conduc la acelaşi<br />

rezultat.<br />

Logaritmul unei matrice ,X, se calculează cu funcţia logm(X) şi este inversa<br />

funcţiei expm(X). Dacă X are valori proprii negative, atunci rezultatul este complex.<br />

Dacă logaritmul matricei nu se calculează cu suficientă precizie, se dă un mesaj <strong>de</strong><br />

eroare. Pentru a evita mesajul <strong>de</strong> eroare, se preferă apelarea funcţiei sub forma,<br />

[L,esterr] = logm(A),<br />

care returnează eroarea reziduală egală cu norm(expm(L)-A)/norm(A).<br />

Dacă X este real <strong>si</strong>metrică sau hermitică complexă, atunci are log(X).<br />

Unele matrice, ca <strong>de</strong> exemplu A=[0 1 ; 0 0], nu au logaritm, nici real şi nici<br />

complex şi, prin urmare, funcţia log(A) nu returnează nimic.<br />

Pentru majoritatea cazurilor,<br />

logm(expm(X)) = X = expm(logm(X)).<br />

Calculele se efectuează după algoritmul Parlett, care utilizează<br />

<strong>de</strong>scompunerea (factorizarea) Schur.<br />

Radicalul unei matrice A este calculat <strong>de</strong> funcţia sqrtm. Apelată sub<br />

forma X=sqrtm(A), aceasta calculează radicalul matricei A, astfel încât X*X = A.<br />

Matricea X este unică, dacă valorile proprii ale părţii reale nu sunt negative. Dacă o<br />

valoare proprie a părţii reale este negativă, atunci rezultatul este complex.<br />

Dacă matricea A este <strong>si</strong>ngulară, aceasta poate să nu aibă matrice radical şi,<br />

în acest caz, se dă un mesaj <strong>de</strong> eroare. Apelată cu două argumente, [X,<br />

RESNORM] = sqrtm(A), nu dă nici un mesaj <strong>de</strong> eroare, ci returnează reziduu<br />

norm(A-X^2,'fro')/norm(A,'fro').<br />

Apelată cu trei argumente <strong>de</strong> ieşire,<br />

[X, ALPHA, CONDEST] = sqrtm(A),<br />

returnează factorul <strong>de</strong> stabilitate, ALPHA şi numărul <strong>de</strong> condiţionare, CONDEST, al<br />

matricei. Reziduu norm(A-X^2,'fro')/norm(A,'fro') este aproximat <strong>de</strong> N*ALPHA*EPS,<br />

iar norma relativă Frobenius, a erorii lui X este aproximată <strong>de</strong><br />

N*ALPHA*CONDEST*eps, un<strong>de</strong> N = max(<strong>si</strong>ze(A)).<br />

Funcţia generală <strong>de</strong> evaluare a unei matrice, A, este funm şi este apelată<br />

sub forma:<br />

F=funm(A,fun),<br />

un<strong>de</strong> fun poate fi expm, logm, sqrtm sau o altă funcţie internă, ca <strong>de</strong> exemplu <strong>si</strong>n,<br />

introdusă ca funcţie handler, @.

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

Saved successfully!

Ooh no, something went wrong!