-1

我已经为高斯消除方法编写了这段代码:

#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;
}

但是,它不会打印正确的输出值。对输出的分析表明这些值已被四舍五入或其他东西。我猜某处二维数组的整数值已被考虑,即使我已将该数组作为双精度并且仅对语法有效的元素地址使用类型转换。您可以通过以下矩阵自行尝试:

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 编译器。

4

2 回答 2

0
  1. 用整数类型声明用于数组索引的所有变量。
  2. 摆脱所有演员表。你不需要它们中的任何一个。
  3. 将行号和列号的所有常量替换为RowsColumns,您只需定义一次。
  4. 在循环范围内保持一致;不要j < 4在某些地方和j <= 3其他地方使用。(两者都会变成j < Columns。)
  5. 摆脱p.
  6. onk循环迭代源行,即包含您将用于取消其他元素的数据的行。它运行for (k = 0; k < Rows-1; ++k)
  7. 中的循环i迭代您为 each 取消的目标行k。它运行for (i = k+1; i < Rows; ++i)
  8. 取消时要使用的因素是k行列中的元素ik. 计算一次并调用它factor
  9. 对于行中的每一列i,从元素中减去该元素factor乘以行中同一列中的元素k

我如上所述编写了代码,它会打印出您所说的预期结果。

于 2013-04-03T22:39:58.213 回答
0

问题可能与舍入无关(传递给数组的索引不应影响数组本身的任何舍入)。

我在主循环中添加了一个打印语句,只是为了查看在进行每行减法时使用了哪些系数,并且它们在每列之间似乎不同,所以很可能你的数学是关闭的。我怀疑它与您的p变量有关,该变量始终固定为上面的行k,我认为这对您没有帮助。

您想获得每对行的行系数,然后减去您用于消除的行乘以该系数。系数是M(1,0)/M(0,0)针对第二排第一排消除,M(2,1)/M(1,1)第三排第二排消除,一般来说,M(I,K)/M(K,K)(其中K是用于消除的行,I是你的行'正在消除)。

最终你想做:

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
于 2013-04-03T22:16:02.430 回答