Solo le prime due sezioni di questa lunga domanda sono essenziali. Gli altri sono solo a scopo illustrativo.
sfondo
Le quadrature avanzate come Newton – Cotes composito di grado superiore, Gauß – Legendre e Romberg sembrano essere destinate principalmente ai casi in cui è possibile campionare con precisione la funzione ma non integrarsi analiticamente. Tuttavia, per le funzioni con strutture più fini dell'intervallo di campionamento (vedere l'Appendice A per un esempio) o il rumore di misurazione, non possono competere con approcci semplici come il punto medio o la regola del trapezio (vedere l'Appendice B per una dimostrazione).
Ciò è alquanto intuitivo in quanto, ad esempio, la regola composita di Simpson essenzialmente "scarta" un quarto delle informazioni assegnandole un peso inferiore. L'unica ragione per cui tali quadrature sono migliori per funzioni sufficientemente noiose è che la corretta gestione degli effetti delle frontiere supera l'effetto delle informazioni scartate. Da un altro punto di vista, mi risulta intuitivamente chiaro che per funzioni con una struttura o un rumore fini, i campioni remoti dai confini del dominio di integrazione devono essere quasi equidistanti e avere quasi lo stesso peso (per un numero elevato di campioni ). D'altra parte, la quadratura di tali funzioni può beneficiare di una migliore gestione degli effetti dei bordi (rispetto al metodo del punto medio).
Domanda
Supponiamo che desidero integrare numericamente dati unidimensionali rumorosi o ben strutturati.
Il numero di punti di campionamento è fisso (a causa della costosa valutazione delle funzioni), ma posso posizionarli liberamente. Tuttavia, I (o il metodo) non è in grado di posizionare i punti di campionamento in modo interattivo, cioè sulla base dei risultati di altri punti di campionamento. Inoltre non conosco preventivamente potenziali regioni problematiche. Quindi, qualcosa come Gauß – Legendre (punti di campionamento non equidistanti) va bene; la quadratura adattativa non è poiché richiede punti di campionamento posizionati in modo interattivo.
Sono stati suggeriti metodi che vanno oltre il metodo del punto medio in questo caso?
Oppure: c'è qualche prova che il metodo del punto medio sia il migliore in tali condizioni?
Più in generale: esistono lavori su questo problema?
Appendice A: esempio specifico di una funzione strutturata con precisione
Vorrei stimare per: con e . Una funzione tipica è simile a questa:
Ho scelto questa funzione per le seguenti proprietà:
- Può essere integrato analiticamente per un risultato di controllo.
- Ha una struttura fine a un livello che rende impossibile catturare tutto con il numero di campioni che sto usando ( ).
- Non è dominato dalla sua struttura fine.
Appendice B: benchmark
Per completezza, ecco un punto di riferimento in 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))
(Qui uso la mediana per ridurre l'influenza degli outlier dovuti a funzioni che hanno solo un contenuto ad alta frequenza. In media, i risultati sono simili.)
Le mediane dei relativi errori di integrazione sono:
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
Nota: dopo due mesi e una taglia senza risultato, l' ho pubblicato su MathOverflow .