Задача оптимизации с квадратом цели успешно решается с помощью IPOPT в Python Gekko.
from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj((x-y)**2)
m.solve()
print(x.value[0],y.value[0])
Однако, когда я переключаюсь на абсолютное значение цели np.abs(x-y)
(пустая версия abs
) илиm.abs(x-y)
(версия Gekko abs
), решатель IPOPT сообщает о неудачном решении. Аппроксимация абсолютного значения m.sqrt((x-y)**2)
также не удалась.
Неудачное решение
from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj(m.abs(x-y))
m.solve()
print(x.value[0],y.value[0])
Я понимаю, что решатели на основе градиента не любят функции без непрерывного первого и второгопроизводные, поэтому я подозреваю, что это происходит с abs()
, где 0
- это точка, которая не имеет непрерывных производных. Есть ли альтернатива abs()
для надежного решения абсолютного значения с помощью градиентных решателей в Python Gekko?