Sympy - 比较表达式

Xic*_*Sim 17 python sympy comparison-operators

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

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

mir*_*ulo 17

来自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
Run Code Online (Sandbox Code Playgroud)

  • @Prokop,如果你假设“x”和“y”为正,则表达式实际上为 0,否则会出现“x”和“y”均为负且身份未正确验证的情况。 (3认同)
  • 它适用于多项式和有理函数,但不适用于其他函数...例如 `f1 = log(x)+log(y)` 和 `f2 = log(x*y)` ... `(f1+f2).simplify ()` 给出 `log(x)+log(y) - log(x*y)` 而不是 `0` (2认同)

Pro*_*hii 12

或者,您可以使用该.equals方法来比较表达式:

from sympy import *
x = symbols('x')

expr1 = tan(x) * cos(x)
expr2 = sin(x)

expr1.equals(expr2)

True
Run Code Online (Sandbox Code Playgroud)