Metoda Gaussa-Seidla

Metoda Gaussa-Seidla – iteracyjna metoda numerycznego rozwiązywania układów równań liniowych. Nazwa upamiętnia niemieckich matematyków: Carla Friedricha Gaussa i Philippa Ludwiga von Seidla.

Metoda stosowana jest głównie do rozwiązywania układów o dużej liczbie równań i niewiadomych (nawet rzędu milionów), których macierz główna jest macierzą przekątniowo dominującą. Równania tego typu występują powszechnie podczas rozwiązywania równań różniczkowych cząstkowych, np. równania Laplace’a. Dla małych układów równań dużo szybsze są metody bezpośrednie, np. metoda eliminacji Gaussa, natomiast dla ogromnych układów równań lepszą zbieżność zapewniają metody nadrelaksacyjne oraz wielosiatkowe (ang. multigrid).

Definicja

Metoda Gaussa-Seidla jest metodą relaksacyjną, w której poszukiwanie rozwiązania rozpoczyna się od dowolnie wybranego rozwiązania próbnego x ( 0 ) , {\displaystyle \mathbf {x} ^{(0)},} po czym w kolejnych krokach, zwanych iteracjami, za pomocą prostego algorytmu zmienia się kolejno jego składowe, tak by coraz lepiej odpowiadały rzeczywistemu rozwiązaniu. Metoda Gaussa-Seidla bazuje na metodzie Jacobiego, w której krok iteracyjny zmieniono w ten sposób, by każda modyfikacja rozwiązania próbnego korzystała ze wszystkich aktualnie dostępnych przybliżonych składowych rozwiązania. Pozwala to zaoszczędzić połowę pamięci operacyjnej i w większości zastosowań praktycznych zmniejsza ok. dwukrotnie liczbę obliczeń niezbędnych do osiągnięcia zadanej dokładności rozwiązania.

Rozpatrzmy układ n {\displaystyle n} równań liniowych z n {\displaystyle n} niewiadomymi:

A x = b . {\displaystyle \mathbf {Ax} =\mathbf {b} .}

Pojedynczą iterację metody Gaussa-Seidla można zapisać algebraicznie jako

x ( k + 1 ) = ( D + L ) 1 ( U x ( k ) + b ) , {\displaystyle \mathbf {x} ^{(k+1)}=(\mathbf {D} +\mathbf {L} )^{-1}\left(-\mathbf {Ux} ^{(k)}+\mathbf {b} \right),}

gdzie:

D {\displaystyle \mathbf {D} } nieosobliwa macierz diagonalna,
L {\displaystyle \mathbf {L} } i U {\displaystyle \mathbf {U} } – odpowiednio macierz dolnotrójkątna i górnotrójkątna macierzy A {\displaystyle \mathbf {A} } (tzn. L {\displaystyle \mathbf {L} } oraz U {\displaystyle \mathbf {U} } mają zera na głównej przekątnej oraz A D + L + U {\displaystyle \mathbf {A} \equiv \mathbf {D} +\mathbf {L} +\mathbf {U} } ),
indeks k = 0 , 1 , 2 , {\displaystyle k=0,1,2,\dots } – numer porządkowy iteracji.

Po rozpisaniu na składowe wzór ten przyjmuje postać używaną w implementacjach numerycznych:

x i ( k + 1 ) = 1 a i i ( b i j = 1 i 1 a i j x j ( k + 1 ) j = i + 1 n a i j x j ( k ) ) , ( i = 1 , 2 , , n ) . {\displaystyle x_{i}^{(k+1)}={\frac {1}{a_{ii}}}\left(b_{i}-\sum _{j=1}^{i-1}a_{ij}x_{j}^{(k+1)}-\sum _{j=i+1}^{n}a_{ij}x_{j}^{(k)}\right),\quad (i=1,2,\dots ,n).}
Uwaga
  • W powyższych wzorach zakłada się, że w razie potrzeby kolejność równań została zmieniona tak, by dominujące (tj. największe co do modułu w danym równaniu) współczynniki równania znajdowały się na głównej przekątnej macierzy A . {\displaystyle \mathbf {A} .}
  • Jeżeli A {\displaystyle \mathbf {A} } jest macierzą nieosobliwą, to zawsze można tak przestawić jej wiersze i kolumny, by macierz D {\displaystyle \mathbf {D} } też była nieosobliwa.
  • Metodę Gaussa-Seidla stosuje się niemal wyłącznie do układów z macierzą przekątniowo dominującą, gdyż w wielu praktycznych zastosowaniach (np. przy rozwiązywaniu eliptycznych równań różniczkowych cząstkowych) jest to łatwy do spełnienia warunek gwarantujący zbieżność metody.
  • Metodę Gaussa-Seidla można stosować także do układów równań liniowych, w których macierz układu nie jest przekątniowo dominująca, ale poza nielicznymi wyjątkami zwykle nie ma gwarancji, że w tym przypadku metoda będzie zbieżna[a].

