SVEIR模型

使用MATLAB实现SVEIR模型,模拟流行病传播过程


日期

SVEIR模型

1 概述

1.1 模型假设

1.2 模型描述

SVEIR 模型扩展了经典的 SIR 模型,通过增加暴露者和疫苗接种者的状态,更贴合现实中添加疫苗措施的情况。模型能有效模拟传染病潜伏期和康复期对疫情的影响。

1.3 模型仓室及参数含义

表 1: 仓室及其含义

仓室 含义
( $S$ ) 易感者人数
( $V_s$ ) 疫苗接种者(仍可能被感染)
( $V_r$ ) 疫苗生效者
( $E$ ) 暴露者人数(已感染但尚未传染他人)
( $I$ ) 感染者人数(有症状且具有传染性)
( $R$ ) 康复者人数
( $N$ ) 总人口数 ($N = S + E + I + R + V_s + V_r$)

表 2: 参数及其含义

参数 含义
( $\beta$ ) 传播率,表示每单位时间内感染者的传染能力
( $\gamma$ ) 感染者的康复速率
( $\omega$ ) 暴露者转化为感染者的速率
( $\phi$ ) 疫苗接种速率
( $f$ ) 抗体生成系数
( $q$ ) 接种疫苗但未产生抗体的比例

2 模型流程图及方程

2.1 模型流程图

以下是SVEIR模型的流程图,展示了易感者、接种疫苗者、感染者和恢复者之间的转化过程:

SVEIR模型流程图

图 1: SVEIR模型流程图

2.2 模型方程

SVEIR 模型由以下常微分方程组描述:

$$\begin{cases} \frac{dS}{dt} = - \phi S - \beta \cdot \frac{I}{N} \cdot S \\
\frac{dE}{dt} = \beta \cdot \frac{I}{N} \cdot S + q \cdot \beta \cdot \frac{I}{N} \cdot V_s - \omega \cdot E \\
\frac{dI}{dt} = \omega \cdot E - \gamma \cdot I \\
\frac{dR}{dt} = \gamma \cdot I \\
\frac{dV_s}{dt} = \phi S - f \cdot V_s - q \cdot \beta \cdot \frac{I}{N} \cdot V_s \\
\frac{dV_r}{dt} = f \cdot V_s \end{cases}$$


3 适用疾病流行条件


4 代码(Matlab)

4.1 条件设定


4.2 代码

close all; clear; clc;

% 模型参数设置
params.tSpan = [0, 359] + 0.5; % 模拟时间范围(360天),从第0.5天开始到第359.5天
params.omega = 0.111; % 潜伏期结束速率(单位:1/天,即潜伏者转为感染者的速率)
params.gamma = 0.05; % 传染期结束速率(单位:1/天,即感染者康复的速率)
params.f = 0.2; % 疫苗接种后产生抗体的速率(单位:1/天)
params.q = 0.2; % 接种疫苗但未产生抗体的比例

beta = 0.3; % 人均接触传播率

% 假设疫苗接种数据
Vacdata = [4730; 4896; 2038; 34394; 36182; 42410; 58666; 87193; 12246; 3263; 87577; 63686; 52780; 45617;
    2310; 2691; 746; 1416; 2169; 2553; 2448; 5674; 67455; 92117; 83533; 67768; 64567; 70476; 100094;
    16106; 5258; 82717; 63992; 59041; 64649; 86073; 12445; 5380; 67880; 51960; 48485; 53048; 66528;
    9287; 3087; 45007; 37920; 34606; 32830; 44738; 7819; 2498; 29398; 24219; 21516; 20931; 25720;
    5684; 2126; 16236; 17610; 16794; 15758; 16340; 4280; 1497; 12379; 12513; 14333; 12205; 12436;
    4187; 1690; 12360; 14280; 12372; 12446; 8593; 3584; 1402; 9517; 11063; 11527; 10827; 9561; 4018;
    1020; 7271; 8041; 5450; 4189; 4000; 923; 440; 3200; 3117; 3301; 3247; 2020; 793; 274; 2217;
    2578; 2348; 3202; 2111; 614; 265; 18; 874; 997; 1177; 598; 239; 159; 773; 1023; 1142; 1009;
    581; 254; 138; 600; 970; 845; 762; 744; 219; 104; 718; 569; 522; 487; 290; 108; 63; 263; 423;
    350; 267; 163; 67; 39; 224; 225; 184; 116; 27; 1; 1; 5]/100; 

