对于受约束的问题,我想使用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
使用旧样式边界和最新的Bounds对象时,都会发生错误。我可以使用以下代码重现错误:
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,OS Win 7 Ent。
答案 0 :(得分:0)
我删除了您的jac和hess争论并使其生效;也许问题出在那儿?
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 = 'SLSQP', bounds = bounds)
print(Res)
结果是
fun: 0.051111012543332675 jac: array([-0.00297706, -0.50601892, -0.00621008]) message: 'Optimization terminated successfully.' nfev: 95 nit: 18 njev: 18 status: 0 success: True x: array([0.89475126, 0.8 , 0.63996894])