采用元胞自动机对病毒传播进行模拟考虑如下条件
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("发生传递感染的次数");
程序运行的过程
起始状态病例稀少
随着疫情发展 感染人数增加
明亮黄色代表发病人群,暗黄色代表康复人群(失去感染能力),黑色点代表死亡病例
当模拟的样本中不再存在病例时,模拟自动停止
对数据结果进行计算
结果符合模拟设定的条件
经过多次修改数据进行模拟得出,死亡率大时,病毒传播能力弱,未被感染人数会增加