我有一个函数(f
:黑线),它在一个特定的小区域(导数f'
:蓝线和二阶导数f''
:红线)变化很大。我想在数值上集成这个函数,如果我均匀地分布点(在日志空间中),那么在急剧变化的区域(在图中的2E15
附近),我会得到相当大的误差。
如何构造阵列间距,以便在二阶导数较大的区域(即与二阶导数成比例的采样频率)进行很好的采样?
我碰巧在使用python,但我对一个通用算法感兴趣。
编辑:
1)仍然能够控制采样点的数量(至少是粗略的),这将是很好的。
2)我考虑过构造一个概率分布函数,形状类似于二阶导数,并从它随机抽取--但我认为这会带来很差的收敛性,而且总的来说,这似乎是一种更确定的方法是可行的。
发布于 2015-03-09 07:56:33
假设f''
是NumPy
array
,您可以执行以下操作
# Scale these deltas as you see fit
deltas = 1/f''
domain = deltas.cumsum()
只考虑数量级波动,这可以调整如下.
deltas = 1/(-np.log10(1/f''))
发布于 2015-03-09 14:30:43
1)酷法
目前,我实现了一种“自适应细化”方法受流体力学技术的启发。我有一个函数,我想要采样,f
,我选择一些初始数组的样本点x_i
。我构造了一个“抽样”函数g
,它决定在哪里插入新的样本点。
在本例中,我选择g
作为log(f)
的斜率--因为我希望解析日志空间中的快速更改。然后,我将g
的范围划分为L=3
细化级别。如果g(x_i)
超过了细化级别,则将span细分为N=2
片段,将这些细分添加到样本中,并根据下一个级别进行检查。这会产生这样的结果:
实心灰色线是我想要采样的函数,而黑色十字是我的初始取样点。
虚线灰色线是我函数的日志的导数。
彩色虚线行是我的“细化级别”
彩色杂交是我精良的取样点。
所有这些都显示在日志空间中。
2)简单方法
在完成(1)之后,我意识到我可能只需要在y
中选择一个最大间距,然后选择x
-spacings来实现。同样,只需在y
中均匀地划分函数,并找到相应的x
点.其结果如下:
发布于 2015-03-09 21:20:06
一个简单的方法是将x轴数组分成三个部分,并对每个部分使用不同的间距。它将允许您保持总点数和所需的间距在不同的地区的地块。例如:
x = np.linspace(10**13, 10**15, 100)
x = np.append(x, np.linspace(10**15, 10**16, 100))
x = np.append(x, np.linspace(10**16, 10**18, 100))
您可能希望根据您的数据选择一个更好的间隔,但是您知道了。
https://stackoverflow.com/questions/28946183
复制相似问题