Apakah mentransformasikan

15

Saya telah mendengar secara anekdot bahwa ketika seseorang mencoba secara numerik melakukan integral dari formulir

0f(x)J0(x)dx

dengan halus dan berperilaku baik (misalnya tidak sendiri sangat berosilasi, nonsingular, dll), maka itu akan membantu akurasi untuk menulis ulang sebagaif(x)

1π0π0f(x)cos(xdosaθ)dxdθ

dan melakukan integral integral secara numerik terlebih dahulu. Saya tidak dapat melihat alasan mengapa saya berharap ini berfungsi, tetapi sekali lagi keakuratan metode numerik jarang terlihat jelas.

Tentu saja saya tahu cara terbaik untuk benar-benar melakukannya adalah dengan menggunakan metode yang dioptimalkan untuk integral osilasi seperti ini, tetapi demi rasa ingin tahu, misalkan saya membatasi diri untuk menggunakan beberapa aturan quadrature. Adakah yang bisa mengkonfirmasi atau membantah bahwa melakukan transformasi ini cenderung meningkatkan akurasi integral? Dan / atau arahkan saya ke sumber yang menjelaskannya?

David Z
sumber
1
Terintegrasi lebih dari ... Itu salah satu definisi integral dari fungsi Bessel. 0θπ
David Z
4
NQN[][0,)QπN[][0,π]QNM.[fJ0]QπM.[QN[f(x)cos(xdosaθ)]] .
Stefano M
@StefanoM ya, itu benar.
David Z
FWIW, salah satu metode yang paling efisien untuk mengevaluasi fungsi Bessel urutan-nol adalah aturan trapesium, yang terkenal memberikan hasil yang sangat akurat ketika mengintegrasikan integrand periodik selama satu periode (bahkan lebih baik dari standar biasa, Gaussian quadrature). Jadi: mungkin membantu, mungkin juga tidak.
JM

Jawaban:

3

θJ0nxf(x)=e-xx2[0,xmaks]xmaksdi bawah. Saya mendapatkan:

 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

n=9

Ini kodenya:

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

OndČej Čertík
sumber
Saya menduga Anda benar, tes saya sendiri telah menunjukkan hasil yang sama.
David Z