Lineáris algebrai egyenletrendszerek megoldása a Matlabban Lineáris algebrai egyenletrendszerek a Matlabban igen egyszer en oldhatók meg. Legyen A az egyenletrendszer m-szer n-es együtthatómátrixa, és b a szabad tagok m dimenziós oszlopvektora. Megoldandó: Ax = b. El ször foglalkozzunk azzal a kérdéssel: hogyan dönthet el, hogy létezik-e megoldása az egyenletrendszernek? Ismeretes, hogy a KroneckerCapelli-tétel szerint egy lineáris algebrai egyenletrendszernek pontosan akkor létezik megoldása, ha az együtthatómátrixnak és a kib vített mátrixnak egyenl a rangja. A kib vített mátrixot könny el állítani az A mátrix egy oszloppal való kib vítésével: [A b]. A mátrixrang a rank függvénnyel számítható ki. Egy sorban is elvégezhet a létezés vizsgálata: rank(a) == rank([a b]) Ha a válasz 1, azaz igaz az állítás, akkor létezik megoldás, ha pedig 0, akkor nem létezik. Ennek a módszernek az a hátulüt je, hogy a két rang összehasonlításakor meghatározott hibahatárral dolgozik a Matlab, így ha eltérnek a rangok, akkor is egyenl séget kaphatunk. Annak eldöntésére, hogy létezik-e megoldás, és egyben egy megoldás kiszámítására a legegyszer bb módszer a Matlab backslash (bal osztás) operátorának a használata: A\b. Ennek m ködése nem is olyan egyszer. Els lépésben megpróbálja a MATLAB el állítani a Cholesky-felbontást (chol), ha ez nem sikerül (hamar kiderül, hogy nem szimmetrikus, pozitív denit a mátrix, így ez nem vesz el sok id t), akkor az LU-felbontással határozza meg a megoldást (Gauss-módszer). Ha az egyenlet túlhatározott, akkor el ször meghatározza a QR-felbontást (Householder-tükrözésekkel), majd ebb l a legkisebb négyzetes értelemben legjobban közelít megoldást. A parancsról részletes angol nyelv leírás található a http://www.weizmann.ac.il/matlab/techdoc/ref/arithmeticoperators.html#8559 oldalon. Általános szabályként megjegyezhetjük, hogy ha az egyenletrendszernek van megoldása, akkor ezzel egy megoldást mindenképpen megkapunk. De, ahogy látni fogjuk, akkor is kaphatunk eredményt, ha nincs megoldás. Ha ad valamit megoldásul a Matlab, akkor is mindenképpen ellen rizzük. Ezt megtehetjük Ax és b összehasonlításával, vagyis az r = Ax-b maradékvektor kiértékelésével. Lehet ezt normában is nézni. Ha nem nagyon kicsi a maradékvektor normája, akkor, amit kaptunk, nem fogadható el megoldásnak. Rendszerint 10 5 b használatos hibaküszöbként. 1
Nézzünk néhány példát! 1. eset: m = n és létezik egyetlen megoldás Ebben az esetben a Matlab a rendszer pontos megoldását számítja ki (eltekintve a kerekítési hibától). Legyen A = [1 2 3;4 5 6;7 8 10] A= 1 2 3 4 5 6 7 8 9 és b = ones(3,1); Ekkor x = A\b x = -1.0000 1.0000 0.0000 Annak ellen rzéseképpen, hogy jó a számított megoldás, számíttassuk ki a maradékvektort: r = b - A*x r = 1.0e-015 * 0.1110 0.6661 0.2220 Ha pontosan számolt a gép, akkor r minden elemére nullát kellene kapnunk. példában nem kaptunk pontosan nullát, ami a kerekítési hiba hatását mutatja. Ebben a 2. eset: m > n (túlhatározott az egyenletrendszer) Ekkor a Matlab azon x vektort határozza meg, amelyre az r maradékvektor elemeinek a négyzetösszege minimiális, vagyis az r, r skaláris szorzat a lehet legkisebb. r, r = Ax b, Ax b = min. 2
A minimum ott lesz, ahol ennek a skalárfüggvénynek az x szerinti deriváltja nulla, vagyis: 2A T (Ax b) = 0 A T, r = 0. Másképpen, azt az x vektort kapjuk, amelyre az teljesül, hogy a maradékvektor az A mátrix minden egyes oszlopára mer leges. Legyen A = [2-1; 1 10; 1 2]; és b maradjon a korábbi (csupa 1-es elemekkel). x = A\b x = 0.5849 0.0491 Számítsuk ki a maradékvektort: r = b - A*x r = -0.1208-0.0755 0.3170 Ezután ellen rizzük a mer legességi tulajdonság teljesülését: r'*a ans = 1.0e-014 * 0.1110 0.6994 3. eset: m < n Ekkor a Matlab egy partikuláris megoldást ad a backslash operátor beírására, amennyiben létezik ilyen. Pl. A = [1 2 3; 4 5 6]; b = ones(2,1); Ekkor 3
x = A\b x = -0.5000 0 0.5000 Ismeretes, hogy ebb l az egy darab megoldásból a megfelel Ax = 0 homogén egyenletrendszer összes megoldása segítségével megkaphatjuk az Ax = b rendszer összes megoldását. Az Ax = 0 rendszer megoldásai az A mátrix magterét alkotó vektorok. A Matlab null függvénye az A mátrix magterének ortonormált bázisát adja: z = null(a) z = 0.4082-0.8165 0.4082 A homogén rendszer összes megoldása el áll a magtér bázisát alkotó vektorok (most egy darab) összes lineáris kombinációjaként. Alább megadunk egy függvényt, amelynek a segítségével tetsz leges méret és számú vektor vagy mátrix lineáris kombinációját kiszámíthatjuk. Ehhez el ször ismerkedjünk meg egy korábban nem tanult adattípussal, a cellával. Ez a vektorhoz ill. a mátrixhoz hasonló adattípus, de eltér típusú és hosszúságú adatok is tárolhatók benne. Írjuk be a parancsablakba: A=eye(2); B='valami'; c={a,b} Az utóbbi sorral deniáltunk egy cellát: olyan tömb, amelynek els eleme a 2-szer 2- es identitásmátrix, második eleme pedig egy karaktersor: a "valami". A cella i- edik elemére a c{i} paranccsal kérdezhetünk rá. Pl. c{1} ans = [1 0; 0 1] c{2} 4
ans = valami A lineáris kombinációt számító függvényt úgy érdemes elkészíteni, hogy tetsz leges, azonos méret tömböket (vektor vagy mátrix) szorozhassunk ugyanannyi valós számmal. A tömbök megadására a vektor adattípus nem alkalmas, mert vektor elemei nem lehetnek tömbök. A megoldás az, hogy a tömbök egy cella elemei lesznek. Az alábbi függvényben két bemen adat van: a lineáris kombinációban szerepl együtthatók vektora, amit most szintén cellaként oldottunk meg (de ez lehetne vektor is), valamint azon tömbök egy cellába rendezve, amelyeknek a lineáris kombinációját meg szeretnénk kapni. function M = lincomb(v,a) % Azonos meretu tombok linearis kombinacioja. % A v = {v1,v2,...,vm} a lin. komb. egyutthatoit tartalmazza (cella) % A pedig a matrixokat A = {A1,A2,...,Am} (cella) m = length(v); [k, l] = size(a{1}); M = zeros(k, l); for i = 1:m M = M + v{i}*a{i}; end A függvény hívásakor cellaként adjuk meg az együtthatókat és vektorokat vagy mátrixokat. Például, visszatérve a megoldandó feladatra, az el bbi x és z lineáris kombinációjának kiszámítása pl. 1 és -1 együtthatókkal (ez egy megoldása lesz az Ax = b egyenletrendszernek) ezen függvény segítségével a következ képpen néz ki: w = lincomb({1,-1},{x,z}) w = -0.9082 0.8165 0.0918 Ellen rzésül számíttassuk ki a maradékvektort: r = b - A*w 5
r = 1.0e-015 * -0.4441 0.1110 6