具有严重抑制指数的 Matlab 双积分
Posted
技术标签:
【中文标题】具有严重抑制指数的 Matlab 双积分【英文标题】:Matlab double integral with heavily suppressed exponentials 【发布时间】:2016-08-11 11:12:59 【问题描述】:我最近一直在尝试计算函数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,但没有成功。我做错了什么?
罗伯
【问题讨论】:
能否提供您的代码。 我不确定这是否是一个编程问题。它看起来更像是一个数字/数学问题。 @obchardon 我声明了上面写的函数,然后输入 'integral2(-1000,1000,a,b)' 和 a,b 适当的极值。 @MSalters 我在这里发布它是因为我看到了一个类似的问题,但这对我没有帮助。你会建议在其他地方问吗? 我不是数值数学专家,所以恐怕我不知道哪个 Stack Exchange 站点更合适。这是一个相当具体的专业领域,我不知道真正的专家聚集在哪里。 Stack Exchange 的风险在于,有太多的非专家不知道他们缺少关键知识。这样的“答案”可能会适得其反。一个好的答案应该不仅仅是一个建议,它应该解释出了什么问题以及如何回避。 【参考方案1】:看起来您的问题与 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
'Method' - 积分方法 '自动' (默认) | '平铺' | '迭代'
积分方法,指定为逗号分隔的对组,由“方法”和下述方法之一组成。
集成方法说明
'auto' 在大多数情况下,integral2 使用 'tiled' 方法。当任何积分限制为无限时,它使用“迭代”方法。这是默认方法。
'tiled'integral2 将积分区域转换为矩形,并根据需要将其细分为更小的矩形区域。积分限制必须是有限的。
'iterated'integral2 调用integral 来执行迭代积分。外部积分在 xmin ≤ x ≤ xmax 上进行评估。内部积分在 ymin(x) ≤ y ≤ ymax(x) 上计算。积分限制可以是无限的。
好的,所以如果我们不定义方法,如果限制是有限的,它将使用“平铺”,如果限制是无限的,则使用“插值”。
会不会是如果范围太大,“平铺”方法创建的瓦片太大而无法准确计算积分?如果是这样,那么“迭代”应该没有这个问题,让我们检查一下
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
这样看起来更好。所以看起来'平铺'方法是你的函数的问题,因为它的特性和限制范围的大小。因此,只要您使用“迭代”就可以了。
【讨论】:
现在可以了,谢谢!如果我尝试从 10 ^ 9 到无穷大计算它,它仍然给我 0,尽管从 0 到 inf 和从 0 到 10 ^ 9 的积分之间存在微小差异,但由于它们非常接近,它可能只是一个问题准确性。 是的,考虑到毕竟Matlab是在做数值积分,在这种情况下不是符号的,所以精度会有限制,特别是与你使用的范围一样大的范围以上是关于具有严重抑制指数的 Matlab 双积分的主要内容,如果未能解决你的问题,请参考以下文章
拟合连续(正支持)分布的 Proc 单变量和 Proc 严重性之间的差异