Gaussの消去法プログラムについて

このQ&Aのポイント
  • Gaussの消去法を利用して、行列式の計算プログラムを作成したいと思っています。しかし、難しくてよくわかりません。教えてください。
  • Gaussの消去法のプログラムは、行列の連立方程式を解くために使用されます。このプログラムでは、ピボット選択と後退代入の手法が使用されています。
  • プログラムの中には、行列の要素の入れ替えや係数の更新が行われます。さらに、ピボット選択を行うための関数も定義されています。
回答を見る
  • ベストアンサー

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; } }

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

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

ガウスの消去法って一次連立方程式の解を求めるのでよかったっけ? // コメントに「**」とある個所を追加・変更した // 画面出力とかは省略 int gauss(double *x, double *a, double *b, int n) { int i,j,k,m; double tmp,p,sum; for(k=0; k<n;k++){ // ** 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; } } for(i=0; i<n; i++){ // ** if(i == k) { // ** p=a[n*k+k]; // ** for(j=0; j<n; j++){ // ** a[n*i+j]/=p; // ** } // ** b[i]/=p; // ** } else { // ** 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]; } // ** } } /* 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; }

関連するQ&A

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

    ガウスのの単純消去法のプログラムです。 前進消去の第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; }

  • ピボット選択がどのように行われてるか確かめたいので

    ピボット選択がどのように行われてるか確かめたいので 関数pivotを呼び出す前と呼び出して式を入れ替えた後のakk,ak+1k,...,ankを調べたいのですが どうすればいいのでしょうか? int gauss(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++){ printf("---- Step %d ----\n",k+1); /* ピボットの選択 */ /*** 追加(2):ピボット選択前,選択して式を入れ替えた後それぞれの * a(k,k), a(k+1,k), ... , a(n-1,k) * を表示して,ピボット選択がどのように行なわれたか調べる. ***/ /*--- ピボット選択前の位置 ---*/ printf("-- before --\n"); /* a(k,k), a(k+1,k), ... , a(n-1,k) を表示させる.*/ /*----------------------------*/ j = pivot(a,n,k); /* j: ピボットとして選ばれたa(j,k)の行番号 */ if(j == ERROR) { return ERROR; } else { if(j != k) { /* ピボットにはa(k,k)ではなくa(j,k)が選ばれた.式の入れ替えが必要 */ /* Aのk行とj行の入れ替え.*/ for(i=0; i<n; i++){ tmp = a[n*k+i]; a[n*k+i] = a[n*j+i]; a[n*j+i] = tmp; } /* b[k] と b[j] の入れ替え */ tmp=b[j]; b[j]=b[k]; b[k]=tmp; } } /*--- ピボット選択をし,式の入れ替えをした直後の位置 ---*/ printf("-- after --\n"); /* a(k,k), a(k+1,k), ... , a(n-1,k) を表示させる. /*------------------------------------------------------*/ /* 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]; 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]); } /*--- 追加(1):第k段によって x[k] を消去した後の,各式の状態を表示する. ---*/ /* a(1,1),a(1,2),...,a(1,n),b(1); a(2,1),a(2,2),... a(2,n),b(2), ... */ 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; } }

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

    ガウスの消去法(部分ピボット選択)のプログラムを組んでみたつもりなのですが上手くいきません。 間違いだらけだと思いますがどうかアドバイスをして頂けませんでしょうか? #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' と出たのですがどこを直せばよいのでしょうか?><

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

    こんにちは。あまりにも困ってしまったので質問させていただきました。 よろしければご回答をよろしくお願い致します。 さて、今ガウスの消去法のプログラムを作っているのですが、 どうしてもどうしても、正しい解を得ることができません。 今日はほぼ徹夜でずっとパソコン画面とにらめっこしていたのですが、 何をしてもどこをいじってもさっぱり上手く行かず、正直嫌気が差し始めているところです(泣) 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); } ご回答お待ちしております。 改めて、お見苦しいソースコードだったとは思いますが、ご容赦下さい。

  • c言語 行列のn階乗のプログラム

      1 2 -1 D= 3 0 -2   -1 1 2 の3次正方行列のn乗を計算するプログラムを作成しています。 いろいろと試してみましたがうまくいきません。 どなたか教えていただけるとうれしいです。 よろしくおねがいします。 #include <stdio.h> int main(void) { int a[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int b[3][3]={ {-1,2,-1},{3,0,-2},{-1,1,2} }; int s[3][3]; int m,n; int i,j,k; printf("[A]^n;n = ");scanf("%d",&n); for (m=2;m <= n;m++){ for (i=0;i<3;i++){ for (j=0;j<3;j++){ s[i][j] = 0; for(k=0;k<3;k++){ s[i][j] =s[i][j] + a[i][k] * b[k][j]; } } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ b[i][j]=s[i][j]; } } printf("%3d",s[i][j]); putchar('\n'); } return (0); }

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

    ガウスの消去法で、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; }

  • ガウスの消去法: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; }

  • -1.#IND00と出てしまうのですが・・・

    vc++(2010)でガウスの消去法を使って連立方程式を解く、というプログラムを組みました。 正直中身自体をきちんと理解していないので、 組みながら理解しようと思って組んだのですが、 結果に-1.#IND00と出てしまいました。 これは何なのでしょうか? 下記がそのプログラムです。 #include<stdio.h> #include<math.h> #define N 3 int main(void){ double a[N][N+1] = {{2,3,4}, {3,-2,5}, {5,4,-7}}; double b[1][N+1] = {20,14,-8}; double x[N]; int i = 0; int j = 0; int k = 0; int l = 0; int pivot = 0; double p = 0; double q = 0; double m = 0; for(i = 0; i < N; i++){ x[i] = 0; } for(i = 0; i < N; i++){ pivot = i; for(l = i; l < N; l++){ if(fabs(a[l][i]) > m){ m = fabs(a[l][i]); pivot = l; } } if(pivot != i){ for(j = 0; j < N; j++){ b[0][j] = a[i][j]; a[i][j] = a[pivot][j]; a[pivot][j] = b[0][j]; } } } for(k = 0; k < N; k++){ a[k][j] = a[k][j] / p; a[k][k] = 1; for(j = k; j < N; j++){ a[k][j] = a[k][j] / p; } for(i = k+1; i < N; i++){ q = a[i][k]; for(j = k+1; j < N; j++){ a[i][j] = a[i][j] - q*a[k][j]; } a[i][k] = 0; } } for(i = N-1; i >= 0; i--){ x[i] = a[i][N]; for(j = N-1; j > i; j--){ x[i] = x[i] - a[i][j] * x[j]; } } // for(i = 0; i < N; i++){ // for(j = 0; j < N+1; j++){ // printf("%.1f", a[i][j]); // } // printf("\n"); // } // printf("解\n"); // for(i = 0; i < N; i++){ // printf("%f\n", x[i]); // } 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)); } }

専門家に質問してみよう