簡體   English   中英

在python中查找勒讓德多項式的根

[英]Finding roots of Legendre polynomial in python

我正在編寫一個程序,通過勒讓德 - 高斯求積分求解積分。 用於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次順序運行正交以獲得高精度,但這種根發現會導致失敗。 有任何想法嗎?

由於np.roots依賴於“找到伴隨矩陣的特征值”,如文檔所述,您可能會遇到錯誤傳播問題,從而導致根上的非零虛部。 也許你可以使用np.real函數丟棄虛部。

您可以嘗試使用泰勒近似根來計算根的不同方法:

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

您可以在其文檔中找到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]

如前面的答案所示,這個例子使用了多項式的泰勒展開式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM