如何解决使用涉及 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),b])[z]
Out[39]: c
任一答案自 a + b == c
起均有效,因此“简化”的预期输出不明确。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。