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