數學建模之傳染病SIR模型(新冠真實數據)

傳染病模型的基本問題

  • 描述傳染病的傳播過程
  • 分析受感染人數的變化規律
  • 預報傳染病高潮到來的時刻
  • 預防傳染病蔓延的手段
  • 按照傳播過程的一般規律用機理分析方法建立模型

注:我們這裏是介紹數學醫學領域中基本的傳染病模型。不從醫學角度分析各種傳染病的特殊機理,按照傳播過程的規律建立微分方程模型.

建立模型

模型一

假設:

  1. 設已知感染人數爲i(t)i(t)(病人數量隨時間變化)
  2. 設每個病人(單位時間)每天有效接觸(足以使人治病)人數爲λ\lambda

模型:
單位時間Δt\Delta{t}內,=×λ新增的人數(現有-原有)=原有的 \times \lambda,即

i(t+Δt)i(t)=λi(t)Δti(t+\Delta{t})-i(t)=\lambda i(t)\Delta{t}
一開始的感染人數爲i0i_0
i(0)=i0i(0)=i_0
解微分方程可以得到
i(t)=i0eλti(t)=i_0e^{\lambda t}
所以可以可到當λ\lambda \rightarrow \infini(t)i(t) \rightarrow \infin
當然這是不可能的,因爲我們考慮的因素太少了,首先一個是,若有效接觸的是病人,則不能使病人數增加,所以必須區分已感染者(病人)和未感染者(健康人)看模型二來解決這個問題

模型二

假設:

  1. 將人羣分爲兩類:易感染者(Susceptible,健康人)和已感染者(Infective, 病人).
  2. 總人數N不變,時刻t健康人和病人所佔比例分別爲s(t)s(t)i(t)i(t), 有s(t)+i(t)=1s(t)+i(t)=1
  3. 每個病人每天有效接觸人數爲λ\lambda(日接觸率),且使接觸的健康人致病.

建模
每天新增的總人數爲原有的人數乘以每個人可以傳染的健康的人數,再乘Δt\Delta t
在這裏插入圖片描述
Δt\Delta t除過去,兩遍N約分得到下面,
在這裏插入圖片描述
MATLAB解一下這個微分方程

y=dsolve('Dy=n*y*(1-y)','t');

y =
 -1/(exp(C1 - n*t) - 1)
                      0
                      1

寫規範點就是這個函數
在這裏插入圖片描述
函數圖像大致爲
在這裏插入圖片描述
可以看出t=tmt=t_m時這裏圖像的斜率有個最大值,其也就是傳染的最快的時候,即傳染病的高潮時刻,當然tmt_m是可以求出來的
在這裏插入圖片描述
再看原式,當tt\rightarrow \infini1i\rightarrow 1
病人的比例爲1,當然這也是不可能的,因爲我們還沒有考慮有沒有可能治癒,看模型三

模型三

假設:

  1. 傳染病無免疫性如傷風、痢疾等——病人治癒成爲健康人,健康人可再次被感染。
  2. 病人每天治癒的比例爲μ\mu (日治癒率),1μ\frac{1}{\mu}爲感染期,

模型
這是減去了治癒人數之後的新增人數
在這裏插入圖片描述
在這裏插入圖片描述
σ\sigma 爲一個感染期內每個病人的有效接觸人數,稱爲接觸數

可以畫出上面的圖形分析下
在這裏插入圖片描述
對上面的公式進行分析,可以得到,當i=11σi=1-\frac{1}{\sigma}時,ii對t的導數爲0這也就到了ii的最大值;當0<i<11σ0<i<1-\frac{1}{\sigma}時,di/dt<0di/dt<0,i單調遞增,且在di/dtdi/dt最大時,i的斜率最大,增速最快;當i>11σi>1-\frac{1}{\sigma}di/dt<0di/dt<0,i是單調遞減的。


當然我們也可以畫出ii隨t的函數圖像
在這裏插入圖片描述
先看紅線,若初始條件i0>11σi_0>1-\frac{1}{\sigma}di/dt<0di/dt<0,i就是單調遞減的,
若若初始條件i0<11σi_0<1-\frac{1}{\sigma},i就是遞增的,可以看到i對t的導數圖像有一個最大值,下面的黑線就有一個增加速率最快的一個值,按S形曲線增長


σ=<1\sigma =<1di/dt<0di/dt<0 i肯定是單調下降的,最終降到0
在這裏插入圖片描述


綜上
想讓患病者越來越少,σ\sigma必須小於等於1,即感染期內有效接觸使健康者感染的人數不超過原有的病人數.
在這裏插入圖片描述
這裏我們分析的是感染之後還能感染的情況,但有些病毒感染之後會在體內生成抗體,就不會再被感染了,下面我們分析這種情況。

模型四 SIR模型

SIR模型是常見的一種描述傳染病傳播的數學模型,其基本假設是將人羣分爲以下三類:

