我有一个简单的问题。我正在尝试使用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。你能简单解释一下,整合出了什么问题?以及如何正确整合贝塞尔类型的函数?
答案 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))
给出了:
如此清楚,积分确实似乎收敛于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
的高度并不重要;你会继续遇到这个错误。使用quad
,quadl
或类似内容(这些是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)