簡體   English   中英

python中使用scipy的Laguerre多項式,缺乏收斂性嗎?

[英]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.LaguerreNumPy文檔中所述

不幸的是,它似乎沒有為廣義 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.

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