Matlab与重度抑制指数的双积分

时间:2016-08-11 11:13:00

标签: matlab precision integral

我最近一直在尝试计算函数fun = @(v,x)(10^4)*0.648*(1+v*0.001).*( exp(-2.83./( 10^-8+(sqrt(1+2*v*0.001)).*(x.^2)) ) -1).*(exp(-(v.^2)*0.33))的双积分,在v的范围(-1000,1000)和x的(0,a)范围内,其中a是一个非常大的数字或无穷大。我发现的是,在a = inf的情况下,该值似乎相当准确(它减少到单个积分,这在数值上评估不那么麻烦),但是如果我从0到10 ^ 9和从10整合^ 9到无穷大,积分不总和到正确的值,后者为零。我真正感兴趣的是从0到10 ^ 9的积分,但这些结果让我想知道我是否可以信任它。 在我所做的事情中,我还必须在函数前使用一个大的前因子(10 ^ 200)来“补偿”小数;否则结果都是胡说八道。我试过使用vpa,但没有成功。我做错了什么?

罗布

1 个答案:

答案 0 :(得分:0)

看起来您的问题与Matlab针对不同情况使用的不同方法以及您正在处理的大数字有关。

我们可以通过ezsurf查看您的功能,了解它的行为方式。

所以提示1是该值将是一个负值,让我们在很小的范围内进行积分,以查看它的估计值。

integral2(fun,-100,100,0,100)

%ans =
%  -5.9050e+04

假设函数趋于零,我们知道最终值应该在邻域上。

现在提示2:

integral2(fun,-1000,1000,0,100)

%ans =
%  -2.5613e-29

这没有多大意义,通过增加限制的范围,积分基本上变为零。检查documentation of integral2

  

'方法' - 整合方法   'auto'(默认)| '平铺'| '重复'

     

积分方法,指定为由“方法”和下述方法之一组成的逗号分隔对。

     

整合方法说明

     

'auto'对于大多数情况,integral2使用'tiles'方法。当任何积分限制是无限的时,它使用'迭代'方法。这是默认方法。

     

'平铺'integral2将积分区域转换为矩形,并根据需要将其细分为较小的矩形区域。集成限制必须是有限的。

     

'iterated'integral2调用整数来执行迭代积分。在xmin≤x≤xmax上评估外积分。在ymin(x)≤y≤ymax(x)上评估内积分。集成限制可以是无限的。

好的,所以如果我们没有定义一个方法,如果限制是有限的,它将使用“平铺”,如果它们是infinte,则使用“内插”。

如果范围太大,可能是因为“平铺”方法创建的切片太大而无法准确计算积分?如果是这种情况,那么“迭代”不应该有这个问题,让我们检查

integral2(fun,-1000,1000,0,100,'Method','iterated')

%ans =
%  -5.9050e+04

有趣的是,看起来我们正在做些什么。让我们试试原来的问题

integral2(fun,-1000,1000,0,inf)

%ans =
%  -5.9616e+04

integral2(fun,-1000,1000,0,10^9,'Method','tiled')

%ans =
%  -2.1502e-33

integral2(fun,-1000,1000,0,10^9,'Method','iterated')

%ans =
%  -5.9616e+04

integral2(fun,-1000,1000,10^9,inf)

%ans =
%     0

看起来更好。所以看起来'平铺'方法是你的功能的问题,因为它的特性和限制范围的大小。所以只要你使用'迭代'就可以了。