手搓传染病模型(SQEIR)

在传染病防控研究中,准确刻画隔离措施对疫情传播的影响至关重要。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*}\)

一、模型方程深度解析

  • 易感者 S:\(\frac{dS}{dt} = -\beta SI\),表示易感者因接触感染者以速率 \(\beta\) 被感染。
  • 暴露者 E:\(\frac{dE}{dt} = \beta SI - \alpha^E q E - (1 - \alpha^E)(1 - q)p\omega E\),包含感染输入、隔离移除(\(\alpha^E q E\))和向感染者转化(\((1 - \alpha^E)(1 - q)p\omega E\))。
  • 隔离暴露者 \(Q_E\):\(\frac{dQ_E}{dt} = \alpha^E q E - p\omega Q_E\),体现暴露者隔离(\(\alpha^E q E\))和隔离后转化(\(p\omega Q_E\))。
  • 感染者 I:\(\frac{dI}{dt} = (1 - \alpha^E)(1 - q)p\omega E - (1 - \mu)\gamma_1 I - \alpha^I \mu I\),包含暴露者转化输入、自然康复(\((1 - \mu)\gamma_1 I\))和隔离移除(\(\alpha^I \mu I\))。
  • 隔离感染者 \(Q_I\):\(\frac{dQ_I}{dt} = p\omega Q_E + \alpha^I \mu I - \gamma_2 Q_I\),整合隔离暴露者转化(\(p\omega Q_E\))、感染者隔离(\(\alpha^I \mu I\))和康复(\(\gamma_2 Q_I\))。
  • 康复者 R:\(\frac{dR}{dt} = (1 - \mu)\gamma_1 I + \gamma_2 Q_I\),汇总自然康复与隔离康复贡献。

二、MATLAB 代码实现与可视化

1. 参数与初始条件设置

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;
  • 设定感染率(\(\beta = 0.6\))、隔离率(\(q = 0.6\))等关键参数,初始状态包含各仓室的人数。

2. 微分方程求解与可视化

[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 求解微分方程组,该函数高效处理非刚性方程,适配多变量动态系统。

3. 结果可视化

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
  • 不同颜色区分各仓室,直观展示传播趋势:易感者(S)随时间下降,暴露者(E)先升后降,康复者(R)持续增加。

手搓传染病模型(SQEIR)_第1张图片

三、敏感性分析:参数对疫情的影响

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
  • 分析暴露者隔离率(q)、隔离成功比例(p)、感染者隔离率(\(\mu\))等参数变化的影响。例如,提高 q 可显著降低感染者峰值,验证隔离措施的有效性。

手搓传染病模型(SQEIR)_第2张图片 

四、模型应用与价值

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

你可能感兴趣的:(matlab,数学建模,传染病,微分方程)