Я пытаюсь построить функцию в 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
Так что же здесь проблема? Как я могу сделать сумму большой? Правильно ли синтаксис суммы?
Этот цикл не может завершиться в течение вашей жизни. 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))
? Я просто хочу указать, что вы написали первый из-за другого ответа.
10 ** 100
известен как десять тысяч sexdecillion или "googol".
РЕДАКТИРОВАТЬ: неправильно прочитать круглые скобки
Ваша сумма имеет 1/n!
. Это означает, что термины затухают ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО быстры, поэтому нет необходимости в том, чтобы сделать сумму до 10 * 100: попробуйте вместо 100, что должно быть совершенно хорошим верхним пределом для вас. Фактически, абсурдно пытаться выработать термины до такого порядка величины, потому что это означает, что компьютер должен работать (10 ** 100)!