实验-伽尔顿板实验的模拟与验证

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

伽尔顿板实验的模拟与验证

光电0807班孔繁琦u200815321

一、实验背景

在一块竖直放置的板的上部,规则的钉有许多铁钉,下部用隔板划分为许多等宽度的狭槽,从装置顶上的漏斗中可将小球向下投放。若每次只投入一个小球,则发现小球每次落入哪个狭槽完全是偶然的。但连续重复许多次实验后发现:小球落入中间槽的次数多,落入两边槽的次数少。若把大量小球一次倒入,则可以看到,小球在各槽内的分布是不均匀的,以中间槽为最多,向两边逐渐减少,当一次倒入的小球总数足够多时,并且实验次数也足够多时,每次得到的分布曲线几乎相同。

(以上内容出自《大学物理(上)》(华中科技大学版)P169)

从有关书籍及概率论课上,我们得知这种分布曲线趋向于正态分布概率密度曲线。所以我们就想通过数学实验来验证这个结论。

二、实验方法及原理

因为对MA TLAB软件不熟悉,我们决定通过C语言编程来实现该过程,具体思路如下:1、小球每碰到一个铁钉,有两种结果,即向左落下和向右落下,可以用取随机数来模拟这

个随机事件。我们的想法是每次从0与1中随机取数,0表示小球向左,1表示小球向右。

2、经过一层层的选择,小球会掉入最底层的槽中。可对槽进行编号,从最左到最右,分别

为0,1,2,3…。

3、如果小球经过n层,即n次选择落入0号槽中,则该小球每次都是往左,有

0+0+0+0+…+0=0;如果落入1号槽,则小球有一次往右,有1+0+0+…0=1,由此类推。

可以将每次小球的选择加起来,得到的就是它将落入的槽的编号。

4、这样,假设有m层,即每次实验取m次随机数,将结果加起来得到一个值,根据这个

值,我们让对应的槽中小球数量加1。经过大量实验,就可以得到每个槽中小球的分布,算出小球落到每个槽中的概率。

5、得到这个离散型的概率分布,我们可以利用MATLAB进行正态分布拟合优度测试,来

验证我们的假设(即小球的分布是正态分布)。另外通过一定的数学方法可以求出对应的概率密度曲线。

三、实验过程

1、编写C语言程序进行模拟实验

说明:①我们取槽的数量(M)为20,小球数(N)分别为5000、10000、30000做三次模

拟。

②最终得到的是每个槽中落入的小球数、球落入每个槽中的概率和概率取自然对数的

值。

程序如下:

#include

#include

#include

#define N 30000 \\小球数

#define M 20 \\槽的数目

void sort(int *p,int n,int m); \\产生随机数,并得出每个槽中的小球数

void gl_f(int *p,int n,float *gl,float *gl_log,int m);\\求概率和概率的对数

void output(int *p,float *gl,float *gl_log,int m);\\输出函数

void main()

{

float gl[M],gl_log[M];\\gl[M]存放概率,gl_log[M]存放概率的对数

int a[M]; \\存放槽中的小球数

sort(a,N,M);

gl_f(a,N,gl,gl_log,M);

output(a,gl,gl_log,M);

}

void sort(int *p,int n,int m)

{

int i;

int j,k;

k=0;

for(j=0;j

p[j]=0;

randomize();

for(i=0;i

{

for(j=0;j

k+=random(2);\\产生两个随机数0或1,存入k中

p[k]++;\\对应槽中小球数加一

k=0;

}

}

void gl_f(int *p,int n,float *gl,float *gl_log,int m)

{

float gl_n;

int i;

gl_n=n;

for(i=0;i

{

gl[i]=0;

gl[i]=p[i]/gl_n;

if(gl[i]>1e-6)

gl_log[i]=log(gl[i]);

else

gl_log[i]=0;\\若gl[i]=0就让gl_log[i]=0

}

}

void output(int *p,float *gl,float *gl_log,int m)

{

int i;

printf("box\t\tballs\t\tgailv\t\t log\n");

for(i=0;i

{

printf("%d\t\t%d\t\t%f\t\t%f\n",i,p[i],gl[i],gl_log[i]);

}

}

2、结果记录如下:

0.02

0.040.060.080.10.120.140.160.180.201234567891011121314151617181920

3、数据处理

① 用MATLAB进行正态分布拟合优度测试

我们选用jbtest 函数进行拟合优度测试

N=5000

>> X=[]; >> X=[0 0 0.0006 0.0012 0.0066 0.0194 0.0528 0.0974 0.149 0.1792 0.1726 0.144 0.0984 0.0492 0.0202 0.0078 0.0012 0.0002 0.0002 0];[H,P,JBSTAT,CV] = jbtest(X) H =

0 P =

相关文档
最新文档