【问题标题】:Gaussian elimination does not eliminate correct terms高斯消元法不会消除正确项
【发布时间】:2015-12-16 00:29:49
【问题描述】:
 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。

我想知道是否有人会知道我的问题是什么,因为我找不到它。

【问题讨论】:

  • 我想知道是否有人会知道我的问题是什么,因为我找不到它。 -- 你用过编译器附带的调试器吗?
  • 您对t 的计算在列循环内,但它仅在列循环之前有效。这不仅仅是一个效率问题,因为当您不希望 t 更改时,您将输入修改为 t
  • @PaulMcKenzie 不,我没有,我的代码没有任何计算错误,只是没有按预期执行
  • @PaulMcKenzie 谢谢,保罗就是这样,事实证明很容易解决。
  • @user4878925 我猜你不知道调试器是什么。它是一种用于一次运行程序的工具。您可以观察变量、设置断点并查看程序的流程。现在是学习使用它的最佳时机。每个程序员都会在代码中犯逻辑错误,而调试器是他们用来查看逻辑哪里出错的工具。信不信由你,我们不会“在脑海中”运行程序,除非它是如此微不足道。

标签: c++ matrix gaussian


【解决方案1】:

这一行:

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 来看看到底发生了什么计算。与使用调试器相比,这很原始,但它是一个有用的工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多