edit
ヤコビ法やガウス・ザイデル法において各ステップで計算されたとを用いて,さらに収束を加速させる方法が逐次加速緩和法(SOR法:Successive Over-Relaxation method)である.
各ステップにおいて補正量を用い,次の式で次ステップの値を計算する.
ここで,は加速係数であり,通常,である. SOR法を使うとの値によっては解の収束を速めることができる. ただし,問題にも依存するため最適な加速係数の算出が難しい.
SOR法を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 SOR(vector< vector<double> > &A, int n, double w, 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]; x[i] = tmp+w*(x[i]-tmp); 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; }