我试图编程广义二项式定理,其中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
有人知道如何使用数组(矢量化方法)来完成这个任务吗?我试图使它非常快地计算这些术语,这样我就可以有更多的术语,并提高结果的准确性。
发布于 2020-09-10 17:10:25
每个术语x*(x-1)*(x-2)*...*(x - n + 1)都被称为降因子。维基百科的文章还描述了不断上升的阶乘x*(x+1)*...*(x + n - 1)。一些计算库包括这些实现。例如,mpmath有mpmath.ff和mpmath.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来做您想做的事情。
https://stackoverflow.com/questions/63832991
复制相似问题