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_nstep_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 参数......

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...