Warunki zbieżności

Warunki wystarczające

Kryterium silnej dominacji w rzędach

Metoda Gaussa-Seidla jest zbieżna dla każdej macierzy A {\displaystyle \mathbf {A} } spełniającej warunek ścisłej dominacji przekątniowej w rzędach[1]:

| a i i | > j = 1 , j i n | a i j | d l a   w s z y s t k i c h   i = 1 , 2 , , n . {\displaystyle |a_{ii}|>\sum _{j=1,j\neq i}^{n}|a_{ij}|\qquad \mathrm {dla~wszystkich~} i=1,2,\dots ,n.}

Kryterium silnej dominacji w kolumnach

Metoda Gaussa-Seidla jest zbieżna dla każdej macierzy A {\displaystyle \mathbf {A} } spełniającej warunek ścisłej dominacji przekątniowej w kolumnach[1]:

| a j j | > i = 1 , i j n | a i j | d l a   w s z y s t k i c h   j = 1 , 2 , , n . {\displaystyle |a_{jj}|>\sum _{i=1,i\neq j}^{n}|a_{ij}|\qquad \mathrm {dla~wszystkich~} j=1,2,\dots ,n.}

Kryterium słabej dominacji w rzędach

Kolejne kryterium dotyczy nieredukowalnych układów równań liniowych[b]. Jeżeli wszystkie wyrazy diagonalne macierzy nieredukowalnej[c][d] A {\displaystyle \mathbf {A} } dominują rzędami w sensie słabym

| a i i | j = 1 , j i n | a i j | d l a   w s z y s t k i c h   i = 1 , 2 , , n {\displaystyle |a_{ii}|\geqslant \sum _{j=1,j\neq i}^{n}|a_{ij}|\qquad \mathrm {dla~wszystkich~} i=1,2,\dots ,n}

oraz jeżeli dla co najmniej jednego wiersza i { 1 , 2 , , n } {\displaystyle i\in \{1,2,\dots ,n\}} zachodzi dominacja silna:

| a i i | > j = 1 , j i n | a i j | , {\displaystyle |a_{ii}|>\sum _{j=1,j\neq i}^{n}|a_{ij}|,}

to ciąg iteracji Gaussa-Seidla jest zbieżny[1][2].

Kryterium słabej dominacji w kolumnach

Jeżeli wszystkie wyrazy diagonalne macierzy nieredukowalnej[c] A {\displaystyle \mathbf {A} } dominują kolumnami w sensie słabym

| a j j | i = 1 , i j n | a i j | d l a   w s z y s t k i c h   i = 1 , 2 , , n {\displaystyle |a_{jj}|\geqslant \sum _{i=1,i\neq j}^{n}|a_{ij}|\qquad \mathrm {dla~wszystkich~} i=1,2,\dots ,n}

oraz jeżeli dla co najmniej jednej kolumny j { 1 , 2 , , n } {\displaystyle j\in \{1,2,\dots ,n\}} zachodzi dominacja silna:

| a j j | > i = 1 , i j n | a i j | , {\displaystyle |a_{jj}|>\sum _{i=1,i\neq j}^{n}|a_{ij}|,}

to ciąg iteracji Gaussa-Seidla jest zbieżny[1].

Kryterium dodatniej określoności

Jeżeli macierz A {\displaystyle \mathbf {A} } jest dodatnio określona, to metoda Gaussa-Seidla jest zbieżna dla dowolnego wektora początkowego[1][3].

