最小二乗法(アルゴリズム) Least squares method 定義: ② 近似曲線は、複数の係数akと関数gkの積和f(x)とします。 ③ 各実験データのyiと各実験データのxiの関数f(xi)の誤差の二乗和をJとします。 ④ Jのそれぞれの係数akで偏微分した値がゼロになる時に、誤差が一番小さいと考えます。 ⑤ 例として、直線の場合を計算します。 ⑥ a係数の偏微分した値=0から、aを求めます。 ⑦ b係数の偏微分した値=0から、bを求めます。 例: #define NN 20 double test_data[NN][2] = { {-0.100, 2.200}, {1.250, 2.550}, {2.050, 2.800}, {2.850, 3.350}, {4.050, 4.150}, {5.000, 4.500}, {5.900, 5.200}, {7.200, 5.700}, {8.150, 6.000}, {8.950, 6.400}, {10.050, 7.200}, {11.100, 7.650}, {12.150, 8.150}, {12.950, 8.700}, {14.000, 8.850}, {14.950, 9.400}, {15.850, 10.200}, {17.150, 10.300}, {17.800, 10.900}, {19.050, 11.500} }; double a; double b; void least_squares_method_test() { int k; double sum_xk_yk = 0; double sum_xk = 0; double sum_yk = 0; double sum_xk_xk = 0; for (k = 0; k < NN; k ++) { sum_xk_yk += test_data[k][0] * test_data[k][1]; sum_xk += test_data[k][0]; sum_yk += test_data[k][1]; sum_xk_xk += test_data[k][0] * test_data[k][0]; } a = (NN * sum_xk_yk - sum_xk * sum_yk) / (NN * sum_xk_xk - sum_xk * sum_xk); b = (sum_xk_xk * sum_yk - sum_xk_yk * sum_xk) / (NN * sum_xk_xk - sum_xk * sum_xk); }結果: a = 0.49738, b = 2.05120。 y = 0.49738x + 2.05120
|