高斯的matlab编程差异

A matlab programming difference for Gaussian

在我的作业中,我被要求描述一个方法可以产生一个高斯分布。 matlab程序如下:

n=100;
b=25;
len=200000;

X=rand(n,len);    
x=sum(X-0.5)*b/n;

[ps2,t2]=hist(x,50);
ps2=ps2/len;

bar(t2,ps2,'y');
hold on;

sigma_2=b^2/(12*n);
R=normrnd(0,sqrt(sigma_2),1,len);

[ps2,t2]=hist(R,50);
ps2=ps2/len;
plot(t2,ps2,'bo-','linewidth',1.5);

x 是 n 个均匀分布的变量乘以 b/n 的总和。 x 是零均值且 sigma^2=b^2/12n 的高斯分布。 然后我得到了两个分布匹配的图像。 但是,当我将 t2 代入正态分布密度函数 f(x)=exp(-x.^2/(2*sigma_2))/sqrt(2*pi*sigma_2) 时,输出比第一个大很多,尽管形状相似。

我想知道为什么会这样?

这是因为你没有规范化离散直方图。我们知道在连续分布中,概率函数的积分是一。为了解决这个问题,您应该将直方图划分为其积分。离散函数的近似积分是矩形积分:

integral (f) = sum(f)* LengthStep 

所以你应该这样修改你的代码:

n=100;
b=25;
len=200000;

X=rand(n,len);    
x=sum(X-0.5)*b/n;

[ps2,t2]=hist(x,50);
ps2=ps2/(sum(ps2)*(t2(2)-t2(1))); % normalize discrete distribution

bar(t2,ps2,'y');
hold on;

sigma_2=b^2/(12*n);
R=normrnd(0,sqrt(sigma_2),1,len);

[ps2,t2]=hist(R,50);
ps2=ps2/(sum(ps2)*(t2(2)-t2(1)));  % normalize discrete distribution
plot(t2,ps2,'bo-','linewidth',1.5);
hold on
plot(t2,exp(-t2.^2/(2*sigma_2))/sqrt(2*pi*sigma_2),'r'); %plot continuous distribution

这是结果: