Matlab实现Galton板的动画演示

galton板又称为高尔顿钉板,室友生物统计学家Galton设计的。

该板即从入口处放进一个直径略小于两颗钉子之间的距离的小圆玻璃球,当小圆球向下降落过程中,碰到钉子后皆以1/2的概率向左或向右滚下,于是又碰到下一层钉子。如此继续下去,直到滚到底板的一个格子内为止。把许许多多同样大小的小球不断从入口处放下,只要球的数目相当大,它们在底板将堆成近似于正态 的密度函数图形(即:中间高,两头低,呈左右对称的古钟型),其中n为钉子的层数。

下面的程序以N=4为例,动画模拟进行100次实验。

K=100;
n=zeros(1,5);
delay=0.05;
clf;
axis([-4 4 -7 0]);
aa=sqrt(3)/2;
bb=1/2;
dd=3/2;
a=0.9*aa;
b=0.9*bb;
xx=[0,-aa,aa,-2*aa,0,2*aa,-3*aa,-aa,aa,3*aa];
yy=[0,-dd,-dd,-2*dd,-2*dd,-2*dd,-3*dd,-3*dd,-3*dd,-3*dd];
for k=1:K
   clf
   r=round(rand(1,4));
   x0=0;y0=0;
   text(1.5,-0.5,'Galton');hold on;
   text(2.5,-1,'cpw');hold on;
   for i=1:10
      x=xx(i);
      y=yy(i)-0.1;
      X=[x,x-a,x-a,x,x+a,x+a];
      Y=[y,y-b,y-b-0.9,y-1.8,y-b-0.9,y-b];
      fill(X,Y,'g');hold on;
   end
   n(sum(r)+1)=n(sum(r)+1)+1;
   plot(x0,y0,'ro');
   for j=1:4
      if r(j)==0
         x0=x0-aa;y0=y0-bb;
         plot(x0,y0,'ro');hold on;pause(delay);
         y0=y0-1;
         plot(x0,y0,'ro');hold on;pause(delay);
      else
         x0=x0+aa;y0=y0-bb;
         plot(x0,y0,'ro');hold on;pause(delay);
         y0=y0-1;
         plot(x0,y0,'ro');hold on;pause(delay);
      end
   end
   for m=1:5
      text((m-3)*sqrt(3),-6.5,num2str(n(m)));
   end
   pause(20*delay);
end
方法比较笨,如果想要进行N更大的实验的话,需要重新计算每个顶板的位置,重新设置xx和yy。

你可能感兴趣的:(动画,matlab)