是否可以通过将参数字典传递给最小化器来执行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()
我在谷歌群组问题页面上看到了一个类似问题的解决方法,他们从整数输入中生成了“假代码”和“假函数”(点击链接查看)。我用我的字典 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 的了解还不够,不能说这是否是最好的方法,或者即使应该尝试。如果有人能对此有所了解,我将不胜感激。:)