我有一个简单的问题。我正在尝试使用 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 型函数?
我有一个简单的问题。我正在尝试使用 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 型函数?
起初,我怀疑对 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 中实现的任何求积方法来精确近似(至少,据我所知)。
我相信正确的解析推导,就像在物理论坛上所做的那样,确实是获得结果的唯一方法,而不必求助于专门的求积方法。
从文档中对振荡函数进行不正确的积分:
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)