没有scipy.minimize多个约束

时间:2017-06-25 11:09:44

标签: python scipy

我想使用scipy.minimize

最小化以下功能
def lower_bound(x, mu, r, sigma):
    mu_h = mu_hat(x, mu, r)
    sigma_h = sigma_hat(x, sigma)
    gauss = np.polynomial.hermite.hermgauss(10)
    return (1 + mu_h + math.sqrt(2) * sigma_h * min(gauss[1]))

测试所有涉及的函数并按预期返回值。现在,为了设置最小化过程,我定义了

cons = ({"type": "ineq",
             "fun": mu_hat,
             "args": (mu, r)},
            {"type": "ineq",
             "fun": lambda x, sigma: -1.0*sigma_hat(x, sigma),
             "args": (sigma)},
            {"type": "ineq",
             "fun": lambda x: x},
            {"type": "ineq",
             "fun": lambda x: 1-np.dot(np.ones(x.size), x)})

作为约束。当我运行此代码时scipy.minimize给出了以下关于约束的错误消息:

File "/usr/local/lib/python3.5/dist-packages/scipy/optimize/slsqp.py", line 312, in <listcomp>
    mieq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in cons['ineq']]))
TypeError: <lambda>() argument after * must be an iterable, not float

定义的约束不正确?

1 个答案:

答案 0 :(得分:1)

错误消息显示:

mieq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in cons['ineq']]))
TypeError: <lambda>() argument after * must be an iterable, not float

因此,我们可以推断c['args']的类型为float,因为c['args']是应用*的唯一变量。很明显,'args'c的查找已成功,因此我们知道cfloat,其中包含可迭代(列表,元组等)。

如果我们现在查看您的约束条件,则args在一个案例中为(mu, r),在另一个案例中为(sigma)。问题很明显:(sigma)相当于sigma,而不是元组。要在Python中创建1元组,您必须说(sigma,)