我正在尝试使用正弦函数识别点阅读。您可以在图像上看到结果不令人满意。我无法调整curve_fit
的各种参数以很好地拟合函数。我可以做些什么来改善我的结果?
from scipy.optimize import curve_fit as cf
import numpy as np
from matplotlib import pyplot as plt
xdata = np.array([0. , 0.02, 0.04, 0.06, 0.08, 0.1 , 0.12, 0.14, 0.16, 0.18, 0.2 ,
0.22, 0.24, 0.26, 0.28, 0.3 , 0.32, 0.34, 0.36, 0.38, 0.4 , 0.42,
0.44, 0.46, 0.48, 0.5 , 0.52, 0.54, 0.56, 0.58, 0.6 , 0.62, 0.64,
0.66, 0.68, 0.7 , 0.72, 0.74, 0.76, 0.78, 0.8 , 0.82, 0.84, 0.86,
0.88, 0.9 , 0.92, 0.94, 0.96, 0.98, 1. , 1.02, 1.04, 1.06, 1.08,
1.1 , 1.12])
ydata = np.array([37.5, 36.4, 37.1, 37.3, 38.2, 38.4, 38.1, 36.7, 34.3, 32.2, 33.1,
31.8, 33.4, 35.7, 37.8, 38.3, 38.1, 37. , 34.9, 32.5, 31.6, 31.7,
33.5, 35.5, 37.8, 38.4, 38.3, 36.9, 34.8, 32.2, 33.9, 31.6, 33.3,
35.5, 37.6, 38.3, 38.2, 36.7, 34.8, 32.4, 31.5, 32.1, 33.3, 35.5,
37.2, 38.3, 38.3, 36.8, 34.5, 32.3, 31.6, 31.8, 33.3, 35.7, 37.8,
38.4, 38.2])
def sin_fun(x,a,b,c,d):
return a*np.sin(b*x+c)+d
p_opt,p_cov=cf(sin_fun,xdata,ydata )
print(p_opt)
plt.plot(xdata,sin_fun(xdata,*p_opt))
plt.plot(xdata,ydata, 'r')
plt.show()
2条答案
按热度按时间4bbkushb1#
一般来说,@jared的答案是正确的。对于西内斯(或者,通常是任何周期函数),FFT是一种更可靠的方法,特别是如果它与二次峰值插值相结合:
4ktjp1zp2#
你可以通过给函数一个好的初始猜测并为目标函数提供一个雅可比函数来改进你的结果。
编辑:我在评论中被问到关于雅可比矩阵的问题,并给出了一个猜测。雅可比矩阵告诉曲线拟合函数,每个参数的变化将如何影响结果,它是通过对目标函数对每个参数的偏导数(按顺序)来计算的。对于猜测,我只是根据绘制的数据进行了目测。