sympy - 使用涉及 SymPy 中变量之间关系的假设简化表达式
问题描述
如果我们知道变量满足某个方程,是否可以简化 SymPy 中的表达式?例如在 Mathematica 中,我们可以这样写:
Simplify[a+b-c, a+b==c]
当然,在这种情况下,可以求解a
并进行替换。但是,对于长表达式进行全局替换可能没有意义。如果目标是生成可能的最短表达式,则可能需要对某些术语应用替换,而其余部分保持不变或求解b
而不是a
.
我认为sympy.assumptions
模块不能对几个变量相互施加限制。Simplify[expr, assum]
是否可以在 SymPy 中以任何其他方式实现 Mathematica 的功能?
或者有没有其他开源项目可以做这样的事情?
解决方案
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
“简化”的预期输出是模棱两可的。
推荐阅读
- django - 如何运行我的 django 项目之外的 Object_detection_image.py?
- r - 来自 bookdown 的 render_book() 的 enc2utf8 问题
- amazon-web-services - Nodejs AWS Textract 不适用于 lambda
- python - 将天数添加到 PySpark Dataframe 中的数组内的元素
- python - 在动态规划问题中得到错误答案或超过时间限制
- c# - 如何在 DHTMLX - Scheduler .NET 中更改 TimeLine 单元格的列宽
- sql - 如何在 SQL 提示中禁止位图索引?
- r - 为什么R函数解析用逗号代替分号?
- java - 为什么表格不会显示在本地主机(jsp 文件)中?
- javascript - 如何使用 jquery 将签入和签出时间数据保存在 mysql 中?