Я пытаюсь найти подходящую точку, которая удовлетворяет набору нелинейных ограничений.Для этого я использую минимизатор последовательного квадратичного программирования (SQP) scipy
.Мой простой пример:
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
сообщать об ошибке (или о плохой начальной точке) вместо возврата к поддельному решению?