Je ne pense pas que cela fasse une différence. Vous devez choisir une quadrature suffisamment élevée pour l'intégrale sur afin qu'elle soit égale à la fonction de Bessel J 0 . J'ai choisi l'ordre 20 dans l'exemple ci-dessous, mais vous devez toujours faire une convergence en ce qui concerne la fonction exacte et l'intervalle sur lequel vous intégrez. Ensuite, j'ai fait la convergence avec n , l'ordre de la quadrature gaussienne de l'intégrale sur x . J'ai choisi f ( x ) = e - x x 2 et j'utilise le domaine [ 0 , x max ] , vous pouvez changerθJ0nxf(x)=e−xx2[0,xmax]xmaxau dessous de. J'ai eu:
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
Comme vous pouvez le voir, pour deux intégrales sont entièrement convergées vers 12 chiffres significatifs.n=9
Voici le code:
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)
Vous pouvez jouer avec cela vous-même, simplement changer xmax
, peut-être pourriez-vous avoir besoin de diviser l'intervalle en éléments et d'intégrer élément par élément. Vous pouvez également modifier la fonction . Assurez-vous que vous faites toujours converger l'intégrale , c'est-à-dire commencez par un ordre faible et continuez à l'augmenter jusqu'à ce que les résultats imprimés cessent de changer.[0,∞]f(x)
rewritten = gauss(inner, 0, pi, 20) / pi