C言語です。このプログラムで、5元連立方程式をやったら答えが本来の答えと全くものが出力されました。ガウスジョルダンです。なにかこのプログラムに間違いがあると思うのですが、自分では分からないので教えていただきたいです。

1件の回答

回答を書く

1093675

2026-02-03 23:05

+ フォロー

内部ループのi,jの範囲が違う気がする。

とりあえず、Java でメソッドにしてみた。

計算誤差の点では割り算は最後に回すのがよい。先に数値を小さくしてしまうと、他のデータとの桁そろえが難しくなって、誤差が発生する。数桁の整数係数、正数解を得るものなら、誤差は出ないはずだけど。



/** 1次 n連立方程式

* @param double[][] a : [n][n+1] column方向のn番は 右辺用定数項

* @return double[] x : 各変数の解

* */

double[] calc(double[][] a) {

int n = a.length;

x = new double[n];

for(int k=0; k\u0026lt;n-1; k++) {

/* k番の変数を消去 , k行k列以下のデータは編集してはいけない。 */

for(int i=k+1; i\u0026lt;n; i++){

a[i][n] -= a[k][n]*a[i][k] / a[k][k] ; // 定数項

/* a'[i][j] は k+1.. n-1 までを計算 */

for(int j=k+1; j\u0026lt;n; j++) a[i][j] -= a[i][k]*a [k][j] / a[k][k];

}

}

for(int i=n-1; i\u0026gt;=0; i--){

/* 定数項位置a[i][n] に x[i] を算出、 k の消去順を逆算 */

for(int j = i+1; j\u0026lt;n; j++) a[i][n] -= a[i][j]*a[j][n];

a[i][n] /= a[i][i];

x[i] = a[i][n] ;

}

return x;

}



以下のような配列を与えると

{{1,1,1,1,1, 15}

,{2,-2,1,-1,1, 2}

,{-1,10,1,-3,2,20}

,{5,-4,3,-2,1, 3}

,{-1,1,-1,1,-1,-3}

}

解は、{1.0000,2.0000,3.0000,4.0000,5.0000}

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有