% E6 X( c' V9 o% y# d9 Z/ L1 c Python小白的数学建模课-B2. 新冠疫情 SI模型 3 d& _5 l J+ S % H3 Y+ ~0 t5 H* m " `0 X2 u& N; p; E4 V传染病的数学模型是数学建模中的典型问题,常见的传染病模型有 SI、SIR、SIRS、SEIR 模型。 " n. d4 ~7 ], D% L! o8 Q0 u5 [4 R2 U% w8 x2 V7 H! f U- M6 A
4 d7 e( K4 q: p- C5 ], HSI 模型是最简单的传染病模型,适用于只有易感者和患病者两类人群。 % B/ a$ s4 U' d8 E8 X7 G4 X1 h/ ]$ O: Y3 G. g* J8 g+ E6 W
; U" A! i1 C4 ]. p/ b5 s& s
我们就从 SI 模型开始吧,从模型、例程、运行结果到模型分析,全都在这个系列中。 1 s+ q2 C) `3 g+ y# b6 n% w2 x r x+ a! j0 g7 p
1 R! h } Z# [3 d『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛达人。) A) r% K* J0 h! B2 G
& Q% Q5 v8 K$ T L4 d( r# M9 n" s) `
5 G& M7 u% H6 u) r& y n
7 M. M% K( \0 ^$ n
1. 前言 . x8 I1 X3 M2 H4 `新冠疫情不仅严重影响到全球的政治和经济,深刻和全面地影响着社会和生活的方方面面,也已经成为数学建模竞赛的背景帝。 2 ?2 X/ M8 ]' [3 M3 `. Y/ R) I7 F p" n3 W
- T: B y# S. y0 g0 p/ ]( P传染病的数学模型是数学建模中的典型问题,标准名称是流行病的数学模型(Mathematical models of epidemic diseases)。建立传染病的数学模型来描述传染病的传播过程,研究传染病的传播速度、空间范围、传播途径、动力学机理等问题,以指导对传染病的有效地预防和控制,具有重要的现实意义。 . D$ u f$ u7 c5 V/ F x0 o 7 ]- N# S2 H' K& c& G/ Y: G; S; B- g5 M. _+ t( f
不同类型传染病的传播具有不同的特点,传染病的传播模型不是从医学角度分析传染病的传播过程,而是按照传播机理建立不同的数学模型。* z8 @: v* E0 H: X
. x. N+ R. R5 f' Z5 a
, ]0 ` ^) w4 z% E. `1 G7 [首先,把传染病流行范围内的人群分为 S、E、I、R 四类,具体含义如下:' b( W/ {; K: J( k9 K- H
/ H5 ~* T# o6 M* h9 V3 i% \1 z+ _# v: {4 g7 \
S 类(Susceptible),易感者,指缺乏免疫能力的健康人,与感染者接触后容易受到感染;+ g1 K4 ]" m) S
& F# B5 E/ C# K, Y1 e w5 F
y; X% W0 r) q9 H+ b- G& G
E 类(Exposed),暴露者,指接触过感染者但暂无传染性的人,适用于存在潜伏期的传染病;# W) v C. V8 X* x
: x0 a5 e, a. l& i' G/ e: w, o - T# N# }: |' X* _I 类(Infectious),患病者,指具有传染性的患病者,可以传播给 S 类成员将其变为 E 类或 I 类成员; 7 K6 V. Y. u. Z# L ! |+ n* F* V- X7 [$ ?; e/ j* n2 J , f' H9 [1 B4 r0 k0 fR 类(Recovered),康复者,指病愈后具有免疫力的人。如果免疫期有限,仍可以重新变为 S 类成员,进而被感染;如果是终身免疫,则不能再变为 S类、E类或 I 类成员。 4 D% L, f( {$ K: q6 t 0 S4 s3 ?: D. }9 g# Q+ G" W 9 |, R( T. D; B, |. S; N常见的传染病模型按照传染病类型分为 SI、SIR、SIRS、SEIR 模型等,就是由以上四类人群根据不同传染病的特征进行组合而产生的不同模型。 ' _& j# b) M. X5 H5 Q 9 O# E, D: }2 W1 m# x& h7 N% o+ U8 ?% E w/ m# Q! S
7 Z& L- s! z' l/ C# Q! U$ g
S* P* T& A- gPython小白的数学建模课-A3.12个新冠疫情数模竞赛赛题及短评 ! O/ A+ I. K" p1 f' y9 aPython小白的数学建模课-B2. 新冠疫情 SI模型 6 q6 M4 K6 M* W. s- m1 EPython小白的数学建模课-B3. 新冠疫情 SIS模型( K# u5 w1 Q+ Q, [1 o
Python小白的数学建模课-B4. 新冠疫情 SIR模型 + T9 [+ u; h8 U6 a. d0 P C/ O3 jPython小白的数学建模课-B5. 新冠疫情 SEIR模型, u" p0 F/ }' A: l7 A9 d. \, y
Python小白的数学建模课-B6. 新冠疫情 SEIR改进模型 + H, W9 V9 M0 m; W( M" UPython数模笔记-PuLP库 # [- c; R7 A- _# W 4 G* H6 @& p& [: ?/ B . z/ H( i y7 p6 R" q 5 A, B5 t+ E4 I% E @2 P* J, B
2. 疫情传播 SI 模型5 F( m5 q# s7 ]' v, O
2.1 SI 模型的适用范围7 c# Z4 l9 y5 U) t0 y+ I/ [# b, c
SI 模型适用于只有易感者和患病者两类人群,且无法治愈的疾病,例如 T型病、僵尸。- u- A* C/ V% r
9 F) j% X( A% s5 z" ]- h) v% c0 |
% n7 C3 q5 l4 E$ v6 _" p# X3 q( Y2 u, O0 r& I$ Z) I0 r
$ _( O7 y% r: [1 b, b0 P5 h2.2 SI 模型的假设 / s5 f5 z: b3 y/ j: t o考察地区的总人数 N 不变,即不考虑生死或迁移; 6 D" |4 N( A9 h* [) t人群分为易感者(S类)和患病者(I类)两类; h* ?5 P2 b `易感者(S类)与患病者(I类)有效接触即被感染,变为患病者,无潜伏期、无治愈情况、无免疫力;$ L+ [: n) t1 n/ D' O2 a( R$ s5 N
每个患病者每天有效接触的易感者的平均人数(日接触数)是 λ \lambdaλ,称为日接触率;9 G# }& F/ O0 e5 }) r: c' n
将第 t 天时 S类、I 类人群的占比记为 s ( t ) s(t)s(t)、i ( t ) i(t)i(t),数量为 S ( t ) S(t)S(t)、I ( t ) I(t)I(t);初始日期 t = 0 t=0t=0 时, S类、I 类人群占比的初值为 s 0 s_0s 0 ~, b3 Y) C7 z' T# z
02 P h3 }8 G m
7 H/ O- r- r' `, l0 r- m' [ 、i 0 i_0i . y& j2 e& u8 q5 k$ a( ] L0 B: k
05 Y, _/ K/ r5 {7 u
* I0 j `8 ]# [
。 7 [4 `- }+ W) s; ?7 n" V2.3 SI 模型的微分方程& L" L% z2 i/ `; a& _$ w
由: C* K/ g9 Z& |
N d i d t = N λ s i N\frac{di}{dt} = N\lambda s i+ Z+ _8 A& ~1 o' c" m8 A l' ?
N * e; Y( _8 r4 c2 Q3 N; A9 G
dt 1 h( ~; b) z- d4 D: y6 |; F/ \7 adi& f% d2 M& h' Z! u/ M$ q
; m; F; I y7 B: y4 P2 S5 p
=Nλsi * {* R- V T8 y, v9 w " z) _( o C7 E }" @# k9 A- h4 i
得: ) A0 R5 U; _3 v; Cd i d t = λ i ( 1 − i ) , i ( 0 ) = i 0 \frac{di}{dt} = \lambda i (1-i),\ i(0) = i_0- r2 Q( V: b3 y3 t. ?$ L& U: I
dt* p( z. g. E6 I+ ~" B7 b; |3 ?
di / z8 V! Q/ u3 t7 N7 l , S1 L" m P+ d9 \ =λi(1−i), i(0)=i 8 m% Y5 d" }3 [7 B
0 + j3 h, U8 h$ a2 b2 p 6 y G( J6 H& R* d! b% D4 V 1 ^' X+ K( M2 d. q1 i" @: k8 {8 F% {7 A) T6 \
& r& _4 q3 R9 a1 N这是 Logistic 模型,用分离变量法可以求出其解析解为: + A; H: G( j5 x, t3 ii ( t ) = 1 1 + ( 1 / i 0 − 1 ) e − λ t I ( t ) = N i ( t ) i(t)=\frac{1}{1+(1/i_0 - 1)\ e^{-\lambda t}}\\ I(t)= N\ i(t) 0 p& N( F- E# g2 oi(t)= . _7 }' E& s" u$ z1+(1/i 4 o- U, i: O3 b8 Y1 n4 q+ B02 k; R: U! u7 g9 G2 l/ |- p, A3 H
- C( e# v+ V' g
−1) e & N7 o* h# M6 v+ k0 v−λt D# W7 M5 b4 k3 y ) \3 `1 I; X( J8 j3 \7 L
1- D9 l1 V4 T& y. H6 v
$ I7 e% L. S1 y8 p% {
+ [! g- n- N; I- A/ |
I(t)=N i(t) " G8 J/ O6 Q, B/ H) x C; Z" I; r: L" ]# }& }
6 Q) Q$ d) I T7 R 6 }( _" G C0 M, ]$ [ , B$ b4 h; b1 j3 u L3. SI 模型的 Python 编程7 Y% M. ~8 ^+ ?$ t& ?" Q& x+ G
3.1 SI 模型的解析解% ~) g) X6 K1 D0 Z) o, D' J* f
上文已经得到 SI 模型的解析解,对此很容易通过 Python 编程实现,详见本文例程。+ s, ^9 @* q- {# p/ J
1 M2 L5 ]8 U0 V5 H
0 [. u' y; C; T
虽然 SI 模型的解析解并不复杂,而且解的精度当然是最好的,但我们仍然不鼓励用解析解的方法。原因在于,一是对于小白求解析解的过程相对复杂困难,而且可能出错,二是对于更复杂的模型是没有解析解的,即便大神也只能用数值方法求解。既然如此,不如从一开始就学习、掌握数值求解方法,熟悉数值解法的编程实现。 , _/ J8 w. o) ?0 ]- r" ^1 ^ 1 B$ y$ A3 W+ M 5 a# n" {$ c: z/ X' r4 p6 ?0 a+ Y6 U3.2 SI 模型的数值解 3 R. B9 _: K3 G0 mSI 模型是常微分方程初值问题,可以使用 Scipy 工具包的 scipy.integrate.odeint() 函数求数值解,具体方法可以参考前文《Python小白的数学建模课-09 微分方程模型》。4 I# F/ d. L* M
) J2 \1 _# Y( k* L- Y% k: L) T2 j! m