fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define N 3 //未知数の数
  5. /*計算結果を表示する際に、三角行列になったか
  6. 確認したいときは1を、解のみ表示した場合は0にしておく*/
  7. #define CHECK 1
  8.  
  9. void gauss(double a[N][N+1])
  10. {
  11. int i,j,k,l,pivot;
  12. double x[N];
  13. double p,q,m,b[1][N+1];
  14.  
  15. for(i=0;i<N;i++) {
  16. m=0;
  17. pivot=i;
  18.  
  19. for(l=i;l<N;l++) {
  20. /*i列の中で一番値が大きい行を選ぶ*/
  21. if(fabs(a[l][i])>m) {
  22. m=fabs(a[l][i]);
  23. pivot=l;
  24. }
  25. }
  26.  
  27. /*pivotがiと違えば、行の入れ替え*/
  28. if(pivot!=i) {
  29. for(j=0;j<N+1;j++) {
  30. b[0][j]=a[i][j];
  31. a[i][j]=a[pivot][j];
  32. a[pivot][j]=b[0][j];
  33. }
  34. }
  35. }
  36.  
  37. for(k=0;k<N;k++) {
  38. p=a[k][k]; //対角要素を保存
  39. /*対角要素は1になることがわかっているので直接代入*/
  40. a[k][k]=1;
  41.  
  42. for(j=k+1;j<N+1;j++) {
  43. a[k][j]/=p;
  44. }
  45.  
  46. for(i=k+1;i<N;i++) {
  47. q=a[i][k];
  48.  
  49. for(j=k+1;j<N+1;j++) {
  50. a[i][j]-=q*a[k][j];
  51. }
  52. /*0となることがわかっているので直接代入*/
  53. a[i][k]=0;
  54. }
  55. }
  56.  
  57. /*解の計算*/
  58. for(i=N-1;i>=0;i--) {
  59. x[i]=a[i][N];
  60. for(j=N-1;j>i;j--) {
  61. x[i]-=a[i][j]*x[j];
  62. }
  63. }
  64.  
  65. /*行列が最後どうなったか見たいときに実行*/
  66. #if CHECK==1
  67. for(i=0;i<N;i++) {
  68. for(j=0;j<N+1;j++) {
  69. printf("%10.3f",a[i][j]);
  70. }
  71. printf("\n");
  72.  
  73. }
  74. #endif
  75.  
  76. printf("解は\n");
  77. for(i=0;i<N;i++) {
  78. printf("%f\n",x[i]);
  79. }
  80.  
  81. }
  82.  
  83. int main(void)
  84. {
  85. /*テストデータ用(プログラムが正常に動いているかの確認用)
  86. 3つの解1,2,3がでる。未知数の個数Nは3にする必要あり*/
  87. /*double a[N][N+1]={{4.0,1.0,1.0,9.0},
  88.   {1.0,3.0,1.0,10.0},
  89.   {2.0,1.0,5.0,19.0}
  90.   };*/
  91. double a[N][N+1]={{0.0,2.0,1.0,4.0},
  92. {4.0,2.0,1.0,8.0},
  93. {2.0,1.0,8.0,16.0}};
  94.  
  95. /*解きたい連立方程式から行列をつくり配列a[N][N+1]に入れ、
  96. 関数gaussに渡す*/
  97. gauss(a);
  98.  
  99. return 0;
  100. }
  101.  
  102.  
  103.  
Success #stdin #stdout 0s 4400KB
stdin
Standard input is empty
stdout
     1.000     0.500     0.250     2.000
     0.000     1.000     0.500     2.000
     0.000     0.000     1.000     1.600
解は
1.000000
1.200000
1.600000