Решение простой выпуклой оптимизации в Sympy

#python #sympy #mathematical-optimization

#python #sympy #математическая оптимизация

Вопрос:

Я пытаюсь решить простой набор уравнений в sympy. Найти решение вручную просто, но я хочу сделать это с помощью sympy, чтобы изучить инструмент.

 from sympy import symbols,solve,Le,Eq
l,x = symbols('lamda x')
f0 = x**2 1
f1 = (x-2)*(x-4); feasible_set = Le(f1,0);
lagrange = f0   l*f1
stationary_lagrangian = Eq(lagrange.diff(x),0)
solve([feasible_set,stationary_lagrangian])
  

Приведенный выше код выдает ошибку NotImplementedError:
inequality has more than one symbol of interest.
.

Вопрос 1: Почему это так? Неравенство содержит только x и нет lamda .

Вопрос 2. Можно ли решить ту же проблему другим способом, используя sympy?


Предыстория проблемы, если вам интересно

 minimize (over x in R)
    x^2   1
subject to
    (x-2)(x-4) <= 0
  

.. а затем применение стационарности и первичной выполнимости из условий KKT

Комментарии:

1. solve решает только системы равенств. Он не может обрабатывать неравенства. Что касается решения вашей проблемы, вы пропустили важное равенство «дополнительной слабости». Я бы предложил использовать solve , чтобы найти решение системы равенств, включенных в условия KKT, а затем «вручную» определить, какие решения удовлетворяют неравенствам.

Ответ №1:

Как упоминалось в комментариях, sympy.solve решает для системы равенств. Так и должно быть,

 from sympy import solve, var, symbols, diff
x = var('x',real=True);
f = x**2 1
g = (x-2)*(x-4)

l = symbols('lambda', real = True)
lagrange = f - l* g
grad = [diff(lagrange,x)]
kkt_eqs = grad   [g]
extremum_points = solve(kkt_eqs, [x, l], dict=True) 
  

Редактировать: теперь из экстремальных точек вам нужно найти минимум.

 f_x_ = min(ele[x]**2   1 for ele in stationary_points)
minimum = [ele[x] for ele in stationary_points if ele[x]**2 1 == f_x_]
print(minimum)
  

Комментарии:

1. Поскольку это решение предполагает, что оптимум находится на границе, оно вообще не будет выполняться. Я не могу это принять. 🙁