변형합니까


15

나는 수치 적으로 정수의 형태를 수행하려고 할 때 일화 적으로 들었습니다.

0에프(엑스)제이0(엑스)엑스

와 (등, 예를 들어, 매우, 진동 정칙 그 자체를) 부드럽게 잘 행동, 그것은 정확도로 재 작성하는 데 도움이 될 것입니다에프(엑스)

1π0π0에프(엑스)코사인(엑스θ)엑스θ

내부 적분을 먼저 수치 적으로 수행하십시오. 이것이 효과가있을 것으로 예상되는 이유를 알 수 없지만 수치 적 방법의 정확성은 거의 분명하지 않습니다.

물론 실제로 그것을하는 가장 좋은 방법은 이와 같은 진동 적분에 최적화 된 방법을 사용하는 것이지만 호기심을 위해 직각 규칙을 사용하는 것으로 제한한다고 가정합니다. 누구든지이 변형을하는 것이 적분의 정확성을 향상시키는 경향이 있다는 것을 확인하거나 반박 할 수 있습니까? 그리고 / 또는 그것을 설명하는 출처를 알려주세요.


1
이상 통합 ... Bessel 기능의 필수 정의 중 하나입니다. 0θπ
David Z

4
귀하의 질문은 그래서 : 일반 감안할 때 N'- 포인트 직교 식 Q N [ ][ 0 , )Q N π [ ][ 0 , π ] 입니다 Q N M은 [ F[][0,)π[][0,π]Q M π [ Q N [ f ( x ) 보다 나쁘거나 좋음미디엄[에프제이0] . π미디엄[[에프(엑스)코사인(엑스θ)]]
Stefano M

@StefanoM 네, 맞습니다.
David Z

0 차 베셀 함수를 평가하는 가장 효율적인 방법 중 하나 인 FWIW는 사다리꼴 규칙으로, 한주기에 걸쳐 주기적 정수를 통합 할 때 매우 정확한 결과를 제공하는 것으로 잘 알려져 있습니다 (일반 표준 인 가우스 구적법보다 우수). 따라서 도움이 될 수 있습니다.
JM

답변:


3

나는 그것이 아무런 차이가 없다고 생각합니다. Bessel 함수 J 0 과 같도록 에 대한 적분에 대해 충분히 높은 직교를 선택해야합니다 . 아래 예에서 차수 20을 선택했지만 통합 한 정확한 기능 및 간격과 관련하여 항상 수렴해야합니다. 그런 다음 x 에 대한 적분의 가우스 구적 차인 n 과 수렴했습니다 . 나는 f ( x ) = e x x 2를 선택 하고 domain [ 0 , x max ] 를 사용하면 x max를 변경할 수 있습니다θ제이0엑스에프(엑스)=이자형엑스엑스2[0,엑스최대]엑스최대이하. 나는 얻었다 :

 n      direct         rewritten
 1  0.770878284949  0.770878284949
 2  0.304480978430  0.304480978430
 3  0.356922151260  0.356922151260
 4  0.362576361509  0.362576361509
 5  0.362316789057  0.362316789057
 6  0.362314010897  0.362314010897
 7  0.362314071949  0.362314071949
 8  0.362314072182  0.362314072182
 9  0.362314072179  0.362314072179
10  0.362314072179  0.362314072179

=9

코드는 다음과 같습니다.

from scipy.integrate import fixed_quad
from scipy.special import jn
from numpy import exp, pi, sin, cos, array

def gauss(f, a, b, n):
    """Gauss quadrature"""
    return fixed_quad(f, a, b, n=n)[0]

def f(x):
    """Function f(x) to integrate"""
    return exp(-x) * x**2

xmax = 3.

print " n      direct         rewritten"
for n in range(1, 20):
    def inner(theta_array):
        return array([gauss(lambda x: f(x) * cos(x*sin(theta)), 0, xmax, n)
            for theta in theta_array])
    direct = gauss(lambda x: f(x) * jn(0, x), 0, xmax, n)
    rewritten = gauss(inner, 0, pi, 20) / pi
    print "%2d  %.12f  %.12f" % (n, direct, rewritten)

xmax[0,]f(x)rewritten = gauss(inner, 0, pi, 20) / pi


나는 당신이 옳다고 생각합니다. 내 자신의 테스트에서도 비슷한 결과가 나타났습니다.
David Z
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.