簡體   English   中英

scipy.integrate Pseudo-Voigt函數,積分變為0

[英]scipy.integrate Pseudo-Voigt function, integral becomes 0

我正在編寫一個腳本,使用Scipy,Numpy和Matplotlib在Python中將峰形擬合到光譜數據。 它可以同時適應多個峰值。 峰值輪廓(現在)是Pseudo-Voigt,它是高斯(aka Normal)和Lorentzian(aka Cauchy)分布的線性組合。

我有一個選項開關,我可以讓軟件優化高斯和洛倫茲的貢獻或將其設置為固定值(其中0 =純高斯和1 =純洛倫茲)。 按預期工作,繪制擬合的峰值看起來像預期的那樣。 當我嘗試使用scipy.integrate計算峰的積分時,問題就開始了。

到目前為止,我嘗試了scipy.integrate.quad,scipy.integrate.quadrature,scipy.integrate.fixed_quad和scipy.integrate.romberg。 當峰值為純高斯時,積分變為類似於1.73476E-34 (並不總是相同的數字),即使對於明顯具有比非純高斯相鄰的峰值更大的區域的峰值,但是返回有限積分的大小為10到1000.以下是相關部件的外觀:

# Function defining the peak functions for plotting and integration
# WavNr: Wave number, the x-axis over which shall be integrated
# Pos: Peak center position
# Amp: Amplitude of the peak
# GammaL: Gamma parameter of the Lorentzian distribution
# FracL: Fraction of Lorentzian distribution
def PseudoVoigtFunction(WavNr, Pos, Amp, GammaL, FracL):
    SigmaG = GammaL / np.sqrt(2*np.log(2)) # Calculate the sigma parameter  for the Gaussian distribution from GammaL (coupled in Pseudo-Voigt)
    LorentzPart = Amp * (GammaL**2 / ((WavNr - Pos)**2 + GammaL**2)) # Lorentzian distribution
    GaussPart = Amp * np.exp( -((WavNr - Pos)/SigmaG)**2) # Gaussian distribution
    Fit = FracL * LorentzPart + (1 - FracL) * GaussPart # Linear combination of the two parts (or distributions)
    return Fit

這是由繪圖函數調用的:

Fit = PseudoVoigtFunction(WavNr, Pos, Amp, GammaL, FracL)

哪個工作正常。 它也由集成商通過以下方式調用:

PeakArea, PeakAreaError = integrate.quad(PseudoVoigtFunction, -np.inf, np.inf, args=(Pos, Amp, GammaL, FracL))

或scipy.integrate提供的任何其他變體,都具有相同的結果,如果FracL = 0,則PeakArea =(幾乎)0。

我確定問題只是因為我太愚蠢而無法弄清楚scipy.integrate如何使用比我能找到的示例更復雜的函數。 希望有人看到我不知道的明顯錯誤。 兩天搜索stackoverflow和Scipy Docs並重新排列和完全重寫我的代碼讓我無處可去。 我懷疑scipy.integrate中的args在某種程度上與問題有關,但對於我能找到的所有內容,它們似乎都是正確排列的。

在此先感謝,Os

我相信你知道,間隔(-inf,inf)非常大。 :)高斯衰減非常快,所以除了峰值附近的間隔,高斯在數值上與0無法區分。我懷疑quad根本看不到你的峰值。

一個簡單的解決方法是將積分分成兩個區間(-inf,pos)和(pos,inf)。 (你的函數關於Pos是對稱的,所以你真的只需要兩倍的積分(-inf,pos)。)

這是一個例子。 我不知道這些參數值是否接近您使用的典型值,但它們說明了這一點。

In [259]: pos = 1500.0

In [260]: amp = 4.0

In [261]: gammal = 0.5

In [262]: fracl = 0  # Pure Gaussian

quad認為積分為0:

In [263]: quad(PseudoVoigtFunction, -np.inf, np.inf, args=(pos, amp, gammal, fracl))
Out[263]: (0.0, 0.0)

相反,整合(-inf,pos)和(pos,inf):

In [264]: quad(PseudoVoigtFunction, -np.inf, pos, args=(pos, amp, gammal, fracl))
Out[264]: (1.5053836955785238, 3.616268258191726e-11)

In [265]: quad(PseudoVoigtFunction, pos, np.inf, args=(pos, amp, gammal, fracl))
Out[265]: (1.5053836955785238, 3.616268258191726e-11)

因此(-inf,inf)的積分大約是3.010767。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM