我正在寻找一个使用高斯求积或辛普森求积在数值积分中产生重大错误的函数。
2 回答
由于 Simpson 和 Gaussian 的方法试图用一些简单的平滑函数(例如二阶多项式)拟合所谓的平滑函数,否则会使用低阶多项式和其他简单的代数函数,例如 $$a+5/6 $$,这是有道理的,最大的挑战将是不是二阶多项式或类似于那些简单函数的函数。
阶跃函数,或更一般的短期运行恒定的函数,然后跳转到另一个值。楼梯或沃尔什函数(用于一种二进制傅里叶变换)应该很有趣。只是一个简单的单步并不能很好地拟合任何多项式逼近。
尝试一个高阶多项式。大 n 的 x^n 应该很有趣。对于一些大的 n,也许减去 x^n - x^(n-1)。“大”有多大?对于辛普森来说,可能是 4 个或更多。对于使用 k 点的高斯,n>k。(不要疯狂尝试超出适度的两位数的 n;除了任何积分之外,这只会变成令人讨厌的计算。)
很少有像极点这样的数值积分方法,即对于 a 周围的某个邻域,函数类似于 1/(xa)。由于处理实际无穷大可能很麻烦,请尝试将其推离实线或复共轭对。使用 1/( (xa)^2 + b) 制作一个大但有限的尖峰,其中 b>0 很小。或者那个表达式的平方根,或者它的正弦或指数。您可以将“2”替换为更大的功率,我敢打赌那会很讨厌。
曾几何时,我想测试一个数值积分程序。我从一个阶梯函数或矩形脉冲序列开始,在一组点上采样。
我使用 Savitzky-Golay 滤波器计算了近似导数。SG 可以使用相邻点的有限窗口来区分数值数据,尽管它通常用于平滑。它需要一个窗口大小(点数)、多项式阶数(实际上是 2 或 4,但您可能想要更高一些)和微分阶数(通常 0 表示平滑,1 表示导数)。
结果是一系列脉冲,然后我将其整合。一个好的例程将重新创建原始的阶梯或矩形脉冲。我想如果 SG 参数选择正确,你会让辛普森和高斯在他们的坟墓里翻身。
如果您正在寻找一种难以集成的功能作为测试方法,您可以考虑 CS Stack Exchange 问题中的一个:
在这个问题中,其中一个答案建议使用 Matlab 的chebfun库,其中包含基本Levin 类型方法的实现。这向我表明,如果使用更简单的方法(例如辛普森规则),该功能将失败。