fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. void gauss(double A[3][3], double b[3], double x[3]) {
  5. for (int i = 0; i < 3; i++) {
  6. double pivot = A[i][i];
  7. for (int j = 0; j < 3; j++) A[i][j] /= pivot;
  8. b[i] /= pivot;
  9.  
  10. for (int k = 0; k < 3; k++) {
  11. if (k == i) continue;
  12. double factor = A[k][i];
  13. for (int j = 0; j < 3; j++) A[k][j] -= factor * A[i][j];
  14. b[k] -= factor * b[i];
  15. }
  16. }
  17.  
  18. for (int i = 0; i < 3; i++) x[i] = b[i];
  19. }
  20.  
  21. int main() {
  22. double xval[8] = {0.15708, 0.23982, 0.37400, 0.57120, 0.82674, 1.04720, 1.23200, 1.43452};
  23. double yval[8] = {0.98769, 0.97138, 0.93087, 0.84125, 0.67728, 0.50000, 0.33236, 0.13586};
  24.  
  25. double S2 = 0, S4 = 0, S6 = 0, S8 = 0;
  26. double Sy = 0, S2y = 0, S4y = 0;
  27.  
  28.  
  29. for (int i = 0; i < 8; i++) {
  30. double x2 = xval[i] * xval[i];
  31. double x4 = x2 * x2;
  32. double x6 = x4 * x2;
  33. double x8 = x4 * x4;
  34.  
  35. S2 += x2;
  36. S4 += x4;
  37. S6 += x6;
  38. S8 += x8;
  39.  
  40. Sy += yval[i];
  41. S2y += x2 * yval[i];
  42. S4y += x4 * yval[i];
  43. }
  44.  
  45.  
  46. double A[3][3] = {
  47. {8, S2, S4},
  48. {S2, S4, S6},
  49. {S4, S6, S8}
  50. };
  51.  
  52. double b[3] = {Sy, S2y, S4y};
  53. double sol[3];
  54.  
  55. gauss(A, b, sol);
  56. printf("(2): y = b1 + b2*x^2 + b3*x^4 計算結果\n");
  57. printf("求められた係数:\n");
  58. printf(" b1 = %.6f\n", sol[0]);
  59. printf(" b2 = %.6f\n", sol[1]);
  60. printf(" b3 = %.6f\n", sol[2]);
  61.  
  62. double E = 0;
  63. for (int i = 0; i < 8; i++) {
  64. double x2 = xval[i] * xval[i];
  65. double x4 = x2 * x2;
  66. double yhat = sol[0] + sol[1] * x2 + sol[2] * x4;
  67. double diff = yval[i] - yhat;
  68. E += diff * diff;
  69. }
  70.  
  71. printf("\n近似式による偏差の2乗和 (誤差 E):\n");
  72. printf(" E = %.10f\n", E);
  73.  
  74. printf("\n近似式による y の予測値:\n");
  75. for (int i = 0; i < 8; i++) {
  76. double x2 = xval[i] * xval[i];
  77. double x4 = x2 * x2;
  78. double yhat = sol[0] + sol[1] * x2 + sol[2] * x4;
  79. printf("%f\n", yhat);
  80. }
  81.  
  82. return 0;
  83. }
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
(2): y = b1 + b2*x^2 + b3*x^4 計算結果
求められた係数:
  b1 = 0.999699
  b2 = -0.496930
  b3 = 0.037543

近似式による偏差の2乗和 (誤差 E):
  E = 0.0000005016

近似式による y の予測値:
0.987460
0.971243
0.930925
0.841562
0.677587
0.499900
0.331937
0.136076