这个长问题的仅前两个部分是必不可少的。其他仅用于说明。
背景
较高阶的正交函数,例如更高阶的牛顿-科茨复合材料,高斯-莱根特雷和罗姆贝格复合材料,似乎主要用于那些可以对函数进行精细采样而不能进行分析集成的情况。但是,对于具有比采样间隔(例如,请参阅附录A)或测量噪声更精细的结构的函数,它们无法与简单的方法(例如中点或梯形规则)(请参见附录B进行演示)竞争。
这有点直观,例如,复合Simpson规则通过分配较低的权重实质上“丢弃”了四分之一的信息。这样的正交对于足够无聊的功能更好的唯一原因是,正确处理边界效应要大于丢弃信息的效应。从另一角度看,从我的直觉上很清楚,对于具有精细结构或噪声的函数,远离积分域边界的样本必须几乎等距且权重几乎相同(对于大量样本而言) )。另一方面,更好地处理边界效果(与中点方法相比)可能会受益于此类函数的正交。
题
假设我希望在数值上整合嘈杂或精细结构的一维数据。
采样点的数量是固定的(由于功能评估成本很高),但是我可以自由放置它们。但是,我(或方法)不能交互地放置采样点,即基于其他采样点的结果。我也不事先知道潜在的问题区域。因此,像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
注意:两个月零一个赏金没有结果后,我将其发布在MathOverflow上。