实验-伽尔顿板实验的模拟与验证
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 =