我在写一个用勒让德-高斯求积求积分的程序。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阶求积的高精度,但这个根查找导致失败。有什么想法吗?在
您可以在its documentation中找到解决
SymPy
问题的简单示例实现:正如前面的答案所示,这个例子使用了多项式的泰勒展开式。在
作为np.根依靠文档中所述的“寻找伴随矩阵的特征值”,您可能会遇到错误传播问题,导致根上的虚部非零。也许你可以用np.实数功能。在
您可以尝试使用根的泰勒近似法来计算根:
https://math.stackexchange.com/questions/12160/roots-of-legendre-polynomial
相关问题 更多 >
编程相关推荐