Построение суммы в питоне

1

Я пытаюсь построить функцию в 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 (или диапазон) и увеличить linspace (от 0, 35 до более 1000 точек), но я получаю либо:

OverflowError: long int too large to convert to int

или

OverflowError: range() result has too many items

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

  • 2
    Вы пытаетесь отработать 10 ** 100 факториалов и удивляетесь, что получили ошибку OverflowError?
Теги:
numpy
sum

2 ответа

6
Лучший ответ

Этот цикл не может завершиться в течение вашей жизни. 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))? Я просто хочу указать, что вы написали первый из-за другого ответа.

  • 1
    Вы, вероятно, также должны упомянуть, что 10 ** 100 известен как десять тысяч sexdecillion или "googol".
  • 0
    О, боже, я вижу XD. Я пренебрег тем фактом, что у меня там есть факториал ... Мои навыки работы с вычислениями - отстой: | Спасибо за разъяснения :)
Показать ещё 1 комментарий
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню