大二项式系数图

2024-06-10 07:46:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想画一个包含二项式系数的函数。我的密码是

#!/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()

不幸的是,这永远不会结束。如果你把最大值减少到40,就说它很好。有没有办法画出这个函数?在

我也担心scipy.special.binom公司可能不会给出准确的答案,因为它似乎是在浮点运算。在


Tags: 函数infromimportforpltmathscipy
1条回答
网友
1楼 · 发布于 2024-06-10 07:46:20

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

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

enter image description here

相关问题 更多 >