在SymPy中同时解决非线性方程和不等式系统

7

我是SymPy和Python的新手,遇到了一个问题。 我正在尝试解决一个名为'kunSys'的系统:

>>> kunSys
[-w0 + w1 - 8*x1 + 20,
-2*w0 + w2 - 8*x2 + 4,
w0*(-x1 - 2*x2 + 2),
w1*x1,
w2*x2,
w0 >= 0,
w1 >= 0,
w2 >= 0]

有一个变量列表'lagVars'

>>> lagVars
(x1, x2, w0, w1, w2)

如您所见,我的系统包含了方程和不等式。
尝试中:
>>> solve(kunSys,lagVars)

获取:

NotImplementedError: 
inequality has more than one symbol of interest

但是当单独解决方程和不等式时,它可以正常工作:

>>> kunSys[:5]
[-w0 + w1 - 8*x1 + 20,
-2*w0 + w2 - 8*x2 + 4,
w0*(-x1 - 2*x2 + 2),
w1*x1,
w2*x2]

>>> solve(kunSys[:5],lagVars)
[(0, 0, 0, -20, -4),
(0, 1/2, 0, -20, 0),
(0, 1, -2, -22, 0),
(2, 0, 4, 0, 4),
(11/5, -1/10, 12/5, 0, 0),
(5/2, 0, 0, 0, -4),
(5/2, 1/2, 0, 0, 0)]

>>> kunSys[5:]
[w0 >= 0, w1 >= 0, w2 >= 0]

>>> solve(kunSys[5:],lagVars)
(0 <= w0) & (0 <= w1) & (0 <= w2) & (w0 < oo) & (w1 < oo) & (w2 < oo)

但这不是我们想要的结果。我尝试使用solveset()函数,但似乎也没有起作用。我搜索了很多,但未能找到答案。

问题:

我该如何解决这个系统?

1个回答

6

SymPy目前不知道如何处理混合不等式和等式,但由于您的不等式只是变量 >= 0,因此您可以通过定义这些符号为非负数来解决这个问题。 solve将根据此过滤解决方案。

>>> w0, w1, w2 = symbols('w0:3', nonnegative=True)
>>> x1, x2 = symbols("x1 x2")
>>> solve([-w0 + w1 - 8*x1 + 20,
... -2*w0 + w2 - 8*x2 + 4,
... w0*(-x1 - 2*x2 + 2),
... w1*x1,
... w2*x2], (w0, w1, w2, x1, x2))
[(0, 0, 0, 5/2, 1/2), (12/5, 0, 0, 11/5, -1/10), (4, 0, 4, 2, 0)]

2
有没有办法将变量限制在特定的区间内呢?比如说[-1,1]。 - jstm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接