我最近一直在尝试计算函数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,但没有成功。我做错了什么?
罗布
答案 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
看起来更好。所以看起来'平铺'方法是你的功能的问题,因为它的特性和限制范围的大小。所以只要你使用'迭代'就可以了。