Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Lineáris egyenletrendszerek
Adott az alábbi lineáris egyenletrendszer:
nnnnnn
nn
nn
bxaxaxa
bxaxaxa
bxaxaxa
2211
22222121
11212111
(1)
melynek mátrixos alakja a következő:
bxA (2)
Ha az A n-ed rendű négyzetes mátrix reguláris (rangja n, ill. detA0), akkor a fenti
egyenletrendszer egyértelműen megoldható, melyre kétféle numerikus módszer létezik:
1. Direkt eljárás, mely az egyenletrendszert elemi átalakításokkal olyan alakra hozza,
ahonnan a megoldások közvetlenül leolvashatók.
2. Iterációs eljárás, amely adott kezdeti értékekből kiindulva a közelítő megoldások olyan
sorozatát adja, amely (1) megoldásához konvergál.
A Matlab programban ha meg van adva az A és a b mátrix, a megoldást
x=A\b
utasítással számítjuk ki.
Direkt eljárások
Gauss elimináció
Az egyenletrendszert elemi átalakításokkal (sorok felcserélése, egy sor szorzása nullától különböző
számmal, egyik sor hozzáadása egy másik sorhoz) úgynevezett lépcsős egyenletrendszer alakjára
hozzuk (felső háromszögmátrix):
cxU , ahol
nn
n
n
r
rr
rrr
U
00
0 222
11211
(3)
Az eljárás n-1 eliminációs lépésben történik. Ha a11 0 (ellenkező esetben sort cserélünk), az A
együtthatómátrix i-edik sorából kivonjuk az első sor
11
1
a
ai -szeresét (i2,3,…,n), Vagy mátrix alakban:
szorozzuk A-t S1- mátrixszal
10
01
001
11
1
11
1
1
a
a
a
a
S
n
i
majd az első sort változatlanul hagyva az eljárást folytatjuk a többi sorra.
Az ekvivalens átalakításokból adódóan (2) és (3) megoldása ugyan az, amelyet visszafelé haladva
nn
nn
r
cx -ből helyettesítéssel mind megkaphatunk:
n
ikkikii
ii
i xrcr
x1
1, (i=n-1, n-2,…,1)
Példa. Hajtsuk végre az adott egyenletrendszeren a Gauss-eliminaciot!
13
8
15
311
413
124
3
2
1
x
x
x
Megoldás
Egyenletek megoldásakor a bevett gyakorlat, hogy mindkét oldalon azonos műveleteket végzünk.
Az induló eliminációs táblázat a következő alakú (kibővített együttható mátrix):
BA
4 2 1 15
3 1 4 8
1 1 3 13
(*)
Ahhoz, hogy az első oszlopban a főátló alatti elemek eltűnjenek, az első lépésben (*)-t szorozzuk S1-
mátrixszal:
104/1
014/3
0011S
BAS1
104/1
014/3
001 4 2 1 15
3 1 4 8
1 1 3 13
4 2 1 15
0 2.5 4.75 19.25
0 0.5 2.75 9.25
(**)
Már csak a harmadik sor második elemét kell nullává változtatni, ehhez szorozzuk (**)-et S2-
mátrixszal:
15/10
010
0012S
212 BAS
15/10
010
001 4 2 1 15
0 2.5 4.75 19.25
0 0.5 2.75 9.25
4 2 1 15
0 2.5 4.75 19.25
0 0 1.80 5.40
Innen azt kapjuk, hogy 38.1
4.53 x , visszahelyettesítéssel pedig az adódik, hogy
25.2
3*75.425.192
x , 2
4
2*23151
x .
Háromszög-faktorizáció (LU-felbontás)
Az LU faktorizációs módszer levezethető a Gauss módszerből, ugyanis ha a Gauss módszerben
ismert szorzók el segítségével megszerkesztjük az S(k) elemi alsóháromszög mátrixot:
100
01..
.01..
..01..
...010
00..01
)(
)(
)(
)(1
kkk
knk
kkk
kkkk
a
a
a
aS
akkor
)1()( kkk ASA
ahol A(k) a k iterációban, Gauss módszerrel generált mátrix (A(1) = A).
Tehát
ASSSAU nn 121)( ..
ahonnan
USSSA n 111211 )....()()(
Az S(k) mátrix egyszerű szerkezetének köszönhetően könnyen kiszámítható az inverze:
100
01..
.01..
..01..
...010
00..01
)(
)(
)(
)(
)(11
kkk
knk
kkk
kkkk
a
a
a
aS
és igazolható, hogy
L
a
a
a
a
a
a
a
a
SSS
kkk
knkn
kkk
kkk
n
1....
01....
.01..
..01..
...01
00..01
)....()()(
)(
)(
)1(11
)1(1
)(
)(1
)1(11
)1(21
111211 (***)
vagyis (***)-ből A = LU.
Példa: Határozzuk meg az A mátrix LU-felbontását.
325
027
1310
A
Megoldás:
Kidolgozott példa:
>> A=[0 2 0 1 0;2 2 3 2 -2;4 -3 0 1 -7;6 1 -6 -5 6]
A =
0 2 0 1 0
2 2 3 2 -2
4 -3 0 1 -7
6 1 -6 -5 6
>> P=[0 0 0 1 ;0 1 0 0;0 0 1 0;1 0 0 0]
% A P permutáció mátrix felcseréli az első és 4 - edik sort.
P =
0 0 0 1
0 1 0 0
0 0 1 0
1 0 0 0
>> A1=P*A
A1 =
6 1 -6 -5 6
2 2 3 2 -2
4 -3 0 1 -7
0 2 0 1 0
>> S1=[1 0 0 0 ;-1/3 1 0 0;-2/3 0 1 0;0 0 0 1]
S1 =
1.0000 0 0 0
-0.3333 1.0000 0 0
-0.6667 0 1.0000 0
0 0 0 1.0000
>> A2=S1*A1
A2 =
6.0000 1.0000 -6.0000 -5.0000 6.0000
0 1.6667 5.0000 3.6667 -4.0000
0 -3.6667 4.0000 4.3333 -11.0000
0 2.0000 0 1.0000 0
>> S2=[1 0 0 0 ;0 1 0 0;0 (3.6667/1.6667) 1 0;0 -(2.0000/1.6667) 0 1]
S2 =
1.0000 0 0 0
0 1.0000 0 0
0 2.2000 1.0000 0
0 -1.2000 0 1.0000
>> A3=S2*A2
A3 =
6.0000 1.0000 -6.0000 -5.0000 6.0000
0 1.6667 5.0000 3.6667 -4.0000
0 -0.0000 14.9999 12.3999 -19.7999
0 0.0000 -5.9999 -3.3999 4.7999
>> S3=[1 0 0 0 ;0 1 0 0;0 0 1 0;0 0 (5.9999/14.9999) 1]
S3 =
1.0000 0 0 0
0 1.0000 0 0
0 0 1.0000 0
0 0 0.4000 1.0000
>> A4=S3*A3
A4 =
6.0000 1.0000 -6.0000 -5.0000 6.0000
0 1.6667 5.0000 3.6667 -4.0000
0 -0.0000 14.9999 12.3999 -19.7999
0 0.0000 0.0000 1.5600 -3.1200
Visszahelyettesítés.
>> x4=-3.1200/1.5600
x4 =
-2
>> x3=(-19.7999-12.3999*x4)/14.9999
x3 =
0.3333
>> x2=(-4.0000-5.0000*x3-3.6667*x4)/1.6667
x2 =
1.0000
>> x1=(6.0000-1.0000*x2+6.0000*x3+5.0000*x4)/6.0000
x1 =
-0.5000
Példa. Hajtsuk végre az adott egyenletrendszeren a Gauss-eliminaciot!
.1435
;252
;3432
;42210
4321
4321
4321
4321
xxxx
xxxx
xxxx
xxxx
Megoldás:
Az induló eliminációs táblázat a következő alakú (kibővített együttható mátrix):
355.140
4.28.09.42.20
8.36.08.36.20
4.02.01.02.01
14135
21521
31432
421210
846.80769.4346.400
6153.53077.11153.800
4615.123077.04615.110
4.02.01.02.01
.
8388.57772.4000
69194.016114.0100
4615.123077.04615.110
4.02.01.02.01
Innen azt kapjuk, hogy
2222.17772.4
8388.54
x
visszahelyettesítéssel pedig az adódik, hogy
.33334.0
)2222.1(2.0)88889.0(1.044443.02.04.0;44443.0
)2222.1(23077.0)88889.0(4615.14615.188889.0)2222.1(16114.069194.0
1
2
3
x
xx
Az előző eljárásból adódik, hogy minden reguláris mátrixra alkalmazható az úgynevezett
háromszög-, vagy LU-faktorizáció:
PA=LU, ahol
nn
n
n
r
rr
rrr
U
00
0 222
11211
és
1
0
1
001
1,1
21
nnn ll
lL
Felső ill. alsó háromszögmátrix (upper ill. lower triangular matrix), a P pedig egy olyan permutációs
mátrix, melynek minden sorában és minden oszlopában pontosan egy elem 1, a többi mind 0. P írja le
az A sorcseréit.
Definíció:
Permutáció mátrix (NN - es) :
A permutáció mátrix felcseréli az i - edik és j - edik sort.
Megjegyzés: ijP nem szinguláris, és belátható, hogy ijij PP 1)( .
Ennek segítségével a (2) egyenletrendszer megoldását három lépésben írhatjuk le:
1. LUPA : A háromszög-faktorizáció végrehajtása
2. bPyL : Az y meghatáozása
3. yxU : Az x megoldás meghatározása visszafelé helyettesítéssel.
Ha a lineáris egyenletrendszer megoldásánál (Ab) kibővített együttható mátrixra a Gauss-
algoritmust alkalmazzuk, az L alsó háromszögmátrixot nem használjuk. L-t hatásosan alkalmazhatjuk
akkor, amikor egyszerre több olyan lineáris egyenletrendszert kell megoldanunk, melyeknek ugyanaz
az A együttható mátrixa, de a b jobb oldalak különböző vektorok.
Egy A mátrix felbontása a Matlab programmal:
1. [L,U]=lu(A)
y = L\b;
x = U\y;
2. [L,U,P]=lu(A)
y = L\(P*b);
x = U\z;
ahol a P mátrix a permutációs mátrix, i.e.: PA=LU.
Példa:
>> A = [2 6 3; 1 5 15; 3 10 4];
>> b = [2 4 6]';
>> [L,U] = lu(A);
>> y = L\b;
>> x = U\y
x =
-7.3793
2.8966
-0.2069
Példa:
>> A=[2 4 -2;4 9 -3;-2 -3 7];
>> [L,U,P]=lu(A)
L =
1.0000 0 0
-0.5000 1.0000 0
0.5000 -0.3333 1.0000
U =
4.0000 9.0000 -3.0000
0 1.5000 5.5000
0 0 1.3333
P =
0 1 0
0 0 1
1 0 0
Cholesky FELBONTÁS
Ha az A mátrix szimmetrikus és pozitív definit, akkor az LU felbontás TLU alakban létezik, tehát
UUA T
ahol L alsó háromszögmátrix, amelynek diagonális elemei pozitív számok (nem feltétlen egyesek). Az
ilyen felbontást Cholesky felbontásnak hívjuk.
Cholesky algoritmus:
A tárgyalt algoritmusok az L mátrixot elemről-elemre számolják ki a következő képletek alapján:
33
3222
312111
333231
2221
11
332313
232212
131211
00
00
00
l
ll
lll
lll
ll
l
aaa
aaa
aaa
L főátlóbeli elemeit így számoljuk:
1
1
2i
kikiiii lal
L főátló alatti elemeit ji pedig így:
1...2,1
1
1
jil
lla
lii
i
kjkikij
ji
Az algoritmus: Ha A 3x3 mátrix:
22
312123322332223121
2
21222222
2
22
2
21
11
1331133111
11
1221122111
111111
2
11
l
llalallll
lalall
l
alall
l
alall
alal
Példa: Állítsuk elő az
97922555
2255515
55156
A
mátrix Cholesky-felbontását!
Megoldás:
Mivel A mátrix szimmetrikus, a felbontás megvalósítható Cholesky algoritmus segítségével
A keresett L mátrix tehát a
mátrix lesz.
Cholesky felbontás Matlabbal
A Matlabban a következő lépésekkel oldhatjuk meg a Cholesky felbontás alapján:
>> A = [4 2 3; 2 4 2; 3 2 4];
>> b = [9 8 9]’;
>> R = chol(A)
R =
2.0000 1.0000 1.5000
0 1.7321 0.2887
0 0 1.2910
>> x = R\y
x =
1.0000
1.0000
1.0000
Iterációs eljárások
Tekintsük
bAx
Tekintsük az
NMA
felbontást, ekkor
bxNM
bNxMx
adódik, amely a lineáris egyenletrendszerek esetén lineáris iterációkkal foglalkozunk,
melyek általában felírhatók
bMNxMx kk 1)(1)1(
Tekintsük az
U L D A
23
1312
3231
21
33
22
11
333231
232221
131211
a
aa
aa
a
a
a
a
aaa
aaa
aaa
felbontást, ahol
L alsó háromszög mátrix, D diagonális mátrix, U felső háromszög mátrix.
A Matlab programban ha meg van adva az A és a b mátrix, a felbontást következő utasítással
számítjuk ki:
>> U = triu(A,1)
>> L = tril(A,-1)
>> D = diag(diag(A))
Jacobi-eljárás
Bontsuk fel A-t a következő módon:
)( ULN
DM
Így tetszőleges x0-ból kiindulva képezhetjük a közelítő megoldások sorozatát.
bDxULDx kk 1)(1)1( )( .
Koordinátánként írva:
Tegyük fel, hogy az (1) egyenletrendszer együttható mátrixában a főátlóbeli elemek mindegyike
nullától különböző. Ekkor az i-edik sorban az xi ismeretlent kifejezhetjük, amiből a következő
iterációs formula adódik ( az iterációs index):
)(
1
)1( k
n
kik ii
ik
ii
ii x
a
a
a
bx
(i=1, 2, …, n)
( =0, 1, 2,…;)0()0(
2)0(
1 ,,, nxxx kezdeti értékek).
Ezt az eljárást teljeslépés eljárásnak is nevezik,, mert az új x(+1)
vektor valamennyi komponensét x()
vektor komponenseiből számítjuk. A Jacobi-eljárás tetszőleges kezdeti vektor esetén akkor konvergál,
ha:
1max1
n
kii ii
ik
k a
a oszlopösszeg-feltétel
vagy a
1max1
n
kii ii
ik
i a
a sorösszeg-feltétel teljesül.
Példa: Legyen
Alkalmazzuk az Ax = b lineáris egyenletrendszerre a Jacobi-iterációt!
Megoldás.
Látható, hogy az A mátrix nem átlósan domináns.
n
ijj
ijii aa1
|| || ( ij aa ijii , || )
Rendezzük át az egyenletrendszerünket a következő alakra:
5952
173
97
321
321
321
xxx
xxx
xxx
.
Látható, hogy az együttható mátrix diagonálisan domináns, így az eljárás konvergens lesz.
Innen a Jacobi-iteráció:
)525(9
1
)31(7
1
)9(7
1
213
312
321
xxx
xxx
xxx
Induljunk el az 0321 xxx kezdővektorból.
0 ,0 ,0 )0(3
)0(2
)0(1 xxx ,
1. Iteráció.
,5556.0)525(9
1
,1429.0)31(7
1
,2857.1)9(7
1
)0(2
)0(1
)1(3
)0(3
)0(1
)1(2
)0(3
)0(2
)1(1
xxx
xxx
xxx
2. Iteráció.
,7619.0)525(9
1
,7732.0)31(7
1
,1859.1)9(7
1
)1(2
)1(1
)2(3
)1(3
)1(1
)2(2
)1(3
)1(2
)2(1
xxx
xxx
xxx
….
4246.0
6865.0
1270.1
)18(3
)17(3
)18(2
)17(2
)18(1
)17(1
xx
xx
xx
Jacobi-iteráció Matlabbal
A következő függvény megadott A mátrixú, b jobb oldalú lineáris egyenletrendszer és x0 kezdeti érték
megoldását állítja elő Jacobi-iterációval maxiter számú lépésben.
function x = Jacobi_it(A,b,x0, maxiter)
D = diag(diag(A));
T = D-A;
for k = 1:maxiter
k
x = D\(T*x0+b)
x0=x;
end
Az iterációt úgy is elvégezhetjük, hogy akkor is álljon le, ha két egymást követő iteráció már elég
közel van egymáshoz.
function x = Jacobi_it_tol(A,b,x0,maxiter,tol)
D = diag(diag(A));
T = D - A;
for k = 1:maxiter
x = D\(T*x0+b);
relerr = norm(x-x0);
if relerr < tol
k
break;
end
x0=x
end
x0=x
end
Gauss-Siedel-eljárás
Bontsuk fel A-t a következő módon:
UN
LDM
Így tetszőleges x0-ból kiindulva képezhetjük a közelítő megoldások sorozatát.
bLDxULDx kk 1)(1)1( )()()( .
Koordinátánként írva:
Ez az eljárás annyiban tér el az előzőtől, hogy az új x(+1)
az i-edik komponens kiszámításához a
már ebben az iterációs lépésben nyert értékeket is felhasználjuk, és csak az i-nél nagyobb
komponensek esetében használjuk a x()
i-nél nagyobb komponensei értékét. Az )1(
1x első
komponenst a Jacobi eljárással határozzuk meg. Formálisan:
)(
1
)1(1
1
)1( k
n
ik ii
ikk
i
k ii
ik
ii
ii x
a
ax
a
a
a
bx
(i=1, 2, …, n)
( =0, 1, 2,…;)0()0(
2)0(
1 ,,, nxxx kezdeti értékek).
Ezt egyenkénti lépések módszerének is nevezik, az előző eljárásnál valamivel gyorsabban konvergál.
Példa: Legyen
Alkalmazzuk az Ax = b lineáris egyenletrendszerre a Gauss-Siedel eljárást!
Megoldás.
Látható, hogy az A mátrix nem átlósan domináns.
n
ijj
ijii aa1
|| || ( ij aa ijii , || )
Rendezzük át az egyenletrendszerünket a következő alakra:
5952
173
97
321
321
321
xxx
xxx
xxx
.
Látható, hogy az együttható mátrix diagonálisan domináns, így az eljárás konvergens lesz.
Innen a Gauss-Seidel iteráció:
0 ,0 ,0 )0(3
)0(2
)0(1 xxx ,
,4558.0)525(9
1
,6939.0)31(7
1
,2857.1)9(7
1
)1(2
)1(1
)1(3
)0(3
)1(1
)1(2
)0(3
)0(2
)1(1
xxx
xxx
xxx
,4222.0)525(9
1
,6886.0)31(7
1
,1215.1)9(7
1
)2(2
)2(1
)2(3
)1(3
)2(1
)2(2
)1(3
)1(2
)2(1
xxx
xxx
xxx
….
4246.0
6865.0
1270.1
)7(3
)6(3
)7(2
)6(2
)7(1
)6(1
xx
xx
xx
Azaz a Gauss-Seidel iteratív eljárás gyorsabban konvergál mint a Jacobi-iterációt
Gauss-Seidel-iteráció Matlabbal
Az A mátrix L és U összetevőjének az előállításához használhatjuk a tril, triu függvényeket.
(Mindkettő meghagyja A főátlóbeli elemeit is.)
A következő függvény megadott A mátrixú, b jobb oldalú lineáris egyenletrendszer és x0 kezdeti érték
megoldását állítja elő Gauss-Seidel iteracioval maxiter számú lépésben.
function x = Gauss_Seidel_it(A,b,x0,maxiter)
LD = tril(A); % LU = L + D
U = LD - A;
for i = 1:maxiter
x= LD\(U*x0+b);
end
Az iterációt úgy is elvégezhetjük, hogy akkor is álljon le, ha két egymást követő iteráció már elég
közel van egymáshoz.
function x = Gauss_Seidel_it_tol(A,b,x0,maxiter,tol)
LD = tril(A); % LU = L + D
U = LD - A;
for k = 1:maxiter
x = LD\(U*x0+b);
relerr = norm(x-x0);
if relerr < tol
k
break;
end
x0=x
end
Kidolgozott példa:
Végezzünk el egy-egy lépést a Jacobi- és a Gauss-Seidel-iterációkkal az x(0) = [0; 0;0; 0]
vektorról indulva a
10x1 – x2 + 2x3 = 6
– x1 + 11x2 – x3 + 3x4 = 25
2x1 – x2 + 10x3 – x4 = –11
3x2 – x3 + 8x4 = 15
egyenletrendszerre!
Megoldás. :
1. Jacobi-iteráció:
1
)k
1(x + k
3(x5
1k2(x
10
1))
5
3
k1(x
11
1k2(x )
1)
11
25k4(x
11
3k3(x
11
1 ))
k2(x
10
1k1(x
5
1k3(x ))
1)
10
11k4(x
10
1 )
1
)k
4(x k
3(x8
1k2(x
8
3))
8
15
Induljunk el az )0(x = (0,0,0,0)
T kezdővektorból.
1. Iteráció. )1(x = )8750.1,1000.1,2727.2,6000.0(
2. Iteráció. )2(x = (1.0473 , 1.7159 , – 0.8052 , 0.8852)
3. Iteráció. )3(x = (0.9326 , 2.0533 , – 1.0493 , 1.1309)
T
… )5(x = (0.9890 , 2.0114 , – 1.0103 , 1.0214 )
…… )10(x = (1.0001 , 1.9998 , – 0.9998 , 0.9998)
.
A pontos gyökök az x = (1, 2, – 1, 1) vektor elemei.
2. Gauss-Seidel-iteráció:
1
)k
1(x + k
3(x5
1k2(x
10
1))
5
3
1
)1
)
k
1(x11
1k2(x
11
25k4(x
11
3k3(x
11
1 ))
1
)1
)1
)
k
2(x10
1k1(x
5
1k3(x
10
11k4(x
10
1 )
1
)k
4(x 1
)1
)
k
3(x8
1k2(x
8
3
8
15
Induljunk el az )0(x = (0,0,0,0)
kezdővektorból.
1. Iteráció.
0.6000x(1)1
2.327311
25
3
0.6000x(1)
2
0.98731.10000.23270.120010
11(2.3273)
10
1
3
0.6000x(1)
3
8
150.9873)(
8
1(2.3273)
8
3x(1)
4
= – 0.8727 – 0.1234 + 1.8750 = 0.8789
)1(x = )0.87896000.0( ,0.9873,2.3273,
2. Iteráció. )2(x (1.0300 , 2.037 , – 1.014 , 0.9844)
3. Iteráció. )3(x = (0.9326 , 2.0533 , – 1.0493 , 1.1309)
… )5(x (1.0001 , 2.0000 , – 1.0000 , 1.0000)