/* 連立方程式の解法(Gauss-Jordan Method) 2x_1+3x_2+x_3=4 4x_1+x_2-3x_3=-2 -x_1+2x_2+2x_3=2 x1=2.000000 x2=-1.000000 x3=3.000000 */ #include <stdio.h> #define N 3 /* 元の数 */ main() { /* 係数行列 */ static double a[N][N+1]={{2.0 ,3.0 ,1.0 ,4.0 }, {4.0 ,1.0 ,-3.0 ,-2.0 }, {-1.0 ,2.0 ,2.0 ,2.0 }}; double p,d; int i,j,k; for (k=0;k<N;k++){ p=a[k][k]; /* ピボット係数 */ for (j=k;j<N+1;j++) /* ピボット行をpで割る */ a[k][j]=a[k][j]/p; for (i=0;i<N;i++){ /* ピボット列の掃き出し */ if (i!=k){ d=a[i][k]; for (j=k;j<N+1;j++) a[i][j]=a[i][j]-d*a[k][j]; } } } for (k=0;k<N;k++) printf("x%d=%f\n",k+1,a[k][N]); }
/* 連立方程式の解法(ピボット選択法) Gauss-Jordan法では、ピボットの値が0に近い小さな値になったとき、 それで各係数を割ると誤差が大きくなってしまう。 そこで、ピボットのある列の中で絶対値最大なものをピボットに選ぶことで 誤差を少なくする方法を「ピボット選択法」という。 2x_1+3x_2+x_3=4 4x_1+x_2-3x_3=-2 -x_1+2x_2+2x_3=2 */ #include <stdio.h> #include <math.h> #include <stdlib.h> #define N 3 /* 元の数 */ main() { /* 係数行列 */ static double a[N][N+1]={{2.0 ,3.0 ,1.0 ,4.0 }, {4.0 ,1.0 ,-3.0 ,-2.0 }, {-1.0 ,2.0 ,2.0 ,2.0 }}; double p,d,max,dumy; int i,j,k,s; for (k=0;k<N;k++){ max=0;s=k; for(j=k;j<N;j++){ if (fabs(a[j][k])>max){ max=fabs(a[j][k]);s=j; } } if (max==0){ printf("解けない"); exit(1); } for (j=0;j<=N;j++){ dumy=a[k][j]; a[k][j]=a[s][j]; a[s][j]=dumy; } p=a[k][k]; /* ピボット係数 */ for (j=k;j<N+1;j++) /* ピボット行をpで割る */ a[k][j]=a[k][j]/p; for (i=0;i<N;i++){ /* ピボット列の掃き出し */ if (i!=k){ d=a[i][k]; for (j=k;j<N+1;j++) a[i][j]=a[i][j]-d*a[k][j]; } } } for (k=0;k<N;k++) printf("x%d=%f\n",k+1,a[k][N]); }
/* 連立方程式の解法(ガウスの消去法) 2x_1+3x_2+x_3=4 4x_1+x_2-3x_3=-2 -x_1+2x_2+2x_3=2 */ #include <stdio.h> #define N 3 /* 元の数 */ main() { /* 係数行列 */ static double a[N][N+1]={{2.0 ,3.0 ,1.0 ,4.0 }, {4.0 ,1.0 ,-3.0 ,-2.0 }, {-1.0 ,2.0 ,2.0 ,2.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]); }