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
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