我希望适配荧光寿命曲线。这些曲线是仪器响应函数(IRF, 假设高斯分布)和(多)指数衰减的卷积结果。
虽然这种方法可以工作,但拟合过程非常缓慢,并且尚未给出任何合理的拟合结果。
有几种方法可以规避卷积过程,例如使用傅里叶变换或迭代去卷积。Origin似乎知道如何做到这一点,但我很难理解这些步骤。
据我所知,迭代去卷积的原理是先将信号与猜测的高斯函数进行去卷积,然后拟合结果,最后调整高斯函数。
傅里叶变换的方法基于实空间中的卷积对应于傅里叶域中的乘法的原理,这将减少计算时间。我猜它会对信号进行傅里叶变换,拟合结果,然后再进行傅里叶反变换。
我想了解如何在Python numpy/scipy中实现这些方法。迭代去卷积似乎最容易实现,所以也许我应该从那里开始。另一方面,根据我的阅读,傅里叶方法应该更快,更可靠。然而,我不知道如何对傅里叶变换后的结果进行拟合。
G是高斯函数,F是指数衰减函数。我尝试使用lmfit.minimize在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
其中,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中实现这些方法。迭代去卷积似乎最容易实现,所以也许我应该从那里开始。另一方面,根据我的阅读,傅里叶方法应该更快,更可靠。然而,我不知道如何对傅里叶变换后的结果进行拟合。