• 締切済み

C言語で連立一次方程式

C言語で連立一次方程式 /* 連立一次方程式 a*x + b*y = e c*x + d*y = f の解を求めるプログラムを作成したい。 a,b,c,d,e,f をキーボード入力させる ことで、 行列 [a b c d] の逆行列、及び、連立方程式の解( x= , y= )を求めたい。 なお、a b c d の値によっては、逆行列を求めることが 出来ません。その時は、 【解を求めることはできません】 と表示してプログラムを終了するようにして下さい。 (注) [a,b,c,d,e,f]を 2次元配列 ma[2][3]とする. [逆行列[a,b,c,d]と解x,y]を 2次元配列 mb[2][3]とする. ma[][] の値をmain関数内でキーボード入力する mb[][] の値は,mat_keisan関数内で計算 mb[][] の値をmain関数内で表示 関数 mat_keisan の戻り値として,「解」が求まる方程式か どうかを知らせる「int 型のフラグ(旗)」として用いるとよい. */ #include<stdio.h> int mat_keisan(int ma , int mb); int main(void) { int inverse; double ma[2][3]; double mb[2][3]={0}; printf("連立一次方程式の計算\n"); printf("a * x + b * y= e\n"); printf("c * x + d * y= f\n"); printf("Input a :"); scanf("%lf",&ma[1][1]); printf("Input b :"); scanf("%lf",&ma[1][2]); printf("Input c :"); scanf("%lf",&ma[1][3]); printf("Input d :"); scanf("%lf",&ma[2][1]); printf("Input e :"); scanf("%lf",&ma[2][2]); printf("Input f :"); scanf("%lf",&ma[2][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[1][1],ma[1][2],ma[1][3]); printf("%4.2f* x + %4.2f * y = %4.2f\n", ma[2][1],ma[2][2],ma[2][3]); inverse=mat_keisan(ma,mb); if(inverse==1) printf("計算できません\n"); else{ printf("逆行列\n"); printf("%4.2f %4.2f\n", mb[1][1],mb[1][2]); printf("%4.2f %4.2f\n", mb[2][1],mb[2][2]); printf("解\n"); printf("x=%4.2f\n",mb[1][3]); printf("y=%4.2f\n",mb[3][3]); } return (0); } /* 配列の足し算 */ int mat_keisan(int ma ,int mb ) { int x,y,z;// 1/ma[1][1]*mb[2][2]-ma[1][2]*mb[2][2]; //逆行列と解を求めるプログラムを作成する。 //そしてその値をmb[][] に入力する。 return(#######); } 関数内が手も足もでません; 他のサイトを調べてみたのですが逆行列を求めるプログラムがよくわかりません; >int mat_keisan(int ma ,int mb ) は、あってないかもです; それとinverseの意味がわかりません; ヒントや、解説を よろしくお願いします;。

みんなの回答

回答No.5

小規模な連立方程式であれば、 ガウス・ジョルダン法 を使うのです。大規模な連立方程式であればLU分解法ですね。

参考URL:
http://homepage3.nifty.com/gakuyu/suti/renritu/gauss-jordan/index.html
  • fkoui
  • ベストアンサー率50% (2/4)
回答No.4

解の公式を作ってその分母を判定するだけにすると一番簡単ですね.

  • ohtawa
  • ベストアンサー率23% (9/38)
回答No.3

No.1さんのご意見に一票 この板でも過去例複数あり

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

連立一次方程式以前の話として、 >double ma[2][3]; この定義で、 >scanf("%lf",&ma[1][3]); >scanf("%lf",&ma[2][1]); >scanf("%lf",&ma[2][2]); >scanf("%lf",&ma[2][3]); これらは配列の定義範囲外の領域であることはおわかりですか? コードの他の部分でも、配列の定義範囲外の領域にアクセスしていますね。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「inverse」という単語の意味は「逆」. プログラム中の意味は, プログラムを書いた人に聞いてくれ. プログラムを書く以前の問題として, 「自分ならどのように解くか」をきちんと説明できますか?

関連するQ&A