代码之家  ›  专栏  ›  技术社区  ›  Jürg Merlin Spaak

sy.sympify(str(expression))不等于expression

  •  3
  • Jürg Merlin Spaak  · 技术社区  · 6 年前

    据我所知, str 将sympy表达式转换为字符串并 sympify 将字符串转换为sympy表达式。因此,我希望(对于合理的表达方式)如下。

    >>> sy.sympify(str(expr)) == expr
    True
    

    我试过这个,事实上这是简单的例子(例如, expr = x+y )。但是,当我用下面的表达式尝试时,它不起作用:

    import sympy as sy
    a = sy.symbols("a")
    A = sy.Matrix(3,3, a)
    c0,c1,c2 = sy.symbols("c0 c1 c2", positive = True)
    c1*c2**2*a(0, 1)**2*a(1, 2)*a(2, 2) - c1*c2**2*a(0, 1)**2*a(2, 2)**2 - c1*c2**2*a(0, 1)*a(0, 2)*a(1, 1)*a(2, 2) + c1*c2**2*a(0, 1)*a(0, 2)*a(2, 1)*a(2, 2) - c1*c2**2*a(0, 1)*a(1, 1)*a(1, 2)*a(2, 2) + c1*c2**2*a(0, 1)*a(1, 1)*a(2, 2)**2 + c1*c2**2*a(0, 2)*a(1, 1)**2*a(2, 2) - c1*c2**2*a(0, 2)*a(1, 1)*a(2, 1)*a(2, 2) - c1*a(0, 0)**2*a(1, 1)*a(2, 1) + c1*a(0, 0)**2*a(2, 1)**2 + c1*a(0, 0)*a(0, 1)*a(1, 1)*a(2, 0) - c1*a(0, 0)*a(0, 1)*a(2, 0)*a(2, 1) + c1*a(0, 0)*a(1, 0)*a(1, 1)*a(2, 1) - c1*a(0, 0)*a(1, 0)*a(2, 1)**2 - c1*a(0, 0)*a(1, 1)**2*a(2, 0) + c1*a(0, 0)*a(1, 1)*a(2, 0)*a(2, 1) - c2**2*a(0, 0)*a(0, 1)*a(1, 2)*a(2, 2) + c2**2*a(0, 0)*a(0, 1)*a(2, 2)**2 + c2**2*a(0, 0)*a(0, 2)*a(1, 1)*a(2, 2) - c2**2*a(0, 0)*a(0, 2)*a(2, 1)*a(2, 2) + c2**2*a(0, 1)*a(1, 0)*a(1, 2)*a(2, 2) - c2**2*a(0, 1)*a(1, 0)*a(2, 2)**2 - c2**2*a(0, 2)*a(1, 0)*a(1, 1)*a(2, 2) + c2**2*a(0, 2)*a(1, 0)*a(2, 1)*a(2, 2) + c2*a(0, 0)**2*a(1, 2)*a(2, 1) - c2*a(0, 0)**2*a(2, 1)*a(2, 2) - c2*a(0, 0)*a(0, 1)*a(1, 2)*a(2, 0) + c2*a(0, 0)*a(0, 1)*a(2, 0)*a(2, 2) - c2*a(0, 0)*a(1, 0)*a(1, 2)*a(2, 1) + c2*a(0, 0)*a(1, 0)*a(2, 1)*a(2, 2) + c2*a(0, 0)*a(1, 1)*a(1, 2)*a(2, 0) - c2*a(0, 0)*a(1, 1)*a(2, 0)*a(2, 2)
    

    有人能告诉我为什么这个表达不起作用吗?

    注:我知道我应该举一个最简单的例子,但我只是没有找到表达式的哪个部分导致了这个问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   user6655984    6 年前

    最简单的例子是

    x = sy.symbols("x", positive=True)
    expr = 2*x
    sy.sympify(str(expr)) == expr   # False
    

    这很有意义:字符串表示 expr ,即 "2*x" ,没有关于x为正的信息。因此, sy.sympify(str(expr)) 使用名称“x”和默认假设创建新符号。这是一个不同于原来的符号。

    如果没有积极的假设,这种比较将返回真值。

    保持积极性假设的一种方法是明确地说字符串中的字符“x”表示现有符号 x ,通过使用 locals 字典:

    x = sy.symbols("x", positive=True)
    expr = 2*x
    sy.sympify(str(expr), locals={"x": x}) == expr    # True