[英]Laguerre polynomials in python using scipy, lack of convergence?
拉蓋爾多項式似乎並沒有收斂,這可以通過運行以下代碼來證明。
import numpy as np
from sympy import mpmath as mp
from scipy.special import genlaguerre as genlag
from sympy.mpmath import laguerre as genlag2
from matplotlib import pyplot as plt
def laguerre(x, r_ord, phi_ord, useArbitraryPrecision=False):
if (r_ord < 30 and phi_ord < 30) and not useArbitraryPrecision:
polyCoef = genlag(r_ord, phi_ord)
out = np.polyval(polyCoef, x)
else:
fun = lambda arg: genlag2(r_ord, phi_ord, arg)
fun2 = np.frompyfunc(genlag2, 3, 1)
# fun2 = np.vectorize(fun)
out = fun2(r_ord, phi_ord, x)
return out
r_ord = 29
phi_ord = 29
f = lambda x, useArb : mp.log10(laguerre(x, 29, 29, useArb))
mp.plot(lambda y : f(y, True) - f(y, False), [0, 200], points = 1e3)
plt.show()
我想知道是否有人知道發生了什么事情或scipy
函數的精度限制? 您是否建議我僅使用mpmath
函數? 起初我以為可能是某個命令后它不起作用,但對於(100,100)來說似乎就可以了。
通過運行
mp.plot([lambda y : f(y, True), lambda y: f(y, False)], [0, 200], points = 1e3)
您將獲得以下圖像,其中差異非常明顯。
任何幫助表示贊賞。
讓我知道是否需要澄清。
使用polyval
高多項式(約n > 20
)一般一個壞主意,因為使用系數(電力基礎)將開始在浮點高的訂單給大錯誤評估多項式。 Scipy文檔中的警告試圖告訴您。
您應該使用scipy.special.eval_genlaguerre(r_ord, phi_ord, float(x))
代替genlaguerre + polyval
; 它使用更穩定的數值算法來評估多項式。
代替pv建議使用scipy.special.eval_genlaguerre
評估高階多項式,您還可以使用numpy.polynomial.Laguerre
如NumPy文檔中所述 。
不幸的是,它似乎沒有為廣義 Laguerre多項式提供函數。
import numpy as np
from numpy.polynomial import Laguerre
p = Laguerre([1, -2, 1])
x = np.arange(5)
p(x)
NumPy輸出:0、0.5、2、4.5、8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.