用 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),你會發現數學模型的魅力就在這些細節里~ 🌈

如果運行代碼時遇到問題,或者有新的模型想法,歡迎在評論區交流哦!讓我們一起用代碼探索更多傳播規律~ 😊

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88666.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ruby如何采集直播數據源地址

在當今數字化的時代,實時獲取并處理信息變得尤為重要。特別是在體育賽事、新聞報道等領域,及時獲取最新的直播數據源對于提升用戶體驗至關重要。本文將介紹如何使用Ruby語言來采集特定網站的數據源地址 一、準備工作 首先,確保你的環境中已…

【fitz+PIL】PDF圖片文字顏色加深

文章目錄0 引言1 解決思路及流程1.1 思路1.2 代碼實現2 完整代碼與效果3 總結0 引言 沒錯,這是連續劇。女友對上一篇【fitzOpenCV】去除PDF圖片中的水印得到的去水印效果很滿意,于是問我可不可以再幫她處理一下另一個PDF文件,我二話不說答應…

tp8.0\jwt接口安全驗證

環境&#xff1a;php8.3\tp8.1\firebase-jwt6.1app\middleware\JwtAuth<?php namespace app\middleware;use app\common\library\JwtHandler; use think\Request; use think\facade\Env;class JwtAuth {public function handle(Request $request, \Closure $next){// 獲取當…

ReactNative【實戰系列教程】我的小紅書 5 -- 文章詳情(含輪播圖 ImageSlider,點亮紅心動畫 Heart,嵌套評論等)

最終效果 安裝依賴 npm i dayjs用于對時間進行格式化 必備組件 輪播圖 ImageSlider https://blog.csdn.net/weixin_41192489/article/details/149224510 點亮紅心動畫 Heart components/Heart.tsx import AntDesign from "expo/vector-icons/AntDesign"; import …

嗶哩嗶哩第三方TV-BBLL最新版

—————【下 載 地 址】——————— 【?本章下載一】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【?本章下載二】&#xff1a;https://pan.xunlei.com/s/VOUtUcaymd9rpgurgDKS9pswA1?pwdp76n# 【百款黑科技】&#xff1a;https://uc…

用YOLOv5系列教程(1)-用YOLOv5輕松實現設備狀態智能監控!工業級教程來了

用YOLOv5輕松實現設備狀態智能監控&#xff01;工業級教程來了設備運維革命&#xff1a;15分鐘教會你的攝像頭看懂指示燈狀態工業現場各種設備狀態指示燈是工程師的"眼睛"——紅燈報警、綠燈運行、黃燈待機。但人工巡檢耗時費力&#xff0c;關鍵故障容易漏檢&#xf…

筆記-分布式計算基礎

Distributed Computing 劃分數據并行&#xff08;DataParallelism&#xff09;將數據分為n份&#xff0c;發送到n個GPU上&#xff0c;每個GPU上都存在一個完整的大模型 缺點&#xff1a; 模型太大Pipeline Parallelism&#xff08;串行的&#xff09;將模型做split,每個GPU負責…

Android Studio 2024,小白入門喂飯級教程

一、下載Android Studio 1、從安卓官網安卓官網下載Android Studio。 ? ? 二、安裝Android Studio 1、雙擊android-studio-2024.3.2.15-windows.exe。 ? ?? ? ? ? ? 三、新建工程 1、雙擊桌面圖標? 打開Android Studio。 ? 選“Empty Views Activity…

AI智能體 | 使用Coze制作一鍵生成單詞洗腦循環視頻,一天批量生成100條視頻不是夢!(附保姆級教程)

目錄 一、整體工作流設計 二、制作工作流 2.1 開始節點 2.2 大模型-單詞 2.3 大模型_圖像生成 2.4 輸出 2.5 圖像生成_1 2.6 輸出_2 2.7 畫板_2 2.8 文本處理 2.9 輸出_3 2.10 speech_synthesis_1x5 2.11 get_audio_duration_1 2.12 代碼 2.13 get_audio_durati…

質量屬性場景(Quality Attribute Scenario)深度解析

本質定義:質量屬性場景(Quality Attribute Scenario)是精確描述軟件系統質量要求的結構化方法,通過標準化的場景模板將抽象的質量屬性轉化為可測量、可驗證的具體行為描述,為架構設計提供客觀評估基準。 一、質量屬性場景核心結構 1. 六元組標準模板 #mermaid-svg-AGbvPVRu…

