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 = Columns 1 through 3 1.000000000000000 0.500000000000000 0.333333333333333 0.500000000000000 0.333333333333333 0.250000000000000 0.333333333333333 0.250000000000000 0.200000000000000 0.250000000000000 0.200000000000000 0.166666666666667 Column 4 0.250000000000000 0.200000000000000 0.166666666666667 0.142857142857143
A Hilbert-mátrixok nevezetesek a magas kondíciószámukról, például
cond(H)
ans = 1.551373873892904e+04
Ugyanakkor a 0 közeli determináns is mutatja, hogy ezek közel szinguláris mátrixok:
det(H)
ans = 1.653439153439305e-07
A magas kondíció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 kondíciószámú mátrixok. Megkeresésükhöz csak annyit kell kihasználni, hogy a determináns nem skálainvariáns, a kondíciószám viszont igen.
A=eye(10)*0.01; cond(A)
ans = 1
det(A)
ans = 1.000000000000000e-20
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.000000000000000 -5.000000000000001 4.000000000000001
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-elimináció folyamán.
[L,U,P]=lu(A)
L = 1.000000000000000 0 0 -0.500000000000000 1.000000000000000 0 0.500000000000000 -0.142857142857143 1.000000000000000 U = 2.000000000000000 4.000000000000000 4.000000000000000 0 7.000000000000000 10.000000000000000 0 0 0.428571428571428 P = 0 1 0 0 0 1 1 0 0
Órai feladat
Írjunk olyan függvényt Matlabban, amelynek bemenete 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