在传染病防控研究中,准确刻画隔离措施对疫情传播的影响至关重要。SQEIR 模型(易感者 S - 暴露者 E - 隔离暴露者 \(Q_E\) - 感染者 I - 隔离感染者 \(Q_I\) - 康复者 R)通过引入隔离仓室,为分析防控策略提供了有力工具。图中的微分方程组清晰定义了各仓室的动态变化:
\(\begin{align*} \frac{dS}{dt} &= -\beta SI \\ \frac{dE}{dt} &= \beta SI - \alpha^E q E - (1 - \alpha^E)(1 - q)p\omega E \\ \frac{dQ_E}{dt} &= \alpha^E q E - p\omega Q_E \\ \frac{dI}{dt} &= (1 - \alpha^E)(1 - q)p\omega E - (1 - \mu)\gamma_1 I - \alpha^I \mu I \\ \frac{dQ_I}{dt} &= p\omega Q_E + \alpha^I \mu I - \gamma_2 Q_I \\ \frac{dR}{dt} &= (1 - \mu)\gamma_1 I + \gamma_2 Q_I \end{align*}\)
parameters = struct(...
'beta', 0.6, ... % 感染率
'omega', 0.2, ... % 潜伏期的逆
'q', 0.6, ... % 暴露者隔离率
'p', 0.5, ... % 隔离成功比例
'gamma1', 0.1, ... % 感染者康复率
'gamma2', 0.05, ... % 隔离感染者康复率
'mu', 0.1, ... % 感染者的隔离率
'alphaE', 0.7, ... % 暴露者隔离速率
'alphaI', 0.8 ... % 感染者隔离速率
);
init_state = [9800; 150; 100; 50; 30; 20]; % [S; E; QE; I; QI; R]
tspan = 0:1:60;
[t, y] = ode45(@(t,y) model_equations(t, y, parameters), tspan, init_state);
function dydt = model_equations(~, y, params)
S = y(1); E = y(2); QE = y(3); I = y(4); QI = y(5); R = y(6);
dS = -params.beta * S * I;
dE = params.beta * S * I - params.alphaE * params.q * E ...
- (1 - params.alphaE) * (1 - params.q) * params.p * params.omega * E;
% 其余方程类似实现...
end
ode45
求解微分方程组,该函数高效处理非刚性方程,适配多变量动态系统。function plot_results(t, y, title_str)
colors = [...
163 193 218; ... % S: 浅蓝色
0 255 255; ... % E: 浅青色
241 208 169; ... % QE: 浅橙色
249 185 182; ... % I: 浅红色
210 161 199; ... % QI: 浅紫色
176 224 164 ... % R: 浅绿色
] / 255;
figure('Position', [100 100 1200 600])
plot(t, y, 'LineWidth', 1.5)
title(title_str, 'FontSize', 16)
xlabel('时间 (天)', 'FontSize', 14)
ylabel('人数', 'FontSize', 14)
legend({'易感者', '暴露者', '隔离暴露者', '感染者', '隔离感染者', '康复者'}, ...
'Location', 'best', 'FontSize', 12)
grid on
set(gca, 'FontSize', 12)
colororder(colors)
end
function sensitivity_analysis()
base_params = struct(...
'beta', 0.6, 'omega', 0.2, 'q', 0.6, 'p', 0.5, ...
'gamma1', 0.1, 'gamma2', 0.05, 'mu', 0.1, ...
'alphaE', 0.7, 'alphaI', 0.8);
sensitivity_params = struct(...
'q', [0.4, 0.6, 0.8], ...
'p', [0.4, 0.5, 0.6], ...
'mu', [0.1, 0.2, 0.3]);
% 求解与绘图...
end
SQEIR 模型通过细化隔离仓室,为评估防控策略提供了精准工具。借助 MATLAB 代码,可模拟不同参数组合下的疫情走势,助力公共卫生决策,如优化隔离资源分配、预测疫苗接种效果等。敏感性分析进一步明确关键参数,为高效防控指明方向。
通过深入理解 SQEIR 模型及其 MATLAB 实现,我们能更科学地应对传染病挑战,为构建健康安全的社会环境提供有力支持。快来尝试调整参数,探索更多防控场景吧!
% 模型参数
parameters = struct(...
'beta', 0.6, ... % 感染率
'omega', 0.2, ... % 潜伏期的逆
'q', 0.6, ... % 暴露者隔离率
'p', 0.5, ... % 隔离成功比例
'gamma1', 0.1, ... % 感染者康复率
'gamma2', 0.05, ... % 隔离感染者康复率
'mu', 0.1, ... % 感染者的隔离率
'alphaE', 0.7, ... % 暴露者隔离速率
'alphaI', 0.8 ... % 感染者隔离速率
);
% 初始状态
init_state = [9800; 150; 100; 50; 30; 20]; % [S; E; QE; I; QI; R]
% 时间范围
tspan = 0:1:60;
% 求解微分方程
[t, y] = ode45(@(t,y) model_equations(t, y, parameters), tspan, init_state);
% 绘制结果
plot_results(t, y, 'SQEIR 模型动态变化');
%%
% 敏感性分析
base_params = struct(...
'beta', 0.6, 'omega', 0.2, 'q', 0.6, 'p', 0.5, ...
'gamma1', 0.1, 'gamma2', 0.05, 'mu', 0.1, ...
'alphaE', 0.7, 'alphaI', 0.8);
sensitivity_params = struct(...
'q', [0.4, 0.6, 0.8], ...
'p', [0.4, 0.5, 0.6], ...
'mu', [0.1, 0.2, 0.3]);
init_state = [9800; 150; 100; 50; 30; 20];
tspan = 0:1:60;
figure('Position', [100 100 1400 1000])
tiledlayout(3,3, 'Padding', 'compact', 'TileSpacing', 'compact')
params = fieldnames(sensitivity_params);
for i = 1:length(params)
param_name = params{i};
param_values = sensitivity_params.(param_name);
for j = 1:length(param_values)
% 更新参数
current_params = base_params;
current_params.(param_name) = param_values(j);
% 求解模型
[t, y] = ode45(@(t,y) model_equations(t, y, current_params), ...
tspan, init_state);
% 绘图
nexttile
plot(t, y, 'LineWidth', 1)
title(sprintf('%s = %.1f', param_name, param_values(j)))
xlabel('时间 (天)')
ylabel('人数')
grid on
if j == 1
legend({'S','E','QE','I','QI','R'}, 'Location', 'best')
end
end
end
sgtitle('SQEIR 模型灵敏度分析', 'FontSize', 16)
function plot_results(t, y, title_str)
% 可视化结果
colors = [...
163 193 218; ... % S: 浅蓝色
0 255 255; ... % E: 浅青色
241 208 169; ... % QE: 浅橙色
249 185 182; ... % I: 浅红色
210 161 199; ... % QI: 浅紫色
176 224 164 ... % R: 浅绿色
] / 255;
figure('Position', [100 100 1200 600])
plot(t, y, 'LineWidth', 1.5)
title(title_str, 'FontSize', 16)
xlabel('时间 (天)', 'FontSize', 14)
ylabel('人数', 'FontSize', 14)
legend({'易感者', '暴露者', '隔离暴露者', '感染者', '隔离感染者', '康复者'}, ...
'Location', 'best', 'FontSize', 12)
grid on
set(gca, 'FontSize', 12)
colororder(colors)
end
function dydt = model_equations(~, y, params)
% 微分方程定义
S = y(1); E = y(2); QE = y(3); I = y(4); QI = y(5); R = y(6);
dS = -params.beta * S * I;
dE = params.beta * S * I - params.alphaE * params.q * E ...
- (1 - params.alphaE) * (1 - params.q) * params.p * params.omega * E;
dQE = params.alphaE * params.q * E - params.p * params.omega * QE;
dI = (1 - params.alphaE) * (1 - params.q) * params.p * params.omega * E ...
- (1 - params.mu) * params.gamma1 * I - params.alphaI * params.mu * I;
dQI = params.p * params.omega * QE + params.alphaI * params.mu * I ...
- params.gamma2 * QI;
dR = (1 - params.mu) * params.gamma1 * I + params.gamma2 * QI;
dydt = [dS; dE; dQE; dI; dQI; dR];
end