2013-12-13 64 views
0

我想繪製一個涉及二項式係數的函數。我的代碼是具有大二項式係數的繪圖函數

#!/usr/bin/python 
from __future__ import division 
from scipy.special import binom 
import matplotlib.pyplot as plt 
import math 

max = 500 
ycoords = [sum([binom(n,w)*sum([binom(w,k)*(binom(w,k)/2**w)**(4*n/math.log(n)) for k in xrange(w+1)]) for w in xrange(1,n+1)]) for n in xrange(2,max)] 

xcoords = range(2,max) 

plt.plot(xcoords, ycoords) 
plt.show() 

不幸的是,這永遠不會終止。如果你將max降低到40,說明它工作正常。有什麼方法來繪製這個功能?

我也擔心scipy.special.binom可能沒有給出準確的答案,因爲它似乎在浮點運行。

+0

你的代碼似乎做工精細,我跑了原樣,雖然它確實需要很長時間顯著量,這是當你與500合作,可以預期條款。此外,情節工作得很好。我不清楚問題是什麼。 –

+1

@TroyRockwood我認爲binom(n,w)只能精確到53位,所以你得到的圖片不會是正確的嗎? – eleanora

+0

這是一個與「永不終止」或「可以繪製它」不同的問題,顯然結果將受到所使用的變量精度的精確度的限制。也許關於這個問題的應用會有所幫助的一點說明。 –

回答

3

通過使用numpy來計算內部循環,您可以獲得顯着的加速。使用舊代碼

N = 500 
X = np.arange(2,N) 

def k_loop(w,n): 
    K = np.arange(0, w+1) 
    return (binom(w,K)*(binom(w,K)/2**w)**(float(n)/np.log(n))).sum() 

def w_loop(n): 
    v = [binom(n,w)*k_loop(w,n) for w in range(1,n+1)] 
    return sum(v) 

Y = [w_loop(n) for n in X] 

使用N=300,因爲它需要3.932s與numpy的代碼測試,但81.645s:一是改變maxN(因爲max是一個內置)和你的函數分解成更小,更易管理的塊。因爲你的舊代碼花了這麼長時間,我甚至沒有時間N=500的情況!

值得指出的是,你的函數基本上是指數增長,可以近似爲這樣。您可以在semilogx情節看到這一點:

enter image description here

+0

謝謝。我還稍微編輯了這個公式,使其更加明智(見新的因子4)。 – eleanora