我想使用scipy.optimize
模块来最小化函数。我们的功能是f(x,a)
:
def f(x,a):
return a*x**2
对于固定的a
,我希望f(x,a)
最小化x
。
使用scipy
我可以导入fmin
函数(我有一个旧的scipy:v.0.9.0),给出初始值x0
然后优化({{ 3}}):
from scipy.optimize import fmin
x0 = [1]
xopt = fmin(f, x0, xtol=1e-8)
失败,因为f
有两个参数而fmin
只传递一个(实际上,我还没有定义a
)。如果我这样做:
from scipy.optimize import fmin
x0 = [1]
a = 1
xopt = fmin(f(x,a), x0, xtol=1e-8)
计算也会失败,因为" x未定义"。但是,如果我定义x
,则没有要优化的变分参数。
如何在此处将非变分参数用作函数参数?
答案 0 :(得分:7)
在其docstring中了解fmin
的args
参数,然后使用
a = 1
x0 = 1
xopt = fmin(f, x0, xtol=1e-8, args=(a,))
答案 1 :(得分:3)
args
论证可能是正确的方法,但这是另一种有时有用的方法。首先,你为f编写一个包装函数,它将把一个函数和一个值作为输入,并返回一个新函数,其中a
是固定的。
def fix_a(f, a):
def f_with_fixed_a(x):
return f(x, a)
return f_with_fixed_a
然后你可以像这样调用fmin:
xopt = fmin(fix_a(f, a), x0, xtol=1e-8)
如果您需要做的就是传递一个固定的a
,使用fmin的args
关键字,这可能过于冗长,但这种方法更灵活,可以处理更复杂的情况(例如,如果您想使a
具有x
的某些功能。
答案 2 :(得分:0)
对于您的情况,Warren的规范解决方案可能是正确的选择。
但值得注意的是,您还可以优化类的成员函数。在这种情况下,您可以访问可用作参数的类变量。如果您的代码已经基于对象并且添加成员函数以进行优化是有意义的,那么这将非常有用。
在您的示例中,此(过度杀伤)解决方案将是:
class FunctionHolder(object):
def __init__(self,a):
self.a=a
def f(self, x):
return x*self.a
f1=FunctionHolder(1)
scipy.optimize.minimize(f1.f, x0)