找到黑盒函数不连续性的最佳方法是什么?

计算科学 插值 信号处理
2021-12-03 21:38:14

有人建议这可能比我之前问过的数学堆栈交换更适合这个问题。

假设一个人有一个黑盒函数,它可以在指定时间间隔内的任何地方(廉价)进行评估[a,b]并且没有噪音(比如说浮点粒度除外)。找到这个函数的不连续性的最好方法是什么?我不知道可能有多少间断,也可能没有。

我可以想到一些简单的方法(统一采样,在样本之间存在较大差异的地方进行细化,......),但也许有更好的方法?

该函数是“合理的”,因为可以假设它最多具有有限多个不连续性,对于更高阶的导数也是如此,我不介意是否遗漏了小的病理性不连续性......(该应用程序是一维函数的自动绘图) .

--

感谢所有回复的人,尤其是佩德罗;Pachón、Platte 和 Trefethen 中描述的方法对我来说似乎是最好的方法,所以我现在去实现它

4个回答

如果您使用的是 Matlab,您可能对Chebfun 项目感兴趣。Chebfun 获取一个函数,对其进行采样并尝试将其表示为多项式插值。如果您的函数有不连续性,Chebfun 应该能够使用该splitting on命令检测到它们。您可以在此处找到一些示例

如果您对底层算法感兴趣,可以参考 Pachón、Platte 和 Trefethen 的论文“ Piecewise Smooth Chebfuns ”。

我怀疑 chebfun 算法一定看起来更实用,但有必要再提一种检测不连续性的方法,即离散小波变换。您可以通过查看此 Mathematica 文档页面了解它的工作原理,请参阅 > 应用程序 > 检测不连续性和边缘部分。

简单来说,可以取 DWT 的f在均匀采样点并查看高频系数。其中最大的很可能对应于不连续点。

加权基本非振荡 (WENO) 方法使用“平滑度指标”来检测有限体积和差分方法中的不连续性。从 Pedro 对 Chebfun 的描述来看,总体思路似乎是相同的:构造一组插值多项式并使用它们来计算某种平滑度。

参见 GS Jiang 和 CW Shu,加权 ENO 方案的有效实施,J.Comput.Phys.,第一卷。126,第 202--228 页,1996 年。

与@Pedro 一起,我将研究边缘检测算法。不连续性是导数的无穷大,因此请考虑查看越来越精细的网格并瞄准感兴趣的区域。

随着网格的细化,对连续函数的导数的有限差分近似应该减小。比较网格之间导数的有限差分结果可以揭示梯度的发散,这表明不连续性。

编辑:好的,所以虽然不连续性具有无限导数,但无限导数并不总是不连续性(感谢@n00b 指出一个例子)。举个例子f(x)=sign(x)|x|x=0,有限差分将随着步长减小hx0,正如我所描述的,即使解析导数不是连续的。