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

如何解决使用涉及 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?