用于计算广义二项式定理分子的矢量化方法?

问题描述

我正在尝试使用矢量化方法编写广义二项式定理,其中n可以是任何有理数。公式如下图所示。

每个项的分子为n,n×(n-1),n×(n-1)×(n-2)等。我已将n分配给0.5,并试图生成5个项。

到目前为止,我有分子的乘积数组: [0.5 -0.5 -1.5 -2.5 -3.5] 使用

def num_products(number_of_terms):
    r = np.arange(1,number_of_terms+1)
    num_prod = np.array(n-r+1)
    return num_prod

但是要为每个术语创建一个分子数组,如下所示(数组中的每个项目都用逗号分隔):

[0.5、0.5×-0.5、0.5×-0.5×-1.5、0.5×-0.5×-1.5×-2.5、0.5×-0.5×-1.5×-2.5×-3.5]

有人知道如何使用数组(向量化方法)吗?我正试图使其很快地计算出项,以便可以有更多的项并提高结果的准确性。

Formula for generalized binomial theorem

解决方法

每个术语x*(x-1)*(x-2)*...*(x - n + 1)被称为falling factorial。维基百科文章还描述了上升阶乘 x*(x+1)*...*(x + n - 1)。一些计算库包括这些的实现。例如,mpmath具有mpmath.ffmpmath.rf

SciPy将上升阶乘实现为scipy.special.poch。下降阶乘可以按照上升阶乘来实现,如

from scipy.special import poch


def ff(x,m):
    return poch(x - m + 1,m)

因为poch被实现为NumPy的“ ufunc”,所以它处理广播,因此ff也是如此。这意味着您可以传递一个m值数组,一次调用即可计算所有相应的下降阶乘。

例如,要获取n = 0.5的广义二项式的前六个分子项(包括初始项1),请调用ff(0.5,np.arange(6))

In [38]: ff(0.5,np.arange(6))
Out[38]: array([ 1.,0.5,-0.25,0.375,-0.9375,3.28125])

[1,0.5×-0.5,0.5×-0.5×-1.5,0.5×-0.5×-1.5×-2.5,0.5×-0.5×-1.5×-2.5×-3.5]相同:

In [40]: [1,0.5*-0.5,0.5*-0.5*-1.5,0.5*-0.5*-1.5*-2.5,0.5*-0.5*-1.5*-2.5*-3.5]
Out[40]: [1,3.28125]

因此,如果您不介意对SciPy的依赖,则可以使用上面定义的ff来完成所需的工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...