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