Seules les deux premières sections de cette longue question sont essentielles. Les autres sont juste à titre d'illustration.
Contexte
Des quadratures avancées telles que Newton – Cotes composites de degré supérieur, Gauß – Legendre et Romberg semblent être principalement destinées aux cas où l'on peut finement échantillonner la fonction sans l'intégrer analytiquement. Cependant, pour les fonctions avec des structures plus fines que l'intervalle d'échantillonnage (voir l'exemple A) ou le bruit de mesure, elles ne peuvent pas rivaliser avec des approches simples telles que la règle médiane ou trapézoïdale (voir l'annexe B pour une démonstration).
Ceci est quelque peu intuitif car, par exemple, la règle composite de Simpson «élimine» essentiellement un quart des informations en lui attribuant un poids inférieur. La seule raison pour laquelle ces quadratures sont meilleures pour des fonctions suffisamment ennuyeuses est que la gestion correcte des effets de bordure l'emporte sur l'effet des informations rejetées. D'un autre point de vue, il est intuitivement clair pour moi que pour les fonctions à structure fine ou à bruit, les échantillons éloignés des frontières du domaine d'intégration doivent être quasiment équidistants et avoir presque le même poids (pour un nombre élevé d'échantillons) ). En revanche, la quadrature de ces fonctions peut bénéficier d'une meilleure gestion des effets de frontière (que pour la méthode du point médian).
Question
Supposons que je souhaite intégrer numériquement des données unidimensionnelles bruyantes ou à structure fine.
Le nombre de points d'échantillonnage est fixe (en raison de l'évaluation coûteuse des fonctions), mais je peux les placer librement. Cependant, I (ou la méthode) ne peut pas placer les points d'échantillonnage de manière interactive, c'est-à-dire sur la base des résultats d'autres points d'échantillonnage. Je ne connais pas non plus au préalable les régions à problèmes potentiels. Donc, quelque chose comme Gauß – Legendre (points d'échantillonnage non équidistants) est correct; la quadrature adaptative ne l'est pas car elle nécessite des points d'échantillonnage placés de manière interactive.
Des méthodes allant au-delà de la méthode du point médian ont-elles été suggérées pour un tel cas?
Ou: Existe-t-il une preuve que la méthode du point médian est la meilleure dans de telles conditions?
Plus généralement: existe-t-il des travaux sur ce problème?
Annexe A: Exemple spécifique d'une fonction à structure fine
Je souhaite estimer pour: avec et . Une fonction typique ressemble à ceci:φi∈[0,2π]logωi∈[1,1000]
J'ai choisi cette fonction pour les propriétés suivantes:
- Il peut être intégré analytiquement pour un résultat de contrôle.
- Il a une structure fine à un niveau qui rend impossible de capturer tout cela avec le nombre d'échantillons que j'utilise ( ).
- Il n'est pas dominé par sa structure fine.
Annexe B: Benchmark
Pour être complet, voici une référence en Python:
import numpy as np
from numpy.random import uniform
from scipy.integrate import simps, trapz, romb, fixed_quad
begin = 0
end = 1
def generate_f(k,low_freq,high_freq):
ω = 2**uniform(np.log2(low_freq),np.log2(high_freq),k)
φ = uniform(0,2*np.pi,k)
g = lambda t,ω,φ: np.sin(ω*t-φ)/ω
G = lambda t,ω,φ: np.cos(ω*t-φ)/ω**2
f = lambda t: sum( g(t,ω[i],φ[i]) for i in range(k) )
control = sum( G(begin,ω[i],φ[i])-G(end,ω[i],φ[i]) for i in range(k) )
return control,f
def midpoint(f,n):
midpoints = np.linspace(begin,end,2*n+1)[1::2]
assert len(midpoints)==n
return np.mean(f(midpoints))*(n-1)
def evaluate(n,control,f):
"""
returns the relative errors when integrating f with n evaluations
for several numerical integration methods.
"""
times = np.linspace(begin,end,n)
values = f(times)
results = [
midpoint(f,n),
trapz(values),
simps(values),
romb (values),
fixed_quad(f,begin,end,n=n)[0]*(n-1),
]
return [
abs((result/(n-1)-control)/control)
for result in results
]
method_names = ["midpoint","trapezoid","Simpson","Romberg","Gauß–Legendre"]
def med(data):
medians = np.median(np.vstack(data),axis=0)
for median,name in zip(medians,method_names):
print(f"{median:.3e} {name}")
print("superimposed sines")
med(evaluate(33,*generate_f(10,1,1000)) for _ in range(100000))
print("superimposed low-frequency sines (control)")
med(evaluate(33,*generate_f(10,0.5,1.5)) for _ in range(100000))
(J'utilise ici la médiane pour réduire l'influence des valeurs aberrantes en raison de fonctions qui n'ont qu'un contenu haute fréquence. Pour la moyenne, les résultats sont similaires.)
Les médianes des erreurs d'intégration relatives sont:
superimposed sines
6.301e-04 midpoint
8.984e-04 trapezoid
1.158e-03 Simpson
1.537e-03 Romberg
1.862e-03 Gauß–Legendre
superimposed low-frequency sines (control)
2.790e-05 midpoint
5.933e-05 trapezoid
5.107e-09 Simpson
3.573e-16 Romberg
3.659e-16 Gauß–Legendre
Remarque: Après deux mois et une prime sans résultat, j'ai posté ceci sur MathOverflow .