Построение суммы в питоне - PullRequest
1 голос
/ 22 мая 2011

Я пытаюсь построить функцию в Python с бесконечной суммой. Теперь, поскольку в вычислениях нет бесконечности, для моей верхней границы я могу выбрать действительно большое число, и это нормально.

Итак, я попытался построить это:

from scitools.std import *
from math import *
import numpy as np

def f1(t):
    return 0.5*(1+sum((4**(2*n)*cos(2*n*t))/(e**16*factorial(n)) for n in xrange(0,10**100)))

t = linspace(0, 35, 10000)
y1 = f1(t)

plot(t, y1)

xlabel(r'$\tau$')
ylabel(r'P($\tau$)')
legend(r'P($\tau$)')
grid(True)

И я попытался уменьшить xrange (или диапазон) и увеличить пространство надстроек (с 0, 35 в более чем 1000 точках), но я получаю либо:

OverflowError: long int too large to convert to int

или

OverflowError: range() result has too many items

Так в чем здесь проблема? Как я могу сделать большую сумму? Является ли синтаксис суммы правильным?

Ответы [ 2 ]

6 голосов
/ 22 мая 2011

Эта петля не может закончиться в течение вашей жизни.10 ** 100 действительно огромное число.Это больше, чем количество частиц во вселенной, это больше, чем количество самых маленьких периодов времени, которые прошли с момента создания вселенной.На невероятно быстром компьютере - 3 * 10 ** 46 тысячелетия до завершения цикла.Чтобы вычислить бесконечную сумму, которую вы хотите вычислить, пока сумма не перестанет значительно изменяться (например, слагаемые упали ниже определенного очень маленького порога).

Кроме того, xrange и range в Python 2 являютсяограничено длинными целыми числами платформы, что означает, что вы не можете иметь числа больше 2 ** 31 на 32-битной машине и 2 ** 63 на 64-битной (последняя по-прежнему слишком велика, чтобы ее завершить в вашейвремя жизни), вот почему вы получаете OverflowError в Python 2. В Python 3 вы не получите никакой ошибки, но суммирование будет продолжаться вечно.

И вычисление факториала для такого большого числа еще медленнееТаким образом, у вас нет шансов когда-либо превысить максимум даже на 32-битной машине.

Найдите функцию для вычисления бесконечных сумм или сделайте это самостоятельно

>>> from __future__ import division
>>> import itertools
>>> from math import factorial, cos, e
>>> for t in [0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1]:
...     summables = ((4 ** (2 * n) * cos(2 * n * t)) / (e ** 16 * factorial(n)) 
...                  for n in itertools.count())
...     print 0.5 * (1 + sum(itertools.takewhile(lambda x: abs(x) > 1e-80, summables)))
... 
1.0
0.973104754771
0.89599816753
0.77928588758
0.65382602277
0.569532373683
0.529115621076
0.512624956755
0.505673516974
0.502777962546
0.501396442319

ТакжеЯ не распознаю формулу, но это должно быть (e ** 16) * factorial(n) или e ** (16 * factorial(n))?Я просто хочу отметить, что вы написали первое из-за другого ответа.

0 голосов
/ 22 мая 2011

РЕДАКТИРОВАТЬ: неправильно прочитать скобки

Ваша сумма содержит 1/n!. Это означает, что термины затухают ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО быстро, поэтому нет необходимости увеличивать сумму до 10 * 100: попробуйте вместо 100, что должно быть для вас хорошим верхним пределом. Фактически, абсурдно пытаться отработать термины до такого порядка, потому что это означает, что компьютер должен работать (10 ** 100)!.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...