繁体   English   中英

是否可以限制 lmfit 的准确性?

[英]Is it possible to limit the accuracy of lmfit?

我想问一些关于 lmfit 准确性的问题(并可能通过获得答案获得更好的拟合结果)。 所有实验光谱都受到采样的限制,即 x 轴方向上两点之间的距离。 我注意到(到目前为止)有两个 lmfit 试图克服此限制的实例,这给我带来了问题:

  1. 当峰的 FWHM 趋于零时。 我假设如果任意两个相邻点相隔 0.013 左右,则 FWHM 为 0.00000005 和数百万百分比误差的拟合结果没有多大意义。 我通过在峰的 FWHM 上设置适当的下边界解决了这个问题。 我还尝试用 Voigt 曲线拟合一些峰,每当洛伦兹宽度显示这种行为时,我将其转换为纯高斯分布。 我认为在这种情况下让它保持 Voigt 是没有意义的。 我的推理是否正确?

  2. 当一个峰的position趋于零时。 我相信推理和我上面提到的是一样的,但是这次,我真的不知道如何限制它“过于准确”。

这是导致实际问题的部分的代码:

 import lmfit from lmfit import Model, Parameters import matplotlib.pyplot as plt import numpy as np x=[-0.3933, -0.38, -0.3667, -0.3533, -0.34, -0.3267, -0.3133, -0.3, -0.2867, -0.2733, -0.26, -0.2467, -0.2333, -0.22, -0.2067, -0.1933, -0.18, -0.1667, -0.1533, -0.14, -0.1267, -0.1133, -0.1, -0.0867, -0.0733, -0.06, -0.0467, -0.0333, -0.02, -0.0067, 0.0067, 0.02, 0.0333, 0.0467, 0.06, 0.0733, 0.0867, 0.1, 0.1133, 0.1267, 0.14, 0.1533, 0.1667, 0.18, 0.1933, 0.2067, 0.22, 0.2333, 0.2467, 0.26, 0.2733, 0.2867] y=[0.0048, 0.005, 0.0035, 0.0034, 0.0038, 0.004, 0.0034, 0.0036, 0.0038, 0.0046, 0.0038, 0.0039, 0.0054, 0.0065, 0.0073, 0.0086, 0.0079, 0.0102, 0.0105, 0.0141, 0.0192, 0.0259, 0.0275, 0.0279, 0.0257, 0.0247, 0.022, 0.0244, 0.0268, 0.0295, 0.0275, 0.0227, 0.0192, 0.0138, 0.0075, 0.0088, 0.0081, 0.005, 0.0041, 0.0034, 0.0023, 0.0019, 0.0021, 0.0019, 0.0016, 0.0013, 0.0022, 0.002, 0.0019, 0.0014, 0.0022, 0.0012] def gfunction_norm(x, pos, gfwhm, int): gwid = gfwhm/(2*np.sqrt(2*np.log(2))); gauss= (1/(gwid*(np.sqrt(2*np.pi))))*(np.exp((-1.0/2)*((((x-pos)/gwid))**2))) return int*(gauss-gauss.min())/(gauss.max()-gauss.min()) def final(x, a, b, int2, pos2, gfwhm2, int3, pos3, gfwhm3): return a*x+b + gfunction_norm(x, pos2, gfwhm2, int2) + gfunction_norm(x, pos3, gfwhm3, int3) params1=Parameters() params1.add('a', value=-2.8e-04) params1.add('b', value=0.003) params1.add('int2', value=0.04, min=0.01) params1.add('pos2', value=0, min=-0.05, max=0.05) params1.add('gfwhm2', value=0.05, min = 0.005, max=0.2) params1.add('int3', value=0.04, min=0.01) params1.add('pos3', value=-0.11, min=-0.13, max=-0.06) params1.add('gfwhm3', value=0.090001, min=0.078, max=0.2) model1 = Model(final) result1 = model1.fit(y, params1, x=x) print(result1.fit_report()) plt.plot(x, y, 'bo', markersize=4) plt.plot(x, result1.best_fit, 'r-', label='best fit', linewidth=2) plt.plot(x, gfunction_norm(x, result1.params['pos2'].value, result1.params['gfwhm2'].value, result1.params['int2'].value)) plt.plot(x, gfunction_norm(x, result1.params['pos3'].value, result1.params['gfwhm3'].value, result1.params['int3'].value)) plt.legend() plt.show()

这是我通过拟合获得的结果:

a:      -0.00427895 +/- 0.00102828 (24.03%) (init = -0.00028)
b:       0.00331554 +/- 2.6486e-04 (7.99%) (init = 0.003)
int2:    0.02301220 +/- 9.6324e-04 (4.19%) (init = 0.04)
pos2:    0.00175738 +/- 0.00398305 (226.65%) (init = 0)
gfwhm2:  0.08657191 +/- 0.00708478 (8.18%) (init = 0.05)
int3:    0.02261912 +/- 8.7317e-04 (3.86%) (init = 0.04)
pos3:   -0.09568096 +/- 0.00432018 (4.52%) (init = -0.11)
gfwhm3:  0.09304840 +/- 0.00797209 (8.57%) (init = 0.090001)

你可以看到 pos2 旁边的巨大错误,我不确定如何修复它。

谢谢!

随着值趋于零,“不确定性百分比”将增加。 也就是说,如果 x 轴移动 +1,则pos2的值为 1.00176,标准误差为 0.004,显示的百分比将低于 1%——拟合将完全相同。

您可以将其解释为“ pos2与 0 一致”,但估计标准误差为 0.004 也是事实,而数据的 x 间距约为 0.01。 所以,是的,该值接近 0,但显然已知非常接近那个非常小的最佳拟合值。

也就是说,不要太在意与最佳拟合值相比标准误差的大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM