在python中绘制一个总和

时间:2011-05-22 12:20:27

标签: python numpy sum

我正在尝试在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(从超过1000点的0,35),但我得到了:

OverflowError: long int too large to convert to int

OverflowError: range() result has too many items

那么这里的问题似乎是什么?怎么能把这笔钱大呢?总和的语法是否正确?

2 个答案:

答案 0 :(得分:6)

在你的一生中,这个循环不可能结束。 10 ** 100真是一个非常庞大的数字。它比宇宙中的粒子数量更大,它大于宇宙创造以来最微小的时间段。在一台不可思议的快速计算机上 - 3 * 10 ** 46千年来完成循环。要计算一个无限和,你希望计算直到总和停止显着变化(例如,求和已经落在某个非常小的阈值之下)。

此外,Python 2中的xrangerange仅限于平台的长整数,这意味着32位机器上的数字不能高于2 ** 31且2 * * 64位64位(后者仍然太大而不能在你的生命中完成),这就是你在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 :(得分:0)

编辑:误读了括号

你的总和中有1/n!。这意味着这些术语真的很快就会快速衰减,所以没有必要使总和达到10 * 100:尝试改为100,这对你来说应该是一个非常好的上限。事实上,尝试将这些术语计算到那种数量级是荒谬的,因为这意味着计算机必须计算出来(10 ** 100)!。