用python和lmfit对实测irf进行迭代再卷积拟合

用python和lmfit对实测irf进行迭代再卷积拟合,python,convolution,non-linear-regression,lmfit,deconvolution,Python,Convolution,Non Linear Regression,Lmfit,Deconvolution,我尝试使用python和lmfit将指数衰减函数与卷积拟合到测量仪器响应 我是python新手,我正在努力学习python中的代码 定义拟合的初始参数时,我会得到错误 ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all() 根据lmfit.model的文档,我怀疑这是因为参数irf在模型中被定义为args=(irf)。我尝试将irf传递到model而不是params。我也尝试过使用**kwargs P> >将 IRF 合并为模型>代码>卷积并拟合数据?<

我尝试使用
python
lmfit
将指数衰减函数与卷积拟合到测量仪器响应

我是python新手,我正在努力学习python中的代码

定义拟合的初始参数时,我会得到错误

ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

根据
lmfit.model
的文档,我怀疑这是因为参数
irf
在模型中被定义为
args=(irf)
。我尝试将
irf
传递到
model
而不是
params
。我也尝试过使用
**kwargs


<> P> <强> >将<代码> IRF <代码>合并为<代码>模型>代码>卷积并拟合数据?< /强>

< p>我相信你想考虑<代码> IRF < /C>作为模型函数的一个附加自变量-一个值,你传递给函数,但在拟合中不被当作变量。< /P> 为此,只需修改模型函数的签名
jumpexpmodel()
,使其更简单

def jumpexpmodel(x, tau1, ampl1, tau2, ampl2, y0, x0, irf):
函数体很好(实际上,
args=(irf)
不起作用,因为您需要解包
args
——这里的签名确实是您想要的)

然后告诉
lmfit.Model()
irf是一个自变量-默认情况下第一个参数是唯一的自变量:

mod = Model(jumpexpmodel, independent_vars=('x', 'irf'))
然后,在制作参数时,不要包括
irf
args

pars = mod.make_params(tau1=10, ampl1=1000, tau2=10, ampl2=1000, y0=0, x0=10)
而是现在将
irf
x
一起传递到
mod.fit()

程序的其余部分看起来很好,由此产生的拟合效果会相当好,并给出一份

[[Model]]
    Model(jumpexpmodel)
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 138
    # data points      = 2797
    # variables        = 6
    chi-square         = 3795.52585
    reduced chi-square = 1.35991610
    Akaike info crit   = 865.855713
    Bayesian info crit = 901.473529
[[Variables]]
    tau1:   50.4330421 +/- 0.68246203 (1.35%) (init = 10)
    ampl1:  2630.30664 +/- 20.1552948 (0.77%) (init = 1000)
    tau2:   225.392872 +/- 2.75674753 (1.22%) (init = 10)
    ampl2:  523.257894 +/- 12.4451921 (2.38%) (init = 1000)
    y0:     20.7975212 +/- 0.14165429 (0.68%) (init = 0)
    x0:    -9.70588133 +/- 0.12597936 (1.30%) (init = 10)
[[Correlations]] (unreported correlations are < 0.100)
    C(tau2, ampl2) = -0.947
    C(tau1, ampl2) = -0.805
    C(tau1, tau2)  =  0.706
    C(tau1, x0)    = -0.562
    C(ampl1, x0)   =  0.514
    C(tau1, ampl1) = -0.453
    C(tau2, y0)    = -0.426
    C(ampl2, y0)   =  0.314
    C(ampl2, x0)   =  0.291
    C(tau2, x0)    = -0.260
    C(tau1, y0)    = -0.212
    C(ampl1, tau2) =  0.119
[[Model]]
模型(jumpexpmodel)
[[Fit统计数据]]
#拟合方法=最小二乘法
#函数evals=138
#数据点=2797
#变量=6
卡方检验=3795.52585
缩减卡方=1.35991610
Akaike信息临界值=865.855713
贝叶斯信息标准=901.473529
[[变量]]
tau1:50.4330421+/-0.68246203(1.35%)(初始值=10)
ampl1:2630.30664+/-20.1552948(0.77%)(初始值=1000)
tau2:225.392872+/-2.75674753(1.22%)(初始值=10)
ampl2:523.257894+/-12.4451921(2.38%)(初始值=1000)
y0:20.7975212+/-0.14165429(0.68%)(初始值=0)
x0:-9.70588133+/-0.12597936(1.30%)(初始值=10)
[[相关性]](未报告的相关性<0.100)
C(tau2,ampl2)=-0.947
C(tau1,ampl2)=-0.805
C(tau1,tau2)=0.706
C(tau1,x0)=-0.562
C(ampl1,x0)=0.514
C(tau1,ampl1)=-0.453
C(tau2,y0)=-0.426
C(ampl2,y0)=0.314
C(ampl2,x0)=0.291
C(tau2,x0)=-0.260
C(tau1,y0)=-0.212
C(ampl1,tau2)=0.119
像这样的情节:

mod = Model(jumpexpmodel, independent_vars=('x', 'irf'))
pars = mod.make_params(tau1=10, ampl1=1000, tau2=10, ampl2=1000, y0=0, x0=10)
result = mod.fit(decay1, params=pars, weights=wWeights, method='leastsq', x=x, irf=irf)
[[Model]]
    Model(jumpexpmodel)
[[Fit Statistics]]
    # fitting method   = leastsq
    # function evals   = 138
    # data points      = 2797
    # variables        = 6
    chi-square         = 3795.52585
    reduced chi-square = 1.35991610
    Akaike info crit   = 865.855713
    Bayesian info crit = 901.473529
[[Variables]]
    tau1:   50.4330421 +/- 0.68246203 (1.35%) (init = 10)
    ampl1:  2630.30664 +/- 20.1552948 (0.77%) (init = 1000)
    tau2:   225.392872 +/- 2.75674753 (1.22%) (init = 10)
    ampl2:  523.257894 +/- 12.4451921 (2.38%) (init = 1000)
    y0:     20.7975212 +/- 0.14165429 (0.68%) (init = 0)
    x0:    -9.70588133 +/- 0.12597936 (1.30%) (init = 10)
[[Correlations]] (unreported correlations are < 0.100)
    C(tau2, ampl2) = -0.947
    C(tau1, ampl2) = -0.805
    C(tau1, tau2)  =  0.706
    C(tau1, x0)    = -0.562
    C(ampl1, x0)   =  0.514
    C(tau1, ampl1) = -0.453
    C(tau2, y0)    = -0.426
    C(ampl2, y0)   =  0.314
    C(ampl2, x0)   =  0.291
    C(tau2, x0)    = -0.260
    C(tau1, y0)    = -0.212
    C(ampl1, tau2) =  0.119