Matlab 元胞自动机 模拟病毒传播

采用元胞自动机对病毒传播进行模拟考虑如下条件

1.发病的周期长短与致死率均由个体身体素质决定,生成随机数矩阵(0-1)数值大代表身体素质好

2.考虑了物品传递导致的病毒传播,传递式传播的强度由群体中发病的个体总数决定,当环境中的病例数多时,发生物品传递的传播也会多

3.当个体接触的病例增加时,感染几率增大

Matlab代码

% 用来模拟Covid-19传播带来的影响 元胞自动机
% 发病的周期长短与致死率均由个体身体素质决定
% 考虑了物品传递导致的病毒传播,传递式传播的强度由群体中发病的个体总数决定
%record记录的数据从左至右依次为 发病人数 同时发病率 死亡人数 死亡率 总感染人数 累计发生传递式感染的次数
clear;clc;
n=1000;%整体的大小
x=randi([2,n-1]); %随机生成一个发病个体的坐标
y=randi([2,n-1]);
bodycondition=rand([n,n]);%用来模拟不同个体的身体状况
con=ones(n); %用来纪律身体状态 1代表健康与康复 0代表死亡 2代表发病 
health=zeros(n); %用来记录病程
death=zeros(n); %用来记录死亡病例
recover=zeros(n); %用来记录康复病例
con(x,y)=2;
health(x,y)=ceil(8.*bodycondition(x,y));
Ph=imagesc(con);
record=[]; %统计数据用的矩阵
b=0;
pro=zeros(n);
num=n.^2-2.*n-2.*(n-2); %计算个体总数
while(sum(find((con-death+recover)==2)))
    record=[record;size((find(con==2)),1),size((find(con==2)),1)./num,sum(sum(death)),sum(sum(death))./((sum(sum(recover.*2))+sum(sum(death)))),(sum(sum(recover.*2))+sum(sum(death))),b];
    set(Ph,'cdata',con-death+recover); 
    for i=2:n-1
        for j=2:n-1
          add=con(i+1,j)+con(i,j+1)+con(i-1,j)+con(i,j-1)+con(i-1,j-1)+con(i+1,j+1)+con(i-1,j+1)+con(i+1,j-1);
            if (con(i,j)==1)&&(add>8)&&(health(i,j)==0)&&(death(i,j)==0)
                ad=add-8;
               while(ad)
                   ad=ad-1;
                   if (1-bodycondition(i,j))<rand() %用来模拟是否感染
                       pro(i,j)=1;
                       health(i,j)=ceil(28.*(1-bodycondition(i,j))); %计算个体病程
                       ad=0;
                   end
               end
            end
            if health(i,j)>1&&(con(i,j)==2)
                health(i,j)=health(i,j)-1;
                if (bodycondition(i,j).*rand()<0.0005) %模拟死亡
                    con(i,j)=1;
                    death(i,j)=1;
                end
            elseif (health(i,j)<=1)&&(con(i,j)==2) %模拟康复
                con(i,j)=1;
                recover(i,j)=0.5;
            end
        end
    end
     con=pro+con;
     pro=zeros(n);
    for a=1:ceil(size((find(con==2)),1)./num.*250) %模拟物品传播
    x=randi([2,n-1]);
    y=randi([2,n-1]);
    if (con(x,y)==1)&&(health(x,y)==0)
        con(x,y)=2;
        health(x,y)=ceil(28.*(1-bodycondition(i,j)));
        b=b+1;
    end
    end
    pause(0.001);
end
record=[record;size((find(con==2)),1),size((find(con==2)),1)./num,sum(sum(death)),sum(sum(death))./((sum(sum(recover.*2))+sum(sum(death)))),(sum(sum(recover.*2))+sum(sum(death))),b];
set(Ph,'cdata',con-death+recover); 
[r,c]=size(record);
figure(1) %绘制同时感染率与致死率情况
plot(1:r,record(:,2),'-',"LineWidth",1.5);
hold on;
plot(1:r,record(:,4),"-","LineStyle","-.","LineWidth",1.5)
legend("同时感染率","致死率");
figure(2) %绘制物品传播率与同时感染率关系
subplot(2,1,1)
plot(1:r,record(:,2),'-',"LineWidth",1.5);
title("同时感染率")
subplot(2,1,2)
bar(diff(record(:,end)));
title("发生传递感染的次数");

程序运行的过程

起始状态病例稀少

随着疫情发展 感染人数增加

明亮黄色代表发病人群,暗黄色代表康复人群(失去感染能力),黑色点代表死亡病例

当模拟的样本中不再存在病例时,模拟自动停止

对数据结果进行计算

结果符合模拟设定的条件

经过多次修改数据进行模拟得出,死亡率大时,病毒传播能力弱,未被感染人数会增加

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值