用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