如何解决lmfit:添加几个约束参数的最佳方法
我想用一个需要n个不同参数的模型来描述一些实验数据,这些参数都是相互约束的:
phi1 + phi2 + phi3 + ... + phin = 1>
与
phii+1i
和
0 i
根据 lmfit 手册关于使用约束 (https://lmfit.github.io/lmfit-py/constraints.html) 的建议,我编写了以下代码:
fit_params = Parameters()
for i in range(len(Files)):
filename = Files[i]
fit_params.add('z_knot0',value = 0.0,vary = False) #position of first knot
fit_params.add('phi_knot0',value = guessed['phi_knot0'][filename],min=0.1,max=1.0,vary = True) #volume fraction of brush at the brush/substrate interface.
for j in range(1,GFP['n_knots']+1):
fit_params.add('d_knot' + str(j),value = guessed['d_knot'+str(j)][filename],min = 1.0,max = 100.0,vary = True) #spacing between two consecutive knots
ex = 'd_knot' + str(j) + ' + z_knot' + str(j-1)
# print(ex)
fit_params.add('z_knot' + str(j),expr=ex) #z position of jth knot.
fit_params.add('delta_phi_knot' + str(j),value = guessed['delta_phi_knot'+str(j)][filename],min = 0.0,max = 0.5,vary = True) #decrease of polymer volume fraction between two consecutive knots
ex1 = 'phi_knot' + str(j-1) + '- delta_phi_knot' + str(j)
phi_knot = ex1 + ' if ' + ex1 + ' > 0 else 0'
fit_params.add('phi_knot' + str(j),expr=phi_knot)
让我担心的是,如果这部分代码:
fit_params.add('delta_phi_knot' + str(j),vary = True) #decrease of polymer volume fraction between two consecutive knots
ex1 = 'phi_knot' + str(j-1) + '- delta_phi_knot' + str(j)
phi_knot = ex1 + ' if ' + ex1 + ' > 0 else 0'
fit_params.add('phi_knot' + str(j),expr=phi_knot)
是拟合例程的问题(我使用差分进化方法)。我没有收到任何错误,并且在对数据建模时似乎也正确考虑了约束。然而,拟合程序似乎并没有收敛到一个好的解决方案,因为我能够模拟一条曲线,该曲线的 chi^2 值比从拟合中获得的值更小。这似乎是代码中最微妙的部分,我不明白的地方可能会发生。
我很感激任何建议。谢谢, 莱昂纳多
解决方法
跳过如何设置其他参数值,我鼓励您考虑 phi_n+1 = phi_n + step_n
,step_n
的下限为零。也许是这样的:
import lmfit
nknots = 7
params = lmfit.Parameters()
init_step = 2./(nknots*(nknots+1))
params.add('phi0',value=init_step,min=0,max=1)
all_phis = ['phi0']
for i in range(nknots-1):
params.add('step%d'%i,max=1)
params.add('phi%d'%(i+1),expr='phi%d + step%d'%(i,i),max=1)
all_phis.append('phi%d'%i)
# expression for final phi so that Sum(phi_N) = 1
params.add('phi%d'%(nknots-1),expr='1-(%s)' % ('+'.join(all_phis)),max=1)
for p in params.values():
print(p)
请注意,phi0
和所有 stepN
参数将是拟合中的变量。其余的 phiN
值受其表达式的约束。
我想这并不能严格保证 phiN > phiN-1
,但它应该可以帮助您入门。为此,可能还需要制作一个以某种方式受到约束的 stepN
参数......
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。