2016-04-03 4 views
1

Я перехожу из Maple в python для своего математического программирования. В рамках этого я пытаюсь определить, какие правильные инструменты должны выполнять бесконечные суммы численно.Как выполнить бесконечную сумму численно в python

Я хотел бы вычислить численно, например:

сумму (ехр (-x^2), х = -infinity..infinity)

В Maple это будет просто

evalf (сумма (exp (-x^2), x = -infinity..infinity));

       1.772637205 

Можете ли вы сделать что-то подобное в питона, возможно, используя научную питона экосистему (SciPy, Numpy, SymPy и т.д.)?

+0

Что вы ожидаете произойдет, если сумма Безразлично» t сходится или если его сходимость неизвестна (http://math.stackexchange.com/questions/20555/are-there-any-series-whose-convergence-is-unknown)? (Мне любопытно, как Maple справляется с этим.) В целом Python не обрабатывает такие операции, которые включают в себя символические/теоретические конструкции, такие как суммирование «до бесконечности». Вы можете вычислить сумму между любыми конечными пределами, которые вы хотите, но вы сами должны установить конечные пределы (и сами решать, считаете ли вы результат сходимости). – BrenBarn

+0

@BrenBarn Если он не сходится или, как правило, очень сложно вычислить, я не ожидаю его успеха. – eleanora

ответ

2

Я использовал mpmath-х nsum для этого в прошлое с хорошими результатами:

>>> from mpmath import nsum, exp, inf 
>>> nsum(lambda x: exp(-x**2), [-inf, inf]) 
mpf('1.7726372048266521') 

, который немного отличается от

>>> from mpmath import quad 
>>> quad(lambda x: exp(-x**2), [-inf, inf]) 
mpf('1.7724538509055161') 

Мы можем получить его с более высокой точностью, и сравнить ее с аналитической ценности:

>>> import mpmath 
>>> mpmath.mp.dps = 50 
>>> nsum(lambda x: exp(-x**2), [-inf, inf]) 
mpf('1.7726372048266521530312505511578584813433860453722459') 
>>> mpmath.jtheta(3, 0, 1/exp(1)) 
mpf('1.7726372048266521530312505511578584813433860453722465') 
+0

Я понятия не имел, что существует nsum! Спасибо. Я считаю, что 1.77263720482665215303125055115785848134338604537224605 - правильный ответ до 54 значащих цифр. – eleanora

+0

Используя Mathematica, вы получите результат «EllipticTheta (3,0,1/e)». –

0

Ожидаю, что вы могли бы сделать некоторые суммы, суммируя диапазон, в котором значение суммируемого выражения достаточно велико (то есть больше, чем заданное eps). Но я не знаю, как это можно было бы решить в более общем плане.

По возможности вы должны, конечно, использовать закрытую форму. Например, (до бесконечности) суммируется до 1/(1-x), когда |x|<1.

1

Для терминов, которые падают достаточно быстро к нулю

def infinisum(f): 
    sum = 0 
    n=0 
    while 1==1: 
     term = f(n) 
     if (sum+term)-sum == 0: 
      break; 
     sum += term 
    return sum 

Тогда ваша конкретная серия

2*infinisum(lambda x: exp(-x**2)) - 1 

или вообще

f = lambda x:exp(-x**2) 
infinisum(f)+infinisum(lambda x : f(-1-x)) 
+0

Спасибо за это. – eleanora

Смежные вопросы