为什么 SymPy 不能正确处理实数?

Why does SymPy not work properly with real numbers?

我正在尝试在 SymPy 中计算无限总和。虽然第一个表达式的计算方式符合我的预期,但 SymPy 似乎无法处理第二个表达式。

from sympy import *
n = symbols('n')
print Sum((2)**(-n), (n, 1, oo)).doit()
print Sum((0.5)**(n), (n, 1, oo)).doit()

结果:

1
Sum(0.5**n, (n, 1, oo))

我假设原因是我使用的是浮点数而不是整数值。

有没有办法近似求和?

来自docs:

If it cannot compute the sum, it returns an unevaluated Sum object.

另一种方法是:

In [40]: Sum((Rational(1,2))**(n), (n, 1, oo)).doit()
Out[40]: 1

另一种方法:

In [43]: Sum((0.5)**(n), (n, 1, float('inf'))).doit()
Out[43]: 1.00000000000000

为了近似,你可以取一个足够大的数而不是无穷大:

In [51]: import sys

In [52]: Sum((0.5)**(n), (n, 1, sys.maxint)).doit()
Out[52]: 1.00000000000000

那是 a bug。它应该工作。但是,一般而言,最好尽可能在 SymPy 中使用精确的有理数而不是浮点数。如果您将 0.5 替换为 Rational(1, 2),它会起作用。