download - Sisteme de Programare pentru Modelare si Simulare
download - Sisteme de Programare pentru Modelare si Simulare
download - Sisteme de Programare pentru Modelare si Simulare
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
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, @.