高斯消去法不消去正确项
Gaussian elimination does not eliminate correct terms
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
可以看出,该过程部分起作用,消除了每行中的前导词。但是,它并没有减去剩余的项。例如原矩阵中的matrix[1][1],行swap = 8后matrix[1][1]高斯消元后仍为8.
我想知道是否有人知道我的问题是什么,因为我找不到它。
这一行:
double t = matrix[row][count]/matrix[count][count];
应该在行之前:
for(column = 0; column < max; column ++)
问题在于,在 column
循环的第一次迭代之后,您设置了 matrix[1][0] = 0;
。但是对于列循环的第二次迭代,您使用 matrix[1][0]/matrix[0][0]
计算 t
,但现在是 0
,因为您只是将 matrix[1][0]
设置为 0
。
注意。为了帮助调试,我 added a printf output 确切地查看了正在发生的计算。与使用调试器相比,这是原始的,但它是一个有用的工具。
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
可以看出,该过程部分起作用,消除了每行中的前导词。但是,它并没有减去剩余的项。例如原矩阵中的matrix[1][1],行swap = 8后matrix[1][1]高斯消元后仍为8.
我想知道是否有人知道我的问题是什么,因为我找不到它。
这一行:
double t = matrix[row][count]/matrix[count][count];
应该在行之前:
for(column = 0; column < max; column ++)
问题在于,在 column
循环的第一次迭代之后,您设置了 matrix[1][0] = 0;
。但是对于列循环的第二次迭代,您使用 matrix[1][0]/matrix[0][0]
计算 t
,但现在是 0
,因为您只是将 matrix[1][0]
设置为 0
。
注意。为了帮助调试,我 added a printf output 确切地查看了正在发生的计算。与使用调试器相比,这是原始的,但它是一个有用的工具。