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