1 易感人羣(Susceptible):指未得病者,但缺乏免疫能力,與感病者接觸後容易受到感染。

2 感染人羣(Infective):指染上傳染病的人,他可以傳播給易感人羣。

3 移除人羣(Removed):被移出系統的人。因病癒(具有免疫力)或死亡的人。這部分人不再參與感染和被感染過程。
在這裏插入圖片描述
假設

  1. 傳染病有免疫性如天花、麻疹等——病人治癒後移出感染系統,稱移出者(Removed).
  2. 總人數N不變,健康人、病人和移出者的比例分別爲s(t),i(t),r(t)s(t), i(t), r(t).
  3. 病人的日接觸率爲λ\lambda , 日治癒率爲μ\mu, 接觸數 σ=λμ\sigma=\frac{\lambda}{\mu}

建模
s(t)+i(t)+r(t)=1s(t)+ i(t)+ r(t)=1
這個就是病人減去治癒的人,和上一個模型是一樣的
在這裏插入圖片描述
因爲有治癒後是有免疫性的,所以可能被感染的總人數要減少,減去移除者就是
在這裏插入圖片描述
將上式化簡爲:
在這裏插入圖片描述
i0+s01i_0+s_0\approx 1(通常r(0)=r0r(0)=r_0很小)

關於i(t) , s(t) 的非線性微分方程組,沒有解析解,只能通過數值計算得到s(t), i(t), r(t)的曲線,下面來看下曲線的數值解的MATLAB程序

這裏我們先設λ=1,μ=0.5,i0=0.01,s0=0.99\lambda =1, \mu=0.5, i_0=0.01,s_0=0.99
也就是平均一個病人人傳染一個正常人,治癒率爲0.5;開始的病人比例爲0.01,正常人爲0.99,設沒有天生帶有病毒抗體的人,所以r0=0r_0=0,之後若果病人被治癒,則具有抗體了,有抗體的人爲:r=1isr=1-i-s

ts=0:40;
x0=[0.01, 0.99];
[t,x]=ode45('ill',ts,x0);
r=1-x(:,1)-x(:,2);
plot(t,x(:,1),t,x(:,2),ts,r),grid
legend('i(t)','s(t)','r(t)')

function y=ill( t,x)
a=1;
b=0.5;
y=[a*x(1)*x(2)-b*x(1);-a*x(1)*x(2)];

在這裏插入圖片描述
可以看出:s(t)單調減,r(t)單調增,都趨於穩定, i(t)先增後減趨於0.
結果分析
先回顧一下參數
λμ1/μ ()σ=λ/μ ()接觸率 \lambda;治癒率 \mu ; 1/ \mu~平均傳染期 (病人治癒所需平均時間);\sigma =\lambda/\mu~接觸數 (感染期內每個病人有效接觸人數)
可以分析出:

  • 隨着衛生健康思想水平高,接觸率λ\lambda變小
  • 隨着醫療水平的提高,治癒率μ\mu增大
  • 接觸數σ=λ/μ\sigma =\lambda/\mu減小——有助於控制傳播.

我們可以試試稍微減少一下λ\lambda,增大μ\mu,來看下效果

ts=0:40;
x0=[0.01, 0.99];
[t,x]=ode45('ill',ts,x0);
r=1-x(:,1)-x(:,2);
plot(t,x(:,1),t,x(:,2),ts,r),grid
legend('i(t)','s(t)','r(t)')

function y=ill( t,x)
a=0.8;
b=0.6;
y=[a*x(1)*x(2)-b*x(1);-a*x(1)*x(2)];

在這裏插入圖片描述
綜上我們可以得出結論:想要減少傳染病的傳播,我們就要在接觸數σ\sigma上下功夫。

實戰建模

數據處理

首先,我用python爬蟲爬取了丁香醫生官方數據,一共5534條數據 特徵包括感染、死亡、治癒的總數,當日感染、死亡、治癒新增,疑似病例,時間,省份等14個特徵
在這裏插入圖片描述

然後用python進行數據提取,提取了較爲典型的湖北省的數據作爲我的參考依據
在這裏插入圖片描述

然後用python對數據進行清洗,提取出了患病總數,現存患者總數,死亡總數,治癒總數,時間,省份這幾個特徵
在這裏插入圖片描述
對日期格式進行修改,值保留月和日,並與死亡人數的位置交換
在這裏插入圖片描述
這裏我用python對提取的四個特徵分別進行了數據分析(主要包括計算最值,平均值等,),並把1.20日作爲第一天,7.02日作爲最後一天也就是第165天,做了可視化可視化處理。
感染人數示意圖
在這裏插入圖片描述
治癒人數示意圖

在這裏插入圖片描述
現存患者數量圖
在這裏插入圖片描述
死亡人數示意圖
在這裏插入圖片描述