Java_Springboot技術框架講解部分(一)

首先講解一下&#xff1a;Java技術棧中&#xff0c;目前Spring Boot在國內的關注趨勢也日漸超過Spring。Spring Boot是Spring家族中的一個全新的框架&#xff0c;它用來簡化Spring應用程序的創建和開發過程。采用Spring Boot可以非常容易和快速的構建基于Spring框架的應用程序&…

從OpenMV到執行器:當PID算法開始“調教”舵機

如果到現在還不會驅動舵機——朋友&#xff0c;電賽的元器件清單每年都在對你“明示”&#xff0c;二維云臺都快成祖傳考題了&#xff01;補課&#xff1f;現在&#xff01;立刻&#xff01;&#xff08;當然&#xff0c;如果你臉皮夠厚&#xff0c;也可以私信騷擾作者&#xf…

xml映射文件的方式操作mybatis

映射文件 在Java spring中使用mybatis有兩種方式&#xff0c;一種是注釋的方式&#xff0c;一種是xml映射文件的方式。在簡單的功能需求可以使用注釋&#xff0c;方便簡潔。而在大的功能邏輯上&#xff0c;更推薦使用xml映射文件&#xff0c;方便管理且結構清晰。 首先xml文件結…

Carla自動駕駛仿真_快速安裝與運行Carla

大家好&#xff0c;我是橙子&#xff0c;今天給大家介紹Carla的基礎安裝和使用 目錄 1.Carla介紹 2.Carla的安裝與使用 3.Carla0.9.15安裝包下載&#xff1a; ?編輯 4.運行Demo 5.運行一個簡單場景&#xff1a; 6.相關資源 1.Carla介紹 Carla 是一個開源的自動駕駛仿…

遠程登錄docker執行shell報錯input is not a terminal問題

背景 最近要遠程去k8s docker里面獲取信息&#xff0c;于是&#xff0c;寫了一個如下的命令&#xff0c;執行完之后&#xff0c;報錯了。 ssh 192.168.100.2 sudo crictl exec -it xxx.docker /usr/bin/lscpu --online --extended錯誤信息如下&#xff1a; time“2025-07-11T21…

使用FastAdmin框架開發二

繼上一篇使用FastAdmin框架開發-CSDN博客教程 部署完項目后我們就可以邊開發邊調試了 在開發前我們可以先做一些基本設置 安裝成功后會生成一個項目后臺的地址http://域名/VrHGtzlfMB.php/index/login&#xff0c;后臺入口文件是隨機生成的&#xff0c;當然我們也可以根據我…

【DB2】load報錯SQL3501W、SQL3109N、SQL2036N

最近老遇到遷移測試LOAD時報錯&#xff0c;如圖所示但是換成import又可以看描述是說load的內容將不會進入備份暫掛狀態balbala… 下面的錯誤是說ixf文件無效 這里一直以為是SQL3501W的問題&#xff0c;去各種研究load參數和db2set里面的load參數&#xff0c;各種調整都不行 又以…

YOLO家族內戰!v5/v8/v10誰才是你的真命天子?(附保姆級選擇指南)

在目標檢測領域&#xff0c;YOLO系列始終是工業部署與學術研究的焦點。從風靡全網的YOLOv5&#xff0c;到全面升級的YOLOv8&#xff0c;再到突破性能瓶頸的YOLOv10——每一次迭代都帶來全新可能。作為開發者&#xff0c;究竟該選哪一代&#xff1f;本文用千字長文對比表格為你徹…

Claude Code是什么?國內如何使用到Claude Code?附國內最新使用教程

2025年已過大半&#xff0c;相信你也聽說過 Claude——它是近年最受關注的 AI 模型之一&#xff0c;而 Claude Code 則是它面向編程場景的特別版本&#xff0c;專為代碼理解、生成與重構而生&#xff0c;尤其擅長處理大項目、長上下文&#xff0c;和開發者對話更自然。 但對于一…

雙輪驅動:政策激勵與外部制約下的國產服務器市場演進

2025年6月&#xff0c;科智咨詢正式發布《中國國產服務器市場研究報告&#xff08;2025&#xff09;》&#xff0c;報告從國產服務器產業概述、政策環境分析、市場現狀與競爭格局、面臨挑戰與市場機遇等維度&#xff0c;深入剖析國產服務器市場現狀及未來發展趨勢。2022年10月&…