Защо SymPy не работи правилно с реални числа?

Опитвам се да оценя безкрайна сума в 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))

Предполагам, че причината е, че използвам плаващо число вместо цяло число.

Вместо това има ли начин да се изчисли приблизително сумата?


person tfv    schedule 17.09.2016    source източник


Отговори (2)


От документи:

Ако не може да изчисли сумата, връща неоценен обект Sum.

Друг начин да направите това е:

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
person Nehal J Wani    schedule 17.09.2016
comment
Използвайте sys.maxsize вместо sys.maxint за python 3.x - person Stefan Gruenwald; 02.02.2018

Това е грешка. Би трябвало да работи. Като цяло обаче е най-добре да предпочитате точните рационални числа пред плаващите числа в SymPy, където е възможно. Ако замените 0.5 с Rational(1, 2), работи.

person asmeurer    schedule 21.09.2016