Trasformare


15

Ho sentito aneddoticamente che quando si sta provando a fare numericamente un integrale del modulo

0f(X)J0(X)dX

con liscio e ben educato (ad es. non esso stesso altamente oscillatorio, non singolare, ecc.), allora aiuterà l'accuratezza a riscriverlo comef(X)

1π0π0f(X)cos(Xpeccatoθ)dXdθ

ed esegui prima l'integrale interno numericamente. Non riesco a vedere alcun motivo per cui dovrei aspettarmi che funzioni, ma ancora una volta l'accuratezza di un metodo numerico è raramente ovvia.

Ovviamente so che il modo migliore per farlo è usare un metodo ottimizzato per integrali oscillatori come questo, ma per amor di curiosità, supponiamo che mi limiti a usare qualche regola di quadratura. Qualcuno può confermare o smentire che questa trasformazione tende a migliorare l'accuratezza dell'integrale? E / o indicarmi una fonte che lo spiega?


1
Integrato su ... È una delle definizioni integrali della funzione di Bessel. 0θπ
David Z,

4
Quindi la tua domanda è: date le formule di quadratura point generiche Q N [ ] su [ 0 , ) e Q N π [ ] su [ 0 , π ] , è Q N M [ fNQN[][0,)QπN[][0,π] peggiore o migliore di Q M π [ Q N [ f ( x )QNM[fJ0] . QπM[QN[f(X)cos(Xpeccatoθ)]]
Stefano M,

@StefanoM sì, esatto.
David Z,

FWIW, uno dei metodi più efficienti per valutare la funzione di Bessel di ordine zeroth è la regola trapezoidale, che è ben nota per dare risultati molto precisi quando si integrano integrali periodici su un periodo (anche meglio del solito standard, quadratura gaussiana). Quindi: potrebbe aiutare, potrebbe non farlo.
JM

Risposte:


3

Non penso che faccia alcuna differenza. Devi scegliere una quadratura abbastanza alta per l'integrale sopra modo che sia uguale alla funzione di Bessel J 0 . Ho scelto l'ordine 20 nell'esempio seguente, ma devi sempre fare la convergenza per quanto riguarda la funzione e l'intervallo esatti su cui ti integri. Poi ho fatto la convergenza con n , l'ordine della quadratura gaussiana dell'integrale su x . Ho scelto f ( x ) = e - x x 2 e utilizzo il dominio [ 0 , x max ] , è possibile modificare x maxθJ0nXf(X)=e-XX2[0,Xmax]Xmaxsotto. Ho ottenuto:

 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

Ecco il codice:

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


Sospetto che tu abbia ragione, i miei test hanno mostrato risultati simili.
David Z,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.