欢迎光临散文网 会员登陆 & 注册

【元胞自动机】基于元胞自动机3D森林火灾模型matlab源码

2021-08-30 00:18 作者:Matlab工程师  | 我要投稿

 一、简介

元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态。变化规则适用于每一个元胞并且同时进行。典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。
1 对元胞自动机的初步认识
元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元
胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状
态。变化规则适用于每一个元胞并且同时进行。
2 元胞的变化规则&元胞状态
典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。
3 元胞自动机的应用
元胞自动机已被应用于物理模拟,生物模拟等领域。
4 元胞自动机的matlab编程
结合以上,我们可以理解元胞自动机仿真需要理解三点。一是元胞,在matlab中可以理解为矩阵中的一点或多点组成的方形块,一般我们用矩阵中的一点代表一个元胞。二是变化规则,元胞的变化规则决定元胞下一刻的状态。三是元胞的状态,元胞的状态是自定义的,通常是对立的状态,比如生物的存活状态或死亡状态,红灯或绿灯,该点有障碍物或者没有障碍物等等。

二、源代码

clear all; n=300; H=cell2mat(struct2cell(load('Z-HIGH.mat'))); %读取数据 S=cell2mat(struct2cell(load('Z-SHI.mat'))); T=cell2mat(struct2cell(load('Z-TEM.mat'))); W=cell2mat(struct2cell(load('Z-WIN.mat'))); h=0.08441; s=-0.07848; t=0.08785; w=0.08332; load lll.dat x=lll(:,1);y=lll(:,2);z=lll(:,3); [X, Y, Z1]=griddata(x,y,z,linspace(min(x),max(x),n)',linspace(min(y),max(y)',n),'cubic'); A=max(max(Z1));B=min(min(Z1));%A=A(1,1);B=B(1,1); Z=(Z1-B)./(A-B); Z=Z.*1000; figure(1) cdata=cat(3,zeros(size(X)),ones(size(X)),zeros(size(X)));%绿色 surf(X,Y,Z,cdata); T1=h.*H+s.*S+t.*T+w.*W; T1=flipdim(T1,1);%二维到三维的变化中会形成矩阵列颠倒 T2=ones(n);%隔离带 R=0.85; for j=1:5    T2(50*j,:)=R;    T2(50*j+1,:)=R;    T2(50*j-1,:)=R; end for j=1:5    T2(:,50*j)=R;    T2(:,50*j+1)=R;    T2(:,50*j-1)=R; end [XX,YY]=find(T2==0.85) XX=X(1,XX); YY=Y(YY,1); T=mapminmax(T1,0.6,1).*T2;%影响因素归一化 pspread=0.63; pgrowth=0; ul=[n,1:n-1]; dr=[2:n,1];   hang=175; lie=175; veg=2*ones(n); veg(hang,lie)=1 for i=1:300 e(i,1)=length(find(veg==0)); if(e(i,1)>81000) break else h1=veg;   h2=h1;   h3=h2; h4=h3;   h1(n,1:n)=0;   h2(1:n,n)=0; h3(1:n,1)=0; h4(1,1:n)=0;   sum=(h1(ul,:)==1)+(h2(:,ul)==1)+(h3(:,dr)==1)+(h4(dr,:)==1); sum1=((sum==1).*(1-(1-pspread))); sum2=((sum==2).*(1-(1-pspread)^2)); sum3=((sum==3).*(1-(1-pspread)^3));   sum4=((sum==4).*(1-(1-pspread)^4)); s=sum1+sum2+sum3+sum4; veg=2*(veg==2)-((veg==2)&((sum>0)&(rand(n,n)<s.*T)))+2*((veg==0)&rand(n,n)<pgrowth);   [xx,yy]=find(veg==1); zz=diag(Z(xx(:,1),yy(:,1))); xx=X(1,xx); yy=Y(yy,1); % if((i>100)&(length(zz)<10)) %     break; % else hold on; plot3(yy,xx,zz,'r.'); % [xx,yy]=find(veg==1); % [xx1,yy1]=find(veg==0); % zz=Z(xx,yy); % % zz1=Z(xx1,yy1); % hold on; % plot3(xx,yy,zz,'r.'); % % hold on; % % plot3(xx1,yy1,zz1,'r.'); xlabel('横坐标'); ylabel('纵坐标'); zlabel('海拔'); % figure(2) % contour(X,Y,Z,10)%画10条等高线 % plot() drawnow title(i) end end % end xlabel('经度'); ylabel('纬度'); zlabel('海拔'); figure(2) surf(X,Y,T);%概率分布图 xlabel('经度'); ylabel('纬度'); title('蔓延率'); shading interp; figure(3)

三、运行结果

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


【元胞自动机】基于元胞自动机3D森林火灾模型matlab源码的评论 (共 条)

分享到微博请遵守国家法律