• 締切済み

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% (2126/6288)
回答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

  • c言語 プログラミング(初心者)

    解を判定するプログラミングを作成したのですが、a,b,cを0,1,2と入力したときに解に0.00000が出てきて解がおかしくなります。 どなたか詳しい方教えてください。また簡潔にできる点などありましたらご指摘お願いします。 #include <stdio.h> #include <math.h> int main (void) { double a,b,c,d,x1,x2; printf("ax^2+bx+c=0 の係数を入力してください\n"); scanf("%lf %lf %lf",&a,&b,&c ); if(a==0){ if(b==0) { printf("解は存在しません\n"); } else { x1=-c/b; printf("解は %f です\n",x1); } } else { d=b*b-4*a*c; if(d>=0){ x1=(-b+sqrt(d))/(2.0*a); x2=(-b-sqrt(d))/(2.0*a); if(d==0){ printf("解は %f (重解)です\n",x1); } else { printf("解は %f と %f です\n",x1,x2); } } else { printf("実数解は存在しません(虚数解)\n"); } } return 0; }

  • C言語で連立1次方程式

    C++で連立1次方程式を解くプログラミングを作りたいのですが何回やっても出来なかったので質問します。 N=3; n=N; 0<=i<=N-1, 0<=j<=N-1, A(3×3行列)= 1 -8 -6 8 7 8 -2 -2 7 a[0][0]*X+a[1][0]*Y=(-1)*a[2][0]; (1X+8Y=-(-2)) a[0][1]*X+a[1][1]*Y=(-1)*a[2][1]; (-8X+7Y=-(-2)) (行をi、列をj、a[0][0]=a[i][j]) (XとYや関数名は適当に決めてもらって構いません) X、Yを求める。 XとYが求まったら1行目をX倍した数と2行目をY倍した数と3行目を足した数を、3行目に入れる。(計算は列ごとにやる(3回計算)) 3行目の成分は分数で表示させる。(整数の形にできるのなら整数の形にしたい) 表示させる関数は↓のように作りました(型はintでなくてもいいです) void matrix_print(int n, int a[N][N]){ int i, j; for(i=0; i<n; i++){ for(j=0; j<n; j++) printf("%5d \n",a[i][j]); } printf("\n"); return; } 私はX、Yで分数が出てきたところでうまく分数表示が出来ずに(整数で表せるなら整数で表したい)そこで詰まってしまいます。 何方かわかる方はプログラムを作ってください。お願いします。

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • 2次方程式の解 Cプログラミング

    C言語でのプログラムの添削をお願いします。 2次方程式の解を求めるものなのですが。 #include<stdio.h> #include<math.h> main(){ double a,b,c,d; double x1=0; double x2=0; scanf("%lf %lf %lf" ,&a,&b,&c); printf("a=%f b=%f c=%f\n" ,a,b,c); d=b*b-4*a*c; if(d>0){ x1=(-b+sqrt(d))/2*a; x2=(-b-sqrt(d))/2*a; printf("x=%f,%f\n" ,x1,x2); }else if(d<0){ x1=-b/2*a; x2=sqrt(-d)/2*a; printf("x=%f+%fi,%f-%fi\n" ,x1,x2,x1,x2); }else{ printf("x=%f\n" ,x1); } return 0; } このとき、 a=-7,b=2,c=-1 を与えると x=7.000000+-17.146428i,7.000000--17.146428i という値が返ってきます。 他にも、虚数解のときに間違った値が返ってきてしまう気がするのですが、いかがでしょうか? 実数解のときは正しいようです。 回答よろしくお願いします。

  • c言語で行列の積の値を求める

    行列の成分を入力した後に、 入力された行列は X = 1 2 3 4 5 6 7 8 9 10 11 12 Y = 1 5 2 6 3 7 4 8 のように表示して、(上の数字は適当です。) 行列 X と行列 Y の積を求めて結果を表示するプログラムが作りたいのですが、上手く表示できなくて困っています。 #include <stdio.h> int main(void) { double A[10][10]; double B[10][10]; double C[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } } この後にどうすればいいのか教えてください。 よろしくお願いします。

  • c言語についての質問です。

    #include<stdio.h> int main(void){ double a,b; int c; printf("Type two numbers\n"); scanf("%lf",&a); scanf("%lf",&b); printf("Select 1)addition, 2) subtraction, 3)multiplication or 4)division\n"); scanf("%d",&c); switch(c){ case1: printf("%.6f + %.6f = %.6f",a,b,a+b); break; case2: printf("%.6f - %.6f = %.6f",a,b,a-b); break; case3: printf("%.6f * %.6f = %.6f",a,b,a*b); break; case4: printf("%.6f / %.6f = %.6f",a,b,a/b); break; default: printf("Error! Select 1, 2, 3 or 4\n"); break; } return 0; このプログラムをコンパイルして実行しても 正しく動きません。なぜですか?

  • c言語のプログラムで行列の積を計算する

    指定された行・列数(それぞれ10以下とする)の行列 X, Y の積 Z = X × Y を求めるプログラムを作成せよ.行列の要素はすべて整数とする. このプログラムで行と列の成分を入力するときに、1列になってしまうのですがどうしたらちゃんと入力できますか? int main(void) { double A[10][10]; double B[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } }

  • C言語 二分法

    初投稿です。 お恥ずかしながらパソコンが苦手で、Cゲッが難しくてできません。 今回二分法です。 途中まではやったのですができません。 演習 0~1の乱数を12個発生させ,これらの平均をxi,yi とする。(s,tは乱数) xi=1/12(x1i+x2i+....x12i) yi=1/12(y1i+y2i+....y12i) このようなを1000個作り,(xi,yi)で散布図 を作りなさい。またx,yのそれぞれの平均を求 めよ。 この演習で #include<stdio.h> #include<stdlib.h> #include<math.h> #define eps 1.0e-5 float f(double x); void nibuin(void); int main () { int count; double a,b,m; count=0; printf("範囲の左の値を入力してください。\n"); scanf("%lf",&a); printf("範囲の右の値を入力してください。\n"); scanf("%lf",&a); if(count==1000){ printf("収束しませんでした。\n"); exit(1); } } while(!(fabs(a-b)<eps)); printf("解の値は%f\n収束するのに%d回かかりました。"m,count); } float f(double x) { reurn x*sin(x)+log(x); } まではできたのですが、 scanf("%lf",&a);とif(count==1000){の間に入る命令が打てません。 よろしくお願いします。

  • C言語 関数化の仕方について

    こんにちは。プログラムの関数化の方法についてお願いがあり投稿いたしました。プログラムの関数化というものを行いたいのですが方法が分からないので、以下のプログラムを関数化していただきたいのです。 #include <stdio.h> int main() { printf("摂氏と華氏を相互変換します。変換したい温度を入力してください。\n"); printf("入力例:32F, 100C, etc.数値と単位の間に空白は不要です。\n"); double x, xc; char u; scanf("%lf%c",&x,&u); if (u=='C') { xc = (x * 9 / 5) + 32; printf("%lf degCは%lf degFです。\n", x, xc); } else if (u=='F') { xc = (x - 32) * 5 / 9; printf("%lf degFは%lf degCです。\n", x, xc); } else { printf("書式が誤っています。\n"); } return 0; } コードを添えていただけるとさらに分かりやすくて助かります。お手数ですがよろしくお願いいたします。

  • C言語 2次方程式の解を求めるプログラム

    ポインタを使った2次方程式の解を求めるプログラムを作りたいのですが、どこが間違っているのか分かりません。 #include<stdio.h> #include<math.h> int quadEq(int a, int b, int c, double *px1, double *px2) int main() { int a,b,c,s; double x1,x2; printf("?"); scanf("%lf",&a); printf("?"); scanf("%lf",&b); printf("?"); scanf("%lf",&c); if((s=quedEq(a,b,c, &x1, &x2))==2){ printf("%f %f", x1,x2); // 解が二つ } else if(s==1){ printf("%f", x1);// 重解 } else { printf("No real solution");// 虚数解 } } int quadEq(int a, int b, int c, double *px1, double *px2) { int d = b*b-4*a*c; if(d>0){ *px1 = (-b+sqrt(d))/(2*a); *px2 = (-b-sqrt(d))/(2*a); return 2; } else if(d==0) { *px1=-b/2*a; *px2=-b/2*a; return 1; } else { return 0; } } エラーは mondai.c: 関数 ‘quadEq’ 内: mondai.c:5:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before {’ token { ^ mondai.c:26:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token { ^ mondai.c:39:1: エラー: expected ‘{’ at end of input } ^ となりました。括弧の位置の間違いや入れ忘れはないと思うのですが、何か根本的なミスがあるのでしょうか。添削お願いします。