% 初始化状态变量
E0 = 0; % 初始潜伏者数量
I0 = 1; % 初始感染者数量
R0 = 0; % 初始康复者数量
population = 220000; % 总人口数

day = numel(Vacdata) + 1; % 疫苗接种数据的天数(加一天表示总天数)
params.fai = sum(Vacdata) / day / population; % 平均每日疫苗接种率(单位:1/天)
Vs0 = 0; % 初始接种疫苗但未产生抗体人数
Vr0 = 0; % 初始接种疫苗并产生抗体人数
S0 = population - E0 - I0 - Vs0 - Vr0; % 初始易感者数量
params.initialStates = [S0; E0; I0; R0; Vs0; Vr0]; % 初始化状态向量

% 定义微分方程并求解
dxdt = @(t, x) computeDerivative(beta, params, t, x); % 定义微分方程函数句柄
[tt, xPredicted] = ode45(dxdt, params.tSpan, params.initialStates); % 使用ODE45求解微分方程
yPredicted = params.omega * xPredicted(:, 2); % 每日新增病例数(潜伏期结束后进入感染期)

% 绘图
fig = figure;
fig.Position = [248.2, 291.4, 1374.4, 584];
tiledlayout(1, 2); % 创建网格布局(1行2列)

% 左侧图:各状态随时间的变化
nexttile;
plot(tt, xPredicted);
legend('S', 'E', 'I', 'R', 'Vs', 'Vr'); % 添加图例
title('SVEIR状态随时间变化');

% 右侧图:每日新增病例数随时间变化
nexttile;
plot(tt, yPredicted);
legend('每日新增病例数');
title('每日新增病例数随时间变化');

% 导出图像为高分辨率PNG文件
exportgraphics(fig, 'SVEIR及每日新增病例图.png', 'Resolution', 300);

%% 微分方程函数
function dxdt = computeDerivative(beta, params, t, x)
    % 提取状态变量
    S = x(1); % 易感者
    E = x(2); % 潜伏者
    I = x(3); % 感染者
    R = x(4); % 康复者
    Vs = x(5); % 接种疫苗未产生抗体者
    Vr = x(6); % 接种疫苗产生抗体者
    N = S + E + I + R + Vs + Vr; % 总人口数(假设不变)

    % 传播项(感染的接触传播速率)
    interactionTerm = beta * I / N;

    % 微分方程
    dSdt = -params.fai * S - interactionTerm * S; % 易感者变化率
    dEdt = interactionTerm * S + params.q * interactionTerm * Vs - params.omega * E; % 潜伏者变化率
    dIdt = params.omega * E - params.gamma * I; % 感染者变化率
    dRdt = params.gamma * I; % 康复者变化率
    dVsdt = params.fai * S - params.f * Vs - params.q * interactionTerm * Vs; % 接种未抗体者变化率
    dVrdt = params.f * Vs; % 接种抗体者变化率

    % 返回结果
    dxdt = [dSdt; dEdt; dIdt; dRdt; dVsdt; dVrdt];
end

4.3 结果

运行以上代码后,可以观察到以下趋势:

以下是模拟结果的可视化图表展示:

SVEIR 模型模拟结果

图 2: SVEIR及每日新增病例图

5 扩展(保证仓室不变)

5.1 加入隔离措施

通过在模拟过程中降低传播率 ( $\beta$ ),可以模拟隔离措施的效果。例如:

模型中的体现

可以在微分方程中引入时间依赖的传播率 ( $\beta(t)$ ),例如: $$\beta(t) = \begin{cases} 0.3, & t < 60 \
0.2, & t \geq 60 \end{cases}$$


5.2 加入疫苗接种

通过直接减少易感者人数 ( S ),并增加疫苗接种者人数 ( $V_s$ ),模拟大规模疫苗接种的效果。例如,假设在第 60 天接种疫苗覆盖了 40% 的总人口,则:

$$S = S - 0.4 \cdot N, \quad V_s = V_s + 0.4 \cdot N$$


注:以上扩展均在仓室设置 ( S, E, V_s, V_r, I, R ) 不变的前提下进行。
林宇豪
点外卖要用券,健身从入门到菜鸟,耳机仙人