最小二乗法が使いやすいと思います.
いくつか追加のモジュールが必要です.
Macで試したのですが,NumPyとMatplotLibとSciPyをインストールすれば良いと思います.
mash
1$ pip3 install numpy
2$ pip3 install matplotlib
3$ pip3 install scipy
その上で,以下のコードを実行してみてください.
テストに使ったデータは y = x ** 2 + 1 の座標です.
2次関数の一般形 y = a * x ** 2 + b * x + c を定義して,
そのパラメータを推定しています.
a_fit,b_fit,c_fitにそれぞれ推定したパラメータが格納されます.
三角関数,指数・対数関数などでも利用できると思うので,試してみてください.
python
1import numpy as np
2import matplotlib.pyplot as plt
3from scipy import optimize
4
5x = np.array([0, 1, 2, 3, 4, 5, 6, 7])
6y = np.array([1, 2, 5, 10, 17, 26, 37, 50])
7
8def fit_func(parameter,x,y):
9 a = parameter[0]
10 b = parameter[1]
11 c = parameter[2]
12 residual = y-(a*x**2+b*x+c)
13 return residual
14
15parameter0 = [0.,0.,0.]
16result = optimize.leastsq(fit_func,parameter0,args=(x,y))
17a_fit=result[0][0]
18b_fit=result[0][1]
19c_fit=result[0][2]
20print(a_fit,b_fit,c_fit)
21
22#PLot
23plt.figure(figsize=(8,5))
24plt.plot(x,y,'bo', label='Exp.')
25plt.plot(x,a_fit*x**2+b_fit*x+c_fit,'k-', label='fitted parabora', linewidth=10, alpha=0.3)
26plt.xlabel('X-axis')
27plt.ylabel('Y-axis')
28plt.legend(loc='best',fancybox=True, shadow=True)
29plt.grid(True)
30plt.show()
参考
フィッティング3(最小二乗法,optimizeの利用) — Mechanical Design Lab. of TUMSAT 1.0 documentation