绘制具有大二项系数的函数

时间:2013-12-13 18:41:01

标签: python numpy scipy

我想绘制一个涉及二项式系数的函数。我的代码是

#!/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可能没有提供准确的答案,因为它似乎在浮点工作。

1 个答案:

答案 0 :(得分:3)

使用numpy计算内部循环可以获得显着的加速。首先将max更改为N(因为max是内置的)并将您的功能分解为更小,更易于管理的块:

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使用旧代码。我甚至没有计算N=500案例,因为你的旧代码花了这么长时间!

值得指出的是,你的函数基本上是指数增长,可以近似。您可以在semilogx图中看到这一点:

enter image description here