TyYm 2024-03-14 11:06 采纳率: 96.2%
浏览 7
已结题

可以帮我看一下这个matlab程序有什么错误吗,运行的不对

img

img

截图中间有点重复的地方,一个森林火灾模型,规则在里面写了,运行出来不太对,可以把需要改正的地方标注一下吗
我把代码补充在下面了




```% 元胞自动机:森林火灾模型% 规则:
% (1)正在燃烧的树变成空格位;
% (2)如果绿树格位的最近邻居中有一个树在燃烧,则它依概率q变成正在燃烧的树;
% (3)在空格位,树以概率p生长;
% (4)在最近的邻居中没有正在燃烧的树的情况下树在每一时步以概率f(闪
%电)变为正在燃烧的树。% 参考文献:% 祝玉学,赵学龙译,<<物理系统的元胞自动机模拟>>, p23
close all;
clc;
clear;
figure;
p=0.3;% 长树的概率p
f=6e-5;% 概率f
axes;
rand('state',0);
set(gcf,'DoubleBuffer','on');
% S=round((rand(300)/2+0.5)*2);
S=round(rand(300)*2);
Sk=zeros(302);
Sk(2:301,2:301)=S;%%加边开始的森林初值
% 红色表示正在燃烧(S中等于2的位置)% 绿色表示绿树(S中等于1的位置)% 黑色表示空格位(S中等于0的位置)
C=zeros(302,302,3);
R=zeros(300);
G=zeros(300);
R(S==2)=1;
G(S==1)=1;
C(2:301,2:301,1)=R;
C(2:301,2:301,2)=G;
Ci=imshow(C);
ti=0;
tp=title(['T = ',num2str(ti)]);%%时间记录
while 1;
    ti=ti+1;
    St=Sk;%%St表示t时刻的森林情况
    St(Sk==2)=0;    % for rule (1) 
    Su=zeros(302);
    Sf=Sk;%%Sf表示模拟着火的过程
    Sf(Sf<1.5)=0;%%只留下着火点
    Sf=Sf/2;%%着火点变为1,此处Sf只有着火和空格两种
    Su(2:301,2:301)=Sf(1:300,1:300)+Sf(1:300,2:301)+Sf(1:300,3:302) +...
        Sf(2:301,1:300)+Sf(2:301,3:302)+Sf(3:302,1:300) + ...
        Sf(3:302,2:301)+Sf(3:302,3:302);%%平移后八个方向叠加,记录下su周围八个点,有多少个在燃烧
    St(Su>0.5)=2;%%% for rule (2)Sf->su
    Se=Sk(2:301,2:301);%%Se中将初始的森林,空白处变为1,其他地方为0
    Se(Se<0.5)=4;%% 空白地方赋值为4
    Se(Se<3)=0;%%有树和着火赋值为0
    Se(Se>3)=1;%%空白地方赋值为1
    St(2:301,2:301)=St(2:301,2:301)+Se.*(rand(300)<p); %for rule (3)%长树,更新t时刻的森林St
    Ss=zeros(302);
    Ss(Sk==1)=1;%%讨论绿树情况
    Ss(2:301,2:301)=Ss(1:300,1:300)+Ss(1:300,2:301)+Ss(1:300,3:302) +...
        Ss(2:301,1:300)+Ss(2:301,3:302)+Ss(3:302,1:300) + ...
        Ss(3:302,2:301)+Ss(3:302,3:302);%%平移后八个方向叠加,记录下Ss周围八个点,有多少个绿树
    Ss(Ss<7.5)=0;
    Ss(Ss>7.5)=1;
    d=find(Ss==1 & Sk==1);
    for k=1:length(d);
        r=rand;
        St(d(k))=round(2*(r<=f)+(r>f));
    end% for rule (4)%%t时刻的着火还是没着火,记为1or2
    Sk=St;%更新t时刻的森林St
    R=zeros(302);
    G=zeros(302);
    R(Sk==2)=1;
    G(Sk==1)=1;
    C(:,:,1)=R;
    C(:,:,2)=G;
    set(Ci,'CData',C);
    set(tp,'string',['T = ',num2str(ti)])
    pause(0.2);
end

```

  • 写回答

9条回答 默认 最新

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-03-14 11:08
    关注

    目前程序没有报错,你的需求是什么?

    img

    img

    这是根据你的规则修改后效果!

    img

    代码

    %以下代码是这样理解的,
    %(1)树的状态有三种,空白(0),绿树(1),正在燃烧的树(2)
    %(2)空白的部分以概率p生长成为绿树
    %(3)绿树的部分,如果其相邻(包括对角线位置)有燃烧的树,则它以概率q变为正在燃烧的树。如果没有,则以概率f(闪电概率)变为正在燃烧的树
    %(4)正在燃烧的树,下一步变为荒地(空白)。
    
    clear;clc;close all;
    p=0.03;%树生长的概率
    q=0.1;% 树变为燃烧状态的概率
    f=6e-3;% 闪电概率
    s=100;% 森林的尺寸 
    
    % 初始状态为随机状态
    forest = round(rand(s)*2);
    
    while 1
        temp = forest;
        % 燃烧的树在下一步变为空白
        forest(temp==2) = 0;
    
        % 空白格的部分以概率p生成新的树
        grow_seed = rand(s); % 成长的种子
        forest(temp==0 & grow_seed<p) = 1;
    
        % 找到哪些是树
        [row,col] = find(temp==1);
        for i = 1:length(row)
            x = row(i);
            y = col(i);
            neighbor = temp(max(x-1,1):min(x+1,s),max(y-1,1):min(y+1,s)); % 找到该树的邻居
            if any(neighbor(:)==2)
                % 如果有正在燃烧的树
                if rand()<q
                    forest(x,y) = 2; 
                end
            else
                % 如果没有燃烧的树,但是被闪电击中,也会变成燃烧的树
                if rand()<f
                    forest(x,y) = 2; 
                end
            end
        end
    
        imagesc(forest);
        drawnow;
    end
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(8条)

报告相同问题?

问题事件

  • 系统已结题 3月22日
  • 已采纳回答 3月14日
  • 修改了问题 3月14日
  • 修改了问题 3月14日
  • 展开全部