Python 失败的scipy.minimize用于多个约束

Python 失败的scipy.minimize用于多个约束,python,scipy,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])) 所有涉及的函数都经过测试,并按预

我想使用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
文件“/usr/local/lib/python3.5/dist-packages/scipy/optimize/slsqp.py”,第312行,在
mieq=sum(对于cons['ineq']]中的c,映射(len,[c['fun']](x,*c['args']))
TypeError:()在*之后的参数必须是iterable,而不是float

定义的约束有哪些不正确

错误消息显示:

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
mieq=sum(对于cons['ineq']]中的c,映射(len,[至少1d(c['fun'](x,*c['args']))
TypeError:()在*之后的参数必须是iterable,而不是float
因此我们可以推断
c['args']
属于
float
类型,因为
c['args']
是唯一应用了
*
的变量。显然,在
c
中查找
'args'
已成功,因此我们知道
c
是一个
浮点值,其中需要一个iterable(列表、元组等)

如果我们现在查看您的约束,在一种情况下传递的
参数是
(mu,r)
,在另一种情况下传递的是
(sigma)
。现在问题很清楚:
(sigma)
等同于
sigma
,而不是元组。要在Python中生成1元组,必须说
(sigma,)