fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main(void) {
  5. // データセットの定義
  6. double x[] = {
  7. 0.15708, 0.23982, 0.37400, 0.57120,
  8. 0.82674, 1.04720, 1.23200, 1.43452
  9. };
  10. double y[] = {
  11. 0.98769, 0.97138, 0.93087, 0.84125,
  12. 0.67728, 0.50000, 0.33236, 0.13586
  13. };
  14.  
  15. int n = sizeof(x) / sizeof(x[0]); // データ数
  16.  
  17. // 正規方程式の各項の和を格納する変数
  18. // 行列 A = [[s_x4, s_x6], [s_x6, s_x8]]
  19. // ベクトル b = [s_yx2, s_yx4]
  20. double s_x4 = 0.0, s_x6 = 0.0, s_x8 = 0.0;
  21. double s_yx2 = 0.0, s_yx4 = 0.0;
  22.  
  23. int i;
  24. for (i = 0; i < n; i++) {
  25. double x2 = x[i] * x[i]; // x^2
  26. double x4 = x2 * x2; // x^4
  27. double x6 = x4 * x2; // x^6
  28. double x8 = x4 * x4; // x^8
  29. double Y = y[i] - 1.0; // Y = y - 1 (定数項を移項)
  30.  
  31. s_x4 += x4;
  32. s_x6 += x6;
  33. s_x8 += x8;
  34.  
  35. s_yx2 += Y * x2; // (y-1) * x^2
  36. s_yx4 += Y * x4; // (y-1) * x^4
  37. }
  38.  
  39. // 行列式 (Determinant) の計算 (2x2行列なので直接計算)
  40. double det = s_x4 * s_x8 - s_x6 * s_x6;
  41.  
  42. if (fabs(det) < 1.0e-10) {
  43. printf("解けません(行列式が0に近いため)\n");
  44. return 1;
  45. }
  46.  
  47. // クラメルの公式、または逆行列を用いて a1, a2 を求める
  48. double a1 = (s_yx2 * s_x8 - s_yx4 * s_x6) / det;
  49. double a2 = (s_x4 * s_yx4 - s_yx2 * s_x6) / det;
  50.  
  51. // 結果の表示
  52. printf("=== 実行結果 ===\n");
  53. printf("データ数 n = %d\n", n);
  54. printf("係数 a1 = %f\n", a1);
  55. printf("係数 a2 = %f\n", a2);
  56. printf("\n求められた近似式:\n");
  57. printf("y = 1 + (%.5f)x^2 + (%.5f)x^4\n", a1, a2);
  58.  
  59. // Excel等でのグラフ作成用データの出力(CSV形式)
  60. printf("\n=== グラフ作成用データ (CSV) ===\n");
  61. printf("x,y_measured,y_approx\n");
  62. for (i = 0; i < n; i++) {
  63. double y_approx = 1.0 + a1 * pow(x[i], 2) + a2 * pow(x[i], 4);
  64. printf("%f,%f,%f\n", x[i], y[i], y_approx);
  65. }
  66.  
  67. return 0;
  68. }
Success #stdin #stdout 0.01s 5316KB
stdin
Standard input is empty
stdout
=== 実行結果 ===
データ数 n = 8
係数 a1 = -0.497563
係数 a2 = 0.037795

求められた近似式:
y = 1 + (-0.49756)x^2 + (0.03779)x^4

=== グラフ作成用データ (CSV) ===
x,y_measured,y_approx
0.157080,0.987690,0.987746
0.239820,0.971380,0.971508
0.374000,0.930870,0.931142
0.571200,0.841250,0.841684
0.826740,0.677280,0.677573
1.047200,0.500000,0.499810
1.232000,0.332360,0.331858
1.434520,0.135860,0.136142