download - Sisteme de Programare pentru Modelare si Simulare
download - Sisteme de Programare pentru Modelare si Simulare
download - Sisteme de Programare pentru Modelare si Simulare
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, @.