我正在尝试在 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 千年才能完成循环。要计算无限总和,您希望一直计算到总和停止显着变化(例如,被加数低于某个非常小的阈值)。
此外,Python 2 中的 xrange 和 range 仅限于平台的长整数,这意味着您不能在32 位机器和 64 位机器上的 2 ** 63,(后者仍然太大而无法在你的一生中完成),这就是为什么你在 Python 2 中得到 OverflowError 的原因。在 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) )?我只想指出,您之所以写前者是因为另一个答案。
