Fourier变换/使用numpy/scipy的python迭代解卷积拟合

2024-06-02 08:00:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个荧光寿命曲线。这些曲线由仪器响应函数(IRF,假设为高斯)和(多)指数衰减的卷积得出:

formula

其中G是高斯衰减,F是指数衰减。我已经尝试在python中使用最小拟合,具有以下功能:

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  

其中gauss定义高斯仪器响应函数,exp1为单指数衰减。func1使用整合,它返回的值用于计算拟合与给定一组参数的数据之间的差:

^{pr2}$

虽然这类工作,装配过程非常缓慢,还没有给我任何合理的适合。在

有几种方法可以通过使用傅立叶变换或迭代反褶积来绕过卷积过程。Origin似乎知道如何做,但我在理解过程时遇到了困难。在

据我所知,迭代反褶积的工作原理是用猜测的高斯函数对信号进行反褶积,然后对结果进行拟合,然后调整高斯函数。在

傅里叶变换方法将基于这样一个原理:实空间中的卷积对应于傅里叶域中的乘法,这将减少计算时间。我猜应该是对信号进行傅里叶变换,拟合,然后再进行傅里叶变换。在

我想要一些关于如何在pythonnumpy/scipy中实现这些方法的信息。迭代反褶积似乎是最容易做到的,所以也许我应该从这开始。另一方面,据我所知,傅里叶法应该更快更可靠。但是,我不知道如何对傅里叶变换后的结果进行拟合。在


Tags: 方法return过程defti指数卷积曲线
1条回答
网友
1楼 · 发布于 2024-06-02 08:00:50

一些评论和想法:

1)在上述实现中,gtoff和expoff是多余的。gamp和expamp也是如此。例如,使用expoff=0和expamp=1。在

2)如果您只是在多指数衰变与高斯核的卷积之后,请使用分析结果,使用scipy.special.erf:exp(-t/tau)(t>;=0)与标准化高斯1/(sqrt(2*pi)*exp(-t^2/(2*sigma^2))的卷积为

1/2*exp(-(2*t*tau-s2)/(2*tau^2))*(1+erf((2*t*tau-s2)/(sqrt(2)*tau*sigma)))。在

这显然概括了exp1和gaus的定义。在

3)可以使用np.卷积,这是基于你的帖子中提到的FFT方法。对于特定的应用程序,高斯函数应该以环绕顺序表示。如需有关详细信息,请参阅第13.1章“数值配方”(否则时间原点将发生变化)。在

4)传统的方法是基于一个典型的常数高斯核的迭代重卷积。虽然反褶积是可能的,但它是不适定的。在

5)设计了一个用于拟合时间分辨荧光数据的通用软件包,实现了您所需的一切:trfit

相关问题 更多 >