[Python] Compare two equivalent Sympy expressions

Discussão em 'Python' iniciado por Stack, Maio 27, 2025.

  1. Stack

    Stack Membro Participativo

    I want to compare two Sympy expressions and know if they are equivalent with some symbolic parameters. A first approah is to use a polynom that works well but it fails with complex expressions. Here is the code:

    import sympy

    def sym_expr_eq(expr1, expr2, symbols = []):
    expr1 = sympy.expand(expr1)
    expr2 = sympy.expand(expr2)

    poly1 = sympy.Poly(expr1, *symbols)
    poly2 = sympy.Poly(expr2, *symbols)

    if (poly1 == None or poly2 == None):
    return False

    if (set(poly1.monoms()) != set(poly2.monoms())):
    return False

    for i in range(0, len(poly1.coeffs())):
    if (poly1.coeffs().is_Number and poly2.coeffs().is_Number):
    if (poly1.coeffs() != poly2.coeffs()):
    return False

    return True


    def test_sym_expr_eq_1():
    a, b, c, d, x, y = sympy.symbols('a b c d x y')

    expr1 = 1
    expr2 = 2

    assert(not sym_expr_eq(expr1, expr2, [x]))

    def test_sym_expr_eq_2():
    a, b, c, d, x, y = sympy.symbols('a b c d x y')

    expr1 = 1
    expr2 = d

    assert(sym_expr_eq(expr1, expr2, [x]))

    def test_sym_expr_eq_3():
    a, b, c, d, x, y = sympy.symbols('a b c d x y')

    expr1 = b + 1
    expr2 = d - 2

    assert(sym_expr_eq(expr1, expr2, [x]))

    def test_sym_expr_eq_4():
    a, b, c, d, x, y = sympy.symbols('a b c d x y')

    expr1 = a*x + b
    expr2 = c*x + d

    assert(sym_expr_eq(expr1, expr2, [x]))

    def test_sym_expr_eq_5():
    a, b, c, d, x, y = sympy.symbols('a b c d x y')

    expr1 = a*x + b
    expr2 = c*y + d

    assert(not sym_expr_eq(expr1, expr2, [x, y]))

    def test_sym_expr_eq_6():
    a, b, c, d, x, y = sympy.symbols('a b c d x y')

    expr1 = (1+a)*x + b + 3
    expr2 = (2+c)*x + d

    assert(sym_expr_eq(expr1, expr2, [x]))

    def test_sym_expr_eq_7():
    a, b, c, d, x, y = sympy.symbols('a b c d x y')

    expr1 = x + a*x + b + 3
    expr2 = 2*x + c*x + d - 1

    assert(sym_expr_eq(expr1, expr2, [x]))

    def test_sym_expr_eq_8():
    a, b, c, d, e, f, x, y = sympy.symbols('a b c d e f x y')

    expr1 = a*x**2 + 3*x + c
    expr2 = d*x**2 + 2*x + f

    assert(not sym_expr_eq(expr1, expr2, [x]))

    def test_sym_expr_eq_9():
    a, b, c, d, e, f, g, h, x, y = sympy.symbols('a b c d e f g h x y')

    expr1 = sympy.sympify("a*log(b*x+c)+d")
    expr2 = sympy.sympify("e+log(g+x*h)*f")

    assert(sym_expr_eq(expr1, expr2, [x]))


    All the tests pass except the 9th (sympy.polys.polyerrors.PolynomialError exception is raised) and I don't know how to do. Maybe treat the expression as a polynom of complex functions can work but I don't know how to do too.

    Continue reading...

Compartilhe esta Página