ガウスの単純消去法のプログラム

このQ&Aのポイント
  • ガウスの単純消去法のプログラムについての質問です。
  • 前進消去の段階でaij, biが表示されるようにしたいです。どうすればいいでしょうか?
  • ガウスの単純消去法の手順に従って、行列Aとベクトルbの成分を入力し、解を求めるプログラムです。
回答を見る
  • ベストアンサー

ガウスのの単純消去法のプログラムです。

ガウスのの単純消去法のプログラムです。 前進消去の第k段階が終わった段階でaij,biが表示されるようにしたいんですがどうすればいいでしょうか↓ よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> #define ERROR -1 #define EPS 1.0e-15 int gausssimp(double *, double *, double *, int); int main(void) { double *a,*b,*x,val; char s[32]; int i,j,n,result; printf("Input size n="); gets(s); sscanf(s,"%d",&n); if((a=(double *)calloc(n*n,sizeof(double)) ) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } if((b=(double *)calloc(n,sizeof(double))) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } if((x=(double *)calloc(n,sizeof(double))) == NULL){ fprintf(stderr,"Memory allocation error\n"); exit(-1); } /* A,b の成分を入力 */ printf("----- A -----\n"); for(i=0; i<n; i++){ for(j=0; j<n; j++){ printf("a(%2d,%2d)=",i+1,j+1); gets(s); sscanf(s,"%lf",&val); a[n*i+j]=val; } } printf("\n----- b -----\n"); for(i=0; i<n; i++){ printf("b(%2d)=",i+1); gets(s); sscanf(s,"%lf",&val); b[i]=val; } /* Gaussの単純消去法による求解 */ result = gausssimp(x,a,b,n); /* 解の表示 */ if(result == ERROR){ printf("ERROR occurs. pivot 0\n"); } else { printf("\n----- solution -----\n"); for(i=0; i<n; i++){ printf("x(%2d)=%.8e\n",i+1, x[i]); } } free(a); free(b); free(x); return 0; } int gausssimp(double *x, double *a, double *b, int n) { int i,j,k; double tmp,p,sum; /* step 1: 前進消去 */ /**** 追加 ****/ /* 前進消去の各段階を終えるごとに,式がどのように変化しているかわかるように表示する */ /**************/ for(k=0; k<n-1;k++){ if(a[n*k+k] == 0.0) { /* ピボットの値が0.割り算でエラーが起きる.*/ return ERROR; } else { /* k+1番目以降の式から x[k] の項を消去 */ for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; } b[i]=b[i]-p*b[k]; printf("a[%d %d]=%d b[%d]=%d",i,j,a[n*i+j]-p*a[n*k+j],i,b[i]-p*a[n*k+j]); ↑これではできませんでした。。。 } /**********************************/ } printf("k=%d\n",k); } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS) return(ERROR); sum=0.0; for(j=k+1; j<n; j++) sum+=a[n*k+j]*x[j]; x[k]=(b[k] - sum)/a[k*n+k]; } return 0; }

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

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

結論だけ言うとこんな感じ http://ideone.com/pzotE ====================== 【割とどうでもいいこと】 gooだとインデントされずに見づらかったし、一行で括弧つけずにif (x == 0) x = 1;みたいに書かれると個人的に判りづらかったので直し、 C99かつ厳しいモードでコンパイルしてみました。 入力用の行列はソース見ながら適当に決めた。(inputのところに書いた) http://ideone.com/eCfz8 >prog.c:97: error: format ‘%d’ expects type ‘int’, but argument 4 has type ‘double’ >prog.c:97: error: format ‘%d’ expects type ‘int’, but argument 6 has type ‘double’ >prog.c:79: error: unused variable ‘tmp’ %dってint型欲してるっつーに第4引数がdoubleだっ %dってint型欲してるっつーに第6引数がdoubleだっ tmpって変数、宣言しているけど、どこにも使ってねーじゃねーか って言われたのでちまちま修正 http://ideone.com/JdE0w gets危ないから使うな、って言われたけどとりあえず放置。 答えは正しい、か。ってことは計算過程が正しくて、表示の部分が何かおかしいっと。 そこに相当するのは…91行目から98行目の部分か。 for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; } b[i]=b[i]-p*b[k]; printf("a[%d %d]=%lf b[%d]=%lf",i,j,a[n*i+j]-p*a[n*k+j],i,b[i]-p*a[n*k+j]); } ん? 何で代入した後、もう一回引く計算してんだ? あと、ループの後のjの値ってここで使うのか? この行が実行された時のjの値ってnだよな? aとbの表示部を分けて、 表示ルーチンをループの中に入れて かつ、二重に引いてる引き算をなくしてみた。 a[n*i+j]-p*a[n*k+j]→a[n*i+j] あと、この入力方式使うと見づらいから関数の最初の処理で改行してみた。本来ココに入るべきではないような気もするけど。 http://ideone.com/pzotE 手元で計算。とりあえず期待通りの数値かな。 25 - 24 * 2 / 5 = 15.4 とまぁ、こんな思考を通って直してます。 ところで、これはC99という規格に沿ってやってます。多分昔の規格だと、変数宣言は関数の最初にしか許されてないと思うけど、 C++やC99では他の場所でも許されていて、こんなコードはエラーを吐かれます。 http://ideone.com/iUqn5 forの部分だけで使うっつってんのに7行目で使ってしまってアウトになる、と。今回の変数jでも活かせるかな、とか。 getsが良しとされない理由は面倒くさいので調べてないです。 【話してないこと。興味があれば調べてね】 ●ガウスの消去法で計算できないのはa[i,i]が計算途中で0になったら、ではないです。ピボット選択とかのルーチン組んでみようぜ ●配列の配列 int x[3][5]みたいな奴使うと見やすくなるかもね、というお話。

