ガウス・ザイデル法

数値線形代数においてガウス・ザイデル法はリープマン法あるいは逐次変位法とも呼ばれ線形方程式系を解く反復法である。ドイツの数学者カール・フリードリヒ・ガウスフィリップ・ルートヴィヒ・フォン・ザイデルにちなんで名付けられた。対角成分がゼロでない任意の行列に適用できるが、収束が保証されるのは、行列が厳密に対角優勢な場合、[1]あるいは対称かつ正定値行列である場合のみである。この法則は、ガウスが1823年に弟子のゲルリングに宛てた私信の中でのみ言及されている。[2]ザイデルによる出版物は1874年より前には発表されていなかった。[3]

説明

をn個の線形方程式の正方連立方程式とします

と が既知で が未知の場合、ガウス・ザイデル法を用いて を反復的に近似することができます。ベクトル はの初期推定値(多くの場合)を表します。 を の-回目の近似値または反復で表しを次の(または -回目の)反復における の近似値で表します。

行列ベースの式

解は、 によって反復的に得られます。ここで、行列は下三角成分と、となる厳密に上三角成分に分解されます[4]具体的には、をと に分解すると次の式で与えられます。

行列ベースの式が機能する理由

線形方程式系は次のように書き直すことができます。

ガウス・ザイデル法では、右辺の の値を として、この式の左辺を について解きます。解析的には、これは次のように書けます。

要素ベースの式

しかし、の三角形状を利用することで、の要素は前方置換を用いて各行ごとに順番に計算することができる[5]

この式では、反復ごとに2つの合計が用いられますが、これは最後に計算された反復 を用いた1つの合計として表すことができます。この手順は通常、反復による変化が、例えば残差 が十分に小さいなど、ある許容範囲を下回るまで続けられます

議論

ガウス・ザイデル法の要素ごとの式は、(反復)ヤコビ法の式と関連していますが、重要な違いがあります。

ガウス・ザイデル法では、 の計算には、既に計算済みのの要素と、 回目の反復で計算されていないの要素のみが使用されます。これは、ヤコビ法とは異なり、要素は計算中に上書きできるため、必要な記憶ベクトルは1つだけであることを意味します。これは、非常に大規模な問題の場合に有利です。

しかし、ヤコビ法とは異なり、各要素の計算はクリティカルパスが非常に長くなる可能性があるため、並列実装が一般的に非常に困難であり、疎行列で最も実現可能です。さらに、各反復における値は元の方程式の順序に依存します。

ガウス・ザイデルは、による逐次過剰緩和と同じです

収束

ガウス・ザイデル法の収束特性は行列に依存します。つまり、この法は次のいずれかの条件を満たす場合に収束することが知られています。

  • 対称正定値である[ 6]または
  • は厳密または不可約的に対角優勢である。[7]

ガウス・ザイデル法は、これらの条件が満たされていなくても収束する可能性があります。

ゴルブとヴァン・ローンは、2つの部分に分割できるアルゴリズムの定理を与えている。が非特異であるとする。を のスペクトル半径とする。すると、が非特異で のとき、 で定義される反復は任意の開始ベクトルに対して に収束する[8]

アルゴリズム

このアルゴリズムでは、要素は計算時に上書きできるため、必要な記憶ベクトルは1つだけで、ベクトルのインデックス付けは省略されます。アルゴリズムは以下のようになります。

アルゴリズムガウス・ザイデル法 入力:  A , b 出力:  φ 解の初期推定値φ を選択し、収束するまで 繰り返します。iに対して 1からnまでσ ← 0 を実行します。 jに対して1からnまでjiの場合σ  σ + a ij φ j end if end ( j -loop) φ i ← ( b iσ ) / a ii end ( i -loop)                 収束に達したかどうかを確認する 終了(繰り返し)

マトリックスバージョンの例

次のように表される線形システムは次のようになります。

次の形式の方程式を使用します

下三角成分と厳密な上三角成分の和に分解します

の逆は次のようになります。

次に以下を見つけます:

とを使用すると、ベクトルを反復的に取得できます。

まず、たとえば を選択します。推測が最終解に近いほど、アルゴリズムに必要な反復回数は少なくなります。

次に計算します。

予想どおり、アルゴリズムは次の解に収束します

実際、行列Aは厳密に対角優勢ですが、正定値ではありません。

マトリックス版の別の例

として示される別の線形システムは次のとおりです。

次の形式の方程式を使用します

下三角成分と厳密な上三角成分の和に分解します

の逆は次のようになります。

次に以下を見つけます:

とを使用すると、ベクトルを反復的に取得できます。

まず、例えばを選択しなければなりません

次に計算します。

収束性検定において、アルゴリズムが発散することが判明しました。実際、行列は対角優勢行列でも正定値行列でもありません。したがって、厳密解への収束は保証されておらず、この場合は収束しません。

方程式バージョンの例

与えられた方程式 と開始点を仮定します。ガウス・ザイデル反復法の任意のステップにおいて、最初の方程式 をについて で解き、次に2番目の方程式 を、先ほど求めた と残りのについて で解き、 まで続けます。そして、収束に達するまで反復を繰り返すか、解の発散が定義済みのレベルを超え始めた場合は反復を中断します。

例を考えてみましょう:

を解く次のようになります。

(0, 0, 0, 0)が初期近似値であるとすると、最初の近似解は次のようになります。

得られた近似値を用いて、所望の精度に達するまで反復手順を繰り返します。以下は4回の反復後の近似解です。

