Почему 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