数値線形代数において、ヤコビ法(別名ヤコビ反復法)は、厳密に対角優位な線形方程式系の解を求めるための反復アルゴリズムです。各対角要素が解かれ、近似値が代入されます。このプロセスは収束するまで繰り返されます。このアルゴリズムは、行列の対角化におけるヤコビ変換法の簡略版です。この方法は、カール・グスタフ・ヤコブ・ヤコビにちなんで名付けられました。
させてn個の線形方程式からなる正方システムとする。
いつそして知られていること、そしてが未知であれば、ヤコビ法を用いて近似することができます。ベクトルは、(頻繁のために) と表記します。k番目の近似または反復として、 そして次の(またはk + 1 回目の)反復は。
すると、Aは対角成分D、下三角部分L、上三角部分Uに分解できる。解は、反復的に次の方法で得られます。
各行の要素ベースの数式つまり、次のようになる。計算各要素が必要それ自体を除いて。ガウス・ザイデル法とは異なり、上書きすることはできません。とその値は残りの計算で必要となるため、保存しておく必要があります。最小限必要なストレージ容量は、サイズnのベクトル 2 つです。
入力:解に対する初期推定値x (0)、(対角優位) 行列A、右辺ベクトルb、収束判定基準 出力:収束に達したときの解コメント:上記の要素ベースの式に基づく擬似コード k = 0 収束するまで繰り返すi : = 1ステップnまで繰り返すσ = 0 j := 1ステップnまで繰り返すj ≠ iの場合、σ = σ + a ij x j ( k ) end end x i ( k +1) = ( b i − σ ) / a ii end k を増分するend
(あらゆる反復法における)標準的な収束条件は、反復行列のスペクトル半径が1未満になることである。
この手法が収束するための十分条件(ただし必要条件ではない)は、行列Aが厳密にまたは既約に対角優位であることです。厳密な行対角優位とは、各行において、対角項の絶対値が他の項の絶対値の合計よりも大きいことを意味します。
ヤコビ法は、これらの条件が満たされない場合でも収束することがある。
ヤコビ法はすべての対称正定値行列に対して収束するとは限らないことに注意してください。例えば、
次の形式の線形システム初期見積もりは
私たちは方程式を使用します前述のように、推定するためにまず、方程式をより便利な形に書き換えます。、 どこそして既知の値から 私たちは決定しますとして さらに遠く、として見つかりました とそして計算すると、推定値として: 次の反復では、 このプロセスは収束するまで繰り返されます(つまり、は小さい)。25回の反復後の解は
次の線形システムが与えられたと仮定します。
初期近似値として (0, 0, 0, 0)を選択した場合、最初の近似解は次のように与えられます。 得られた近似値を用いて、所望の精度に達するまで反復手順を繰り返す。以下は、5回の反復後の近似解である。
このシステムの正確な解は(1, 2, − 1, 1) です。
import numpy as np反復回数制限= 1000# 行列を初期化するA = np.array ([[ 10 . , -1 . , 2. , 0. ] ,[ - 1. 、11. 、- 1. 、3. ]、[ 2. , - 1. , 10. , - 1. ],[ 0.0 , 3. , - 1. , 8. ]])# 右辺ベクトルを初期化するb = np.array ([ 6 . , 25. , -11 . , 15. ] )# システムの出力print ( "システム:" )for i in range ( A.shape [ 0 ] ) :row = [ f " { A [ i , j ] } *x { j + 1 } " for j in range ( A . shape [ 1 ])]print ( f ' { " + " .join ( row ) } = { b [ i ] } ' )プリント()x = np.zeros_like ( b )for it_count in range ( ITERATION_LIMIT ):it_count != 0 の場合:print ( f "反復回数{ it_count } : { x } " )x_new = np.zeros_like ( x )for i in range ( A.shape [ 0 ] ) :s1 = np.dot ( A [ i , : i ], x [ : i ] )s2 = np.dot ( A [ i , i + 1 :], x [ i + 1 : ] )x_new [ i ] = ( b [ i ] - s1 - s2 ) / A [ i , i ]x_new [ i ] == x_new [ i - 1 ]の場合:壊すif np.allclose ( x , x_new , atol = 1e-10 , rtol = 0 . ) :壊すx = x_newprint ( "解決策: " )print ( x )error = np.dot ( A , x ) - bprint ( "エラー:" )print (エラー)重み付きヤコビ反復法はパラメータを使用する反復を計算するには
と通常の選択肢である。[ 1 ] 関係からこれは次のように表現することもできます。
どこは反復回数における代数的残差である。。
システム行列が対称正定値行列であれば、収束を示すことができる。
させてを反復行列とする。すると、収束は保証される。
どこは最大固有値です。
スペクトル半径は、特定の選択に対して最小化できます。次のように どこは行列条件番号です。