0.62.32727−0.9872730.878864
1.030182.03694−1.014460.984341
1.006592.00356−1.002530.998351
1.000862.0003−1.000310.99985

この系の正確な解は(1, 2, −1, 1)である。

PythonとNumPyを使った例

次の反復手順により、線形方程式の解ベクトルが生成されます。

numpyをnpとしてインポートする   反復制限 =  1000# 行列を初期化しますA  =  np . array (  [  [ 10.0 ,  - 1.0 ,  2.0 ,  0.0 ],  [ - 1.0 ,  11.0 ,  - 1.0 ,  3.0 ],  [ 2.0 ,  - 1.0 ,  10.0 ,  - 1.0 ],  [ 0.0 ,  3.0 ,  - 1.0 ,  8.0 ],  ] ) # 右辺ベクトルを初期化しますb  =  np . array ([ 6.0 ,  25.0 ,  - 11.0 ,  15.0 ])print ( "方程式系:" ) for  i  in  range ( A . shape [ 0 ]):  row  =  [ f " { A [ i , j ] : 3g } *x { j + 1 } "  for  j  in  range ( A . shape [ 1 ])]  print ( "[ {0} ] = [ {1:3g} ]" . format ( " + " . join ( row ),  b [ i ]))x  =  np . zeros_like ( b ,  np . float_ ) it_count が range ( 1 , ITERATION_LIMIT )の場合:  x_new = np . zeros_like ( x , dtype = np . float_ )で print ( f "反復{ it_count } : { x } " )i が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 ]でnp . allclose ( x , x_new , rtol = 1e-8 )の場合: break x = x_new                                            print ( f "解: { x } " ) error  =  np . dot ( A ,  x )  -  b print ( f "エラー: { error } " )

次の出力を生成します:

System of equations: [ 10*x1 + -1*x2 + 2*x3 + 0*x4] = [ 6] [ -1*x1 + 11*x2 + -1*x3 + 3*x4] = [ 25] [ 2*x1 + -1*x2 + 10*x3 + -1*x4] = [-11] [ 0*x1 + 3*x2 + -1*x3 + 8*x4] = [ 15] Iteration 1: [ 0. 0. 0. 0.] Iteration 2: [ 0.6 2.32727273 -0.98727273 0.87886364] Iteration 3: [ 1.03018182 2.03693802 -1.0144562 0.98434122] Iteration 4: [ 1.00658504 2.00355502 -1.00252738 0.99835095] Iteration 5: [ 1.00086098 2.00029825 -1.00030728 0.99984975] Iteration 6: [ 1.00009128 2.00002134 -1.00003115 0.9999881 ] Iteration 7: [ 1.00000836 2.00000117 -1.00000275 0.99999922] Iteration 8: [ 1.00000067 2.00000002 -1.00000021 0.99999996]反復9: [ 1.00000004 1.99999999 -1.00000001 1. ]反復10: [ 1. 2. -1. 1.]解答: [ 1. 2. -1. 1.]エラー: [ 2.06480930e-08 -1.25551054e-08 3.61417563e-11 0.00000000e+00]

Matlabを使用して任意の数の方程式を解くプログラム

次のコードでは次の式を使用しています

function  x = gauss_seidel ( A, b, x, iters ) for i = 1 : iters for j = 1 : size ( A , 1 ) x ( j ) = ( b ( j ) - sum ( A ( j ,:) '.* x ) + A ( j , j ) * x ( j )) / A ( j , j );終わり、終わり、終わり                     

参照

注記

  1. ^ ザウアー、ティモシー (2006).数値解析(第2版). ピアソン・エデュケーション社. p. 109. ISBN 978-0-321-78367-7
  2. ^ Gauss 1903、p. 279; 直接リンク。
  3. ^ ザイデル、ルートヴィヒ (1874)。 「Über ein Verfahren, die Gleichungen, auf welche die Methode der kleinsten Quadrate füult, sowie lineäre Gleichungen überhaupt, durch successive Annäherung aufzulösen」 [最小二乗法が導く方程式および一般的な線形方程式を逐次近似によって解くプロセスについて]。Abhandlungen der Mathematisch-Physikalischen Klasse der Königlich Bayerischen Akademie der Wissenschaften (ドイツ語)。11 (3): 81–108 .
  4. ^ ゴラブとヴァン・ローン、1996年、p. 511。
  5. ^ Golub & Van Loan 1996、式(10.1.3)
  6. ^ Golub & Van Loan 1996、Thm 10.1.2。
  7. ^ Bagnara, Roberto (1995年3月). 「ヤコビ法とガウス・ザイデル法の収束性に関する統一的証明」. SIAM Review . 37 (1): 93– 97. CiteSeerX 10.1.1.26.5207 . doi :10.1137/1037008. JSTOR  2132758. 
  8. ^ ゴルブ&ヴァン・ローン 1996、Thm 10.1.2

参考文献

この記事には、 GFDLライセンスの下にある CFD-Wiki の記事「Gauss-Seidel_method」のテキストが組み込まれています


  • 「ザイデル法」、数学百科事典EMSプレス、2001 [1994]
  • www.math-linux.com の Gauss–Seidel
  • ガウス・ザイデル(ホリスティック数値解析研究所より)
  • www.geocities.com のガウス ジーデル反復
  • ガウス・ザイデル法
  • ビックソン
  • Matlabコード
  • Cコードの例
Retrieved from "https://en.wikipedia.org/w/index.php?title=Gauss–Seidel_method&oldid=1299347908"