MATLAB模拟伽尔顿板实验

MATLAB模拟伽尔顿板实验代码展示:

clear;

b=1;

k=1;

dxdy=0.81;

r=0.1;ttt=0:pi/300:2*pi;xxx=r*exp(i*ttt);

for n=1:80

    for m=10:20

if xor(mod(m,2),mod(n,2))

            xy0(1,k)=dxdy*n;

            xy0(2,k)=dxdy*m;

            ax=xy0(1,k);

            ay=xy0(2,k);

            plot(xxx+-1+i*(-2),'r.'), plot(ax,ay,'r.','markersize',15) ,hold on

            k=k+1;

        end

    end

end

k0=k-1;

axis ([-3 n*dxdy+3 -2 m*dxdy+5])

ll=40/80*dxdy;

L=3000;

r1=n/2*dxdy*ones(1,L)+[1.5*dxdy*rand(1,L/2) -1.5*dxdy*rand(1,L/2)];

r2=(m*dxdy+1)+1.5*dxdy*rand(1,L);

xyxy=[r1;r2];

xy=[r1;r2];

vy=-1*rand(1,L);

vx=[2*rand(1,L/2) -2*rand(1,L/2)];

v=[vx;vy];

ball=plot(r1(1,:),r2(1,:),'.','markersize',15,'color','b')

hold off

pause

xy=xyxy;

m=1;

for k=1:3000

   dt=0.015;

    g=59.8;

vxm(k)=mean(v(1,:));vym(k)=mean(v(2,:));

vxstd(k)=std(v(1,:));vystd(k)=std(v(2,:));

    for numball=1:L

           if xy(2,numball)<=5

                 xy(2,numball)=5;

                 v(2,numball)=0;

                 v(1,numball)=0;

           end

if xy(1,numball)<dxdy | xy(1,numball)>=n*dxdy

   xy(1,numball)=(xy(1,numball)<dxdy)*(2*dxdy-xy(1,numball))+(xy(1,numball))>n*dxdy)*(2*n*dxdy-xy(1,

numball));

                 v(1,numball)=-v(1,numball);

             end

           dtt=dt/3*2;

           dttt=dt/3;

          dtttt=dt/2;

            xy(1,numball)=xy(1,numball)+dt*v(1,numball);

            xy(2,numball)=xy(2,numball)+dt*v(2,numball)-0.5*g*dt^2;

            v(2,numball)=v(2,numball)-g*dt;

            if xy(2,numball)>10*dxdy  

            al=xy(1,numball)-dtt*v(1,numball);

            all=xy(1,numball)-dttt*v(1,numball);

            alll=xy(1,numball)-dtttt*v(1,numball);

            bl=xy(2,numball)-dtt*v(2,numball)-0.5*g*dtt^2;

            bll=xy(2,numball)-dttt*v(2,numball)-0.5*g*dttt^2;

            blll=xy(2,numball)-dtttt*v(2,numball)-0.5*g*dtttt^2;

            cl=[al;bl];

            cll=[all;bll];

            clll=[alll;blll];

             for numxy=1:k0

              dxy=norm(xy(:,numball)-xy0(:,numxy));

              dxyl=norm(cl-xy0(:,numxy));

              dxyll=norm(cll-xy0(:,numxy));

              dxylll=norm(clll-xy0(:,numxy));

              if dxy<=0.38 | dxyl<=0.38 | dxyll<=0.38 | dxylll<=0.38

                 xy(:,numball)=xyxy(:,numball);

                 v(2,numball)=v(2,numball)+g*dt;    

                 a=xy(1,numball);b=v(1,numball);

                 c=xy(2,numball);d=v(2,numball);

                 e=xy0(1,numxy);f=xy0(2,numxy);

                 t = fsolve(@myfun2,0.000,optimset('Display','off'),a,b,c,d,e,f,g);

                 t0=min(t);

                 xy(1,numball)=xy(1,numball)+t0*v(1,numball);

                 xy(2,numball)=xy(2,numball)+t0*v(2,numball)-0.5*g*t0^2;

                  %set(ball,'xdata',xy(1,:),'ydata',xy(2,:));

                 v(2,numball)=v(2,numball)+g*t0;

                 y1=xy(2,numball);y2=xy0(2,numxy);

                 x1=xy(1,numball);x2=xy0(1,numxy);

                 vx=v(1,numball);

                 vy=v(2,numball);

                 axy=atan((y2-y1)/(x2-x1+eps));

                 v(1,numball)=(-vx*cos(2*axy)-vy*sin(2*axy));

                 v(2,numball)=(vy*cos(2*axy)-vx*sin(2*axy));

                 t0=dt-t0;

                 xy(1,numball)=xy(1,numball)+t0*v(1,numball);

                 xy(2,numball)=xy(2,numball)+t0*v(2,numball)-0.5*g*t0^2;

                 v(2,numball)=v(2,numball)-g*t0;

              end

           end 

    end

end

    xyxy=xy;

set(ball,'xdata',xy(1,:),'ydata',xy(2,:));

drawnow;

end

figure(1)

histfit(xy(1,:),31)

figure(2); 

   m=1:k;

   kk=m*dt;

plot(kk,vxm,'r:',kk,vym,'b-')

  figure(3); 

plot(kk,vxstd,'r:',kk,vystd,'b-')

figure(4)

vx1=diff(vxm);vy1=diff(vym);

n=1:(k-1);

kkt=n*dt;

plot(kkt,vx1,'r:',kkt,vy1,'b-')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值