我已经为高斯消除方法编写了这段代码:
#include <stdio.h>
int main()
{
float arr[3][4]={{0}}, i, j, k, p;
printf("Enter the coefficients:-\n");
for(i=0; i<3;i++)
{
printf("Row #(%d)\n", (int)(i+1));
for(j=0; j<4; j++)
{
scanf("%f", &arr[(int)i][(int)j]);
}
}
for(k=1, p=(k-1); (k<=2); k++, p++)
{
for(i=k; i<=2; i++)
{
for(j=0; j<=3; j++)
{
arr[(int)i][(int)j]-=((arr[(int)i][(int)p]/arr[(int)p][(int)p])*arr[(int)p][(int)j]);
}
}
}
for(i=0; i<3;i++)
{
for(j=0; j<4; j++)
{
printf("%0.3f ", arr[(int)i][(int)j]);
}
printf("\n");
}
return 0;
}
但是,它不会打印正确的输出值。对输出的分析表明价值已经四舍五入。我在某处猜测了2-d数组的整数值,即使我已将数组作为double并且仅使用类型转换为语法有效元素地址。你可以自己尝试一下矩阵:
R1- 10 -1 2 4
R2- 1 10 -1 3
R3- 2 3 20 7
正确的输出应该是:
R1- 10 -1 2 4
R2- 0 10.1 -1.2 2.6
R3- 0 0 19.980 5.376
我正在使用GNU GCC编译器。
答案 0 :(得分:0)
问题可能与舍入无关(传递给数组的索引不应该影响数组本身的任何舍入)。
我在主循环中添加了一个print语句,只是为了查看在执行每行减法时使用的系数,并且它们在每列之间看起来不同,所以很可能你的数学已关闭。我怀疑它与您的p
变量有关,该变量始终固定为k
上方的行,我认为这对您没有帮助。
您希望获取每对行的行系数,然后减去您正在使用的行以消除乘以该系数。对于第二行逐行消除,系数为M(1,0)/M(0,0)
,对于第三行到第二行消除,系数为M(2,1)/M(1,1)
,并且通常为M(I,K)/M(K,K)
(其中K是用来消除的行,我是你要消除的行。
最终你想做:
For each row K excluding the last row (0 to 1)...
For each row I after it (K+1 to 2)...
Get the row factor = M(I, K) / M(K, K).
For each column J (0 to 3)...
M(I, J) -= M(K, J) * factor
将(几乎直接)翻译成代码,它应该是:
10.000000 -1.000000 2.000000 4.000000
-0.000000 10.100000 -1.200000 2.600000
-0.000000 -0.000000 19.980198 5.376237
答案 1 :(得分:0)
Rows
和Columns
,您只需定义一次。j < 4
,在其他地方使用j <= 3
。 (两者都将成为j < Columns
。)p
。k
上的循环遍历源行,即包含将用于取消其他元素的数据的行。它运行for (k = 0; k < Rows-1; ++k)
。i
中的循环会迭代您为每个k
取消的目标行。它运行for (i = k+1; i < Rows; ++i)
。k
列i
和k
列中元素之间的比率。计算一次并称之为factor
。i
中的每一列,从元素中减去factor
次行k
中同一列中的元素。我编写了如上所述的代码,并打印出您所说的预期结果。