具有严重抑制指数的 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 双积分的主要内容,如果未能解决你的问题,请参考以下文章

matlab的simulink实验比例

Matlab(Simulink-PID控制)

拟合连续(正支持)分布的 Proc 单变量和 Proc 严重性之间的差异

如何使用 saveas() 将 MATLAB 图形保存为 JPEG 而图像不严重?

重污染天气等级划分

摩尼教刺杀宋徽宗差点成功:《清明上河图密码3》,探案推理与历史细节双绝。五星推荐。以下严重剧透。