110 likes | 243 Views
基于matlab的模拟生长. 卢梦. 主要内容. 模拟树生长 模拟石墨烯生长. 树生长. 大体思路:在一个区域上设置一些凝结核,然后随机产生自由粒子,粒子做随机运动,当粒子运动到凝结核附近时就凝结下来。. function l a=zeros(53,303);a(2,5:80:300)=1; %设置一个零矩阵,并在底部设置凝结核 for i=1:1:50000 %总共产生50000个粒子 t=randperm(301);f=t(1)+1;e=51; %在顶部随机产生粒子
E N D
主要内容 • 模拟树生长 • 模拟石墨烯生长
树生长 • 大体思路:在一个区域上设置一些凝结核,然后随机产生自由粒子,粒子做随机运动,当粒子运动到凝结核附近时就凝结下来。
function l • a=zeros(53,303);a(2,5:80:300)=1; %设置一个零矩阵,并在底部设置凝结核 • for i=1:1:50000 %总共产生50000个粒子 • t=randperm(301);f=t(1)+1;e=51; %在顶部随机产生粒子 • while e<52&&e>2&&f<302&&f>2 %限定粒子的运动范围 • s=randperm(4);r=rem(s(1),4); %定义随机运动 • switch(r) • case 0 • f=f-1; • case 1 • f=f+1; • case 2 • e=e-1; • otherwise • e=e+1; • end • if a(e,f+1)+a(e,f-1)+a(e-1,f)+a(e+1,f)>0 %凝结判断 • a(e,f)=1; %赋值到矩阵 • break • else • continue • end • end • end • [x,y]=find(a); %找出矩阵中不为零的元素 • scatter(y,x,'.');
模拟石墨烯生长 • 大体思路:与树生长类似,也是随机产生粒子做自由运动,运动到凝结核周围时进行凝结。不同的是,石墨烯的凝结方式与树生长不同。从平面近似来看,石墨烯碳原子间的化学键之间是120度角,每个原子最多只能与其他三个原子结合。
原理图 从图中可以发现,凝结只发生在某些线上。绿线所指的两条线上无凝结发生。因此,将坐标轴所有的纵线进行定义,再加上凝结判据即可凝结
function smx L=151; axis([0 L 0 L]); %建立坐标系 x0=floor(L/2)+1; y0=x0; X=sparse(L,L); %建立相对应的矩阵 X(x0,y0)=1; %设定凝结核 R=floor(L/2)-5; for i=1:1:15000 r=rand*2*pi; kx=floor(x0+R*cos(r)); ky=floor(y0+R*sin(r)); %产生随机点 if X(kx,ky)==1 break end while (kx-76)*(kx-76)+(ky-76)*(ky-76)<5184 s=randperm(4);t=rem(s(1),4); switch(t) case 0 kx=kx-1; if X(kx,ky)==1 kx=kx+1;continue end case 1 kx=kx+1; if X(kx,ky)==1 kx=kx-1;continue end case 2 ky=ky-1; if X(kx,ky)==1 ky=ky+1;continue end otherwise ky=ky+1; if X(kx,ky)==1 ky=ky-1;continue end end %随机运动 if rem((kx-76)/3+1,2)==0&&(X(kx+1,ky+2)+X(kx+1,ky-2)+X(kx-2,ky))>0 X(kx,ky)=1; break elseif rem((kx-77),6)==0&&(X(kx-1,ky+2)+X(kx-1,ky-2)+X(kx+2,ky))>0 X(kx,ky)=1; break elseif rem((kx-76),6)==0&&(X(kx+1,ky+2)+X(kx+1,ky-2)+X(kx-2,ky))>0 X(kx,ky)=1; break elseif rem((kx-77)/3+1,2)==0&&(X(kx-1,ky+2)+X(kx-1,ky-2)+X(kx+2,ky))>0 X(kx,ky)=1; break %凝结判据 else continue end end end [m,n]=find(X); %找出凝结点 scatter(m,n*sqrt(3)/2,'b.'); %画图,进行坐标收缩 axis equal;
结束 谢 谢 !