C++言語で書いたヤコビ法のプログラムをガウスザイデル法のプログラムに書き換えたいのですが、どこを変えれば良いでしょうか?
C++言語で書いたヤコビ法のプログラムをガウスザイデル法のプログラムに書き換えたいのですが、どこを変えれば良いでしょうか? プログラム強い方教えていただけると助かります。 書いたヤコビ法のプログラムは以下の通りです。よろしくお願いします。 #include <stdio.h> #include <math.h> int main(void) { int i, j; float s = 0; int m, mmax = 30; int k = 4; int l = 5; float err, eps = 1e-6; float xx[5][6]; float x[5][6]; float a[5][6] = { { 0, 0, 0, 0, 0, 0 }, { 0, 5, 1, 1, 1, 1 }, { 0, 1, -10, 3, 1, -6 }, { 0, 3, -4, 20, -3 ,-20 }, { 0, 5, -6, 10, -30, 36 } }; for (i = 1; i <= 4; i++) { xx[i][i] = a[i][l] / a[i][i]; } for (i = 1; i <= 4; i++) { for (j = 1; j <= 4; j++) { if (i != j) { xx[i][i] = xx[i][i] - (s / a[i][i]) * (a[i][j]); } } } x[1][1] = xx[1][1]; x[2][2] = xx[2][2]; x[3][3] = xx[3][3]; x[4][4] = xx[4][4]; for (m = 1; m <= mmax; m++) { err = 0; for (i = 1; i <= 4; i++) { xx[i][i] = a[i][l] / a[i][i]; for (j = 1; j <= 4; j++) { if (i != j) { xx[i][i] = xx[i][i] - (a[i][j] * xx[j][j]) / (a[i][i]); } } } for (i = 1; i <= 4; i++) { err += fabs((xx[i][i] - x[i][i]) / x[i][i]); } printf("m = %d\n, err = %f\n, x1 = %f\n, x2 = %f\n, x3 = %f\n, x4 = %f\n", m, err, xx[1][1], xx[2][2], xx[3][3], xx[4][4]); if (err < eps) { printf("収束しました"); break; } else { x[1][1] = xx[1][1]; x[2][2] = xx[2][2]; x[3][3] = xx[3][3]; x[4][4] = xx[4][4]; } } if (m > mmax) { printf("収束しませんでした"); } getchar(); return 0; }
ベストアンサー
ガウス・ザイデル法は計算し終わった x はすぐに使おうというものなので xx[i][i] = xx[i][i] - (a[i][j] * xx[j][j]) / (a[i][i]); で xx[j][j] を x[j][j] にするとヤコビ法、 xx[j][j] のままだとガウス・ザイデル法です。 収束するまでの回数を比較してみるとわかります
質問者からのお礼コメント
ありがとうございます。助かりました!
お礼日時:1/25 23:19