• ベストアンサー

数値解析に関する質問です。

数値解析に関する質問です。 以下のプログラムでは、4元1次連立方程式のデータは、cとcheckの2つの配列に入力される。この理由を教えてください。また、1つの配列に入力して済ませる方法を教えてください。 よろしくお願いします。 /*kadai 13 Gaussian Elimination Method for System of Linear Equations*/ #include <stdio.h> #include<math.h> /*---------------------------*/ void inputdata(double[4][5],double [4][5]); void calsol(double [4][5],double [4]); void elimination(double [4][5], double [4][5]); void pivot(int *, double [4][5], int *); void outputdata(double [4]); void checksol(double [4][5],double [4]); /*---------------------------*/ main(){ double c[4][5], check[4][5],x[4]; /*---------------------------*/ printf("Program of Gaussian Elimination Method 3\n"); /*---------------------------*/ inputdata(c, check); /*---------------------------*/ calsol(c,x); /*---------------------------*/ outputdata(x); /*---------------------------*/ checksol(check, x); /*---------------------------*/ return(0); } /*---------------------------*/ /* Function inputdata */ /*--------------------------*/ void inputdata(double c[4][5],double check[4][5]){ int ie,ic; printf("-----\n"); printf("Input Data\n"); printf("(a0*x0 + a1*x1 + a2*x2 +a3*x3 = a4)\n"); printf("\n"); for(ie=0; ie<=3; ie++){ printf("Equation %d\n",ie); printf("Input a0 a1 a2 a3 a4\n"); for (ic=0; ic<=4; ic++){ scanf("%lf",&c[ie][ic]); check[ie][ic] = c[ie][ic]; } } } /*---------------------------*/ /* Functiom calsol */ /*---------------------------*/ void calsol(double c[4][5],double x[4]){ double cc[4][5]; elimination(c, cc); x[3]=cc[3][4]; x[2]=cc[2][4]-cc[2][3]*x[3]; x[1]=cc[1][4]-cc[1][3]*x[3]-cc[1][2]*x[2]; x[0]=cc[0][4]-cc[0][3]*x[3]-cc[0][2]*x[2]-cc[0][1]*x[1]; } /*---------------------------*/ /*Function elimination */ /*---------------------------*/ void elimination(double c[4][5],double cc[4][5]){ int ie,ic,ienew,imax,eli; eli = 0; while(eli<4){ pivot(&eli,c,&imax); cc[eli][eli] = 1; for(ie=eli+1;ie<=4;ie++){ cc[eli][ie]=c[imax][ie]/c[imax][eli]; } ienew= 0; for(ic=0;ic<=3-eli;ic++){ if(ie != imax){ for(ie=eli+1;ie<=4;ie++){ c[ienew][ie]=c[ic][ie]-cc[eli][ie]*c[ic][eli]; } ienew = ienew + 1; } } eli = eli +1; } } /*---------------------------*/ /*Function pivot */ /*---------------------------*/ void pivot(int *eli,double c[4][5],int *imax){ int ie; double cmax; cmax=0; for(ie=0;ie<=4-*eli;ie++){ if(fabs(c[ie][*eli])>cmax){ cmax=fabs(c[ie][*eli]); *imax=ie; } } } /*---------------------------*/ /*Function outputdata */ /*---------------------------*/ void outputdata(double x[4]){ int i; printf("------\n"); printf("Solutions\n"); for(i=0;i<=3;i++){ printf("x%d=%14.6e\n",i,x[i]); } } /*---------------------------*/ /*Function checksol*/ /*---------------------------*/ void checksol(double check[4][5],double x[4]){ double crt,clt; int ie,ic; printf("-------\n"); printf("Check Solutions\n"); printf("Left Term Right Term\n"); for(ie=0;ie<=3;ie++){ clt = 0; for(ic =0;ic<=3;ic++){ clt = clt + check[ie][ic]*x[ic]; } crt = check[ie][4]; printf("%14.6e %14.6e\n",clt,crt); } }

みんなが選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8469/18132)
回答No.1

cとcheckの2つの配列に入力されるのは、それぞれの役目が違うから。 cは方程式の解を求めるために使われるのだが、その際に値が変化します。checkは方程式の解が求まった後に、その解が正しいことを確認するために、はじめに入力した係数行列を保存しておきます。従って値の変化するcをこの用途で使うことはできません。 1つの配列に入力して済ませ対のであれば、解の確認をやめることです。

関連するQ&A