您好我使用此代码进行高斯消除方法。当我使用这种算法的第二种形式时,我得不到正确的结果,但在这两种情况下代码是相同的。所以 为什么会这样:
for(k = 0 ; k < (n-1) ; k++) {
for(i = k ; i < (n-1) ; i++) {
temp = a[i+1][k]/a[k][k]; //Why?
for(j = k ; j < n ; j++) {
a[i+1][j] -= a[k][j] * temp;
}
}
}
这并不起作用:
for(k = 0 ; k < (n-1) ; k++) {
for(i = k ; i < (n-1) ; i++) {
for(j = k ; j < n ; j++) {
a[i+1][j] -= a[k][j] * a[i+1][k]/a[k][k];
}
}
}
答案 0 :(得分:4)
在第二个版本中,最里面的循环会修改a[i+1][k]/a[k][k]
的值,因为它正在迭代。
要回避这一点,你必须在第一个版本中完成你的表达。
考虑减少的梯形形式以及高斯消除的工作原理。其中一个步骤是将整行划分为对角元素,以使对角元素变为一。如果您在对角元素自身潜水之前没有保存原始值,那么它将永远丢失。
答案 1 :(得分:3)
*
和\
具有相同的优先权。在这种情况下,运算符的关联性 * 很重要。因此在第二种情况下
a[i+1][j] -= a[k][j] * a[i+1][k]/a[k][k];
将被视为
a[i+1][j] -= (a[k][j] * a[i+1][k])/a[k][k];
因为当运算符具有相同的优先级时,就会发生从左到右的关联。
括号a[i+1][k]/a[k][k]
,第二个代码段将起作用
a[i+1][j] -= a[k][j] * (a[i+1][k]/a[k][k]);
* Associativity rules描述当表达式具有一堆相同类型的运算符时,如何将表示不足的表达式括起来。例如,加法从左到右是关联的,因此a + b + c等价于(a + b)+ c,而不是+(b + c)。在普通算术中,这两个表达式总是给出相同的结果;在计算机算术中,它们不一定。