Sympy - 比较表达式

时间:2016-05-09 09:56:17

标签: python sympy comparison-operators

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

我发现了一些类似的问题,但都没有涉及到这个问题。

4 个答案:

答案 0 :(得分:14)

来自the SymPy documentation

  

==表示精确的结构相等性测试。这里的“精确”意味着只有两个表达式在结构上完全相等时才会与==进行比较。这里,(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

答案 1 :(得分:1)

比较'Name'中两个表达式的另一种方法:

sympy

答案 2 :(得分:0)

使用简化的解决方案对我来说太慢了(不得不交叉检查多个变量),因此我编写了以下函数,该函数事先进行了一些简单的校验,以减少计算时间,仅在最后一步中使用简化。

import numpy as np
import sympy as sp

def check_equal(Expr1,Expr2):
    if Expr1==None or Expr2==None:
        return(False)
    if Expr1.free_symbols!=Expr2.free_symbols:
        return(False)
    vars = Expr1.free_symbols
    your_values=np.random.random(len(vars))
    Expr1_num=Expr1
    Expr2_num=Expr2
    for symbol,number in zip(vars, your_values):
        Expr1_num=Expr1_num.subs(symbol, sp.Float(number))
        Expr2_num=Expr2_num.subs(symbol, sp.Float(number))
    Expr1_num=float(Expr2_num)
    Expr2_num=float(Expr2_num)
    if not np.allclose(Expr1_num,Expr2_num):
        return(False)
    if (Expr1.equals(Expr2)):
        return(True)
    else:
        return(False)

答案 3 :(得分:-2)

从最初的同情中自己检查一下。 https://github.com/sympy/sympy/wiki/Faq enter image description here

它为我工作的例子 enter image description here