Dönüştürme mu


15

Anekdotsal olarak duydum ki, kişi sayısal olarak formun bir integralini yapmaya çalışırken

0f(x)J0(x)dx

ile (vs, örneğin yüksek titreşimli tekil olmayan kendi başına) düz ve iyi huylu, o zaman doğruluğu olarak yeniden için yardımcı olacaktırf(x)

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

ve önce iç integrali sayısal olarak gerçekleştirin. Bunun çalışmasını beklemem için herhangi bir neden göremiyorum, ancak yine de sayısal bir yöntemin doğruluğu nadiren açıktır.

Tabii ki bunu yapmanın en iyi yolunun, bunun gibi salınımlı integraller için optimize edilmiş bir yöntem kullanmak olduğunu biliyorum, ama merak uğruna, kendimi bazı kareleme kuralı kullanmakla sınırlandırdığımı varsayalım. Herkes bu dönüşümü yapmanın integralin doğruluğunu artırma eğiliminde olduğunu teyit edebilir veya reddedebilir mi? Ve / veya beni açıklayan bir kaynağa mı yönlendiriyorsun?


1
0θπ

4
NQN[][0,)QπN[][0,π]QNM[fJ0]QπM[QN[f(x)cos(xsinθ)]]

@StefanoM evet, doğru.
David Z

Sıfırıncı dereceden Bessel işlevini değerlendirmek için en etkili yöntemlerden biri olan FWIW, periyodik integralleri bir periyotta (normal standarttan, Gauss quadrature'dan bile daha iyi) entegre ederken çok doğru sonuçlar verdiği bilinen trapezoidal kuraldır. Yani: yardımcı olabilir, olmayabilir.
JM

Yanıtlar:


3

θJ0nxf(x)=exx2[0,xmax]xmaxaltında. Bende var:

 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

İşte kod:

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


Haklı olduğunu düşünüyorum, kendi testlerim de benzer sonuçlar verdi.
David Z
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.