在没有lambda函数的情况下使用scipy.optimize.minimize

时间:2017-10-02 15:47:32

标签: python numpy optimization lambda scipy

我想使用scipy.optimize.minimize函数而不将我的约束指定为lambda函数。这可能吗?

即。对于标准示例:

from scipy.optimize import minimize

def fun(x):
    return (x[0] - 1) ** 2 + (x[1] - 2.5)**2.

x   = (2, 0)

def c_0(x):
    return x[0] - 2. * x[1] + 2.

def c_1(x):
    return -x[0] - 2. * x[1] + 6.

def c_2(x):
    return -x[0] + 2. * x[1] + 2.

cons = ({'type': 'ineq', 'fun': c_0(x)},
    {'type': 'ineq', 'fun': c_1(x)},
    {'type': 'ineq', 'fun': c_2(x)})

bnds = ((0, None), (0, None))

res = minimize(fun(x), x, method='SLSQP', bounds=bnds, constraints=cons)

我想避免使用lambda函数的原因是我的约束数对我的问题(2 *自由度数)增长很快,所以除非有一种方法为我的约束创建一个“lambda”工厂,写它们会很快变得单调乏味。

上面的代码段返回:

TypeError: 'float' object is not callable

1 个答案:

答案 0 :(得分:1)

不带参数调用函数。这对我有用:

from scipy.optimize import minimize

def fun(x):
    return (x[0] - 1) ** 2 + (x[1] - 2.5)**2.

x   = (2, 0)

def c_0(x):
    return x[0] - 2. * x[1] + 2.

def c_1(x):
    return -x[0] - 2. * x[1] + 6.

def c_2(x):
    return -x[0] + 2. * x[1] + 2.

cons = ({'type': 'ineq', 'fun': c_0},
    {'type': 'ineq', 'fun': c_1},
    {'type': 'ineq', 'fun': c_2})

bnds = ((0, None), (0, None))

res = minimize(fun, x, method='SLSQP', bounds=bnds, constraints=cons)