3

我有一个简单的问题。我正在尝试使用 Matlab R2012a 评估 0 阶 Bessel 函数的不正确积分:

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

这给了我 v = 3.7573e+09。然而,这在理论上应该是 v = 1。当我试图做

v = integral(@(l)besselj(0,l), 0, 1000)

结果为 v = 1.0047。您能否简要解释一下,集成出了什么问题?以及如何正确集成 Bessel 型函数?

4

2 回答 2

1

起初,我怀疑对 Bessel 函数进行积分会产生有限的结果。然而,Mathematica/Wofram Alpha 表明结果是有限的,但它不适合胆小的人

但是,然后我被指向这个站点,该站点解释了如何正确执行此操作,并且积分的值应为 1。

我做了一些实验来验证他们陈述的正确性:

    F = @(z) arrayfun(@(y) quadgk(@(x)besselj(0,x), 0, y), z);

    z = 10:100:1e4;

    plot(z, F(z))

这给了:

贝塞尔积分

很明显,积分确实似乎收敛到 1。 Wolfram Alpha 可耻!

(请注意,这是一种误导性的情节;尝试这样做,z = 10:1e4;您就会明白为什么。但是,好吧,无论如何,原理都是一样的)。

该图还准确地显示了您在 Matlab 中遇到的问题;积分的值就像 1 附近的阻尼振荡以增加x。问题是,阻尼非常弱——正如你所看到的,我z需要一路走10,000才能产生这个图,而振荡幅度只降低了 ~0.5。

当您尝试通过弄乱“MaxIntervalCount”设置来进行不正确的积分时,您会得到以下信息:

    >> quadgk(@(x)besselj(0,x), 0, inf, 'maxintervalcount', 1e4) 

    Warning: Reached the limit on the maximum number of intervals in use.
    Approximate bound on error is 1.2e+009. The integral may not exist, or
    it may be difficult to approximate numerically.
    Increase MaxIntervalCount to 10396 to enable QUADGK to continue for 
    another iteration. 
    > In quadgk>vadapt at 317
      In quadgk at 216

不管你设置多高MaxIntervalCount; 你会一直遇到这个错误。quad使用,或类似的东西时也会发生类似的事情quadl(这些是 R2012integral功能的基础)。

正如这个警告和绘图显示的那样,积分不适合通过标准 MATLAB 中实现的任何求积方法来精确近似(至少,据我所知)。

我相信正确的解析推导,就像在物理论坛上所做的那样,确实是获得结果的唯一方法,而不必求助于专门的求积方法。

于 2013-04-05T14:04:08.753 回答
1

从文档中对振荡函数进行不正确的积分:

q = integral(fun,0,Inf,'RelTol',1e-8,'AbsTol',1e-13)

在文档中的例子是

fun = @(x)x.^5.*exp(-x).*sin(x);

但我想在你的情况下尝试:

q = integral(@(x)(besselj(0, x),0,Inf,'RelTol',1e-8,'AbsTol',1e-13)
于 2013-04-05T14:04:27.753 回答