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])
在第一个图中,限制接近您提供的均值。您可以看到二元法线的形状:
如果你扩展限制,你会看到不连续的样子:
内置积分函数尝试计算积分,但如果您的限制是 -inf
和 inf
,您的函数几乎处处为零,并且不连续性接近均值。
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
我遇到了以下问题。我正在尝试在整个支持范围内集成双变量正态分布的 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])
在第一个图中,限制接近您提供的均值。您可以看到二元法线的形状:
如果你扩展限制,你会看到不连续的样子:
内置积分函数尝试计算积分,但如果您的限制是 -inf
和 inf
,您的函数几乎处处为零,并且不连续性接近均值。
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