Scipy minimal (method = 'SLSQP') возвращает успех, даже если ограничения не выполнены - PullRequest
0 голосов
/ 27 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...