簡體   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