使用MATLAB集成0阶贝塞尔函数

时间:2013-04-05 13:43:59

标签: matlab integral bessel-functions

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

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。你能简单解释一下,整合出了什么问题?以及如何正确整合贝塞尔类型的函数?

2 个答案:

答案 0 :(得分:1)

起初,我怀疑在贝塞尔函数上取一个积分会产生有限的结果。然而,Mathematica / Wofram Alpha表明结果是有限的,但它是not for the faint of heart

然而,我被指向this site,其中解释了如何正确地执行此操作,并且积分的值应为1.

我进行了一些实验以验证其陈述的正确性:

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

    z = 10:100:1e4;

    plot(z, F(z))

给出了:

bessel integral

如此清楚,积分确实似乎收敛于1.对Wolfram Alpha的羞耻!

(请注意,这是一种误导性的情节;尝试用z = 10:1e4;来做,你会明白为什么。但是,哦,好吧,原则是相同的)。

这个图也准确地显示了你在Matlab中遇到的问题;对于增加x,积分的值就像1左右的阻尼振荡一样。问题是,阻尼非常弱 - 正如你所看到的,我的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的高度并不重要;你会继续遇到这个错误。使用quadquadl或类似内容(这些是R2012 integral函数的基础)时也会发生类似情况。

正如此警告和图表所示,积分不适合通过标准MATLAB中实现的任何正交方法精确近似(至少,我知道)。

我相信正确的分析推导,如在物理论坛上所做的那样,实际上是获得结果的唯一方法,而不必采用专门的求积法。

答案 1 :(得分:1)

From the docs对振荡函数进行不正确的积分:

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)