我正在尝试使用 python 中的模块执行多参数拟合lmfit
,但要遵守某些参数组必须总和为一个的约束。
例如,假设我的卡方中有参数 B1_0 和 B1_1,我params.add('B1_0', value=0.5, min=0, max=1)
为第一个和params.add('B1_1', expr='1-B1_0-B1_2')
第二个设置了参数。然后我可以使用该minimize
方法找到我的模型最适合我的数据。
在我的代码中并不是这么简单;有许多自动生成的参数适合,所以我使用这样的方法:
for term in listOfTerms:
con = constraint(term,listOfTerms) # finds the constraint (all sum to 1)
params.add(term,value=getValue(term),expr=con)
其中该方法getValue(term)
从另一个已知最小化卡方的拟合方法返回值。当我尝试运行我的代码时,我收到如下错误消息:
Traceback (most recent call last):
File "/home/user/Desktop/MPhys/chisquare.py", line 123, in <module>
result = minimize(objfunc,params,args=(trans,sum_in,sum_out,data))
File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 467, in minimize
iter_cb=iter_cb, scale_covar=scale_covar, **fit_kws)
File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 92, in __init__
self.prepare_fit()
File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 219, in prepare_fit
self.update_constraints()
File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 122, in update_constraints
self.__update_paramval(name)
File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 109, in __update_paramval
self.__update_paramval(dep)
File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 109, in __update_paramval
self.__update_paramval(dep)
... ...等,以:
File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 109, in __update_paramval
self.__update_paramval(dep)
File "/usr/local/lib/python2.7/dist-packages/lmfit-0.7-py2.7.egg/lmfit/minimizer.py", line 106, in __update_paramval
par = self.params[name]
RuntimeError: maximum recursion depth exceeded while calling a Python object
我不知道为什么 lmfit 在这种情况下会抛出错误。有人有想法吗?它在没有限制的情况下“工作”,但会给出不可用的结果。