※ ChatGPTを利用し、要約された質問です(原文:数値解析に関する質問です)
数値解析に関する質問
このQ&Aのポイント
数値解析に関する質問について回答してくれませんか?
以下のプログラムについて、初項の絶対値が大きい方の式を選んで消去する理由と、2元1次連立方程式の解が得られないデータを入力した場合のエラー表示について教えてください。
プログラムの実行結果は、x0=2, x1=3であり、チェックの結果も正しいようです。
以下のプログラムにおいて
1) 初項の絶対値が大きい方の式を選んで消去する理由は何故か?
2)2元1次連立方程式の解が得られないデータ(例えば,1 2 3と2 4 6)を入力した場合,エラーを表示するようにするにはどうすればよいか?
教えてください。
よろしくお願いします。
#include <stdio.h>
#include<math.h>
//--------------------------------
void inputdata(double [2][3]);
void calsol(double [2][3], double [2]);
void elimination(double [2][3], double [2][3]);
void outputdata(double [2]);
void checksol(double [2][3], double [2]);
//---------------------------------
main() {
double c[2][3], x[2];
printf("Program of Gaussian elimination \n");
inputdata(c);
calsol(c, x);
outputdata(x);
checksol(c, x);
return(0);
}
//-----------------------------
void inputdata(double c[2][3]) {
printf("----------------------\n");
printf("Input Data\n");
printf("(a0*x0 + a1*x1 = a2)\n");
printf("\n");
printf("Equation 1\n");
printf("Input a0 a1 a2\n");
scanf("%lf%lf%lf" , &c[0][0], &c[0][1], &c[0][2]);
printf("Equation 2\n");
printf("Input b0 b1 b2\n");
scanf("%lf%lf%lf", &c[1][0], &c[1][1], &c[1][2]);
}
//-----------------------------
void calsol(double c[2][3], double x[2]){
double cc[2][3];
elimination(c, cc);
x[1]=cc[1][2];
x[0]=cc[0][2]-cc[0][1]*x[1];
}
//-----------------------------
void elimination(double c2[2][3],double cc[2][3]) {
int imax;
double c1[3];
if(fabs(c2[0][0])>fabs(c2[1][0])){
imax = 0;
}
else{
imax = 1;
}
cc[0][0] = 1;
if (imax == 0){
cc[0][1]= c2[imax][1]/c2[imax][0];
cc[0][2]=c2[imax][2]/c2[imax][0];
}
else{
cc[0][1]=c2[1][1]/c2[1][0];
cc[0][2]=c2[1][2]/c2[1][0];
c1[0]=0;
c1[1]=c2[0][1]-(cc[0][1]*c2[0][0]);
c1[2]=c2[0][2]-(cc[0][2]*c2[0][0]);
}
cc[1][0]=c1[0];
cc[1][1]=1;
cc[1][2]=c1[2]/c1[1];
}
//-----------------------------
void outputdata(double x[2]){
printf("--------\n");
printf("Solutions\n");
printf("x0=%14.6e\n", x[0]);
printf("x1=%14.6e\n", x[1]);
}
//-----------------------------
void checksol(double check [2][3],double x[2]) {
double crt, clt;
int ie;
printf("---------\n");
printf("Check Solutions\n");
printf("Left Term Right Term\n");
for(ie=0; ie<=1; ie++) {
clt = check[ie][0]*x[0] + check[ie][1]*x[1];
crt = check[ie][2];
printf("%14.6e %14.6e\n", clt,crt);
}
}
実行結果
Program of Gaussian elimination
----------------------
Input Data
(a0*x0 + a1*x1 = a2)
Equation 1
Input a0 a1 a2
2 3 13
Equation 2
Input b0 b1 b2
4 8 32
--------
Solutions
x0= 2.000000e+00
x1= 3.000000e+00
---------
Check Solutions
Left Term Right Term
1.300000e+01 1.300000e+01
3.200000e+01 3.200000e+01