我尝试使用python中的lmfit
模块来实现多参数拟合,但有一个约束条件,即某些参数组必须和为一。在
例如,假设我在卡方中有参数B1\u0和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)
返回另一个拟合方法的值,该方法已知可以最小化卡方。当我尝试运行我的代码时,我会收到如下错误消息:
。。。 ... 等,终止于:
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模块中的
params.add
方法设置的。发生错误是因为程序试图在定义某些参数之前应用约束。在可以通过首先定义所有参数,然后用
params['<enter parameter here>'].expr = '<expression defining constraint>
实现约束来解决这个问题。在例如:
希望这能帮助其他人使用这个模块!在
除此之外,当表达式中存在参数相互依赖时,也会出现错误。我最近正在研究一个需要以下约束的问题,并收到了相同的消息:
因为这里的表达式都是相互依赖的,所以lmfit无法理解。我希望这有助于其他人查看此消息。这个错误可以通过删除表达式中的一些相互依赖关系来修正。这似乎是一个可以通过更改源代码来接受这些依赖类型来解决的问题。在
干杯
相关问题 更多 >
编程相关推荐