Harmadik labor: Lineáris egyenletrendszerek
Contents
A kondíciószám
Egy mátrix kondíciószámát a cond() függvénnyel kérdezhetjük le, például nem meglepő módon
cond(eye(5),1)
ans = 1
illetve
cond(eye(5),2)
ans = 1
A Matlabban sok nevezetes mátrixcsalád megtalálható beépített függvényként, például a Hilbert-mátrixok is. Ezeknek (i, j)-edik eleme 1/(i+j+1).
H=hilb(4)
H = 1.0000 0.5000 0.3333 0.2500 0.5000 0.3333 0.2500 0.2000 0.3333 0.2500 0.2000 0.1667 0.2500 0.2000 0.1667 0.1429
A Hilbert-mátrixok nevezetesek a magas kondiciószámukról, például
cond(H)
ans = 1.5514e+04
Ugyanakkor a 0 közeli determináns is mutatja, hogy ezek közel szinguláris mátrixok:
det(H)
ans = 1.6534e-07
A magas kondiciószám nem feltétlen jelent 0 közeli determinánst. Vegyük például azt az A mátrixot, amit úgy kapunk, hogy az egységmátrix bal felső elemét kicseréljük egy nagy, pozitív 'a' konstansra. Ekkor det(A)=a és cond(A)=a (hiszen A szimmetrikus, a legnagyobb séje a, a legkisebb 1), például:
A=eye(10); A(1,1)=100; cond(A)
ans = 100
det(A)
ans = 100
Másfelől léteznek 0 közeli determinánssal alacsony kondiciószámú mátrixok. Megkeresésükhöz csak annyit kell kihasználni, hogy a determináns nem skálainvariáns, a kondiciószám viszont igen.
A=eye(10)*0.01; cond(A)
ans = 1
det(A)
ans = 1.0000e-20
Sajátértékek
Az eig() polimorf függvény szolgál a sajátértékek meghatározására:
C=[1 0 3; 4 3 -1; 3 -5 8] eig(C)
C = 1 0 3 4 3 -1 3 -5 8 ans = -1.5938 4.9175 8.6763
viszont a sajátvektorok lekérdezhetőek:
[Vc,Lc]=eig(C)
Vc = 0.5904 -0.4623 0.3625 -0.6252 -0.6495 0.0920 -0.5105 -0.6037 0.9274 Lc = -1.5938 0 0 0 4.9175 0 0 0 8.6763
ennek segítségével a spektálfelbontása:
Vc*Lc*inv(Vc)
ans = 1.0000 0.0000 3.0000 4.0000 3.0000 -1.0000 3.0000 -5.0000 8.0000
Mivel C nem szimmetrikus mátrix, ezért V nem ortogonális, így
Vc*Lc*Vc'
ans = 1.6352 2.3543 4.7692 2.3543 1.5251 2.1600 4.7692 2.1600 8.8397
nem a C-t adja vissza. Viszont tudjuk, hogy valós szimmetrikus mátrixokra létezik ortogonális bázis, így például
D=[1 2 3; 2 4 5; 3 5 7]
D = 1 2 3 2 4 5 3 5 7
[V,L]=eig(D)
V = -0.9008 0.3004 0.3135 -0.0785 -0.8229 0.5628 0.4270 0.4824 0.7648 L = -0.2478 0 0 0 0.3388 0 0 0 11.9090
V*L*V'
ans = 1.0000 2.0000 3.0000 2.0000 4.0000 5.0000 3.0000 5.0000 7.0000
mert a Matlab normálja V-t, így
V'*V
ans = 1.0000 -0.0000 -0.0000 -0.0000 1.0000 -0.0000 -0.0000 -0.0000 1.0000
de
Vc'*Vc
ans = 1.0000 0.4413 -0.3170 0.4413 1.0000 -0.7872 -0.3170 -0.7872 1.0000
ami mutatja, hogy bár a sajátvektorok egy hosszúak, de nem merőlegesek.
LER-ek megoldása
A linsolve() parancs segítségével oldhatjuk meg a lineáris egyenletrendszereket. Ha nincs speciális tulajdonsága a mátrixnak, akkor a linsolve() Gauss-eliminációt csinál részleges főelemkiválasztással:
A=[1 1 1; 2 4 4; -1 5 8]
A = 1 1 1 2 4 4 -1 5 8
b=[3 ;4 ; 3]
b = 3 4 3
x=linsolve(A,b)
x = 4.0000 -5.0000 4.0000
Az lu() parancs segítségével meg is kaphatjuk a módosított Gauss-elimináció folyamán keletkező P, L, U mátrixokat. Figyeljük meg, hogy L normált mátrix, azaz minden eleme 1-nél kisebb abszolútértékű. A P mátrixból kiderül, hogy volt sorcsere a Gauss-elmináció folyamán.
[L,U,P]=lu(A)
L = 1.0000 0 0 -0.5000 1.0000 0 0.5000 -0.1429 1.0000 U = 2.0000 4.0000 4.0000 0 7.0000 10.0000 0 0 0.4286 P = 0 1 0 0 0 1 1 0 0
Órai feladat
Írjunk olyan függvényt Matlabban, amelynek bemente egy tetszőleges négyzetes mátrix, és végrehajtja a sorcsere nélküli Gauss-eliminációt A-n, a kibővített együtthatómátrixszal most nem foglalkozunk. A kimenet legyen az így kapott L és U mátrix, vagy egy hibaüzenet ha az eljárás elakadt.
function [L, U]=simaGauss(A) U=A; L=eye(size(A,1)); for i=1:size(A,2)-1 if A(i,i)==0 error('A főátlóba 0 került!'); end gausstr=eye(size(A,1)); gausstr(i+1:end,i)= -U(i+1:end,i)./U(i,i); U=gausstr*U; L(i+1:end,i)=-gausstr(i+1:end,i); end