数模-微分方程(SIS模型)

SIS模型

image

代码

fun1.m

function dx=fun1(t,x)   % 大家可以修改里面的参数,来看结果的变化
    global TOTAL_N   % 定义总人数为全局变量
    beta = 0.1;  % 易感染者与已感染者接触且被传染的强度
    alpha = 0.06; % 由感染状态I恢复为易感者状态S的恢复率
    dx = zeros(2,1);  % x(1)表示S  x(2)表示I
    dx(1) = alpha*x(2) - beta*x(1)*x(2)/TOTAL_N;  
    dx(2) = beta*x(1)*x(2)/TOTAL_N - alpha*x(2);
end

code.m

%% 最简单的SIS模型
clc;clear
global TOTAL_N   % 定义总人数为全局变量(可以在子函数中使用)
TOTAL_N = 1000;  % 总人数
i0 = 1; % 初始时刻患者(已感染者)的人数
[t,x]=ode45('fun1',[1:500],[TOTAL_N-i0 i0]); 
x = round(x);  % 对x进行四舍五入(人数为整数)
figure(1)
plot(t,x(:,1),'r-',t,x(:,2),'b-','Linewidth',1.5)   % x的第一列是易感染者S的数量,x的第二列是患者I的数量
legend('易感染者S','患者I')

结果

image

SIS模型扩展

image

代码

fun2.m

function dx=fun2(t,x)   % 大家可以修改里面的参数,来看结果的变化
    global TOTAL_N   % 定义总人数为全局变量
    beta = 0.1;  % 易感染者与已感染者接触且被传染的强度
    alpha = 0.02; % 由感染状态I恢复为易感者状态S的恢复率
    if t > 200
        alpha = alpha * 10; % 第200期后引入了新的医疗装备,使得恢复率alpha增加为原来的10倍
    end
    dx = zeros(2,1);  % x(1)表示S  x(2)表示I
    dx(1) = alpha*x(2) - beta*x(1)*x(2)/TOTAL_N;  
    dx(2) = beta*x(1)*x(2)/TOTAL_N - alpha*x(2);
end

code.m

%% 考虑某种使得恢复率alpha增加的因素(例如建立医院、升级医疗装备等)
% 第200期后引入了新的医疗装备,使得恢复率alpha增加为原来的10倍
clc;clear
global TOTAL_N   % 定义总人数为全局变量(可以在子函数中使用)
TOTAL_N = 1000;  % 总人数
i0 = 1; % 初始时刻患者(已感染者)的人数
[t,x]=ode45('fun2',[1:500],[TOTAL_N-i0 i0]); 
x = round(x);  % 对x进行四舍五入(人数为整数)
figure(2)
plot(t,x(:,1),'r-',t,x(:,2),'b-','Linewidth',1.5)   % x的第一列是易感染者S的数量,x的第二列是患者I的数量
legend('易感染者S','患者I')
axis([0 500 0 1000])  % 设置坐标轴范围,x轴为0-500 y轴为0-1000

结果

image

posted @ 2022-05-08 10:19  司砚章  阅读(830)  评论(0编辑  收藏  举报