【发布时间】:2019-02-05 11:09:12
【问题描述】:
对于我的受限问题,我想使用 Scipy-Trusted-Constr 算法,因为我有一个多变量的约束问题。我不想/不能分析地计算 Jacobi/Hessian 并计算它。 但是,在设置边界时,雅可比行列式的计算会崩溃:
File "C:\Python27\lib\site-packages\scipy\optimize\_trustregion_constr\tr_interior_point.py", line 56, in __init__
self.jac0 = self._compute_jacobian(jac_eq0, jac_ineq0, s0)
File "C:\Python27\lib\site-packages\scipy\optimize\_trustregion_constr\tr_interior_point.py", line 164, in _compute_jacobian
[J_ineq, S]]))
File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 1237, in bmat
arr_rows.append(concatenate(row, axis=-1))
ValueError: all the input array dimensions except for the concatenation axis must match exactly
在使用旧样式边界和最新的边界对象时都会发生错误。我可以用这段代码重现错误:
import numpy as np
import scipy.optimize as scopt
def RosenbrockN(x):
result = 0
for i in range(len(x)-1):
result += 100*(x[i+1]-x[i]**2)**2+(1-x[i])**2
return result
x0 = [0.0, 0.0, 0.0]
#bounds = scopt.Bounds([-2.0,-0.5,-2.0],[2.0,0.8,0.7])
bounds = [(-2.0,2.0),(-0.5,0.8),(-2.0,0.7)]
Res = scopt.minimize(RosenbrockN, x0, \
method = 'trust-constr', bounds = bounds, \
jac = '2-point', hess = scopt.SR1())
我认为我只是误解了界限是如何设置的,但找不到我的错误。建议表示赞赏。
编辑:我还尝试了文档中给出相同结果的代码示例。 SLSQP 等其他方法适用于边界。
SciPy 版本 1.1.0,Python 版本 2.7.4,操作系统 Win 7 Ent.
【问题讨论】:
-
感谢您的链接。不过,Trust-constr 通常不能与约束一起工作,这令人惊讶,因为它在文档中被列为约束问题的首选算法。
-
那么得出的结论是 trust-constr 根本就没有界限吗?
-
@Kvothe,Rosenbrock 示例适用于
scopt.Bounds。顺便,你可以from scipy.optimize import rosen, rosen_der, rosen_hess -
好的,我不知道这个问题发生了什么(它被赞成了很多,所以我认为它在某些时候可能真的不起作用。)对我来说,问题是你有明确要求搜索保持在约束区域内,例如:
Bounds(np.array([0.5, 0.5]), np.array([0.55, 2.0]), keep_feasible = True)否则它将愉快地超出您的范围(对于中间步骤)。
标签: python optimization scipy