<環境>
- windows10
- visual studio 2017
/********************************************* * 連立方程式の解法 ( ガウスの消去法 ) *********************************************/ #include <iostream> // for cout #include <stdio.h> // for printf() // 元の数定義 #define N 4 // 3 using namespace std; /* * 計算クラス */ class Calc { double a[N][N + 1]; // 各種変数 double d; // ダミー int i, j, k; // LOOP インデックス public: // 連立方程式を解く(ガウスの消去法) void calcGaussElimination(); }; /* * 連立方程式を解く(ガウスの消去法) */ void Calc::calcGaussElimination() { // 係数 static double a[N][N + 1] = { //{ 2.0, -3.0, 1.0, 5.0}, //{ 1.0, 1.0, -1.0, 2.0}, //{ 3.0, 5.0, -7.0, 0.0} { 1.0, -2.0, 3.0, -4.0, 5.0}, {-2.0, 5.0, 8.0, -3.0, 9.0}, { 5.0, 4.0, 7.0, 1.0, -1.0}, { 9.0, 7.0, 3.0, 5.0, 4.0} }; // 元の連立方程式をコンソール出力 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%+fx%d ", a[i][j], j + 1); printf("= %+f\n", a[i][N]); } // 前進消去 for (k = 0; k < N -1; k++) { for (i = k + 1; i < N; i++) { d = a[i][k] / a[k][k]; for (j = k + 1; j <= N; j++) a[i][j] -= a[k][j] * d; } } // 後退代入 for (i = N - 1; i >= 0; i--) { d = a[i][N]; for (j = i + 1; j < N; j++) d -= a[i][j] * a[j][N]; a[i][N] = d / a[i][i]; } // 結果出力 for (k = 0; k < N; k++) printf("x%d = %f\n", k + 1, a[k][N]); } /* * メイン処理 */ int main() { try { // 計算クラスインスタンス化 Calc objCalc; // 連立方程式を解く(ガウスの消去法) objCalc.calcGaussElimination(); } catch (...) { cout << "例外発生!" << endl; return -1; } // 正常終了 return 0; }
以上のプログラムの後退代入の部分に関して、
for (i = N - 1; i >= 0; i--) { d = a[i][N]; for (j = i + 1; j < N; j++) d -= a[i][j] * a[j][N]; a[i][N] = d / a[i][i]; }
の部分を
for (i = N - 1; i >= 0; i--) { d = a[i][N]; for (j = i + 1; j < N; j++) a[i][N] = d - a[i][j] * a[j][N] / a[i][i]; }
と置いてビルドするといじっていない元のプログラムと同じ結果が出ると思ったのですが全く異なった結果が出ました。
いじる前の計算結果はこちらです。
+1.000000x1 -2.000000x2 +3.000000x3 -4.000000x4 = +5.000000 -2.000000x1 +5.000000x2 +8.000000x3 -3.000000x4 = +9.000000 +5.000000x1 +4.000000x2 +7.000000x3 +1.000000x4 = -1.000000 +9.000000x1 +7.000000x2 +3.000000x3 +5.000000x4 = +4.000000 x1 = 1.000000 x2 = 3.000000 x3 = -2.000000 x4 = -4.000000
いじった後の結果はこちらです。
+1.000000x1 -2.000000x2 +3.000000x3 -4.000000x4 = +5.000000 -2.000000x1 +5.000000x2 +8.000000x3 -3.000000x4 = +9.000000 +5.000000x1 +4.000000x2 +7.000000x3 +1.000000x4 = -1.000000 +9.000000x1 +7.000000x2 +3.000000x3 +5.000000x4 = +4.000000 x1 = 82.333333 x2 = 231.666667 x3 = -275.415033 x4 = 19.333333
正直なところなぜ結果が違うのかよくわかりませんでした。別に{}を付いてないので式を一つにまとめても同じ結果が出ると思っていました。
8/5 編集
dを使ってのプログラム
for (i = N - 2; i >= 0; i--) { d = a[i][N]/ a[i][i]; a[i][N] =d*a[i][i]; for (j = N-1; j < N; j++) a[i][N]=a[i][N] - a[i][j] * a[j][N] / a[i][i]; }
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。