数値解析に関する質問です。
数値解析に関する質問です。
以下のプログラムでは、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);
}
}
補足
すいません、質問の内容に不備がありました。上に示したプログラムにエラーは出ません。「収束した計算結果」は表示されるのですが、「収束過程の計算」が表示されません。その点についてお聞きしたい次第です。