이 긴 질문의 처음 두 부분 만이 필수적입니다. 다른 것은 단지 설명을위한 것입니다.
배경
고차 합성 Newton–Cotes, Gauß–Legendre 및 Romberg와 같은 고급 쿼드 러처는 주로 함수를 미세하게 샘플링 할 수 있지만 분석적으로 통합 할 수없는 경우를위한 것으로 보입니다. 그러나 샘플링 간격 (예 : 부록 A 참조)보다 미세한 구조의 기능 또는 측정 노이즈의 경우 중간 점 또는 사다리꼴 규칙과 같은 간단한 접근 방식과 경쟁 할 수 없습니다 (시연은 부록 B 참조).
예를 들어 복합 심슨 규칙은 정보의 1/4을 더 낮은 가중치로 할당하여 본질적으로 "삭제"하므로 다소 직관적입니다. 이러한 직각이 충분히 지루한 기능에 더 좋은 유일한 이유는 경계 효과를 올바르게 처리하는 것이 폐기 된 정보의 효과보다 중요하기 때문입니다. 다른 관점에서 볼 때, 미세 구조 또는 노이즈가있는 함수의 경우 통합 영역 경계에서 떨어진 샘플은 거의 같은 거리에 있어야하고 무게는 거의 같아야합니다 (많은 샘플 수). ). 다른 한편으로, 그러한 함수의 직교는 (중간 점 방법보다) 보더 효과의 더 나은 처리로부터 이익을 얻을 수 있습니다.
질문
노이즈가 있거나 미세 구조화 된 1 차원 데이터를 수치 적으로 통합한다고 가정합니다.
샘플링 포인트의 수는 고정되어 있지만 (기능 평가에 비용이 많이 들기 때문에) 자유롭게 배치 할 수 있습니다. 그러나 I (또는 방법)은 대화식으로, 즉 다른 샘플링 지점의 결과를 기반으로 샘플링 지점을 배치 할 수 없습니다. 나는 또한 잠재적 문제 영역을 미리 모른다. 따라서 Gauß–Legendre (비 동일 샘플링 지점)와 같은 것은 괜찮습니다. 적응 구적법은 대화식으로 배치 된 샘플링 지점이 필요하지 않기 때문입니다.
이 경우 중간 점 방법을 넘어서는 방법이 제안 되었습니까?
또는 : 중간 조건 방법이 그러한 조건에서 최상이라는 증거가 있습니까?
더 일반적으로 :이 문제에 대한 기존 작업이 있습니까?
부록 A : 미세 구조화 된 기능의 특정 예
추정하고 싶습니다 를 들어 와및. 일반적인 기능은 다음과 같습니다.
다음 속성에 대해이 기능을 선택했습니다.
- 제어 결과를 위해 분석적으로 통합 될 수 있습니다.
- 그것은 내가 사용하고있는 샘플 수 ( )로 모든 것을 캡처 할 수없는 수준의 훌륭한 구조를 가지고 있습니다 .
- 그것은 훌륭한 구조에 의해 지배되지 않습니다.
부록 B : 벤치 마크
완전성을 위해 다음은 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))
(여기서 나는 중간 값을 사용하여 고주파 성분 만있는 함수로 인한 특이 치의 영향을 줄입니다. 평균적으로 결과는 비슷합니다.)
상대 적분 오차의 중앙값은 다음과 같습니다.
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
참고 : 결과없이 2 개월 동안 현상금이 한 번 발생하면 MathOverflow에 게시했습니다 .