高斯消除不会消除正确的项

Gaussian elimination does not eliminate correct terms

本文关键字:高斯消      更新时间:2023-10-16
 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

可以看出,该过程部分工作,消除了每行中的前导词。但是,它不会减去其余项。例如,原始矩阵中的矩阵[1][1],行交换= 8之后,高斯消除后的矩阵[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

铌。为了帮助调试,我添加了一个 printf 输出来准确查看正在发生的计算。与使用调试器相比,这是原始的,但它是腰带中的有用工具。