1

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

每一项的分子为 n、n×(n-1)、n×(n-1)×(n-2) 等。我已将 0.5 分配给 n 并尝试生成 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]

有谁知道如何使用数组(矢量化方法)来做到这一点?我试图让它非常快速地计算术语,这样我就可以拥有更多的术语并提高结果的准确性。

广义二项式定理的公式

4

1 回答 1

0

每个项x*(x-1)*(x-2)*...*(x - n + 1)都称为下降阶乘。维基百科文章还描述了上升阶乘 x*(x+1)*...*(x + n - 1)。一些计算库包括这些的实现。例如,mpmathmpmath.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×-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*-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, 0.5, -0.25, 0.375, -0.9375, 3.28125]

所以如果你不介意对 SciPy 的依赖,你可以使用ff上面定义的来做你想做的事。

于 2020-09-10T17:10:25.970 回答