パラメータの辞書をミニマイザーに渡すことで、 PyMinuit関数の最小化を実行することは可能ですか?
たとえば、PyMinuit の通常の使用は、次のようなものを使用して呼び出されます。
def f(x, a, b): return a + b*x
def chi2(a,b):
c2 = 0.
for x, y, yerr in data:
c2 += (f(x, a, b) - y)**2 / yerr**2
return c2
m = minuit.Minuit(chi2)
m.migrad()
この質問から、PyMinuit がイントロスペクションを使用してパラメーター x と y を決定することを理解しています (ただし、それが何を意味するのか完全にはわかりません)。理想的には、次のようなことができるようになりたいです。
p = dict()
p['x'] = 0.
p['y'] = 0.
def f(x,a,b): return a + b*x
def chi2():
c2 = 0.
for x, y, yerr in data:
c2 += (f(x, a, b) - y)**2 / yerr**2
return c2
m = minuit.Minuit(chi2,**p)
m.migrad()
あるいは:
p = <dictionary of parameters + initial values>
model = <list containing strings representing functions e.g. 'a*b+a**2*x'>
data = x, y, yerr, model
def chi2():
c2 = 0.
for x, y, yerr, model in data:
c2 += (eval(model,{"__builtins__":None},p) - y)**2 / yerr**2
return c2
m = minuit.Minuit(chi2)
m.migrad()
Googleグループの問題ページで、整数入力から「偽のコード」と「偽の関数」を生成した同様の問題の回避策を見ました(リンクに従ってください)。辞書 p で同様のことを試しました:
class fake_code:
def __init__(self,p):
self.co_argcount = len(p)
self.co_varnames = tuple(p.keys())
print tuple(p.keys())
class fake_function:
def __init__(self,p):
self.func_code = fake_code(p)
def __call__(self,*args):
c2 = 0.
print args
for x, y, yerr in data:
c2 += (f(x, a, b) - y)**2 / yerr**2
return c2
しかし、何らかの理由ですべてのパラメータが「修正済み」に分類されており、それらを「修正解除」できないようです。
このようにすることは可能だと思いますが、これが最善の方法であるかどうか、または試みるべきかどうかさえ、pythonについて十分に知りません。誰かがこれに光を当てることができれば、私は知って感謝しています. :)