基本C语言中的高斯Jordan方法

时间:2015-01-24 13:57:38

标签: c arrays algorithm gaussian equation-solving

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

此代码对于仅具有相同n值的数组是准确的;例如。 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

1 个答案:

答案 0 :(得分:0)

  

此代码对于仅具有相同n值的数组是准确的;例如。   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

这是否正确是值得商榷的,但是如果你想要一个变量,其中每个数字都是一个值为零的解决方案,你可以插入

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

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

之前