用 MATLAB 模拟传染病传播:从 SI 模型到 SIS 模型的可视化之旅
在公共卫生研究中,数学模型是理解传染病传播规律的重要工具。通过数值模拟,我们能直观看到 “易感人群” 和 “感染人群” 随时间的变化趋势,甚至能预测疫情发展的关键节点。今天就带大家用 MATLAB 实现两个经典的传染病模型 ——SI 模型和SIS 模型,一步步拆解代码逻辑,还会教你如何替换自己的数据,让模型更贴合你的研究场景哦~ 🌟
一、为什么要做传染病模型模拟? 🤔
想象一下:当一种新的传染病出现时,卫生部门需要快速判断 “多久会出现感染高峰?”“最终会有多少人被感染?” 这些问题光靠经验很难回答,但数学模型能帮我们 “预演” 不同场景下的传播过程。
今天要实现的两个模型,虽然简单却蕴含着传播的核心逻辑:
- SI 模型:假设感染后不会康复,只会在易感人群中持续扩散(比如某些终身携带的病毒);
- SIS 模型:感染后会康复,且康复者会重新成为易感人群(比如流感这类可重复感染的疾病)。
通过可视化这两个模型的结果,我们能清晰看到 “康复” 这个变量对传播趋势的巨大影响~
二、模型原理:从公式到逻辑 📝
在写代码前,先让我们看懂两个模型的数学表达式 —— 这是理解模拟逻辑的关键哦!
1. SI 模型:“一旦感染,终身携带”
SI 模型里有两个核心人群:
- S(t):t 时刻的易感人群(可能被感染的人);
- I(t):t 时刻的感染人群(已感染且具有传染性的人)。
总人数 N = S (t) + I (t)(因为没有康复,所以总人数不变)。
模型的微分方程如下:
\( \begin{cases} \dfrac{dS}{dt} = -\beta \dfrac{S \times I}{N} \\ \dfrac{dI}{dt} = \beta \dfrac{S \times I}{N} \end{cases} \)
公式解读:
- \( \beta \) 是传染率(比如 β=0.2 表示每个感染者每天平均会让 20% 的易感者被感染);
- \( \frac{S \times I}{N} \) 代表 “易感者与感染者的接触概率”(总人数 N 固定时,接触次数和两者数量的乘积成正比);
- 因此,易感人群的减少量 \( \frac{dS}{dt} \) 等于感染人群的增加量 \( \frac{dI}{dt} \),符合 “无康复” 的设定~
2. SIS 模型:“康复后仍可能再感染”
SIS 模型在 SI 模型的基础上增加了 “康复” 环节:感染人群会以一定概率康复,且康复后重新成为易感者(所以叫 SIS,Susceptible-Infected-Susceptible)。
新增参数 \( \gamma \) 代表康复率(比如 γ=0.25 表示每天有 25% 的感染者会康复)。
模型的微分方程如下:
\( \begin{cases} \dfrac{dS}{dt} = -\beta \dfrac{SI}{N} + \gamma I \\ \dfrac{dI}{dt} = \beta \dfrac{SI}{N} - \gamma I \end{cases} \)
公式解读:
- 感染人群的变化(dI/dt)由两部分组成:新增感染(\( \beta SI/N \))和康复减少(\( -\gamma I \));
- 易感人群的变化(dS/dt)也对应两部分:因感染减少(\( -\beta SI/N \))和因康复增加(\( +\gamma I \));
- 这个模型更贴近现实中 “可重复感染” 的疾病(比如普通感冒、流感),感染高峰会因康复而回落~
三、MATLAB 代码实现:从公式到可视化 💻
接下来我们用 MATLAB 的ode45函数(常微分方程求解器)来模拟这两个模型。ode45能帮我们求解微分方程组的数值解,再结合plot函数就能画出人群变化曲线啦~
1. SI 模型代码解析
先看第一段代码 —— 没有康复率的 SI 模型:
% 模型参数N = 1000000; % 总人数I0 = 10; % 初始感染人数S0 = N - I0; % 初始易感人数beta = 0.2; % 传染率num_days = 160; % 模拟天数% x(1):感染人群I, x(2):易感人群Sdxdt = @(t, x) [beta * x(1) * x(2) / N; % dIdt-beta * x(1) * x(2) / N % dSdt];[t, y] = ode45(dxdt, 1: num_days, [I0, S0]);hold onplot(t, y(:, 1));plot(t, y(:, 2));legend('感染人数I', '易感人数S');
关键参数说明(这些都能自定义哦!):
- N:总人数(比如模拟一个城市的人口,可替换为 500000、10000 等);
- I0:初始感染人数(疫情刚开始时的病例数,可替换为 5、20 等);
- S0:初始易感人数(总人数减去初始感染人数,会随N和I0自动变化,也可手动修改);
- beta:传染率(值越大传播越快,可替换为 0.1、0.3 等);
- num_days:模拟天数(想观察 1 年就设为 365,想观察 1 个月就设为 30)。
微分方程定义:
dxdt是一个匿名函数,用来定义微分方程组:
- 第一行beta * x(1) * x(2) / N对应dI/dt(感染人数的变化率),和 SI 模型公式完全一致;
- 第二行-beta * x(1) * x(2) / N对应dS/dt(易感人数的变化率),负号表示易感者因感染而减少。
求解与绘图:
- [t, y] = ode45(dxdt, 1: num_days, [I0, S0]):ode45会在 1 到num_days天内求解方程组,初始值是[I0, S0](初始感染和易感人数);
- y(:, 1)是每天的感染人数(I),y(:, 2)是每天的易感人数(S);
- plot函数画出两条曲线,legend添加标签,方便区分~
2. SIS 模型代码解析
再看第二段代码 —— 加入康复率的 SIS 模型:
% 模型参数N = 1000000; % 总人数I0 = 10; % 初始感染人数S0 = N - I0; % 初始易感人数beta = 0.2; % 传染率gamma = 0.05; % 康复率num_days = 160; % 模拟天数% x(1):感染人群I, x(2):易感人群Sdxdt = @(t, x) [beta * x(1) * x(2) / N - gamma * x(1); %dIdt-beta * x(1) * x(2) / N + gamma * x(1) %dSdt];[t, y] = ode45(dxdt, 1: num_days, [I0, S0]);hold onplot(t, y(:, 1));plot(t, y(:, 2));legend('感染人数I', '易感人数S');
新增参数(可自定义!):
- gamma:康复率(值越大表示康复越快,可替换为 0.1、0.5 等)。比如 gamma=0.5 意味着每天有 50% 的感染者会康复~
微分方程变化:
和 SI 模型相比,dxdt的定义多了gamma相关项:
- 感染人数变化(dI/dt):beta * x(1)*x(2)/N - gamma * x(1)(新增感染减去康复减少,对应 SIS 模型公式);
- 易感人数变化(dS/dt):-beta * x(1)*x(2)/N + gamma * x(1)(感染减少加上康复增加,和公式一致)。
四、模拟结果分析:曲线背后的传播规律 🔍
运行两段代码后,我们会得到两条截然不同的曲线 —— 这就是模型参数对传播趋势的影响,超直观!
1. SI 模型的曲线特征
在 SI 模型中(无康复):
- 感染人数(I)会从初始的 10 人开始,随着时间快速增长(因为没有康复,每个感染者都在持续传染易感者);
- 易感人数(S)会不断减少,直到几乎所有易感者都被感染(因为总人数固定,I+S=N);
- 曲线趋势:I 呈 “J 型增长”,S 呈 “反向 J 型下降”,最终 I≈N,S≈0(除非初始易感者耗尽)。
这很像 “一旦感染终身携带” 的疾病(比如某些病毒携带者),只要有易感者存在,感染就会持续扩散~ 😮
2. SIS 模型的曲线特征
在 SIS 模型中(有康复):
- 感染人数(I)会先快速上升(新增感染 > 康复),达到一个 “感染高峰”;
- 随着易感人数减少、康复人数增加,感染人数会逐渐下降,最终可能稳定在一个平衡值(I 不再变化);
- 易感人数(S)会先减少后回升,最终和 I 形成动态平衡(因为康复者会回到易感人群)。
这更贴近现实中 “可康复且重复感染” 的场景:比如流感,冬天感染人数上升,春天因康复和抵抗力增强而下降,但来年可能再次流行~ 🌦️
3. 关键差异对比
模型 | 感染人数趋势 | 易感人数趋势 | 核心原因 |
SI 模型 | 持续增长至 N | 持续下降至 0 | 无康复,感染不可逆 |
SIS 模型 | 先增后减至平衡值 | 先减后增至平衡值 | 康复者回归易感人群 |
五、自定义数据指南:让模型更贴近你的研究 🧪
想模拟自己关注的场景?只需修改几个参数就行!以下是 “可替换数据” 的详细指南,新手也能轻松上手~
1. 必改参数清单
参数名 | 含义 | 推荐修改范围 | 修改后影响示例 |
N | 总人数 | 1000~10^7(根据场景) | N=10000(模拟一个小镇),传播速度会更快 |
I0 | 初始感染人数 | 1~100 | I0=1(零号病人),初期增长会更慢 |
beta | 传染率 | 0.01~1(越小越慢) | beta=0.1(低传染),感染高峰会推迟 |
gamma | 康复率(仅 SIS 模型) | 0.05~1(越大康复越快) | gamma=0.5(高康复),感染高峰会降低 |
num_days | 模拟天数 | 30~365 | num_days=365(模拟一年),看长期趋势 |
2. 进阶玩法:对比不同参数的影响
比如想研究 “传染率高低对疫情的影响”:
- 保持 N=1000000,I0=10,gamma=0.25(仅 SIS),num_days=160;
- 分别用 beta=0.1、0.2、0.3 运行 SIS 模型,会发现 beta 越大,感染高峰越高、出现越早~
再比如研究 “康复率的作用”:
- 固定 beta=0.2,尝试 gamma=0.1(康复慢)和 gamma=0.5(康复快),会看到康复越快,感染高峰越低、回落越快~
六、总结:模型是工具,思考是核心 🧠
通过今天的模拟,我们不仅学会了用 MATLAB 实现传染病模型,更理解了 “传染率”“康复率” 这些参数如何影响传播趋势:
- SI 模型适合模拟 “终身感染” 的场景,帮我们理解 “无干预下的最坏情况”;
- SIS 模型适合模拟 “可康复且重复感染” 的疾病,能预测感染高峰和平衡状态。
但要注意:现实中的传染病传播还受 “隔离措施”“疫苗接种”“人口流动” 等因素影响(这些可以在模型中加入更多参数扩展,比如 SIR 模型)。今天的模型是基础,后续可以不断添加变量,让模拟更精准~
最后,鼓励大家多动手修改参数:试着模拟 “一个学校的流感传播”(N=1000,beta=0.3,gamma=0.4),或者 “一个城市的慢病毒传播”(N=500000,beta=0.05,无 gamma),你会发现数学模型的魅力就在这些细节里~ 🌈
如果运行代码时遇到问题,或者有新的模型想法,欢迎在评论区交流哦!让我们一起用代码探索更多传播规律~ 😊