Python SciPy IndexError:边界长度与x0的长度不兼容

时间:2015-03-19 16:30:12

标签: python python-2.7 numpy scipy

我是使用Python和scipy进行优化的新手。我收到了错误

IndexError: SLSQP Error: the length of bounds is not compatible with that of x0.

尝试将bounds参数传递到scipy.optimize.minimize

x0 = np.array([[2,2,2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,2,2]])
bounds = ( [(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000)], [(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000),(0,12000)] )

x_max = optimize.minimize(f, x0.flatten(), method='SLSQP', bounds=bounds)

如何为bounds定义x0

2 个答案:

答案 0 :(得分:3)

请注意在optimize.minimize:

文档中给出的示例中
>>> bnds = ((0, None), (0, None))
>>> res = minimize(fun, (2, 0), method='SLSQP', bounds=bnds,
...                constraints=cons)

bnds是一系列元组。 len(bnds)等于初始猜测的长度x0,在示例中为(2, 0)


在您的代码中bounds是元组列表的元组。它需要被平铺为一系列元组,例如

bnds = bounds[0]+bounds[1]

或者更简单地说,

bnds = [(0, 12000)]*22
x_max = optimize.minimize(f, x0.flatten(), method='SLSQP', bounds=bnds)

另请注意,bnds是22个二元组的列表,与此一致 是x0.flatten()中的22项:

In [19]: x0.flatten()
Out[19]: array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

In [20]: len(x0.flatten())
Out[20]: 22

答案 1 :(得分:0)

我遇到相同的错误,但是原因不同。我尝试了一个玩具示例,其中仅针对一个输入变量进行了优化。我的bounds变量如下所示:

bnds=((0.0, 100.0))

我必须将其更改为以下内容才能起作用:

bnds=((0.0, 100.0),)