在python中查找勒让德多项式的根

时间:2012-08-03 11:35:26

标签: python root

我正在编写一个程序,通过勒让德 - 高斯求积法求解积分。用于n阶正交的算法在一点上需要找到n阶勒让德多项式Pn(x)的根,将它们分配给阵列Absc(对于“横坐标”)。 Pn是n阶多项式,在区间[-1,1]上具有n个独立的实根。我希望能够计算根,而不是从某个库中导入它们。我能够创建一个给出多项式系数的数组,我称之为PCoeff。找到我试过的根源

 Absc = numpy.roots(PCoeff)

这可以达到大约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阶运行正交以获得高精度,但这种根发现会导致失败。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

由于np.roots依赖于“找到伴随矩阵的特征值”,如文档中所述,您可能会遇到错误传播问题,从而导致根上的非零虚部。也许你可以使用np.real函数丢弃虚部。

您可以尝试使用泰勒近似根来计算根的不同方法:

https://math.stackexchange.com/questions/12160/roots-of-legendre-polynomial

答案 1 :(得分:0)

您可以在its documentation中找到SymPy问题的简单示例实现:

>>> for n in range(5):
...     nprint(polyroots(taylor(lambda x: legendre(n, x), 0, n)[::-1]))
...
[]
[0.0]
[-0.57735, 0.57735]
[-0.774597, 0.0, 0.774597]
[-0.861136, -0.339981, 0.339981, 0.861136]

如前面的答案所示,这个例子使用了多项式的泰勒展开式。