使用scipy在python中对正弦函数进行曲线拟合不会产生所需的输出

问题描述 投票:0回答:1

我正在尝试将正弦函数适合我的数据。没有显示错误,但似乎没有用。

python
def sin_fun(x,a,b):
    return (a*np.sin(b*x))

p_opt,p_cov=cf(sin_fun,xdata,ydata)
print(p_opt)

plt.plot(xdata,sin_fun(xdata,*p_opt))
plt.scatter(xdata,ydata)
plt.show()

这是我得到的输出:

“我得到的输出”

scipy python-3.7 curve-fitting
1个回答
1
投票
我已经模拟了您的数据。您的代码有2个问题,说明为什么它没有执行您想要的操作。首先是您的sin_fun需要一个y-offset参数,否则该函数将始终关于y = 0对称。其次,如果可以为curve_fit提供合理的猜测,则拟合会更好。这是使用p0参数完成的。在这里看看:

from scipy.optimize import curve_fit as cf import numpy as np from matplotlib import pyplot as plt # simulate your data xdata = np.linspace(0, 25000, 256) ydata = 15000 * np.sin(xdata/2000) + 22000 # add some noise ydata += np.random.rand(xdata.size) * 2000 # sin function needs a y-offset -> c def sin_fun(x,a,b,c): return a*np.sin(b*x)+c # need a reasonable guess -> note that the guess is not quite right but curve_fit still works p_opt,p_cov=cf(sin_fun,xdata,ydata, p0=(10000, 1/2500, 15000)) print(p_opt) plt.plot(xdata,sin_fun(xdata,*p_opt)) plt.plot(xdata,ydata, 'r.', ms=1) plt.show()

result

通过这些修复程序,您可以很好地适应您的需求。您也可以在函数中添加相位参数,以帮助拟合其他正弦曲线。

© www.soinside.com 2019 - 2024. All rights reserved.