我想使用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
,然后优化(documentation):
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
,那么就没有要优化的变分参数。
如何在这里允许非变分参数用作函数参数?
阅读docstring中^{} 的
args
参数,并使用这里的
args
参数可能是正确的方法,但这里有另一种方法有时很有用。首先,为f编写一个包装函数,它将接受一个函数和一个值作为输入,并返回一个新函数,其中a
是固定的。然后你可以这样给fmin打电话:
如果您只需要传入一个固定的
a
,那么使用fmin的args
关键字可能太冗长了,但是这种方法更灵活,可以处理更复杂的情况(例如,如果您想使a
成为x
的某个函数)。对你来说,沃伦的经典解决方案可能是正确的选择。
但是,值得注意的是,您还可以优化类的成员函数。在这种情况下,您可以访问可以用作参数的类变量。如果您的代码已经是基于对象的,并且添加一个成员函数进行优化是有意义的,那么这一点尤其有用。
在您的示例中,这个(过度杀戮)解决方案是:
相关问题 更多 >
编程相关推荐