【问题标题】:integral2 returns 0 when it shouldn't积分 2 在不应该时返回 0
【发布时间】:2019-11-19 19:43:54
【问题描述】:

我遇到以下问题。我正在尝试在整个支持中集成二元正态的 pdf 函数。但是,Matlab 为 d 返回 0,情况并非如此。我的方法有什么问题?

代码如下:

mu1=100;
mu2=500;
sigma1=1;
sigma2=2;
rho=0.5;
var1=sigma1^2;
var2=sigma2^2;

pdf = @(x,y) (1/(2*pi*sigma1*sigma2*sqrt(1-rho^2))).*exp((-1/(2*(1-rho^2)))*(((x-mu1).^2/var1)+((y-mu2).^2/var2)-((2*rho*(x-mu1).*(y-mu2))/(sigma1*sigma2))));

d = integral2(pdf,-Inf,Inf,-Inf,Inf)

【问题讨论】:

  • 请附上积分原图(图片或公式)
  • 如果公式正确,我可以想象您的宽度为 1 的高斯凹凸不会被积分器拾取。你告诉它从无穷大集成到无穷大,你有一个隐藏在[100, 500] 的凹凸。指数在远离峰值的地方很快就被切断了,所以如果在这里遇到问题我不会太惊讶。我不知道integral2 是如何工作的,这只是一般的思考。
  • pdf(42,23)(或任何其他数字)始终为 0。您的公式有问题。

标签: matlab integral


【解决方案1】:

正如@Andras Deak 评论的那样,“指数在远离峰值的地方很快就被切断了”。 事实上,您可以将其可视化:

mu1=100;
mu2=500;
sigma1=1;
sigma2=2;
rho=0.5;
var1=sigma1^2;
var2=sigma2^2;

pdf = @(x,y) (1/(2*pi*sigma1*sigma2*sqrt(1-rho^2))).*exp((-1/(2*(1-rho^2)))*(((x-mu1).^2/var1)+((y-mu2).^2/var2)-((2*rho*(x-mu1).*(y-mu2))/(sigma1*sigma2))));
figure
fsurf(pdf,[90 110 490 510])
figure
fsurf(pdf,[0 200 400 600])

在第一个图中,限制接近您提供的方法。您可以看到二元法线的形状:

如果你扩大限制,你会看到它看起来像一个不连续:

内置积分函数会尝试计算积分,但如果您的极限是 -infinf,那么您的函数几乎处处为零,不连续性接近均值。

To treat singularities,您应该按照 MATLAB 的建议破坏您的域。由于该函数几乎处处为零,因此您只能围绕均值进行积分:

d = integral2(pdf,90,110,490,510)

> d =
> 
>     1.0000

您也可以将其编写为变量的函数。 empirical rule 声明 99.7% 的数据与均值相差在 3 个标准差以内,因此:

d = integral2(pdf,mu1-3*sigma1,mu1+3*sigma1,mu2-3*sigma2,mu2+3*sigma2)

> d =
> 
>     0.9948

这会给你一个很好的结果。 我们可以详细说明。在经验法则的维基百科页面中,表达式

erf(x/sqrt(2))

将给出“mu+-x*sigma 范围内的预期人口比例”。对于 MATLAB 中作为标准显示的短精度,如果您选择 x=5,您将得到:

x = 5;
erf(x/sqrt(2))

> ans =
> 
>     1.0000

几乎所有数据都包含在 5 个标准差内。因此,您可以在双重积分中忽略此范围之外的域,以避免(几乎)奇点。

d = integral2(pdf,mu1-x*sigma1,mu1+x*sigma1,mu2-x*sigma2,mu2+x*sigma2)

> d =
> 
>     1.0000

【讨论】:

  • 非常感谢,帮了大忙!
猜你喜欢
  • 2016-09-24
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
相关资源
最近更新 更多