2017-06-25 59 views
0

失败scipy.minimize我想用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

错误消息说:

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']*适用于它的唯一变量。显然,在c中查找'args'已成功,因此我们知道c是一个float,其中预期有一个可迭代(列表,元组等)。

如果我们现在看看您的约束,args通过(mu, r)在一个案件和(sigma)在另一个。问题现在已经清楚:(sigma)相当于sigma,而不是元组。要在Python中创建1元组,您必须说(sigma,)