2011-05-22 113 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)!