我试图找到一个满足一组非线性约束的可行点。我正在使用scipy
的顺序二次编程(SQP)最小化器来执行此操作。我的简单示例是
target = lambda x: 1
cons = ({'type': 'ineq', 'fun': lambda x: 1/2*np.sin(x[0])-0.48 + x[1]/150},
{'type': 'ineq', 'fun': lambda x: -np.sin(x[2])*-np.sin(x[1])-0.99})
bnds = ((0, 6), (0, 6), (0, 6))
res = minimize(target, (0, 0, 0), method='SLSQP', bounds=bnds, constraints=cons, options={'disp':True, 'maxiter':10000})
但是,返回的结果是:
the value of g1: -0.48
the value of g2: -0.99
fun: 1.0
jac: array([0., 0., 0.])
message: 'Optimization terminated successfully.'
nfev: 5
nit: 5
njev: 1
status: 0
success: True
x: array([0., 0., 0.])
看来,即使根本不满足约束(g1
和g2
的值都是负数),优化器仍然认为它成功终止了。我了解通过将起始点更改为(0,0,1),它将成功找到正确的可行解决方案,但是SQP不能为不可行的起始点工作吗?如果不是,scipy
应该报告失败(或错误的初始点)而不是返回伪造的解决方案吗?