2011-05-22 108 views
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) 

我设法降低x范围(或范围),并增加linspace(0,35在1000个多点),但我越来越之一:

OverflowError: long int too large to convert to int 

OverflowError: range() result has too many items 

那么,似乎这里是什么问题?我怎样才能让这笔钱变大?总和的语法是否正确?

+2

你正在努力解决10 ** 100阶乘问题,你很惊讶你会得到一个OverflowError? – katrielalex 2011-05-22 12:27:04

回答

6

该循环在您的一生中不可能结束。 10 ** 100是一个非常非常庞大的数字。它比宇宙中的粒子数量还要多,它比宇宙创造以来最小的时间数量还要多。在一个不可能的快速电脑 - 3 * 10 ** 46千年的循环完成。要计算一个无穷大的总和,你希望计算一下,直到总和停止变化很大(例如,加数已经下降到某个非常小的阈值)。

此外,xrange和在Python 2 range仅限于该平台的长整数,这意味着你不能有一个64位的一个32位机器上比2 ** 31更高的数字和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))?我只想指出,由于另一个答案,你写了前者。

+1

你或许还应该提到'10 ** 100'被称为万仟万美元或“googol”。 – martineau 2011-05-22 13:09:41

+0

哦,大声笑我看到XD我忽略了我在那里有因数的事实......我的数值计算技能很糟糕:感谢您的澄清:) – 2011-05-22 13:09:54

+0

我更新了答案:您至少应该取每个元素的绝对值。 – 2011-05-22 17:53:51

0

编辑:误读括号

你的总和中有1/n!。这意味着术语衰减真的非常快,所以没有必要使得总和达到10 * 100:尝试100,这应该是一个非常好的上限。事实上,试图计算出这样一个数量级的条件是荒谬的,因为这意味着计算机必须解决(10 ** 100)!