Решение простой выпуклой оптимизации в Sympy - PullRequest
1 голос
/ 12 апреля 2019

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

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 Ответ

0 голосов
/ 12 апреля 2019

Как уже упоминалось в комментариях, 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)
...