seir模型matlab代码
SEIR模型是一种常见的传染病传播模型,其微分方程组为
SEIR模型微分方程组的含义解释
方程逐项解释
-
易感者(S)的变化率 dS/dt
- 负号表示易感者减少,β 是接触率(单位时间内有效接触导致感染的概率)。
- 减少速率与当前易感者人数 S 和感染者人数 I 成正比,βSI/N 表示易感者被感染的速度3。
-
潜伏期者(E)的变化率 dE/dt
- 第一部分 βSINNβSI 是新增潜伏期人数(来自易感者被感染)。
- 第二部分 σE 表示潜伏期转为感染者的速度,σ 是潜伏期转化为感染期的概率(σ=1/潜伏期天数)。
-
感染者(I)的变化率 dI/dt
- 第一部分 σE 是潜伏期转为感染者的速率。
- 第二部分 γI 表示感染者康复或死亡的速率,γ 是恢复率(γ=1/平均感染期天数)。
-
康复者(R)的变化率 dR/dt
- γI表示感染者康复后加入康复群体的速率。
模型假设与关键参数
- 总人口恒定:S+E+I+R=N(忽略出生、死亡和迁移)。
- 参数关系:基本再生数 R0=β/γ,表示单个感染者平均传染人数
% SEIR模型参数设置
N = 1e6; % 总人口
beta = 0.5; % 感染率
lambda = 1/5.2; % 潜伏期转染病率(潜伏期约5.2天)
gamma = 1/14; % 康复率(患病期约14天)
% 初始条件 [S E I R]
y0 = [N-10 0 10 0]; % 初始10例感染者
% 时间范围 (0-180天)
tspan = [0 180];
% 求解微分方程
[t,y] = ode45(@(t,y) seir_model(t,y,beta,lambda,gamma,N), tspan, y0);
% 可视化结果
figure;
plot(t, y(:,1), 'b', 'LineWidth', 2); hold on;
plot(t, y(:,2), 'm', 'LineWidth', 2);
plot(t, y(:,3), 'r', 'LineWidth', 2);
plot(t, y(:,4), 'g', 'LineWidth', 2);
legend('易感者(S)','潜伏者(E)','感染者(I)','康复者(R)');
xlabel('时间(天)');
ylabel('人口数量');
title('SEIR传染病模型演化');
function dydt = seir_model(t,y,beta,lambda,gamma,N)
S = y(1);
E = y(2);
I = y(3);
dS = -beta*S*I/N;
dE = beta*S*I/N - lambda*E;
dI = lambda*E - gamma*I;
dR = gamma*I;
dydt = [dS; dE; dI; dR];
end
如何在该模型中添加疫苗接种因素?
一、模型结构扩展
-
增加疫苗接种群体(V):
S→V→R
新划分群体:
- 完全免疫群体(V):完成疫苗接种且产生有效免疫
- 部分免疫群体(Vp):仅完成部分接种流程
-
改良SEIR模型结构:
五、案例实现(Python示例)
import numpy as np
from scipy.integrate import odeint
def vac_SEIR(y, t, params):
S, V, E, I, R = y
Λ, β, ν, η, δ, σ, γ = params
dSdt = Λ - β*S*I - ν*S + δ*V
dVdt = ν*S - δ*V - β*(1-η)*V*I
dEdt = β*S*I + β*(1-η)*V*I - σ*E
dIdt = σ*E - γ*I
dRdt = γ*I
return [dSdt, dVdt, dEdt, dIdt, dRdt]
# 参数设置
params = [0.01, 0.3, 0.005, 0.9, 1/300, 1/5, 1/10]
t = np.linspace(0, 200, 1000)
y0 = [0.99, 0.0, 0.0, 0.01, 0.0]
solution = odeint(vac_SEIR, y0, t, args=(params,))