将数据拟合到高斯轮廓时,如何在lmfit中包括误差线?

时间:2019-06-02 07:20:24

标签: python lmfit

我正在使用lmfit将数据适合高斯人。我要完成的三件事是: 1)了解如何在lmfit中计算误差 2)如何在lmfit中包含我自己的计算错误 3)如何绘制适合范围内的误差

def gaussian(x, amp, cen, fwhm):
    return + amp * np.exp(-(x - cen) ** 2 / (2 * (fwhm / 2.35482) ** 2))    

def gaussian_fit(x,y,guess=[1,0,0,5],varies=[True,True,True,True]):

c = 299792458 #m/s
gmod = Model(gaussian)
gmod.nan_policy = 'omit'
#x,y - your dataset to fit, with x and y values
print (np.max(y))
gmod.set_param_hint('amp', value=guess[0],vary=varies[0])  
gmod.set_param_hint('cen', value=guess[1],vary=varies[1])
gmod.set_param_hint('fwhm', value=guess[2],vary=varies[2])  
gmod.make_params()

result = gmod.fit(y,x=x,amp=guess[0], cen=guess[1], fwhm=guess[2])

amp = result.best_values['amp']
cen = result.best_values['cen']
fwhm = result.best_values['fwhm']
#level = result.best_values['level']
sigma = fwhm / 2.35482
c = 299792458 #m/s
print(result.fit_report())

gaussfield = amp * np.sqrt(2 * np.pi * sigma ** 2)
residual = y - result.best_fit

print ('params:',amp,cen,fwhm,sigma,gaussfield)
return amp,cen,fwhm,sigma,gaussfield,residual

amp, cen, fwhm, sigma, gaussfield, residual 
= gaussian_fit(xdata,ydata,guess=[.1,6.9,.02],varies=[True,False,False]) 

我看不到脚本中的错误,因此如何将其包含在最终报告中?您如何才能包含自己的错误而不是lmfit的错误?如何最终绘制这些错误?

1 个答案:

答案 0 :(得分:1)

首先,我建议只使用lmfit.models.GaussianModel,而不要使用set_param_hint()-只是要明确而不是聪明-就像:

from lmfit.models import GaussianModel
gmodel = GaussianModel()
params = gmodel.make_params(amplitude=1, center=0, sigma=2)
result = gmodel.fit(y, params, x=x)

print(result.fit_report())

现在,您的问题:

  1. 通过查看更改参数值将如何更改拟合来估算最佳拟合参数的不确定性。将chi-square定义为残差数组(data-fit)/data_uncertainty的平方和,每个参数的不确定性(以及参数-参数相关性)估计为将chi-square增加1的值。还有更多有关非线性最小二乘拟合如何工作的更深入的资源。

  2. “如何在lmfit中包括我自己的计算错误”。在这里,我想您是指y数据中的不确定性,而不是参数中的不确定性(例如,您将如何知道不确定性而不是值?)。如果您不确定数据,请将其作为weights数组传递给Model.fit,也许作为

    result = gmodel.fit(y,params,x = x,weights = 1.0 / dely)

  3. 如何在拟合范围内绘制误差。您可以使用matplotlibs errorbar函数绘制数据及其错误栏。如果要绘制参数不确定性对最佳拟合曲线的预期范围的影响,可以使用delmodel = result.eval_uncertainty(x=x)然后绘制xresult.best_fit + delmodel和{{1 }}。 Matplotlib的result.best_fit - delmodel函数通常对此有用。