【问题标题】:sy.sympify(str(expression)) is not equal to expressionsy.sympify(str(expression)) 不等于表达式
【发布时间】:2018-06-05 07:41:16
【问题描述】:

据我了解,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)

谁能告诉我为什么它不适用于这个表达式?

PS:我知道我应该放一个最小的工作示例,但我只是没有找到表达式的哪个部分导致了问题。

【问题讨论】:

  • Say your expr = sy.sympify("c1*c2**2*a(0, 1)..........") #A Sympy object now if you perform sy.sympify(str(expr)) == expr 它会返回 True 我做对了吗?
  • @NishantPatel 是的,在这一步之后它是正确的。但是我第一次转换它不是。

标签: python type-conversion sympy


【解决方案1】:

一个最小的例子是

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

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

如果没有积极性假设,比较将返回 True。

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

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

【讨论】: