SymPy 不识别相等的值

SymPy does not recognize equal values

SymPy 中的简单计算可以快速生成笨拙的结果,例如下面的三个 should_be 值。
与正确值的比较给出 False(尽管 math.isclose 给出 True)。

from sympy import sqrt
phi = (1 + sqrt(5)) / 2
should_be_phi = -(1/2 + sqrt(5)/2)**2 + (1/2 + sqrt(5)/2)**3
should_be_half = -sqrt(5)/8 + 1/8 + (1/2 + sqrt(5)/2)**2/4
should_be_one = -sqrt(5)/4 + 1/4 + (1/2 + sqrt(5)/2)**2/2
print(should_be_phi == phi, should_be_half == 1/2, should_be_one == 1)

这些是 Wolfram Alpha 格式化的相同公式:
披: 一半: 一:
should_be_phi 被创建为 phi**3 - phi**2 顺便说一句。

目前我总是将这些怪异的东西复制到 Wolfram Alpha 以获得合适的公式并删除重复项。

每次比较你也得到 False 吗?我使用 Python 3.6.8 和 SymPy 1.4.

有没有一种方法可以在 Python 中进行实际有效的符号计算?
SymPy 似乎无法做它应该做的事情。

我想你想要的是简化这些表达式,所以只需使用 simplify 函数:

In [6]: from sympy import *

In [7]: phi = (1 + sqrt(5)) / 2

In [8]: should_be_phi = -(S(1)/2 + sqrt(5)/2)**2 + (S(1)/2 + sqrt(5)/2)**3

In [9]: should_be_phi
Out[9]: 
          2           3
  ⎛1   √5⎞    ⎛1   √5⎞ 
- ⎜─ + ──⎟  + ⎜─ + ──⎟ 
  ⎝2   2 ⎠    ⎝2   2 ⎠ 

In [10]: simplify(should_be_phi)
Out[10]: 
1   √5
─ + ──
2   2 

请注意,您应该使用 S(1)/2 而不是 1/2,后者会给出一个浮点数。

如果你想比较表达式,那么显而易见的方法是使用 == 但这是 SymPy 中的 "structural equality"。这意味着 expr1 == expr2 仅当表达式的形式完全相同时才会给出 True 。如果你想测试数学相等性,那么你应该使用 Eq(lhs, rhs)simplify(lhs-rhs):

In [11]: should_be_phi == phi    # Expressions are not in the same form
Out[11]: False

In [12]: Eq(should_be_phi, phi)
Out[12]: True

In [13]: simplify(should_be_phi - phi)
Out[13]: 0

Is there a way do do symbolic calculations in Python that actually works? SymPy seems to be unable to do the things it is supposedly made for.

与 Wolfram Alpha 不同,SymPy 的设计目的不是让没有阅读过任何文档的人也能使用或理解它。如果您阅读了 SymPy 教程的前几页,您的上述问题就会得到解答: https://docs.sympy.org/latest/tutorial/index.html#tutorial