我不明白这个数据拟合有什么问题:

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/

10-12 19:00