#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. Поскольку это решение предполагает, что оптимум находится на границе, оно вообще не будет выполняться. Я не могу это принять. 🙁