首页 > 解决方案 > 使用涉及 SymPy 中变量之间关系的假设简化表达式

问题描述

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

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

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

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

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

标签: sympysymbolic-math

解决方案


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“简化”的预期输出是模棱两可的。


推荐阅读