fork(1) download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main() {
  5. // 与えられたデータセット (8組)
  6. double x[8] = {0.15708, 0.23982, 0.37400, 0.57120, 0.82674, 1.04720, 1.23200, 1.43452};
  7. double y[8] = {0.98769, 0.97138, 0.93087, 0.84125, 0.67728, 0.50000, 0.33236, 0.13586};
  8.  
  9. double Sx2 = 0, Sx4 = 0, Sy = 0, Sx2y = 0;
  10.  
  11. // 正規方程式に必要な各合計値の計算
  12. for (int i = 0; i < 8; i++) {
  13. double x2 = x[i] * x[i];
  14. Sx2 += x2;
  15. Sx4 += x2 * x2;
  16. Sy += y[i];
  17. Sx2y += x2 * y[i];
  18. }
  19.  
  20. // 正規方程式の行列要素設定
  21. double A11 = 8, A12 = Sx2;
  22. double A21 = Sx2, A22 = Sx4;
  23.  
  24. double B1 = Sy, B2 = Sx2y;
  25.  
  26. // 2元連立方程式を解く (クラメルの公式 / 行列式デタミナント)
  27. double det = A11 * A22 - A12 * A21;
  28. double a1 = (B1 * A22 - A12 * B2) / det;
  29. double a2 = (A11 * B2 - B1 * A21) / det;
  30.  
  31. // 結果の出力
  32. printf("=========================================\n");
  33. printf("モデル (1): y = a1 + a2*x^2 計算結果\n");
  34. printf("=========================================\n");
  35. printf("求められた係数:\n");
  36. printf(" a1 = %.6f\n", a1);
  37. printf(" a2 = %.6f\n", a2);
  38.  
  39. // 残差平方和 (誤差の2乗和 E) の計算
  40. double E = 0;
  41. for (int i = 0; i < 8; i++) {
  42. double yhat = a1 + a2 * x[i] * x[i];
  43. double diff = y[i] - yhat;
  44. E += diff * diff;
  45. }
  46.  
  47. printf("\n近似式による偏差の2乗和 (誤差 E):\n");
  48. printf(" E = %.10f\n", E);
  49.  
  50. // Excelプロット用の予測値出力 (yhatのみ)
  51. printf("\n近似式による y の予測値 (Excelグラフ作成用):\n");
  52. for (int i = 0; i < 8; i++) {
  53. double yhat = a1 + a2 * x[i] * x[i];
  54. printf("%f\n", yhat);
  55. }
  56. printf("=========================================\n");
  57.  
  58. return 0;
  59. }
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
=========================================
モデル (1): y = a1 + a2*x^2 計算結果
=========================================
求められた係数:
  a1 = 0.985005
  a2 = -0.423999

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

近似式による y の予測値 (Excelグラフ作成用):
0.974543
0.960619
0.925697
0.846667
0.695202
0.520035
0.341448
0.112479
=========================================