我想用高斯函数拟合数据。你知道吗
原始数据本身显示了一个非常明显的峰值。 当我尝试使用“曲线拟合”进行拟合时,拟合会标识峰值,但它没有曲线顶部。 我现在也在尝试用spinmob的fitter来拟合数据。然而,这个拟合只是给出了一条直线。你知道吗
我试过修改fitter的几个参数,高斯函数定义,以及fit的初始参数,但似乎没有任何效果。你知道吗
代码如下:
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
import spinmob as s
x = x30
y = ydata
def gaussian(x, A, mu, sig): # See http://mathworld.wolfram.com/GaussianFunction.html
return A/(sig * np.sqrt(2*np.pi)) * np.exp(-np.power(x-mu, 2) / (2 * np.power(sig, 2)))
popt,pcov = curve_fit(gaussian,x,y,p0=[1,7.688,0.005])
FWHM = 2*np.sqrt(2*np.log(2))*popt[2]
print("FWHM: {}".format(FWHM))
plt.plot(x,y,'bo',label='data')
plt.plot(x,gaussian(x,*popt),'r+-',label='fit')
plt.legend()
fitter = s.data.fitter()
fitter.set(subtract_bg=True, plot_guess_zoom=True)
fitter.set_functions(f=gaussian, p='A=1,mu=8.688,sig=0.001')
fitter.set_data(x, y, eydata = 0.03)
fitter.fit()
曲线拟合返回此图: Curve_fit plot
spinmob fitter图给出: Spinmob Fitter Plot
假设
spinmob
实际上使用了scipy.curve_fit
,我会猜测(抱歉)问题是,您给它的初始值太远了,它不可能找到解决方案。你知道吗当然,
A=1
对scipy.curve_fit()
或spinmob.fitter()
都不是一个很好的猜测。峰值肯定是负数,你应该猜一个更像-0.1
而不是+1
的值。实际上,您可以断言A
必须是<;0。你知道吗您给
curve_fit()
的mu
的初始值7.688非常好,它将允许一个解决方案。我不知道这是否是一个输入错误,但是您给spinmob.fitter()
的mu
的初始值8.688是非常遥远的(也就是说,远远超出了数据范围),拟合永远无法从那里优化到正确的解决方案。你知道吗初始值对曲线拟合很重要,初始值不好会导致不好的结果。你知道吗
它可能被一些人视为一个无耻的插头,但请允许我鼓励您尝试
lmfit
(https://lmfit.github.io/lmfit-py/)(我是主要作者)解决这类问题。Lmfit将参数值数组替换为命名的参数对象,以便更好地组织拟合。它还有一个内置的高斯模型(它也计算半高宽,包括不确定性)。也就是说,使用Lmfit,您的脚本可能如下所示:这将打印出一份报告,如
并生成一个数据图和最佳拟合
应该和你想做的很接近。你知道吗
相关问题 更多 >
编程相关推荐