使用涉及 SymPy 中变量之间关系的假设来简化表达式

Simplify expression with assumptions involving relations between variables in SymPy

如果我们知道变量满足特定方程,是否可以简化 SymPy 中的表达式? 例如在 Mathematica 中我们可以这样写:

Simplify[a+b-c, a+b==c]

当然,在这种情况下,可以求解 a 并进行替换。但是,对于长表达式进行全局替换可能没有意义。如果目标是生成可能的最短表达式,则可能需要对某些术语应用替换并保持其余部分不变或解决 b 而不是 a.

我认为sympy.assumptions模块不能对几个变量相互限制。 是否可以在 SymPy 中以任何其他方式实现 Mathematica Simplify[expr, assum] 的功能?

或者有没有其他开源项目可以做这样的事情?

SymPy 的当前假设系统无法处理变量之间的关系,尽管正在努力。不过,有几种方法可以做到这一点。

ratsimpmodprime 函数在知道符号本身满足多项式方程的基础上简化了某些符号中多项式的表达式。我们可以使用它来制作一个函数来简化您展示的示例:

In [26]: a, b, c = symbols('a:c')

In [27]: polysimp = lambda expr, eqs: ratsimpmodprime(expr, groebner(eqs).exprs)

In [28]: polysimp(a + b - c, [a + b - c])
Out[28]: 0

In [29]: polysimp(a + b, [a + b - c])
Out[29]: c

In [31]: polysimp(a**4 + b - c, [a**2 - b, b - c])
Out[31]: 
 2
c 

您还可以引入一个新符号并将其与其他方程一起求解为一个组合系统:

In [33]: solve([z - (a + b - c), a + b - c])[z]
Out[33]: 0

这种方法的优点是你可以选择要消除的符号例如:

In [38]: solve([z - (a + b), a + b - c], [z, c])[z]
Out[38]: a + b

In [39]: solve([z - (a + b), a + b - c], [z, b])[z]
Out[39]: c

a + b == c 以来,任一答案均有效,因此“简化”的预期输出不明确。