我正在创建一个程序,通过遵循此算法使用Gauss-Jordan方法解决线性系统:
for each row ri of the matrix (i from 1 to n)
replace ri with ri / rii
for each row rk of the matrix (k!=i)
replace rk with rk - rki * ri
显然我做得不对,因为只有行中的第一个元素被自己划分。我还是C的新手,所以任何帮助都会受到赞赏。谢谢!
for (k = 0; k < n; k++) {
for (m = 0; m < n+1; m++) {
if (matrix[k][m] < TOLERANCE) {
printf("Error, pivot is 0\n");
exit(0);
}
matrix[k][m] = matrix[k][m] / matrix[k][k];
}
for (l = 0; l != k; l++) {
printMatrix(n, n+1, matrix);
for (o = 0; o < n+1; o++) {
matrix[l][o] = matrix[l][o] - matrix[l][k] * matrix[k][o];
}
}
}
还有其他输入吗?它仍然不太正确,我把我的头发拉出来lol
答案 0 :(得分:3)
首先,内循环中的l != k
是一个继续条件。换句话说,当l
等于k
时,该循环将退出。
这不是原始代码中的工作方式。它继续使用l
的所有其他值。
你可以改用这样的东西:
for(l = 0; l < n; l++) {
if (l != k) {
printMatrix(n, n+1, matrix);
for (o = 0; o < n+1; o++) {
matrix[l][o] = matrix[l][o] - matrix[l][k] * matrix[k][o];
}
}
}
而且,顺便说一下,你应该尝试摆脱一个字母的变量名,尤其是 l
,这可能会在你第一次误以为它时咬你很厉害1
: - )
答案 1 :(得分:3)
您将自己划分matrix[k][k]
(因此将其设置为1),然后将行的其余部分除以1.使用临时变量存储原始数据透视而不是使用matrix[k][k]
< / p>
编辑虽然以上是代码中的错误,但正如其他人所指出的那样,这可能不会导致您遇到的问题,您还需要使用continue
,而不是在l=k
时终止循环。
答案 2 :(得分:1)
你应该替换
for(l = 0; l != k; l++){
与
for(l = 0; l < n; l++){
if (l == k) continue;
第一个在l
到达k
后立即停止,因此只处理行0..k-1
。第二个处理行0..n-1
除了行k
(适合您的伪代码“for each row rk of the matrix (k!=i)
”)
此外:
for(m = 0; m < n+1; m++){
这意味着你有一个n行和n + 1列的矩阵,这是正确的吗?如果是这样的话,其他一切看起来都很好。