在Sympy中求解简单凸优化问题

2024-10-06 11:28:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试着解一组简单的方程组。手动查找解决方案很简单,但我想用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 conditions应用平稳性和原始可行性


Tags: le手动方程组f1eqsymbolssympyset
1条回答
网友
1楼 · 发布于 2024-10-06 11:28:29

正如评论中提到的,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)

相关问题 更多 >