関連するQ&A

  • ガウスの消去法のプログラム

    ガウスの消去法(部分ピボット選択)のプログラムを組んでみたつもりなのですが上手くいきません。 間違いだらけだと思いますがどうかアドバイスをして頂けませんでしょうか? #include <stdio.h> double main(void){ int i,j,k,N,M,m; double A[N+1][N+1][N+1],B[j],S,X[N+1]; printf("次数の入力。\n"); scanf("%d",&N); for(k=1;k<=N;k++){ for(i=1;i<=N;i++){ for(j=1;j<=N+1;j++){ A[k][i][j]=0; } } } for(i=1;i<=N;i++){ for(j=1;j<=N+1;j++){ printf("係数の入力.\n A[1][%d][%d]?\n",i,j); scanf("%f",&A[1][i][j]); } } for(k=2;k<=N;k++){ if(A[k-1][k-1][k-1]=0){ for(M=k;M<=N;M++){ if(A[k-1][M][k-1]!=0){ for(j=k-1;j<=N+1;j++){ B[j]=A[k-1][k-1][j]; A[k-1][k-1][j]=A[k-1][M][j]; A[k-1][M][j]=B[j]; } goto abc; } else {printf("解は無い\n");} } } abc: for(i=k;i<=N;i++){ for(j=k;j<=N+1;j++){ A[k][i][j]=A[k-1][i][j]-(A[k-1][i][k-1]/A[k-1][k-1][k-1])*A[k-1][k-1][j]; } } X[N]=A[N][N][N+1]/A[N][N][N]; printf("解X(N)は %f 。\n",X[N]); for(k=N-1;k>=1;k--){ S=0; for(m=N;m>=k+1;m--){ S+=A[k][k][m]*X[m]; } X[k]=(A[k][k][N+1]-S)/A[k][k][k]; printf("解X(%d)は %f 。\n",k,X[k]);} } }

  • ガウスの消去法のプログラムについて

    ガウスの消去法のプログラムについて #include <stdio.h> #define N 3 void main(void) { static double a[N][N+1]={{3.0, 1.0, 1.0, 8.0}, {6.0, 2.0, 3.0, 4.0}, {9.0, 4.0, 5.0, 12.0}}; double d; int i,j,k; for (k=0;k<N-1;k++){ for (i=k+1;i<N;i++){ d=a[i][k]/a[k][k]; for (j=k+1;j<=N;j++) a[i][j]=a[i][j]-a[k][j]*d; } } for (i=N-1;i>=0;i++){ d=a[i][N]; for (j=i+1;j<N;j++){ d=d-a[i][j]*a[j][N]; a[i][N]=d/a[i][i]; } } for (k=0;k<N;k++){ printf("x%d=%f\n",k+1,a[k][N]); } } というプログラムを実行したら 8-5.c: In function `main': 8-5.c:4: warning: return type of `main' is not `int' と出たのですがどこを直せばよいのでしょうか?><

  • Gaussの消去法のプログラムなんですがこれを利用して、消去法による行

    Gaussの消去法のプログラムなんですがこれを利用して、消去法による行列式の計算プログラムをつくりたいのですが難しくてよくわかりません。。。 教えていただきたいです。 困ってるのでよろしくお願いします。 int gauss(double *x, double *a, double *b, int n) { int i,j,k,m; double tmp,p,sum; for(k=0; k<n-1;k++){ printf("---- Step %d ----\n",k+1); printf("-- before --\n"); for( m = k;m < n;m++){ printf("%lf\n",a[n * m + k]); } printf("-- --\n"); j = pivot(a,n,k); if(j == ERROR) { return ERROR; } else { if(j != k) { for(i=0; i<n; i++){ tmp = a[n*k+i]; a[n*k+i] = a[n*j+i]; a[n*j+i] = tmp; } tmp=b[j]; b[j]=b[k]; b[k]=tmp; } } printf("-- after --\n"); for( m = k;m < n;m++){ printf("%lf \n",a[n * m + k]); } for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; printf("a[%d %d]=%lf",i,j,a[n*i+j]); } b[i]=b[i]-p*b[k]; printf("b[%d]=%lf\n",i,b[i]); } printf("k=%d\n",k); /*--------------------------------------------------------------------------*/ } /* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS){ return(ERROR); } sum=0.0; for(j=k+1; j<n; j++){ sum+=a[n*k+j]*x[j]; } x[k]=(b[k] - sum)/a[k*n+k]; } return 0; } int pivot(double *a, int n, int k) { int i,m; double d; /* ピボットの探索 */ m = k; d = fabs(a[k*n+k]); for(i=k+1; i<n; i++){ if(fabs(a[n*i+k]) > d){ m = i; d = fabs(a[n*i+k]); } } if(fabs(d) < EPS) { return ERROR; } else { return m; } }

  • ガウスの消去法、後退代入について

    ガウスの消去法で、n変数n式の連立一次方程式を解くプログラムを 作っています。 ですが、前進消去およびピボット選択ははおそらくできたのですが 後退代入が悪いのか、答えが出ません。 もしかしたら前進消去部分も悪いのかもしれませんが;; いろいろ調べたのですが どうしたら直るのかわからなくなってしまいました。 どのようにして直せばいいのか教えてください。 プログラムは以下です。 #include<stdio.h> #include<math.h> #define SIZE 100/*上限MAXのマクロ定義*/ #define EPS (1.0e-5) int main() { /*変数宣言*/ int n; /*連立方程式の式数*/ int i; /*1つ目のループカウンタ*/ int j; /*2つ目のループカウンタ*/ int k;/*3つ目のループカウンタ*/ int pivot; /*pivot選択を行う際に使用する変数*/ double max; /*pivot選択用の絶対値が最大の値*/ double matrix_a[SIZE][SIZE]; /*変数xijの係数aij*/ double matrix_b[SIZE]; /*式iの定数項bi*/ double a_hozon;/*matrix_aの値を一時保存する変数*/ double b_hozon;/*matrix_bの値を一時保存する変数*/ double r_hozon;/*前進消去法をする時使用する値を一時保存する変数*/ int l; int m; /*入力処理*/ /*未知数nの入力*/ printf("n変数n式の連立一次方程式を解きます。\n"); printf("式数n(1~100)を入力してください。 n=?\n"); scanf("%d",&n); /*未知数nのチェック*/ if(n>SIZE||n<1) { printf("\n\nn=%dはプログラムの利用可能範囲外です。\n",n); return -1; } printf("%d変数%d式の一次方程式を入力して下さい。\n",n,n); printf("入力は、式毎に係数、定数項の順に行ってください。\n\n"); printf("連立一次方程式の拡大係数行列を表示します。\n"); for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%lf",&matrix_a[i][j]); } scanf("%lf",&matrix_b[i]); } for(i=0; i<n; i++) { for(j=0; j<n; j++) { printf("%6.2f",matrix_a[i][j]); } printf("|%6.2f\n",matrix_b[i]); } printf("計算します。\n"); /*pivot選択*/ for(k=0; k<n; k++) { max=0.0; pivot=0; for(i=k; i<n; i++) { if(fabs(matrix_a[i][k])>max) { max=fabs(matrix_a[i][k]); pivot=i; } } if(matrix_a[pivot][k]==0.0) { printf("正則性なし\n"); } if(pivot!=k) { for(j=0; j<n; j++) { a_hozon = matrix_a[k][j]; matrix_a[k][j] = matrix_a[pivot][j]; matrix_a[pivot][j] = a_hozon; } b_hozon = matrix_b[k]; matrix_b[k] = matrix_b[pivot]; matrix_b[pivot] = b_hozon; } } /*入れ換え後の行列を表示*/ for(l=0; l<n; l++) { for(m=0; m<n; m++) { printf("%6.2f",matrix_a[l][m]); } printf("|%6.2f\n",matrix_b[l]); } /*消去法*/ for(k=0; k<n; k++) { for(i=k+1; i<n-1; i++) { r_hozon = matrix_a[i][k]/matrix_a[k][k]; for(j=k; j<n; j++) { matrix_a[i][j] = matrix_a[i][j]-r_hozon*matrix_a[k][j]; } matrix_b[i] = matrix_b[i]-r_hozon*matrix_b[k]; } } /*後退代入*/ for(i=n-1; i>=0; i--) { matrix_b[i]=0.0; for(j=i+1; j<n; j++) { matrix_b[i]=matrix_b[i]-matrix_a[i][j]*matrix_b[j]; } } /* for(i=n-1; i>0; i--) { temp = 0.0; for(j=i+1; j<n; j++) { xn = b[n]/a[n][n]; xn-1 = (-a[n-1][n]*x[n]+b[n-1])/a[n-1][n-1]; xn-2 = (-a[n-2][n-1]*x[n-2]+a[n-2][n]*x[n]+b[n-2])/a[n-2][n-2]; xn-j = (-a[i][n-j]*x[i+1]+b[i])/a[i][i]; temp = matrix_a[][] temp=temp+matrix_a[i][j]*matrix_a[j][n]; matrix_a[i][n]=matrix_a[i][n]-temp; matrix_a[i][n]=matrix_a[i][n]/matrix_a[i][i]; } } */ /*不定、不能の判別*/ if(matrix_a[k][k]<EPS) { printf("解は一意に求まらない。\n"); return -1; } /*出力処理*/ printf("連立一次方程式の解を表示します。\n"); for(i=0; i<n; i++) { printf("x%d = %6.2f\n",i,matrix_b[i]); } return 0; }

  • ガウス消去

    行列3*3で4列目に答えが入る、ガウス消去の前進消去のプログラムを考えたのですが、3行目まで正規化してしまいます。 前進消去したのを行列mに格納しています。 int main() { int i, j, k,n=3; double a[3][4]={{ 3, 2,-3,-2}, { 2,-2, 1, 7}, {-3, 6, 5,28}}; double m[3][4]; /* 前進消去 */ for( i = 0; i < n; i++ ) { for( j = i+1; j <= n; j++ ) { m[i][j] = a[i][j]/a[i][i]; m[i][i]=1; for( k = i+1; k <= n+1; k++ ) { a[k][j] = a[k][j] -a[k][i] * m[i][j]; m[j][i]=0; }}}

  • ガウスの消去法のプログラムがどうしてもうまく動きません。

    こんにちは。あまりにも困ってしまったので質問させていただきました。 よろしければご回答をよろしくお願い致します。 さて、今ガウスの消去法のプログラムを作っているのですが、 どうしてもどうしても、正しい解を得ることができません。 今日はほぼ徹夜でずっとパソコン画面とにらめっこしていたのですが、 何をしてもどこをいじってもさっぱり上手く行かず、正直嫌気が差し始めているところです(泣) Cの詳しい知識などは皆無に近い人間ですが、 こんなド素人を助けていただけませんか? ↓が僕の書いたソースコードです。間違いだらけで非常に見苦しいと思いますがお許し下さい。 #include<stdio.h> #include<stdlib.h> #include<math.h> int main(){ float a[3][3] = { {-2, 4000000, -6000000}, {-2, 0.03, -0.2}, {1, -0.2, -0.05} }; float b[3] = {5000000, 0.1, 0.1}; float max[3]; float maxp; float temp; float x[3]; float m; int pivot = 0; int i,j,k; for( k = 0; k < 3; k++ ){ /* scaling */ for( j = 0; j < 3; j++ ){ max[j] = 0; for( i = 0; i < 3; i++ ){ if( max[j] < fabs(a[j][i]) ) max[j] = fabs(a[j][i]); } } for( j = 0; j < 3; j++ ){ for( i = 0; i < 3; i++ ){ a[j][i] = a[j][i] / max[j]; } b[j] = b[j]/max[j]; } /* pivoting */ for( j = k; j < 3; j++ ){ if ( maxp < fabs(a[j][k]) ){ pivot = j; maxp = fabs(a[j][k]); } } for( i = k; i < 3; i++ ){ temp = a[k][i]; a[k][i] = a[pivot][i]; a[pivot][i] = temp; } temp = b[k]; b[k] = b[pivot]; b[pivot] = temp; /* forword elimination */ for( j = k+1; j < 3; j++ ){ m = a[j][k] / a[k][k]; for( i = k; i < 3; i++ ){ a[j][i] -= a[k][i] * m; } b[j] -= b[k] * m; } /* backward substitution */ for( j = 1; j >= 0; j-- ){ for( i = j+1; i > 3; i++){ m += a[j][i] * b[i]; x[j] -= m; x[j] = x[j] / a[j][j]; } } } for( j = 0; j < 3; j++ ){ for( i = 0; i < 3; i++ ){ printf("%f ", a[j][i]); } printf("\n"); printf("%f", x[j]); } return(0); } ご回答お待ちしております。 改めて、お見苦しいソースコードだったとは思いますが、ご容赦下さい。

  • ネイピア数(e)のプログラム

    テイラー展開によってネイピア数の近似値を求める プログラミングが全くわかりません。 e = 2.71828 18284 59045 23536 02874 71352 … を計算したいのですが。 #include <stdio.h> #include <math.h> int kaijou(int p) { int cnt; int val=1; for(cnt=1 ; cnt<=p ; cnt++){ val=val*cnt; } return(val); } double napier(int p) { printf("eを計算します。E = (1+(1/k))^k\n"); printf("k=いくつまで計算しますか ?\n"); scanf("%d", &n); double E[n]; E[1] = 1; for (j = 1; j <= n; j++){ E[j] = E[j] + 1; } for (k = 1; k <= n; k++) { K = K + 1; A = 1 / K; // printf("A = %e, ",A); B = 1 + A; // printf("B = %e\n",B); for ( i = 1; i<=k; i++){ E[k] = E[k] * B; // printf("E[%3d]= %e\n",k,E[k]); } void main(void) { int n; int cnt; double answer; printf("計算する最大の項nを入力してください:"); scanf("%d",&n); for(cnt=1 ; cnt<=n ; cnt++){ answer=napier(cnt); printf("第%d項までの近似値:%f 真値:%f 差:%f\n",cnt,answer,exp(1),answer-exp(1)); } }

  • ガウスの消去法:C言語

    連立方程式をガウスの消去法を用いて解くプログラミングをVisual Studioで作成したいのですが、ビルドがうまくいきません ビルドをすると、 ・リンケージ指定子がグローバル スコープで宣言されていません ・直前のエラーを修復できません。コンパイルを中止します。 と表示されデバックできません。 どなたかご教授願います。 ちなみに、C++ win32コンソールアプリケーションを使用しています。 ソースコード↓ #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { #include <stdio.h> #include <math.h> #define EPS 1.0e-5 #define N 10 void DATAIN(char name[], int nr, int nc, double ma[]); void RESULT(char name[], int nr, int nc, double ma[]); int PIVOT(int *num, int nr, int k, double ma[]); int GAUSS(int nr, double ma[], double mb[], double mx[]); int main(void) { int nr,nc; int flag; double ma[N*N],mb[N],mx[N]; printf("方程式の数 nr="); scanf("%d",&nr); nc=nr; printf("\n配列maのデータ%d*%d=%d",nr,nr,nr*nr); printf("個を入力"); DATAIN("ma",nr,nc,ma); printf("\n配列mbのデータ %d 個を",nr); printf("入力してください"); DATAIN("mb",nr,1,mb); flag=GAUSS(nr,ma,mb,mx); if(flag) printf("計算不能"); else RESULT("mx",nr,1,mx); return (0); } void DATAIN(char name[], int nr, int nc, double ma[]) { int i,j; printf("\n---入力データ---\n"); for(i=0; i<nr; i++) { for(j=0; j<nc; j++) { printf(" %s[%d%d] = ",name,i+1,j+1); scanf("%lf",&ma[nc*i+j]); } } } void RESULT(char name[], int nr, int nc, double ma[]) { int i,j; printf("\n---計算結果---\n"); for(i=0; i<nr; i++) { for(j=0; j<nc; j++) printf(" %s[%d] = %8.5lf",name,i+1,ma[nc*i+j]); printf("\n"); } } int PIVOT(int *num, int nr, int k, double ma[]) { int i; double aa,bb; *num=k; aa=fabs(ma[nr*k+k]); for(i=k+1; i<nr; i++) { if (fabs(ma[nr*i+k])>aa) { *num=i; aa=fabs(ma[nr*i+k]); } } if(fabs(aa)<=EPS) return (1); if(*num==k) return (0); for(i=k; i<nr; i++) { bb=ma[nr*k+i]; ma[nr*k+i]=ma[nr*(*num)+i]; ma[nr*(*num)+i]=bb; } return (0); } int GAUSS(int nr, double ma[], double mb[], double mx[]) { int i,j,k; int num; double cc; for(k=0; k<nr-1; k++) { if(PIVOT(&num,nr,k,ma)!=0) return (1); if(num!=k) { cc=mb[num]; mb[num]=mb[k]; mb[k]=cc; } for(i=k+1; i<nr; i++) { cc=ma[nr*i+k]/ma[nr*k+k]; for(j=k+1; j<nr; j++) ma[nr*i+j]=ma[nr*i+j]-cc*ma[nr*k+j]; mb[i]=mb[i]-cc*mb[k]; } } for(k=nr-1; k>=0; k--) { if(fabs(ma[nr*k+k])<=EPS) return(1); cc=0.0; for(j=k+1; j<nr; j++) cc+=ma[nr*k+j]*mx[j]; mx[k]=(mb[k]-cc)/ma[nr*k+k]; } return (0); } return 0; }

  • ガウスの消去法を用いたC言語のプログラムについて

    現在あらかじめ与えられた連立方程式をガウスの消去法を用いて、 求めるというプログラムをC言語で作っています。 しかし学校ではまだ行列のやっておらず、 ガウスの消去法についても説明があやふやでした。 一応プログラムは出来たのですが明らかに無駄が多すぎて困っています。 与えられた方程式は下記の通りです。 2x + 3y + 4z = 20 3x - 2y + 5z = 14 5x + 4y - 7z = -8 プログラムは以下の通りです。 #include <stdio.h> int main(void){ double a[3][3] = {{2, 3, 4}, //(1) {3, -2, 5}, //(2) {5, 4, -7}}; //(3) double b[3] = {20, 14, -8}; double x = 0; double y = 0; double z = 0; int i; //前進消去 //(1)÷2 ・・・(1)' for(i = 0; i < 3; i++){ a[0][i] = a[0][i] / 2; } b[0] = b[0] / 2; //(2)-(1)'×3 ・・・(2)' for(i = 0; i < 3; i++){ a[1][i] = a[1][i] - a[0][i] * 3; } b[1] = b[1] - b[0] * 3; //(3)-(1)'×5 ・・・(3)' for(i = 0; i < 3; i++){ a[2][i] = a[2][i] - a[0][i] * 5; } b[2] = b[1] - b[0] * 5; //(2)'÷6.5 ・・・(2)'' for(i = 0; i < 3; i++){ a[1][i] = a[1][i] / 6.5; } b[1] = b[1] / 6.5; //(2)''×3.5 + (3) ・・・(3)'' for(i = 0; i < 3; i++){ a[2][i] = a[2][i] + a[1][i] * 3.5; } b[2] = b[2] + b[1] * 3.5; //(3)''÷3.53846でzを求める z = b[2] / a[2][1]; //後退代入 //(2)''にzを代入してyを求める a[1][1] = a[1][1] * z; y = b[1] - a[1][1]; //(1)'にyとzを代入してxを求める a[0][1] = a[0][1] * y; a[0][2] = a[0][2] * z; x = b[0] - a[0][1] - a[0][2]; printf("\n x = %f \n y = %f \n z = %f \n", x, y, z); return 0; } 制作はvc++を用いています。 ここからどうやって短くしていけばよいかがわかりせん。 アドバイスや指摘があればお願いいたします。

  • ガウスの消去法

    逆行列を求めたいのですが どうも上手くできません。 下にソースコードを載せますので どなたかどこが悪いのか ご教授してくれませんか? よろしくお願いします。 void MINV(double A[][100],double InvAf2[][100],int G,int R){ int i,j,k; double temp;//行列値の一時記憶 double B[100][100],C[100][100];//行列の一時記憶 for(k=0;k<R;k++){//k列目を調整する for(i=0;i<G;i++){//行数を指す for(j=0;j<R;j++){//列数を指す temp=A[k][k]; B[i][j]=A[i][j];//InvAf2を計算するのに必要 C[k][j]=InvAf2[k][j];//InvAf2を計算するのに必要(更新した値を使われると困る) if(i==k){ A[i][j]/=temp; InvAf2[i][j]/=temp; } else{ A[i][j] -= A[k][j] * A[i][k] / temp; InvAf2[i][j] -= C[k][j] * B[i][k] / temp; } } } } }

専門家に質問してみよう