我想拟合荧光寿命曲线。这些曲线由仪器响应函数(IRF,假定高斯)和(多)指数衰减的卷积给出:
其中 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 中实现这些方法的输入。迭代反卷积似乎是最容易做到的,所以也许我应该从它开始。另一方面,根据我的阅读,傅里叶方法应该更快、更可靠。但是,我不知道如何对傅里叶变换的结果进行拟合。