我正在编写一个通过Legendre-Gauss积分求解的程序。对于n阶积分法算法,需要在某个时候找到n阶Legendre多项式Pn(x)的根,并将它们指定到Absc数组中。Pn是一个n阶多项式,在[-1,1]区间上具有n个独立实数根。我想能够计算出这些根,而不仅仅是从某个库中导入它们。我已经可以创建一个给出多项式系数的数组,我称之为PCoeff。为了找到这些根,我尝试过
Absc = numpy.roots(PCoeff)
这段代码可以在n小于等于40的情况下正常工作,但是如果n大于40时就会出现复数根的错误。我也尝试过使用其他方式定义这个多项式,例如:
P = numpy.poly1d(PCoeff)
Absc = P.r
但是这会导致同样的问题,可能是因为它使用了相同的numpy根查找算法。
另一种看起来很有前途的方法是使用scipy.optimize.fsolve(Pn, x0),其中x0是我的猜测根的n个元素数组。问题在于,根据我的x0选择,该方法可能会在某些根的位置多次给出一个特定的根,而不是其他根。我尝试将x0填充为[-1,1]上等距分布的点。
x0 = numpy.zeros(n)
step = 2./(n-1)
for i in xrange(n):
x0[i] = -1. + i*step
但是当n = 5时,fsolve会给出一些重复的根并忽略其他根。我也尝试使用numpy.roots的结果作为x0。然而,在np.roots给出复数值的问题区域,这些值会导致fsolve出错。
TypeError: array cannot be safely cast to required type
我在网上看到有一个scipy.optimize.roots()例程可以使用,但我的计算机上的scipy库中没有这个函数。由于我没有下载权限,更新是一个麻烦的事情。
我想要能够运行64阶的积分以达到高精度,但这个根查找会导致失败。你有什么建议吗?