问题 Sympy - 比较表达式


有没有办法检查两个表达式在数学上是否相等?我期望 tg(x)cos(x) == sin(x) 输出 True,但它输出 False。有没有办法与同情进行这样的比较?另一个例子是 (a+b)**2 == a**2 + 2*a*b + b**2 令人惊讶的是也有输出 False

我发现了一些类似的问题,但没有人提到这个问题。


7413
2018-05-09 09:56


起源



答案:


SymPy文档

== 代表精确的结构平等测试。这里的“精确”意味着只有两个表达式在结构上完全相等时才会与==进行比较。这里,(x + 1)^ 2和x ^ 2 + 2x + 1在符号上不相同。一个是增加两个术语的力量,另一个是增加三个术语。

事实证明,当使用SymPy作为库时,有 == 测试精确的符号相等比它代表符号相等或者测试数学相等更有用。但是,作为新用户,您可能会更关心后两者。我们已经看到了象征性地表示平等的替代方案,Eq。为了测试两件事是否相等,最好回想一下这样一个基本事实:如果a = b,那么a-b = 0。因此,检查a = b的最佳方法是采用a-b并简化它,并查看它是否为0.我们稍后会了解到执行此操作的函数被调用 simplify。这种方法并非绝对可靠 - 事实上,理论上可以证明,无法确定两个符号表达式是否在一般情况下完全相同 - 但对于大多数常见表达式,它可以很好地工作。

作为特定问题的演示,我们可以使用等效表达式的减法,并像这样比较为0

>>> from sympy import simplify
>>> from sympy.abc import x,y
>>> vers1 = (x+y)**2
>>> vers2 = x**2 + 2*x*y + y**2
>>> simplify(vers1-vers2) == 0
True
>>> simplify(vers1+vers2) == 0
False

11
2018-05-09 11:55



请注意,如果您有布尔表达式(您的变量在哪里) a, b, ... = sympy.symbols('a b ...', boolean=True) 你用的东西就像 sympy.Or, sympy.Xor等等)然后你就可以做到 isEquivalent = lambda expr1, expr2: sympy.simplify((expr1 & (~expr2)) | ((~expr1) & expr2))==False - Phylliida


答案:


SymPy文档

== 代表精确的结构平等测试。这里的“精确”意味着只有两个表达式在结构上完全相等时才会与==进行比较。这里,(x + 1)^ 2和x ^ 2 + 2x + 1在符号上不相同。一个是增加两个术语的力量,另一个是增加三个术语。

事实证明,当使用SymPy作为库时,有 == 测试精确的符号相等比它代表符号相等或者测试数学相等更有用。但是,作为新用户,您可能会更关心后两者。我们已经看到了象征性地表示平等的替代方案,Eq。为了测试两件事是否相等,最好回想一下这样一个基本事实:如果a = b,那么a-b = 0。因此,检查a = b的最佳方法是采用a-b并简化它,并查看它是否为0.我们稍后会了解到执行此操作的函数被调用 simplify。这种方法并非绝对可靠 - 事实上,理论上可以证明,无法确定两个符号表达式是否在一般情况下完全相同 - 但对于大多数常见表达式,它可以很好地工作。

作为特定问题的演示,我们可以使用等效表达式的减法,并像这样比较为0

>>> from sympy import simplify
>>> from sympy.abc import x,y
>>> vers1 = (x+y)**2
>>> vers2 = x**2 + 2*x*y + y**2
>>> simplify(vers1-vers2) == 0
True
>>> simplify(vers1+vers2) == 0
False

11
2018-05-09 11:55



请注意,如果您有布尔表达式(您的变量在哪里) a, b, ... = sympy.symbols('a b ...', boolean=True) 你用的东西就像 sympy.Or, sympy.Xor等等)然后你就可以做到 isEquivalent = lambda expr1, expr2: sympy.simplify((expr1 & (~expr2)) | ((~expr1) & expr2))==False - Phylliida