/ /ベーシックCマルチのガウスジョーダン法-c、配列、アルゴリズム、ガウス、方程式解決

ガウスジョーダン法の基礎C多項式、配列、アルゴリズム、ガウス、方程式解法

私はする必要がある多次元配列を持っています未知の値(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=%.3fn",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

このコードは、同じ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].

表示されているコードの主な欠点は、 行交換操作、必要な場合があります 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=%.3fn",i,x[i]).