在python中求Legendre多项式的根

2024-10-01 07:44:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

 Absc = numpy.roots(PCoeff)

这个方法的有效值是n=40,但超过这个值后,它开始失败,当它真的不该这样做时,它会给出复杂的根。我也试着用

^{pr2}$

但这也带来了同样的问题,大概是因为它使用相同的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.根提供复杂值,这些值会导致fsolve中出现错误

TypeError: array cannot be safely cast to required type

我在网上看到有一个scipy.optimize.root()可以工作的例程,但它不在我计算机上的scipy库中。更新很麻烦,因为我没有在这台计算机上下载东西的权限。在

我希望能够运行64阶求积的高精度,但这个根查找导致失败。有什么想法吗?在


Tags: 方法程序numpy算法step计算机scipy数组
2条回答

您可以在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]

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

作为np.根依靠文档中所述的“寻找伴随矩阵的特征值”,您可能会遇到错误传播问题,导致根上的虚部非零。也许你可以用np.实数功能。在

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

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

相关问题 更多 >