edit
ヤコビ反復法ではステップでのだけを使ってでの値を求めていた. しかし,と順番に計算した場合, を求めるときにはが, を求めるときにはがすでに計算されている. これら最新の値を使うのがガウス・ザイデル反復法(Gauss-Seidel iteration method)である.
たとえば,3元連立1次方程式の場合,反復式は以下となる.
収束判定条件はヤコビ法と同じであり, 収束するための係数行列の条件も同じである. ただし,収束までの反復回数はヤコビ法よりも少なくすむ.
ヤコビ反復法ではとの2つを格納するために2つの配列を用意したが, ガウス・ザイデル法では常に最新の値を用いるため配列は1つでよい. ガウス・ザイデル反復法をC++で実装した例を以下に示す.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
int GaussSeidel(vector< vector<double> > &A, int n, int &max_iter, double &eps) { vector<double> x(n, 0.0); double tmp; double e = 0.0; int k; for(k = 0; k < max_iter; ++k){ e = 0.0; for(int i = 0; i < n; ++i){ tmp = x[i]; x[i] = A[i][n]; for(int j = 0; j < n; ++j){ x[i] -= (j != i ? A[i][j]*x[j] : 0.0); } x[i] /= A[i][i]; e += fabs(tmp-x[i]); } if(e <= eps){ break; } } max_iter = k; eps = e; for(int i = 0; i < n; ++i){ A[i][n] = x[i]; } return 1; }