使用scipy最小化同时接受非变分参数的函数

2024-09-27 07:32:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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,那么就没有要优化的变分参数。

如何在这里允许非变分参数用作函数参数?


Tags: 模块函数fromimport参数return定义def
3条回答

阅读docstring中^{}args参数,并使用

a = 1
x0 = 1
xopt = fmin(f, x0, xtol=1e-8, args=(a,))

这里的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的某个函数)。

对你来说,沃伦的经典解决方案可能是正确的选择。

但是,值得注意的是,您还可以优化类的成员函数。在这种情况下,您可以访问可以用作参数的类变量。如果您的代码已经是基于对象的,并且添加一个成员函数进行优化是有意义的,那么这一点尤其有用。

在您的示例中,这个(过度杀戮)解决方案是:

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)

相关问题 更多 >

    热门问题