包括贝塞尔函数的积分

计算科学 matlab 积分方程
2021-12-26 08:51:03

我正在尝试使用 Matlab 评估第一类 0 阶 Bessel 函数的不正确积分:

v = integral(@(x)besselj(0, x), 0, Inf)

返回v = 3.7573e+091但是,理论上应该是这样。我应该怎么做才能进入1Matlab?

1个回答

问题是您正在对无限区间内的振荡函数进行积分。MATLAB 网站没有详细说明其integral功能背后的算法(它只是说“全局自适应”)。quad功能曾经是自适应辛普森,所以我可以假设它integral是相同的。可能发生的是代码转换了间隔[0,][0,1]要么[1,1]左右,因此它挤压了这个区间的所有振荡。结果,它增加了很多积极的贡献并减去了很多消极的贡献。因此,一个完全错误的答案。

对于像这样的振荡积分,存在一些技巧。首先,如果函数快速衰减,您可以截断区间(因此经典例程不会转换区间)。如果您对零交叉有想法,您可以遍历所有这些并在零之间积分,注意先将正部分和负部分相加,然后最后减去。

第二种方法可能是适用于振荡积分的双指数正交公式。请参考 Ooura 和 Mori,“半无限区间振荡函数的双指数公式”,J. Comp。应用程序。数学。, 38, p353-360, 1991。Ooura 在他的网站上有 FORTRAN 和 C 实现。

最后,既然你已经知道你的积分的正确答案,为什么还要用数字呢?只是为了了解为什么integral会失败或是否有更大的图景?