使用MATLAB实现SVEIR模型,模拟流行病传播过程
SVEIR 模型扩展了经典的 SIR 模型,通过增加暴露者和疫苗接种者的状态,更贴合现实中添加疫苗措施的情况。模型能有效模拟传染病潜伏期和康复期对疫情的影响。
表 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$ ) | 接种疫苗但未产生抗体的比例 |
以下是SVEIR模型的流程图,展示了易感者、接种疫苗者、感染者和恢复者之间的转化过程:
图 1: SVEIR模型流程图
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}$$
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
运行以上代码后,可以观察到以下趋势:
以下是模拟结果的可视化图表展示:
图 2: SVEIR及每日新增病例图
通过在模拟过程中降低传播率 ( $\beta$ ),可以模拟隔离措施的效果。例如:
模型中的体现:
可以在微分方程中引入时间依赖的传播率 ( $\beta(t)$ ),例如:
$$\beta(t) =
\begin{cases}
0.3, & t < 60 \
0.2, & t \geq 60
\end{cases}$$
通过直接减少易感者人数 ( S ),并增加疫苗接种者人数 ( $V_s$ ),模拟大规模疫苗接种的效果。例如,假设在第 60 天接种疫苗覆盖了 40% 的总人口,则:
$$S = S - 0.4 \cdot N, \quad V_s = V_s + 0.4 \cdot N$$