雨水冲刷沙堡模型——matlab元胞自动机(二)

这段代码实现了一个二维沙堡模型,模拟了降雨对沙堡结构的影响。当沙子的含水量达到一定程度时,顶层会塌陷。通过GUI控制运行、停止和退出,观察沙堡随雨滴下落而变化的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二代和第一代有些许不同,每体积沙子被雨水打到后会增加一定量的含水量,当最上面一层的含水量平均值大于某个值得时候,最上面一层沙子就会塌陷。

 

 不多说啥了,看代码(个人练习记录,大佬轻喷)

clear all;
% 设置GUI按键
plotbutton=uicontrol('style','pushbutton','string','运行', 'fontsize',12, 'position',[150,400,50,20], 'callback', 'run=1;');
erasebutton=uicontrol('style','pushbutton','string','停止','fontsize',12,'position',[250,400,50,20],'callback','freeze=1;');
quitbutton=uicontrol('style','pushbutton','string','退出','fontsize',12,'position',[350,400,50,20],'callback','stop=1;close;');
%设置元胞大小
n=100;
C = zeros(n,n);
%设置种类 0:空气 1:沙子 2:雨滴
ca= zeros(n,n);
wa=zeros(n,n);%含水量
%沙堆和雨滴的数量
numsand=zeros(10000,1);
numrain=zeros(10000,1);
numceng=zeros(10000,1);
time=0;
%设置沙堆
for i=10:90
    for j=1:n
        if i<=35
            if j<=sqrt(i-10)*5
                ca(j,i)=1;
                wa(j,i)=10;
            end
        elseif i<=65
            if j<=25
                ca(j,i)=1;
                wa(j,i)=10;
            end
        else
            if j<=sqrt(90-i)*5
                 ca(j,i)=1;
                 wa(j,i)=10;
            end
        end
    end
end
%绘制沙堆
for i=2:98
    for j=3:97
        k=0;
           for i1=1:3
            for j1=1:3
                if ca(j+j1-2,i+i1-2)==1
                    k=k+1;
                end
            end
           end
                if k==1||k==2||k==3
                          C(j,i)=60;
                elseif k==4||k==5||k==6
                           C(j,i)=57;
                elseif k==7||k==8||k==9
                           C(j,i)=55;
                end
    end
end



image(C)
set(gca,'YDir','normal')
stop= 0; run = 0;freeze = 0;
            
%             for i1=2:8
%                 C(100,i1*10)=20;
%             end
            
        
while stop==0
    if run==1
 %沙堆重绘       颜色由上方五个决定
 for i=2:98
    for j=3:97
        k=0;
       for i1=1:3
            for j1=1:3
                if ca(j+j1-2,i+i1-2)==1
                    k=k+1;
                end
            end
       end
                if k==1||k==2||k==3
                          C(j,i)=60;
                elseif k==4||k==5||k==6
                           C(j,i)=57;
                elseif k==7||k==8||k==9
                           C(j,i)=55;
                end
    end
 end
%模拟雨滴下落及对沙堡的影响
       for j2=2:100
           for i2=1:100
               if ca(j2,i2)==2
                   C(j2,i2)=0;
                   ca(j2,i2)=0;
                   if ca(j2-1,i2)==1    %雨滴遇到沙砾时
                       wa(j2-1,i2)=wa(j2-1,i2)+15; %沙砾含水量增加,预定增加15%
                           %判断含水量的变化会不会冲刷沙堡形状
                           sum=0;k_1=0;
                            for i_1=1:100
                                if ca(j2-1,i_1)==1
                                    sum=sum+wa(j2-1,i_1);
                                    k_1=k_1+1;
                                end
                            end
                            avg=sum/k_1;
                                if avg>=55
                                    for i_1=1:100
                                   ca(j2-1,i_1)=0;
                                   
                                    end
                                %填入塌陷的沙砾
                                 num_sand=k_1;
                                       for j_2=1:100
                                            for i_2=2:50
                                               if num_sand>0
                                                if ca(j_2,i_2+1)==1&&ca(j_2,i_2-1)==0
                                                    ca(j_2,i_2)=1;
                                                    num_sand=num_sand-1; 
                                                end
                                               end
                                            end
                                            
                                            for i_2=98:-1:51
                                               if num_sand>0
                                                if ca(j_2,i_2-1)==1&&ca(j_2,i_2+1)==0
                                                    ca(j_2,i_2)=1;
                                                    num_sand=num_sand-1; 
                                                end
                                                    
                                               end
                                            end
                                       end
                                       
                                end

                   
                                
                   else      %正常下落
                       ca(j2-1,i2)=2;
                       C(j2-1,i2)=20;
                   
                   end
               end
           end
       end
 %生成雨滴             
        a=unidrnd(n);
        C(n,a)=20;
        ca(n,a)=2;
%数据储存
time=time+1;
    for j3=1:100
           for i3=1:100
               if ca(j3,i3)==1
                   numsand(time)=numsand(time)+1;
                   
               end
           end
    end
numrain(time)=time/(1375-numsand(time));
       for j_3=1:100
          if ca(j_3,50)==1
              numceng(time)=numceng(time)+1;
          end
       end
              



%图像更新
image(C)   
set(gca,'YDir','normal')
 if time==3000
     run=0;
 end
% run=0;
    end
    if freeze==1
        run = 0;
        freeze = 0;
    end
    drawnow %更新图窗并处理回调
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值