Warunek konieczny i wystarczający

Niech

B = ( D + L ) 1 U {\displaystyle \mathbf {B} =-(\mathbf {D} +\mathbf {L} )^{-1}\mathbf {U} }

Metoda Gaussa-Seidla jest zbieżna wtedy i tylko wtedy, gdy moduły wszystkich wartości własnych B {\displaystyle \mathbf {B} } są mniejsze od 1[3].

Uwaga: powyższe kryterium jest niepraktyczne i nie jest wykorzystywane w obliczeniach numerycznych.

Warunek zakończenia iteracji

W praktyce iteracje Gaussa-Seidla kończy się wtedy, gdy dla iteracji o numerze k > 1 {\displaystyle k>1} maksymalna względna zmiana składowej przybliżonego rozwiązania nie przekracza pewnego z góry zadanego małego parametru ε {\displaystyle \varepsilon } (np. 10 10 {\displaystyle 10^{-10}} ):

max i | x i k x i k 1 | < ε max i | x i k | . {\displaystyle \max _{i}|x_{i}^{k}-x_{i}^{k-1}|<\varepsilon \max _{i}|x_{i}^{k}|.}

Alternatywny sposób polega na śledzeniu wektora reszt:

r = b A x . {\displaystyle \mathbf {r} =\mathbf {b} -\mathbf {Ax} .}

Obliczenia przerywa się, gdy max i | r i | {\displaystyle \max _{i}|r_{i}|} osiągnie wartość mniejszą od pewnego z góry ustalonego małego parametru ϵ . {\displaystyle \epsilon .}

Uwagi:

  • W metodzie Gaussa-Seidla w każdym kroku modyfikuje się pewną składową rozwiązania ( x j {\displaystyle x_{j}} ), tak by wyzerować odpowiadającą mu składową wektora reszt ( r j {\displaystyle r_{j}} ).
  • Sukcesywne zerowanie jednej lub kilku składowych wektora reszt stanowi istotę wszystkich metod relaksacyjnych.
  • Aktualizacja wektora reszt w kolejnych krokach może być przeprowadzona stosunkowo niewielkim nakładem obliczeń.

Przykłady

Układ trzech równań liniowych

Rozważmy następujący układ równań liniowych:

