Nur die ersten beiden Abschnitte dieser langen Frage sind wesentlich. Die anderen dienen nur zur Veranschaulichung.
Hintergrund
Fortgeschrittene Quadraturen wie höhergradige zusammengesetzte Newton-Cotes, Gauß-Legendre und Romberg scheinen hauptsächlich für Fälle gedacht zu sein, in denen man die Funktion fein abtasten, aber nicht analytisch integrieren kann. Funktionen mit Strukturen, die kleiner als das Abtastintervall sind (siehe Beispiel in Anhang A) oder Messrauschen können jedoch nicht mit einfachen Ansätzen wie dem Mittelpunkt oder der Trapezregel konkurrieren (siehe Demonstration in Anhang B).
Dies ist etwas intuitiv, da z. B. die zusammengesetzte Simpson-Regel im Wesentlichen ein Viertel der Informationen „verwirft“, indem ein geringeres Gewicht zugewiesen wird. Der einzige Grund, warum solche Quadraturen für ausreichend langweilige Funktionen besser sind, besteht darin, dass der ordnungsgemäße Umgang mit Randeffekten den Effekt verworfener Informationen überwiegt. Aus einer anderen Sicht ist mir intuitiv klar, dass für Funktionen mit feiner Struktur oder Rauschen Proben, die von den Grenzen der Integrationsdomäne entfernt sind, fast gleich weit entfernt sein müssen und fast dasselbe Gewicht haben müssen (für eine hohe Anzahl von Proben) ). Andererseits kann die Quadratur solcher Funktionen von einer besseren Handhabung von Randeffekten profitieren (als bei der Mittelpunktmethode).
Frage
Angenommen, ich möchte verrauschte oder fein strukturierte eindimensionale Daten numerisch integrieren.
Die Anzahl der Abtastpunkte ist fest (aufgrund der hohen Kosten für die Funktionsbewertung), ich kann sie jedoch frei platzieren. Ich (oder die Methode) kann jedoch keine Stichprobenpunkte interaktiv platzieren, dh basierend auf Ergebnissen anderer Stichprobenpunkte. Auch potenzielle Problemregionen kenne ich vorher nicht. So etwas wie Gauß-Legendre (nicht äquidistante Stichprobenpunkte) ist in Ordnung. Adaptive Quadratur ist nicht erforderlich, da interaktiv platzierte Abtastpunkte erforderlich sind.
Wurden für einen solchen Fall Methoden vorgeschlagen, die über die Mittelpunktmethode hinausgehen?
Oder: Gibt es einen Beweis dafür, dass die Midpoint-Methode unter solchen Bedingungen am besten ist?
Allgemeiner: Gibt es Arbeiten zu diesem Problem?
Anhang A: Spezifisches Beispiel einer fein strukturierten Funktion
Ich möchte ∫ 1 0 f ( t ) schätzen für: mitund. Eine typische Funktion sieht so aus:φi∈[0,2π]logωi∈[1,1000]
Ich habe diese Funktion für die folgenden Eigenschaften gewählt:
- Es kann für ein Kontrollergebnis analytisch integriert werden.
- Es hat eine feine Struktur auf einer Ebene, die es unmöglich macht, alles mit der Anzahl der von mir verwendeten Samples zu erfassen ( ).
- Es wird nicht von seiner feinen Struktur dominiert.
Anhang B: Benchmark
Der Vollständigkeit halber ist hier ein Benchmark 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))
(Ich verwende hier den Median, um den Einfluss von Ausreißern aufgrund von Funktionen mit nur hochfrequenten Inhalten zu verringern. Im Mittel sind die Ergebnisse ähnlich.)
Die Mediane der relativen Integrationsfehler sind:
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
Hinweis: Nach zwei Monaten und einer Prämie ohne Ergebnis habe ich dies auf MathOverflow gepostet .