2014-10-21 1 views
0

laguerre 다항식은 다음 코드를 실행하여 증명할 수있는 것처럼 일부 순서에서 수렴하지 않는 것처럼 보입니다. 누군가가 나 scipy 함수의 정확도 한계 무슨 일이 일어나고 있는지 알고 있는지파이퍼에서 라기 어 다항식은 scipy를 사용하여 수렴성이 부족합니까?

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() 

궁금 해서요? 단순히 mpmath 기능을 사용하는 것이 좋습니다? 처음에는 특정 순서가 지나면 작동하지 않는다고 생각했지만 (100, 100)은 정상적으로 작동하는 것 같습니다.

mp.plot([lambda y : f(y, True), lambda y: f(y, False)], [0, 200], points = 1e3) 

는 차이가 꽤 명확하게 다음과 같은 이미지를 얻을를 실행하여

.

enter image description here

감사 어떤 도움.

설명이 필요하면 알려주세요.

+0

나는 당신이 "이상한 행동"에 대한 자세한 내용을 설명해야 할 것 같아요. 당신이 보는 것을 기대하는 것과 일치하지 않는 것을 당신은 무엇을보고 있습니까? – mgilson

+0

제목을 편집하고 음모를 추가 했는데도 여전히 이것이 항목을 명확히하지 않는다고 생각되면 알려주세요. – evan54

답변

1

고차 다항식 (약 n > 20)을 사용하여 polyval을 사용하는 것은 일반적으로 나쁜 생각입니다. 계수를 사용하여 다항식을 계산하면 높은 차수의 부동 소수점에 큰 오차가 생기기 시작하기 때문입니다. Scipy 문서의 warning은 그 사실을 알려줍니다.

genlaguerre + polyval 대신 scipy.special.eval_genlaguerre(r_ord, phi_ord, float(x))을 사용해야합니다. 그것은 다항식을 평가하기 위해 더 안정된 수치 알고리즘을 사용합니다.

0

고차 다항식을 제안 할 때 scipy.special.eval_genlaguerre을 사용하는 대신 NumPy documentation에서 설명한대로 numpy.polynomial.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