![](/img/trans.png)
[英]Iterative reconvolution fitting with measured irf using python and lmfit
[英]Fitting data with Voigt profile in lmfit in python - huge errors
我正在嘗試使用 Voigt 配置文件(Python 中的 lmfit)擬合一些 RIXS 數據,並且我已按以下方式定義了 Voigt 配置文件:
def gfunction_norm(x, pos, gwid):
gauss= (1/(gwid*(np.sqrt(2*np.pi))))*(np.exp((-1.0/2)*((((x-pos)/gwid))**2)))
return (gauss-gauss.min())/(gauss.max()-gauss.min())
def lfunction_norm(x,pos,lwid):
lorentz=(0.15915*lwid)/((x-pos)**2+0.25*lwid**2)
return (lorentz-lorentz.min())/(lorentz.max()-lorentz.min())
def voigt(x, pos, gwid, lwid, int):
step=0.005
x2=np.arange(pos-7,pos+7+step,step)
voigt3=np.convolve(gfunction_norm(x2, pos, gwid), lfunction_norm(x2, pos, lwid), mode='same')
norm=(voigt3-voigt3.min())/(voigt3.max()-voigt3.min())
y=np.interp(energy, x2, norm)
return y * int
我在 Python 中使用了這個定義而不是流行的 Voigt 配置文件定義:
def voigt(x, alpha, cen, gamma):
sigma=alpha/np.sqrt(2*np.log(2))
return np.real(wofz((x-cen+1j*gamma)/sigma/np.sqrt(2)))/(sigma*2.51)
因為它讓我更清楚地了解峰的強度等。
現在,我有幾個具有 9-10 個峰的光譜,我正試圖用 Voigt 曲線擬合它們(正是我定義它的方式)。
現在,我有幾個問題:
你覺得我的 Voigt 定義可以嗎? 使用卷積而不是近似的第二定義有什么(不利)優勢?
由於我的健康,有時我會得到瘋狂的大標准差。 例如,這些是其中一個峰的最佳擬合參數:
int8: 0.00986265 +/- 0.00113104 (11.47%) (init = 0.05)
pos8: -2.57960013 +/- 0.00790640 (0.31%) (init = -2.6)
gwid8: 0.06613237 +/- 0.02558441 (38.69%) (init = 0.1)
lwid8: 1.0909e-04 +/- 1.48706395 (1363160.91%) (init = 0.001)
(強度,position,分別為高斯和洛倫茲寬度)。 這個 output 是否意味着這個峰應該是純高斯峰?
model = Model(final)
result = model.fit(spectra[:,nb_spectra], params, x=energy)
print(result.fit_report())
“最終”是我之前定義的許多 voigt 配置文件的總和。
謝謝!
這似乎是Lmfit fit 的重復或后續操作會產生巨大的不確定性- 請在每個主題的 SO 問題上使用。
您認為我的 Voigt 定義可以嗎? 使用卷積而不是近似的第二定義有什么(不利)優勢?
是什么讓你說第二個定義是近似的? 從某種意義上說,所有浮點計算都是近似的,但是來自 scipy.special.wofz 的 Faddeeva scipy.special.wofz
是Voigt 剖面的解析解。 自己進行卷積可能會慢一些,並且也是一個近似值(在機器精度級別)。
由於您使用的是 Lmfit,我建議使用它的VoigtModel
這將使您的生活更輕松:它使用scipy.special.wofz
和參數名稱,可以輕松切換到其他配置文件(例如GaussianModel
)。
您沒有給出一個非常完整的代碼示例(供參考,SO 或多或少期望實際代碼的最小工作版本並強烈推薦),但這可能看起來像
from lmfit.models import VoigtModel
model = VoigtModel(prefix='p1_') + VoigtModel(prefix='p2_') + ...
由於我的健康,有時我會得到瘋狂的大標准差。 例如,這些是其中一個峰的最佳擬合參數:
int8: 0.00986265 +/- 0.00113104 (11.47%) (init = 0.05) pos8: -2.57960013 +/- 0.00790640 (0.31%) (init = -2.6) gwid8: 0.06613237 +/- 0.02558441 (38.69%) (init = 0.1) lwid8: 1.0909e-04 +/- 1.48706395 (1363160.91%) (init = 0.001)
(強度,position,分別為高斯和洛倫茲寬度)。 這個 output 是否意味着這個峰應該是純高斯峰?
首先,這可能不是“瘋狂的大”標准差——它在某種程度上取決於數據和擬合的 rest。 也許int8
的值真的非常小,並且與其他峰值嚴重重疊——它可能與其他變量高度相關。 但是,這很可能意味着峰值更像高斯分布。
由於您正在分析 X 射線散射數據,因此使用 Voigt function 可能部分證明材料響應會給出高斯分布的想法(斷言、假設、期望?),而儀器(包括 X 射線源) ) 會產生洛倫茲展寬。 這表明洛倫茲寬度對於各種峰可能是相同的,或者可能參數化為入射和散射波長或q
值的簡單 function。 也就是說,您可能能夠(並且可能會更好)將洛倫茲寬度的值(我認為您的lwid
或lmfit.models.VoigtModel
中的gamma
)限制為相同。
事實上,我認為還有一個導致大錯誤的額外問題。 即,兩個數據點之間的距離大於洛倫茲寬度(最佳擬合參數)。 顯然,這沒有意義,我應該設置一個更大的最小邊界。 現在我面臨的問題是我的點數太少,但我必須用我所擁有的來工作。 非常感謝您的回答!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.