fork(1) download
  1. // ガウスの消去法を行う関数を作成せよ。引数として拡大係数行列を受け取ることとする。
  2.  
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<math.h>
  6.  
  7. #define MN_MAX 100
  8. #define EPS 1.0E-3 //許容誤差
  9.  
  10. struct matrix_data{
  11. int row; //行数
  12. int col; //列数
  13. double dat[MN_MAX];
  14.  
  15. };
  16.  
  17. struct matrix_data AugmentedMatrix = {
  18. 3,
  19. 4,
  20. {
  21. 2.0, 3.0, -1.0, 1.0,
  22. 1.0, 1.0, 2.0, 0.0,
  23. 3.0, -1.0, 1.0, 2.0,
  24. }
  25. };
  26.  
  27. struct matrix_data init_matrix(int m, int n)
  28. {
  29. struct matrix_data mat;
  30.  
  31. mat.row = m;
  32. mat.col = n;
  33.  
  34. return mat;
  35. }
  36.  
  37.  
  38. void set_matrix(struct matrix_data* mat, int i, int j, double val)
  39. {
  40. mat->dat[i*mat->col + j] = val;
  41. }
  42.  
  43. double get_matrix(struct matrix_data mat, int i, int j)
  44. {
  45. return mat.dat[i*mat.col + j];
  46. }
  47.  
  48. //p行とq行を入れ替える
  49. struct matrix_data exchange_matrix(struct matrix_data mat,int p, int q)
  50. {
  51. int i;
  52. double dp,dq;
  53.  
  54. for(i = 0; i < mat.col; ++i){
  55. dp = get_matrix(mat, p, i);
  56. dq = get_matrix(mat, q, i);
  57. set_matrix(&mat, q, i, dp);
  58. set_matrix(&mat, p, i, dq);
  59. }
  60. return mat;
  61. }
  62.  
  63. //行列の表示
  64. void show_matrix(struct matrix_data mat)
  65. {
  66. int i, j;
  67.  
  68. for (i = 0; i < mat.row; i++){
  69. for(j = 0; j < mat.col; j++){
  70. printf("%f ",get_matrix(mat, i, j));
  71. }
  72. printf("\n");
  73. }
  74. }
  75.  
  76. //ガウスの消去法
  77. struct matrix_data Gaussian_Elimination(struct matrix_data mat)
  78. {
  79. int i,j,k;
  80. int n;
  81. double p,q;
  82.  
  83. struct matrix_data x;
  84. x = init_matrix(mat.col-1,1);
  85. n = mat.col;
  86.  
  87. // 前進消去
  88. for(k = 0; k < n-1; k++){
  89. for(i = k+1; i < n-1; i++){
  90. if(fabs(get_matrix(mat, k, k)) < fabs(get_matrix(mat, i, k))){
  91. mat = exchange_matrix(mat, i, k);
  92. }
  93. }
  94. if(fabs(get_matrix(mat, k, k)) < EPS){
  95. exit(2);
  96. }
  97.  
  98. p = get_matrix(mat, k, k);
  99. for(j = k; j < n; j++){
  100. set_matrix(&mat, k, j, get_matrix(mat, k, j) / p);
  101. }
  102.  
  103. for(i = k+1; i < n-1; i++){
  104. q = get_matrix(mat, i, k);
  105. for(j = k; j< n; j++){
  106. set_matrix(&mat, i, j, get_matrix(mat, i ,j) - get_matrix(mat, k, j)*q);
  107. }
  108. }
  109. }
  110. printf("途中経過\n");
  111. show_matrix(mat);
  112.  
  113. // 後退代入
  114. for(k = n-2; k >= 0; k--){
  115. q = get_matrix(mat, k, n-1);
  116. for(j = k+1; j < n-1; j++){
  117. q = q - get_matrix(mat, k ,j) * get_matrix(x, j, 0);
  118. }
  119. set_matrix(&x, k, 0, q);
  120. }
  121. return x;
  122. }
  123.  
  124.  
  125. int main(void)
  126. {
  127. struct matrix_data x;
  128.  
  129. printf("もとの行列を表示します\n");
  130. show_matrix(AugmentedMatrix);
  131.  
  132. x = Gaussian_Elimination(AugmentedMatrix);
  133. printf("解を表示します。\n");
  134. show_matrix(x);
  135.  
  136. return 0;
  137. }
  138.  
Success #stdin #stdout 0.01s 1720KB
stdin
Standard input is empty
stdout
もとの行列を表示します
2.000000 3.000000 -1.000000 1.000000 
1.000000 1.000000 2.000000 0.000000 
3.000000 -1.000000 1.000000 2.000000 
途中経過
1.000000 -0.333333 0.333333 0.666667 
0.000000 1.000000 -0.454545 -0.090909 
0.000000 0.000000 1.000000 -0.240000 
解を表示します。
0.680000 
-0.200000 
-0.240000