{ x 1 + 6 x 2 + x 3 = 9 4 x 1 x 2 + x 3 = 4 x 1 + 2 x 2 + 5 x 3 = 2 {\displaystyle {\begin{cases}x_{1}+6x_{2}+x_{3}=9\\4x_{1}-x_{2}+x_{3}=4\\-x_{1}+2x_{2}+5x_{3}=2\end{cases}}}

W pierwszym i drugim równaniu wyrazy dominujące ( 6 x 2 {\displaystyle 6x_{2}} i 4 x 1 {\displaystyle 4x_{1}} ) leżą poza główną przekątną. Po zamianie kolejności tych równań otrzymujemy układ, w którym wartości dominujące leżą na głównej przekątnej:

4 x 1 x 2 + x 3 = 4 {\displaystyle 4x_{1}-x_{2}+x_{3}=4}
x 1 + 6 x 2 + x 3 = 9 {\displaystyle x_{1}+6x_{2}+x_{3}=9}
x 1 + 2 x 2 + 5 x 3 = 2 {\displaystyle -x_{1}+2x_{2}+5x_{3}=2}

Układ ten spełnia warunek zbieżności metody (macierz układu jest dominująca przekątniowo). Układ zapisujemy w postaci równań na wyrazy dominujące:

x 1 = 1 4 ( 4 + x 2 x 3 ) {\displaystyle x_{1}={\tfrac {1}{4}}(4+x_{2}-x_{3})}
x 2 = 1 6 ( 9 x 1 x 3 ) {\displaystyle x_{2}={\tfrac {1}{6}}(9-x_{1}-x_{3})}
x 3 = 1 5 ( 2 + x 1 2 x 2 ) {\displaystyle x_{3}={\tfrac {1}{5}}(2+x_{1}-2x_{2})}

Dokonujemy wyboru („zgadujemy”) wartości x 2 {\displaystyle x_{2}} i x 3 , {\displaystyle x_{3},} np. x 2 = 0 {\displaystyle x_{2}=0} i x 3 = 0. {\displaystyle x_{3}=0.} Następnie podstawiamy te wartości do równania na x 1 , {\displaystyle x_{1},} uzyskując początkową wartość x 1 . {\displaystyle x_{1}.} Tak uzyskaną wartość podstawiamy do równania na x 2 , {\displaystyle x_{2},} uzyskując nowe przybliżenie tej niewiadomej. Iteracje kontynuujemy do osiągnięcia określonej dokładności względnej.

Dla x 2 = 0 {\displaystyle x_{2}=0} i x 3 = 0 {\displaystyle x_{3}=0} powyższa procedura daje następujące wyniki (dwie pełne iteracje):

x 1 = 1 4 ( 4 + 0 0 ) = 1 {\displaystyle x_{1}={\tfrac {1}{4}}(4+0-0)=1}
x 2 = 1 6 ( 9 1 0 ) = 4 3 1,333 {\displaystyle x_{2}={\tfrac {1}{6}}(9-1-0)={\tfrac {4}{3}}\approx 1{,}333}
x 3 = 1 5 ( 2 + 1 2 4 3 ) = 1 15 0,066 7 {\displaystyle x_{3}={\tfrac {1}{5}}(2+1-2\cdot {\tfrac {4}{3}})={\tfrac {1}{15}}\approx 0{,}0667}
x 1 = 1 4 ( 4 + 4 3 1 15 ) = 79 60 1,317 {\displaystyle x_{1}={\tfrac {1}{4}}(4+{\tfrac {4}{3}}-{\tfrac {1}{15}})={\tfrac {79}{60}}\approx 1{,}317}
x 2 = 1 6 ( 9 79 60 1 15 ) = 457 360 1,269 {\displaystyle x_{2}={\tfrac {1}{6}}(9-{\tfrac {79}{60}}-{\tfrac {1}{15}})={\tfrac {457}{360}}\approx 1{,}269}
x 3 = 1 5 ( 2 + 79 60 2 457 360 ) = 7 45 0,155 6 {\displaystyle x_{3}={\tfrac {1}{5}}(2+{\tfrac {79}{60}}-2\cdot {\tfrac {457}{360}})={\tfrac {7}{45}}\approx 0{,}1556}

Dokładne rozwiązanie: x 1 = 23 18 1,278 , {\displaystyle x_{1}={\tfrac {23}{18}}\approx 1{,}278,} x 2 = 53 42 1,262 , {\displaystyle x_{2}={\tfrac {53}{42}}\approx 1{,}262,} x 3 = 19 126 0,150 8. {\displaystyle x_{3}={\tfrac {19}{126}}\approx 0{,}1508.}

Jak łatwo sprawdzić, gdyby na początku nie zmieniono kolejności równań, iteracje Gaussa-Seidla byłyby rozbieżne.

Jednowymiarowe równanie Laplace’a

Jednowymiarowe równanie Laplace’a ma postać A x = b , {\displaystyle \mathbf {Ax} =\mathbf {b} ,} gdzie A {\displaystyle \mathbf {A} } jest macierzą trójprzekątniową:

A = [ 2 1 1 2 1 1 1 2 ] {\displaystyle \mathbf {A} ={\begin{bmatrix}2&-1&&&\\-1&2&-1&\ddots &\\&\ddots &\ddots &\ddots &-1\\&&&-1&2\end{bmatrix}}}

Macierz A , {\displaystyle \mathbf {A} ,} jako pełna macierz trójprzekątniowa, jest nieredukowalna[c]. Wszystkie elementy dominujące znajdują się na głównej przekątnej. Wartość bezwzględna każdego elementu dominującego jest co najmniej równa sumie wartości bezwzględnych pozostałych elementów w danym wierszu. Istnieją dwa elementy dominujące (w pierwszym i ostatnim wierszu, czyli na brzegach układu), których wartość bezwzględna jest większa od sumy wartości bezwzględnych pozostałych elementów wiersza. Dlatego na mocy kryterium dominacji przekątniowej metoda Gaussa-Seidla jest w przypadku tego równania zbieżna.

Ten sam wniosek można wyciągnąć z kryterium dodatniej określoności macierzy A , {\displaystyle \mathbf {A} ,} ale wymaga to bardziej zaawansowanych rachunków.

Równanie niezbieżne

Rozpatrzmy układ równań A x = Θ , {\displaystyle \mathbf {Ax} ={\boldsymbol {\Theta }},} gdzie

A = [ 2 1 1 1 2 1 1 1 2 ] {\displaystyle \mathbf {A} ={\begin{bmatrix}2&-1&-1\\-1&2&-1\\-1&-1&2\end{bmatrix}}}

Układ ten ma nieskończenie wiele rozwiązań postaci x = c [ 1 , 1 , 1 ] , {\displaystyle \mathbf {x} =c[1,1,1],} gdzie c {\displaystyle c} jest dowolną liczbą rzeczywistą. Macierz A {\displaystyle \mathbf {A} } nie spełnia żadnego z opisanych powyżej warunków dostatecznych zbieżności metody Gaussa-Seidla. Mimo tego, jak łatwo sprawdzić, metoda Gaussa-Seidla jest w tym przypadku zbieżna dla każdego wektora początkowego x 0 ; {\displaystyle x_{0};} problem w tym, że wartość graniczna zależy od wyboru rozwiązania próbnego x ( 0 ) . {\displaystyle \mathbf {x} ^{(0)}.}

Algorytm

Wybierz początkowe przybliżenie x ( 0 ) {\displaystyle \mathbf {x} ^{(0)}}
for k := 1 step 1 until oczekiwane przybliżenie do
for i := 1 step 1 until n do
σ = 0 {\displaystyle \sigma =0}
for j := 1 step 1 until i-1 do
σ = σ + a i j x j ( k ) {\displaystyle \sigma =\sigma +a_{ij}x_{j}^{(k)}}
end (j-for)
for j := i+1 step 1 until n do
σ = σ + a i j x j ( k 1 ) {\displaystyle \sigma =\sigma +a_{ij}x_{j}^{(k-1)}}
end (j-for)
x i ( k ) = ( b i σ ) a i i {\displaystyle x_{i}^{(k)}={\frac {\left({b_{i}-\sigma }\right)}{a_{ii}}}}
end (i-for)
sprawdź, czy osiągnięto oczekiwane przybliżenie
end (k-for)
x x ( k ) {\displaystyle \mathbf {x} \approx \mathbf {x} ^{(k)}}

Przykład w Python 3 i pakiecie NumPy

import numpy as np

ITERATION_LIMIT = 1000

# initialize the matrix
A = np.array([[10., -1., 2., 0.],
       [-1., 11., -1., 3.],
       [2., -1., 10., -1.],
       [0.0, 3., -1., 8.]])
# initialize the RHS vector
b = np.array([6., 25., -11., 15.])

# prints the system
print("System:")
for i in range(A.shape[0]):
  row = ["{}*x{}".format(A[i, j], j + 1) for j in range(A.shape[1])]
  print(" + ".join(row), "=", b[i])
print()

x = np.zeros_like(b)
for it_count in range(ITERATION_LIMIT):
  print("Current solution:", x)
  x_new = np.zeros_like(x)

  for i in range(A.shape[0]):
    s1 = np.dot(A[i, :i], x_new[:i])
    s2 = np.dot(A[i, i + 1:], x[i + 1:])
    x_new[i] = (b[i] - s1 - s2) / A[i, i]

  if np.allclose(x, x_new, rtol=1e-8):
    break

  x = x_new

print("Solution:")
print(x)
error = np.dot(A, x) - b
print("Error:")
print(error)

Powyższy przykład wyświetla wynik:

System:
10.0*x1 + -1.0*x2 + 2.0*x3 + 0.0*x4 = 6.0
-1.0*x1 + 11.0*x2 + -1.0*x3 + 3.0*x4 = 25.0
2.0*x1 + -1.0*x2 + 10.0*x3 + -1.0*x4 = -11.0
0.0*x1 + 3.0*x2 + -1.0*x3 + 8.0*x4 = 15.0

Current solution: [ 0. 0. 0. 0.]
Current solution: [ 0.6     2.32727273 -0.98727273 0.87886364]
Current solution: [ 1.03018182 2.03693802 -1.0144562  0.98434122]
Current solution: [ 1.00658504 2.00355502 -1.00252738 0.99835095]
Current solution: [ 1.00086098 2.00029825 -1.00030728 0.99984975]
Current solution: [ 1.00009128 2.00002134 -1.00003115 0.9999881 ]
Current solution: [ 1.00000836 2.00000117 -1.00000275 0.99999922]
Current solution: [ 1.00000067 2.00000002 -1.00000021 0.99999996]
Current solution: [ 1.00000004 1.99999999 -1.00000001 1.    ]
Current solution: [ 1. 2. -1. 1.]
Solution:
[ 1. 2. -1. 1.]
Error:
[ 2.06480930e-08 -1.25551054e-08  3.61417563e-11  0.00000000e+00]

Uwagi

  1. Metoda iteracyjna wyrażona równaniem Q x ( k ) = ( Q A ) x ( k 1 ) + b {\displaystyle \mathbf {Qx} ^{(k)}=(\mathbf {Q} -\mathbf {A} ){\mathbf {x} ^{(k-1)}+\mathbf {b} }} jest zbieżna, gdy ciąg ( x ( k ) ) {\displaystyle (\mathbf {x} ^{(k)})} jest zbieżny do x {\displaystyle \mathbf {x} } dla dowolnego wektora początkowego x ( 0 ) . {\displaystyle \mathbf {x} ^{(0)}.}
  2. Tj. takich układów, których nie można uporządkować przez permutacje wierszy i kolumn w ten sposób, by niektóre niewiadome można było wyznaczyć poprzez rozwiązanie mniejszej liczby równań niż n . {\displaystyle n.}
  3. a b c Macierz A {\displaystyle \mathbf {A} } jest nieredukowalna, jeżeli poprzez przestawienie wierszy i kolumn nie można jej sprowadzić do postaci blokowej górnej trójkątnej.
  4. Nieredukowalność macierzy kwadratowej A {\displaystyle \mathbf {A} } stopnia n {\displaystyle n} można sprawdzić za pomocą grafu skierowanego G ( A ) {\displaystyle G(\mathbf {A} )} mającego n {\displaystyle n} węzłów P 1 , P 2 , , P n , {\displaystyle P_{1},P_{2},\dots ,P_{n},} w którym para ( P i , P j ) {\displaystyle (P_{i},P_{j})} jest połączona ścieżką od P i {\displaystyle P_{i}} do P j {\displaystyle P_{j}} wtedy i tylko wtedy, gdy a i j 0. {\displaystyle a_{ij}\neq 0.} Macierz A {\displaystyle \mathbf {A} } jest nieredukowalna wtedy i tylko wtedy, gdy między dowolnymi dwoma różnymi węzłami P i , P j {\displaystyle P_{i},P_{j}} w grafie G ( A ) {\displaystyle G(\mathbf {A} )} istnieje połączenie ścieżkami.

Przypisy

  1. a b c d e Stoer i Bulirsch, 1993.
  2. Tannehill i in., 1997.
  3. a b Ralston, 1983.

Bibliografia

  • AnthonyA. Ralston AnthonyA., Wstęp do analizy numerycznej, RomanR. Zuber (tłum.), StefanS. Paszkowski (oprac.), Warszawa: PWN, 1983, ISBN 83-01-01626-4, OCLC 749823556 .
  • JosefJ. Stoer JosefJ., Introduction to Numerical Analysis, Second Edition, RolandR. Bulirsch, wyd. 2nd ed, New York: Springer-Verlag, 1993, ISBN 0-387-97878-X, OCLC 26097604 .
  • John C. Tannehill, Dale A. Anderson i Richard H. Pletcher, Computational Fluid Mechanics and Heat Transfer (Second Edition), Francis & Taylor, Philadelphia, 1997, ISBN 1-56032-046-X.

Literatura dodatkowa

  • David Kincaid, Ward Cheney, Analiza Numeryczna ISBN 83-204-3078-X.

Linki zewnętrzne

  • Metoda Gaussa-Seidla