在公共衛生研究中,數學模型是理解傳染病傳播規律的重要工具。通過數值模擬,我們能直觀看到 “易感人群” 和 “感染人群” 隨時間的變化趨勢,甚至能預測疫情發展的關鍵節點。今天就帶大家用 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),你會發現數學模型的魅力就在這些細節里~ 🌈
如果運行代碼時遇到問題,或者有新的模型想法,歡迎在評論區交流哦!讓我們一起用代碼探索更多傳播規律~ 😊