2013-05-10 177 views
4

我想擬合熒光壽命曲線。這些曲線由儀器響應函數的卷積(IRF,假設高斯)和(多)指數衰減給出:傅立葉變換/使用numpy/scipy在python中進行迭代反捲積

formula

在G是高斯和F指數衰減。我已經在Python使用lmfit.minimize嘗試配合這一點,具有以下功能:

def gaus(t, gamp, gwidth, gtoff): 
    i = gamp*math.exp(-(t-gtoff)**2/gwidth) 
    return i 


def exp1(t, expamp, exptime, exptoff): 
    i = expamp*math.exp((t-exptoff)/(exptime)) 
    return i 

def func1(t, gamp, gwidth, gtoff, expamp1, exptime1, exptoff1): 

    i = [(scipy.integrate.quad(lambda Tpr: gaus((ti - Tpr), gamp, gwidth, gtoff)*exp1(ti, expamp1, exptime1, exptoff1), 0, ti))[0] 
      for ti in t] 
    return i 

凡GAUS限定高斯儀器響應函數,EXP1是單指數衰減。 FUNC1計算兩個與scipy.integrate之間的卷積,它返回被用於計算擬合之間的差的值和給定的數據的一組參數:

def fitfunc(params, x, data): 
    ..getting parameters part here.. 

    values = func1(t, gamp, gwidth, toff, expamp1, exptime1, toff) 
    return values - data 

result = lmfit.minimize(fitfunc, fit_params, args = (t, test)) 

雖然這種作品的,擬合過程是非常緩慢的,還沒有給出我的任何合理的配合。

有幾種方法可以通過使用傅立葉變換或迭代反捲積來規避卷積過程。 Origin似乎知道如何去做,但我無法理解程序。

據我所知,迭代反捲積的工作原理是用猜測的高斯函數去卷積信號,然後擬合結果,然後調整高斯。

傅里葉變換方法將基於實空間中的卷積對應於傅立葉域中的乘法的原理,這將減少計算時間。我猜測這將是傅里葉變換信號,擬合,然後傅里葉變換回來。

我想要一些關於如何在python numpy/scipy中實現這些方法的輸入。迭代去卷積似乎是最容易做到的,所以也許我應該從頭開始。另一方面,從我讀過的內容來看,傅里葉方法應該更快更可靠。但是,我不知道如何對傅里葉變換結果進行擬合。

回答

3

一些意見和想法:

1)在你上面的實現gtoff和expoff是多餘的。這同樣適用於gamp和expamp。使用例如expoff = 0和expamp = 1。 2)如果你只是在多指數衰減與高斯內核的卷積之後,使用分析結果,使用scipy.special.erf可以很容易和高效地評估:exp(-t/tau) (t)= 0)與標準化的高斯1 /(sqrt(2 * pi)* sigma)* exp(-t^2 /(2 * sigma^2) (2 * t * tau-s2)/(sqrt(2)* tau * sigma)))來計算(2 * t * tau_s2)/(2 * tau^2))*

這顯然會推廣到您的exp1和gaus的定義。

3)您可以使用np.convolve有效地卷積矢量,這是基於您在文章中提到的F​​FT方法。對於您的特定應用程序,高斯應該以包裝順序來表示。見例如數值食譜,第13.1章瞭解細節(否則你的時間原點將會改變)。

4)傳統方法基於使用典型恆定高斯內核的迭代重新卷積。儘管可能,但解卷積是不適當的。

5)多功能包安裝時間分辨熒光數據已經設計實現所有您需要什麼:trfit