gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:47:39 29 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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 起均有效。因此“简化”的预期输出是不明确的。

关于sympy - 使用涉及 SymPy 中变量之间关系的假设简化表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67217022/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com