Почему scipy.optimize.minimize не работает с ограничением и начальным значением 0 - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь оптимизировать функцию двух переменных. Я хочу, чтобы одна переменная была зафиксирована на 50, а другая - от -5 до 5. Я написал следующий код:

x0 = np.array([50, 0.0])
res = minimize(error, x0, constraints=[
    {'type': "eq", "fun": lambda x: x[0] - 50},
    {'type': "ineq", "fun": lambda x: -abs(x[1]) + 5},
])

, где minimize - это функция от scipy.optimize. Первое ограничение - x[0] == 50, а второе - -5 <= x[1] <= 5. Я получаю следующий ответ: message: 'Inequality constraints incompatible'. Но когда я устанавливаю вторую переменную не равной нулю (например, x0 = np.array([50, 0.1])), она успешно находит решение. В чем может быть причина такого поведения?

1 Ответ

1 голос
/ 03 мая 2020

Ограничения должны быть дифференцируемыми, а ваше второе ограничение - нет. Если вы express ограничите в терминах x[1]**2 вместо abs(x[1]), оно должно работать. Вы также можете исключить abs, разделив ограничение на два отдельных ограничения, одно для верхней границы и одно для нижней границы.

...