• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のプログラムで質問です。)

C言語プログラムで2元1次連立方程式の解を求める方法

このQ&Aのポイント
  • C言語のプログラムで2元1次連立方程式の解を求める方法について教えてください。
  • (1)3元1次連立方程式の解を求めるプログラムにする方法
  • (2)係数行列、定数行列をキーボードからの入力にする方法

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

 回答プログラムは、質問のプログラムをそのまま採用していますので「 #define N 3 」を4にすれば4元、2元にすれば2元に対応しますが、「 /* save original coefficients */」の printf() と scanf() を N に合わせて変更し、必ず実行前にコンパイルを忘れないでください。  今回の3元のデータ入力は、↓のように各行毎に表示されますので A[0][0] A[0][1] A[0][2] b[0]: 2 3 1 4 A[1][0] A[1][1] A[1][2] b[1]: 4 1 -3 -2 A[2][0] A[2][1] A[2][2] b[2]: -1 2 2 2 半角スペースで区切って b[] もまとめて入力してください。入力に際し、たとえば実数の「 2. 」は整数の「 2 」と入力しても計算結果は同じです(変換誤差を伴う)。 /* Gcc on Mac OSX */ #include <stdio.h> /* gauss22.c */ #define N 3 int main(void){ double A[N][N], Aa[N][N]; double b[N], x[N], bb[N], e[N]; int i, j, k; double akk, aik, s; /* save original coefficients */ for (i=0; i<N; i++){ printf("A[%d][0] A[%d][1] A[%d][2] b[%d]: ", i, i, i, i); scanf("%lf %lf %lf %lf", &A[i][0], &A[i][1], &A[i][2], &b[i]); } /* forward operation */ for (k=0; k<N-1; k++){ akk=1/A[k][k]; for (i=k+1; i<N; i++){ aik=-A[i][k]*akk; for (j=k+1; j<N; j++){ A[i][j]+=aik*A[k][j]; } b[i]+=aik*b[k]; } for (j=k+1; j<N; j++){ A[k][j]*=akk; } b[k]*=akk; } /* backward operation */ x[N-1]=b[N-1]/A[N-1][N-1]; for (k=N-2; k>=0; k--){ s=0.0; for (j=k+1; j<N; j++){ s+=A[k][j]*x[j]; } x[k]=b[k]-s; } /* check */ for (i=0; i<N; i++){ s=0.0; for (j=0; j<N; j++){ s+=Aa[i][j]*x[j]; } e[i]=s-bb[i]; printf("x(%d)=%f error=%f?n",i, x[i], e[i]); } return 0; }

naozerojp
質問者

お礼

分かりました。ありがとうございます。

その他の回答 (2)

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

参考例をつくりました あなたの方でもっとエレガントに かきなおすことできると思います #include <stdio.h> double Det(double a11,double a12,double a13, double a21,double a22,double a23, double a31,double a32,double a33) { return (a11*a22*a33 + a12*a23*a31 + a13*a21*a32 - a11*a23*a32 - a12*a21*a33 -a13*a22*a31); } main() { double a[4][4]; double b[4]; double x[4]; int i,j; for(i=1;i<4;i++) { for(j=1;j<4;j++) { printf("a%d%dを入力してください\r\n",i,j); scanf("%f",&a[i][j]); } } for(i=1;i<4;i++) { printf("b%dを入力してください\r\n",i); scanf("%f",&b[i]); } x[1] = Det(b[1] ,a[1][2],a[1][3],b[2] ,a[2][2],a[2][3],b[3] ,a[3][2],a[3][3]) /Det(a[1][1],a[1][2],a[1][3],a[2][1],a[2][2],a[2][3],a[3][1],a[3][2],a[3][3]); x[2] = Det(a[1][1],b[1] ,a[1][3],a[2][1],b[2] ,a[2][3],a[3][1],b[3] ,a[3][3]) /Det(a[1][1],a[1][2],a[1][3],a[2][1],a[2][2],a[2][3],a[3][1],a[3][2],a[3][3]); x[3] = Det(a[1][1],a[1][2],b[1] ,a[2][1],a[2][2],b[2] ,a[3][1],a[3][2],b[3] ) /Det(a[1][1],a[1][2],a[1][3],a[2][1],a[2][2],a[2][3],a[3][1],a[3][2],a[3][3]); printf("xは %f です\r\n", x[1]); printf("yは %f です\r\n", x[2]); printf("zは %f です\r\n", x[3]); }

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

プログラムを考える前に 数学上の解法を知ることです これはよく知られた解法があり たくさんのサイトで 紹介されています 一例は 行列式を使った連立方程式の解き方 http://kagennotuki.sakura.ne.jp/la/node11.html など これをしれば プログラムをつくるのは 単に労力の問題です

naozerojp
質問者

補足

数学的な解法は線形代数でやっているので知っていますが、 プログラムのほうが得意でないので分からないのです。

関連するQ&A

専門家に質問してみよう