我不明白这个数据拟合有什么问题:
from scipy.optimize import curve_fit
def sin_fit(x, *p):
a,b,c,d= p
return a + b*np.sin(c*x+ d)
# p0 is the initial guess for the fitting coefficients
p0 = [0.1, 1., 1., 0.1]
coeff, var_matrix = curve_fit(sin_fit, t, data, p0=p0)
我想要么是有明显的错误,我现在错过了,要么我不能用scipy的曲线拟合来解决这个问题。有什么想法吗?
最佳答案
这似乎是你最初猜测的问题,特别是你选择的频率太远了。在您当前的初始猜测中,p0
在一个好的答案上不会收敛得足够快,因此您需要选择一个更好的curve_fit
。以下是我的意思的一个例子:
t = np.linspace(0,50,1000)
data = 0.275 * (np.random.rand(len(t)) * 0.2 + 1.) * np.sin(2. * np.pi / 15. * t - 7.5)
p0 = [0.2, 0.5, 1.5 * np.pi / 14, 0.]
coeff, var_matrix = curve_fit(sin_fit, t, data, p0=p0)
plt.plot(t, data, 'bo')
plt.plot(t, sin_fit(t, *p0), 'g-')
plt.plot(t, sin_fit(t, *coeff), 'r-')
下面您可以看到,使用更接近的初始猜测(绿色曲线)
p0
将更好地执行拟合(红色曲线):关于python - scipy的曲线拟合不适用于正弦波吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26344655/