アプリ版:「スタンプのみでお礼する」機能のリリースについて

こちらのプログラム
/*********************************************
* 連立方程式の解法 ( ガウスの消去法 )
*********************************************/
#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;
printf("%f=a[%d][%d] /a[%d][%d]である\n ", d,i,k,k,k);
printf("[k]=%dである\n", k);
printf("a[%d][%d]=a[%d][%d]-a[%d][%d]*%lfである\n", i, j, i, j, k, j, d);
}
}

// 後退代入
for (i = N - 1; i >= 0; i--) {
d = a[i][N];
printf("%f = a[%d][%d]となる\n", d, i, N);
for (j = i + 1; j < N; j++)
d -= a[i][j] * a[j][N];
printf("%f -= a[%d][%d] * a[%d][%d]となる\n", d, i,j,j, N);
a[i][N] = d / a[i][i];
printf("a[%d][%d] = %f / a[%d][%d]となる\n", i, N,d,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;
}

をprintf関数を用いてどのような過程の計算をしているのかを表示しました。
しかし、見れたのは良かったのですが、何をやっているのか正しく整理できませんでした。

以下が結果なのですが、以下の行列での計算過程をわかりやすく行列の計算過程と書いていただけないでしょうか?
どうかよろしくお願いいたします。
+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です
-2.000000=a[1][0] /a[0][0]である
[k]=0である
a[1][5]=a[1][5]-a[0][5]*-2.000000である
5.000000=a[2][0] /a[0][0]である
[k]=0である
a[2][5]=a[2][5]-a[0][5]*5.000000である
9.000000=a[3][0] /a[0][0]である
[k]=0である
a[3][5]=a[3][5]-a[0][5]*9.000000である
14.000000=a[2][1] /a[1][1]である
[k]=1である
a[2][5]=a[2][5]-a[1][5]*14.000000である
25.000000=a[3][1] /a[1][1]である
[k]=1である
a[3][5]=a[3][5]-a[1][5]*25.000000である
1.833333=a[3][2] /a[2][2]である
[k]=2である
a[3][5]=a[3][5]-a[2][5]*1.833333である
19.333333 = a[3][4]となる
19.333333 -= a[3][4] * a[4][4]となる
a[3][4] = 19.333333 / a[3][3]となる
-292.000000 = a[2][4]となる
408.000000 -= a[2][4] * a[4][4]となる
a[2][4] = 408.000000 / a[2][2]となる
19.000000 = a[1][4]となる
3.000000 -= a[1][4] * a[4][4]となる
a[1][4] = 3.000000 / a[1][1]となる
5.000000 = a[0][4]となる
1.000000 -= a[0][4] * a[4][4]となる
a[0][4] = 1.000000 / a[0][0]となる
x1 = 1.000000
x2 = 3.000000
x3 = -2.000000
x4 = -4.000000

A 回答 (1件)

「ガウスの消去法」で検索すると、解説がたくさん見つかります。


https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!