Задача оптимизации с квадратом цели успешно решается с помощью 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)
(numpy версия 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?