【元胞自动机】元胞自动机之3D森林火灾模型【Matlab 596期】

一、简介

元胞自动机(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)

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

完整代码或者代写添加QQ 912100926

猜你喜欢

转载自blog.csdn.net/m0_54742769/article/details/115419190