integral2 returns 0 当它不应该

integral2 returns 0 when it shouldn't

我遇到了以下问题。我正在尝试在整个支持范围内集成双变量正态分布的 pdf 函数。但是,Matlab returns 0 for d,不应该这样。我的方法有什么问题?

代码如下:

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)

正如@Andras Deak 评论的那样,"exponentials cut off very fast away from the peak"。 其实你可以想象一下:

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))

会给"Expected fraction of population inside range 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