Sympy - Comparing expressions Sympy - Comparing expressions python python

Sympy - Comparing expressions


From the SymPy documentation

== represents exact structural equality testing. “Exact” here means that two expressions will compare equal with == only if they are exactly equal structurally. Here, (x+1)^2 and x^2+2x+1 are not the same symbolically. One is the power of an addition of two terms, and the other is the addition of three terms.

It turns out that when using SymPy as a library, having == test for exact symbolic equality is far more useful than having it represent symbolic equality, or having it test for mathematical equality. However, as a new user, you will probably care more about the latter two. We have already seen an alternative to representing equalities symbolically, Eq. To test if two things are equal, it is best to recall the basic fact that if a=b, then a−b=0. Thus, the best way to check if a=b is to take a−b and simplify it, and see if it goes to 0. We will learn later that the function to do this is called simplify. This method is not infallible—in fact, it can be theoretically proven that it is impossible to determine if two symbolic expressions are identically equal in general—but for most common expressions, it works quite well.

As a demo for your particular question, we can use the subtraction of equivalent expressions and compare to 0 like so

>>> 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) == 0True>>> simplify(vers1+vers2) == 0False


Alternatively you can use the .equals method to compare expressions:

from sympy import *x = symbols('x')expr1 = tan(x) * cos(x)expr2 = sin(x)expr1.equals(expr2)True


The solution with simplify was too slow for me (had to crosscheck multiple variables), so I wrote the following function, which does some simple checkes beforehand, to reduce computational time, to use simplify only in the last step.

import numpy as npimport sympy as spdef 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)