經過上面的圖片與describe數據分析,我們發現有一天是異常的,患者多出了平時的十倍左右,經過查閱資料,這天因加強了檢測標準,所以增多了很多。爲了避免這個數據的影響我們選擇將這一天刪去(或者用平均數或中位數代替也可)
將上面清理過的數據存放到csv文件中

模型建立
模型假設
經過上面數據的分析,我們大體可以進行如下假設:
1.由於不存在封閉情況,考慮開放體系。
2.目前數據以天爲單位發佈,因此不考慮連續變化情況,只考慮離散的方程。
3.新型冠狀病毒的治癒人數和死亡人數相對較 小,因此只考慮 Susceptible(易感)和 Infected(感染) 兩類人羣。設易感人羣總數爲N
4.經專家鑑定新冠病毒患者治癒後至少六個月之內不會再被感染,所以設治癒後移出易感人羣。
5.設每個病人每天有效接觸人數爲 λ\lambda(日接觸率),且使接觸的健康人致病.
6.設病人每天治癒的比例爲 μ\mu(日治癒率)
7.時刻t健康人、病人和移出者的數量分別爲 s(t), i(t), r(t).

模型一

分析可以得到移出者r(t)=治癒人數+死亡人數
通過python數據處理,我們算出了r(t)的值,並將其可視化
在這裏插入圖片描述

我用MATLAB對其進行了擬合,擬合圖像爲

在這裏插入圖片描述

分析可以得到患者 i(t)=患病總數-移出者
可以通過csv文件的currentConfirmedCount 直接獲得i(t)數據,當然也可以通過 i(t)=confirmedCountv - r(t)獲得,對此我也做了可視化展示
在這裏插入圖片描述
通過MATLAB程序對其進行擬合,可以得到r(t)的函數圖像大致爲

在這裏插入圖片描述

爲了方便,利於公式推導,我們先設時刻t健康人、病人和移出者的數量分別爲 s(t), i(t), r(t). 所以有
在這裏插入圖片描述
可以推導出每日新增病例的表達式
在這裏插入圖片描述
在這裏插入圖片描述

由以上兩個公式可以推導出以下兩個微分方程
si -  i

可以知道初值
i(0)=i0.s(0)=s0i(0)=i_0.s(0)=s_0
因爲一開始治癒的和死亡的肯定很少,所以r0可以看爲0,於是就有:
i0+s0=1i_0+s_0=1
通過解以上微分方程我們可以根據經驗假設λ\lambda (日接觸率)和 μ\mu(日治癒率)的值分別爲1和0.5(也就是每個患者可能使1個正常人患病,患者可能有0.5的概率被治癒);由於一開始患者肯定比正常人少很多,所以我們設i0=0.01,s0=0.99。對其求解可以得到s(t), i(t), r(t),的變化圖像
在這裏插入圖片描述

MATLAB程序如下
ts=0:40;
x0=[0.01, 0.99];
[t,x]=ode45(‘ill’,ts,x0);
r=1-x(:,1)-x(:,2);
plot(t,x(:,1),t,x(:,2),ts,r,ts,x(:,1)/x(:,2))
legend(‘i(t)’,‘s(t)’,‘r(t)’)

function y=ill( t,x)
a=1;
b=0.5;
y=[ax(1)x(2)-bx(1);-ax(1)*x(2)];

結果分析:患病人數肯定有個高潮,但之後高潮就會減弱,並逐步降低爲0。隨着醫療衛生條件的不斷提升,患者的 λ\lambda(日接觸率)肯定降低,μ\mu (日治癒率)肯定上升,所以我們可以把λ\lambda調一點爲0.8,μ\mu調高一點爲0.6,可以得到以下趨勢圖。所以應對傳染病很關鍵的一點是我們要提高醫療衛生條件
在這裏插入圖片描述

模型二

實際上,λ\lambda (日接觸率)和 μ\mu(日治癒率)都是隨着時間變化的,這裏我們設s(t), i(t), r(t) 爲第t天健康人、病人、移除者(病癒與死亡之和)的數量, s(t)+ i(t)+r(t)=N..
(t), (t) ~第t天感染率, 移除率(治癒率與死亡率之和)
di/dt=λ(t)s(t)i(t)(t)i(t)di/dt=\lambda (t)s(t)i(t) - (t)i(t)
因爲s遠大於i, r,s(t)視爲常數,所以有
(t)i(t) -  (t)i(t) (t) i(t)

取差分近似導數
(t)(t)=Δr(t)/i(t)(t)=(Δi(t)+Δr(t))/i(t)

我們可以先用真實數據對(t)進行展示並進行擬合

在這裏插入圖片描述
當然同樣的方法對(t)進行擬合

做不出來了,好難,光這些東西就弄了四天,到了數學建模國賽得多難多累啊,哎,讓我這個小白手足無措。畢竟還沒有正規的培訓,這個模型等期末考完試一定好好做做!!!
衝國獎
衝國獎
衝國獎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章