Gauss–Seidel-módszer

Innen: testwiki
A lap korábbi változatát látod, amilyen imported>Bean49 2024. április 21., 16:11-kor történt szerkesztése után volt. (syntaxhighlight)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

A Gauss–Seidel néven ismert eljárás egy iteratív módszer, alkalmas a nagyobb méretű, nem feltétlenül ritka együttható-mátrixú lineáris egyenletrendszerek megoldására. Indirekt módszer, amely – a direkt módszerekkel ellentétben – nem véges, előre meghatározott számú lépés után téríti vissza a keresett megoldásvektort tökéletesen pontosan (ha a kerekítési hibáktól eltekintünk), hanem az eljárás során az iterációs lépéseket addig ismételjük, míg egy általunk meghatározott pontosságig az ismeretleneket meg nem határozzuk, tehát akkor állunk meg a lépesekkel, mikor már két egymás utáni lépésben kapott ismeretlen értékek különbsége kisebb egy általunk meghatározott értéknél (vagyis, ha hiba elhanyagolható).

A Gauss–Seidel-módszer hasonlít a Jacobi-módszerhez. Mindkét módszer ugyanahhoz a megoldáshoz konvergál, de a Gauss–Seidel-módszer konvergenciája gyorsabb, mert a következő xn ismeretlen kiszámításához felhasználja az ugyanabban a ciklusban már kiszámolt xn1,xn2.... stb. ismeretlenek értékeit. Ez azt jelenti, hogy ugyanolyan pontosság eléréséhez ezzel a módszerrel kevesebb iterációt kell végrehajtanunk.

Leírás

A Gauss–Seidel-módszer esetében az iterációs képlet a következő lesz:

xi(k+1)=biaiil=1(i1)ailaiixl(k+1)l=i+1(n)ailaiixl(k)

A módszer elvének megértése érdekében tekintsünk egy példát:

(a11a12a21a22)(x1x2)=(b1b2)

Az áttekinthetőség kedvéért átírjuk egyenletek formájába:

{a11x1+a12x2=b1a21x1+a22x2=b2

Innen kifejezhető az x1 és x2 ismeretlen, így a következő egyenleteket kapjuk:

x1=a12a11x2+b1a11,

x2=a21a22x1+b2a22

Az így kapott egyenletrendszert úgy oldhatjuk meg, hogy kezdetben kiindulunk az x1(0), illetve az x2(0) legjobb becslésünkből, vagy az egyszerűség kedvéért indulhatunk 0-ból is. Ezután felhasználva az

x1(k)=a12a11x2(k1)+b1a11,

x2(k)=a21a22x1(k1)+b2a22

lépéseket, eljuthatunk egy jobb közelítő értékig.

Az x2 kiszámítására már használhatjuk az x1 új értékét is. Vagyis:

x1(k)=a12a11x2(k1)+b1a11

x2(k)=a21a22x1(k)+b2a22

Ebben az esetben a Gauss–Seidel-féle iterációs módszert kapjuk eredményül.

Konvergencia

A módszer konvergenciája függ az A mátrixtól, vagyis iterációs eljárással eljutunk a megoldásig, ha:

Egy általános, x(k)=Gx(k1)+c alakú iterációs képlet akkor konvergál bármely kezdeti x(0)vektor esetén, ha a G mátrix spektrálsugara kisebb, mint 1:

limx(k)x=0ρ(G)<1 , xa megoldásvektor.

Általánosabban tárgyalva a problémát, feladatunk a Ax=b alakú egyenletrendszer megoldása. Így a fentebb tárgyalt iterációs képlet mátrix-alakban a következő:

x(k)=(IQ1A)x(k1)+Q1b ahol a Q mátrix A főátlóját és a főátló alatti elemeit tartalmazza. Ez olyan, mintha a fenti egyenletrendszerünkben az összes egyenletből kifejeztük volna a változókat. Bizonyított, hogy a (IQ1A) mátrix sugara kisebb, mint 1, ha az A mátrix szigorúan diagonálisan domináns, tehát a módszer konvergálni fog ilyen esetben.[2]

Algoritmus

A Jacobi-algoritmusban az y segédtömb arra szolgál, hogy az x értékeit ne írjuk felül, amielőtt kiszámítottuk volna az összes új értéket. A Gauss–Seidel-módszer algoritmusában egyszerűbb a helyzet, mert azonnal felülírhatjuk a régi értékeket, ezzel gyorsítva az algoritmust. Kezdetben a megoldást tartalmazó x tömb a becslést tartalmazza.

Input: A(n,n) , b(n), x(n), iter_max
Output: x(n)

function Jacobi:
      for k = 1 to iter_max do
          for i = 1 to n do
              y[i] = b[i]  
              for j = 1 to n do
                  if j != i then
                      y[i] ← y[i] − A[i][j]*x[j]
                  end if
              end for
             x[i] ← y[i]/A[i][i]
         end for
     end for
     return x
 end function
Input: A(n,n), b(n), x(n), iter_max
Output: x(n)

function Gauss_Seidel:
      for k = 1 to iter_max do
          for i = 1 to n do
              x[i] = b[i]  
              for j = 1 to n do
                  if j != i then
                      x[i] ← x[i] − A[i][j]*x[j]
                  end if
              end for
             x[i] ← x[i]/A[i][i]
         end for
     end for
     return x
 end function

Jegyzetek

Sablon:Jegyzetek

Fordítás

Források

Kapcsolódó szócikkek