for(count = 0; count < max; count ++)
{
for (row=(count+1); row < max; row++)
{
for(column = 0; column < max; column ++)
{
double t = matrix[row][count]/matrix[count][count];
matrix[row][column] = (matrix[row][column] - (t*matrix[count][column]));
}
}
}
これはガウス消去プロセスのコードです。すべての変数は以前に宣言されています。元の行列は次のとおりです。
1.4 2.1 2.1 7.4 9.6
1.6 1.5 1.1 0.7 5.0
3.8 8.0 9.6 5.4 8.8
4.6 8.2 8.4 0.4 8.0
2.6 2.9 0.1 9.6 7.7
私が得ている出力は次のとおりです。
行のスワップを実行するので、行列は次のようになります。
4.6 8.2 8.4 0.4 8
3.8 8 9.6 5.4 8.8
1.4 2.1 2.1 7.4 9.6
2.6 2.9 0.1 9.6 7.7
1.6 1.5 1.1 0.7 5
私が得ている出力は次のとおりです。
4.6 8.2 8.4 0.4 8
0 8 9.6 5.4 8.8
0 0 2.1 7.4 9.6
0 0 0 9.6 7.7
0 0 0 0 5
見て分かるように、プロセスは部分的に機能しており、各行の先頭の項を削除します。しかし、それは残りの項を減算していません。例えばガウス消去後の行スワップ= 8と行列[1] [1]の後も元の行列の行列[1] [1]はまだ8です。
誰かが私の問題が何かを知ることができないかどうか、私はそれを見つけることができないのだろうかと思っていた。
回答:
回答№1の場合は3この行:
double t = matrix[row][count]/matrix[count][count];
行の前にする必要があります:
for(column = 0; column < max; column ++)
問題は、最初の column
あなたが設定したループ matrix[1][0] = 0;
。しかし、列ループの2回目の反復では、 t
を使用して matrix[1][0]/matrix[0][0]
しかし、それは今です 0
あなたが設定したばかりなので matrix[1][0]
に 0
.
NB。デバッグを支援するには printf出力を追加しました 正確にどのような計算が行われているかを確認します。これはデバッガを使用した場合に比べて基本的なものですが、あなたのベルトに置くには便利なツールです。