Python 如何重新排列包含关系运算符的sympy表达式

Python 如何重新排列包含关系运算符的sympy表达式,python,sympy,Python,Sympy,我有包含关系运算符、符号和常量的表达式。我想重新排列表达式,以便(尽可能地)所有常量项都位于关系运算符的一侧,其余的项位于另一侧。例如,我想重新安排: x-5>y-z 致: x-y+z>5 是否有现有的Symphy方法来执行此操作?如果没有,我应该从哪里开始扩展Symphy?有点奇怪,我找不到一种“开箱即用”的方法来实现这一点。你可以使用中的方法使任何一个变量成为不等式左侧(LHS)的唯一主语,但我似乎不能使常数项成为主语 所以,我写了自己的版本,并在下面复制。我已经在给出的示例和其他几个示例上

我有包含关系运算符、符号和常量的表达式。我想重新排列表达式,以便(尽可能地)所有常量项都位于关系运算符的一侧,其余的项位于另一侧。例如,我想重新安排:

x-5>y-z

致:

x-y+z>5


是否有现有的Symphy方法来执行此操作?如果没有,我应该从哪里开始扩展Symphy?

有点奇怪,我找不到一种“开箱即用”的方法来实现这一点。你可以使用中的方法使任何一个变量成为不等式左侧(LHS)的唯一主语,但我似乎不能使常数项成为主语

所以,我写了自己的版本,并在下面复制。我已经在给出的示例和其他几个示例上对其进行了测试。它试图使右侧(RHS)由零项或仅由基于可选参数的常量项组成。很可能有一些情况下它会失败-请谨慎使用/修改

代码:
导入sympy
从sympy.core.relational导入relational
乘以减去一个映射={
无:'=',
'==': '==',
“eq”:“==”,
'!=': '!=',
'': '!=',
'ne':'!=',

“>=”:“:”在
canonical
方法中省略这一点可能是一个疏忽

也许以下内容适用于您的
else
子句

r, l = (ineq.lhs - ineq.rhs).as_coeff_Add()
if r < 0:
    l, r = -r, -l
return Relational(l, r, ineq.rel_op).canonical
r,l=(ineq.lhs-ineq.rhs).as_coeff_Add()
如果r<0:
l、 r=-r,-l
返回关系(l,r,ineq.rel_op).canonical

有人可能会认为canonical也会删除公因子,所以我不认为它是重复的。在我的示例表达式上调用simplify没有任何作用,你的问题的答案是求解一个变量。在我的例子中,等价的是求解关系运算符一侧的所有常量项,然后通过组合所有常量来简化它们。我不知道如何在Symphy中实现这一点。好的-我没有标记它,因为我不确定(感谢您的回复)我现在在一台无法安装Symphy的机器上。如果你没有及时得到答案,我会在我的机器上查看一下。谢谢Richard;它正是我想要的。
Re-arranging x - 5 > y - z
Gives x - y + z > 5
Or equivalently x - y + z - 5 > 0
====
Re-arranging x**2 + x - 5 > x**2 + y - z
Gives x - y + z > 5
Or equivalently x - y + z - 5 > 0
====
Re-arranging x + 5 > y - z
Gives -x + y - z < 5
Or equivalently x - y + z + 5 > 0
====
Re-arranging x**3 + y**2 >= x + 5*y - z - 15
Gives -x**3 + x - y**2 + 5*y - z <= 15
Or equivalently x**3 - x + y**2 - 5*y + z + 15 >= 0
r, l = (ineq.lhs - ineq.rhs).as_coeff_Add()
if r < 0:
    l, r = -r, -l
return Relational(l, r, ineq.rel_op).canonical