Python でモジュールを使用してマルチパラメーター フィットを実行しようとしていlmfit
ますが、一部のパラメーター グループの合計が 1 になるという制約があります。
たとえば、カイ二乗にパラメーター 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')
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 がエラーをスローする理由がわかりません。誰にもアイデアはありますか?制約なしで「機能」しますが、使用できない結果が得られます。