我有一个多维数组,需要解析以解决未知值(x1,x2,x3,..)。在这个多维数组中,我在i和j坐标上的数组大小是不同的; B [n] [n + 1]。我知道这种解决未知问题的基本C,高斯约旦方法不正确,并且希望有人指出如何对其进行修改。

该代码对于仅具有相同n值的Array是准确的;例如。 A [n] [n]。

//Computation to solve
for(j=0; j<=n; j++)
{
    for(i=0; i<=n; i++)
    {
        if(i!=j)
        {
            c=B[i][j]/B[j][j];
            for(k=0;k<=n+1;k++)
            {
                B[i][k] = B[i][k] - c*B[j][k];
            }
        }
    }
}

//Print Solution
printf("\nThe solution is:\n");
for(i=0; i<=n; i++)
{
    x[i]=B[i][n+1]/B[i][i];
    printf("\n x%d=%.3f\n",i,x[i]);
}


例如,如果我的n = 2。我要解决的数组是B [2] [3]。

0  -20  0  -1
0  30  -10  0
0  -10  10  1


此代码的输出是

x1= -inf
x2=0.050
x3=0.000


正确的输出应该是

x1=0.00
x2=0.05
x3=0.15

最佳答案

该代码对于仅具有相同n值的Array是准确的;例如。
  A [n] [n]。


不,代码已经在循环中占了n + 1列(其中包含右边的常数项)

            for(k=0;k<=n+1;k++)
            {
                B[i][k] = B[i][k] - c*B[j][k];
            }


(因为k运行到n+1)。因此,在这方面是正确的。


  例如,如果我的n = 2。我想解决的数组是
  B [2] [3]。


通过指定数组中元素的数量(而不是最高索引)来声明C数组,​​因此需要B[3][4]

所示代码的主要缺陷是缺少row swapping operation(如果B[j][j]为零,则可能是必需的)和相关测试。我们可以通过插入来实现

        if (!B[j][j])
        {
            for (i=j+1; i<=n; i++)
                if (B[i][j]) { swap(B[j], B[i]); break; }
            if (!B[j][j]) continue; // leave all-zero column as is
        }


for(j=0; j<=n; j++)循环主体的开头(实现留给阅读器的swap())。


  正确的输出应该是

x1=0.00



这是否正确尚有待商but,但如果您希望每个数字都是一个解的变量采用零值,则可以插入

        if (B[i][i] == 0 && B[i][n+1] == 0) x[i] = 0;


printf("\n x%d=%.3f\n",i,x[i])之前。

08-24 15:25