. d" L ?: I+ a/ j0 R% F 6 ~$ f) U$ S: ^6 O1 u7 O0 e# ], V5 }, O首先,把传染病流行范围内的人群分为 S、E、I、R 四类,具体含义如下:6 p! N# v5 |0 i
" O; E' W9 f' S+ Q S, M # t; s3 ?& P. Q2 d, C9 U2 JS 类(Susceptible),易感者,指缺乏免疫能力的健康人,与感染者接触后容易受到感染;& @8 p' z9 r0 e' T
( N% C- ~# Y/ \: u3 }' O # w0 C/ @; j% P: k: g( C5 X# Y7 sE 类(Exposed),暴露者,指接触过感染者但暂无传染性的人,适用于存在潜伏期的传染病; # p8 a. J9 t: O/ w, x& g/ \: T 5 E# a! I. B7 n6 p/ c- \% w2 P4 @2 u0 ^9 g2 t6 A9 b7 D1 L
I 类(Infectious),患病者,指具有传染性的患病者,可以传播给 S 类成员将其变为 E 类或 I 类成员; 9 l; Y- C5 I) a& Q8 E 7 A! B% n) o% g8 Z 6 i/ _3 A) K: {7 g3 }* bR 类(Recovered),康复者,指病愈后具有免疫力的人。如果免疫期有限,仍可以重新变为 S 类成员,进而被感染;如果是终身免疫,则不能再变为 S类、E类或 I 类成员。 7 x) }* q V, y7 L9 p8 V) Q y6 p6 T( t4 v( G' H+ Z# B) m
! Q9 F6 ^0 G' b/ @9 O常见的传染病模型按照传染病类型分为 SI、SIR、SIRS、SEIR 模型等,就是由以上四类人群根据不同传染病的特征进行组合而产生的不同模型。 K/ Y) z" w- a: f1 P+ C 5 Z* b$ H" q0 q! x7 c ~& r0 _3 \ A+ X' H N- j8 ~
/ h. k, s5 m- {( K5 ^8 T/ c0 G( ~) Y. b% _
Python小白的数学建模课-A3.12个新冠疫情数模竞赛赛题及短评' ]; `1 j) V- [: c8 w. X F0 }, i
Python小白的数学建模课-B2. 新冠疫情 SI模型 : u2 P' P, H9 K% I/ l/ M4 FPython小白的数学建模课-B3. 新冠疫情 SIS模型& \ E m0 ]/ Y m# g: @+ t e/ a
Python小白的数学建模课-B4. 新冠疫情 SIR模型 * j$ B6 D ?# f6 } S0 b6 j+ o FPython小白的数学建模课-B5. 新冠疫情 SEIR模型8 T3 s4 l! i, m6 E& h
Python小白的数学建模课-B6. 新冠疫情 SEIR改进模型 4 J( o0 _6 y5 a8 Z( `* H. |* k9 vPython数模笔记-PuLP库 , ~" R6 R* t$ w: V& r ) |0 A, F0 |0 C2 R7 V/ _ 5 t9 O" o' @& o( c5 l0 q & d5 @9 ]# U' g0 \) F& B* J. C% _* Z$ D' r
2. 疫情传播 SI 模型 . [$ L/ E) ?. }( s# c% ?2.1 SI 模型的适用范围 , {# |; O- j6 @$ B" nSI 模型适用于只有易感者和患病者两类人群,且无法治愈的疾病,例如 T型病、僵尸。+ s5 M2 F- P9 f
! n/ z8 D' V3 \- Q: ~0 z3 U6 s9 G2 ]/ V5 o6 _
: ?# [$ o$ e/ ?4 P # E# n; T. k; l2 Q2 }! x2.2 SI 模型的假设, i, n% J, F$ u* Q/ A
考察地区的总人数 N 不变,即不考虑生死或迁移; ; P" H6 g4 F' h( P: O( L人群分为易感者(S类)和患病者(I类)两类;% L3 e1 J) H) b0 Z5 `6 h3 N2 c3 c
易感者(S类)与患病者(I类)有效接触即被感染,变为患病者,无潜伏期、无治愈情况、无免疫力; p. ^( m3 x" S- e每个患病者每天有效接触的易感者的平均人数(日接触数)是 λ \lambdaλ,称为日接触率; / A8 z$ F, Z6 `将第 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 # l8 Q0 D4 m4 e& F' ~9 b5 e
0 5 ?( E7 W5 j, W6 j5 V9 e 4 x8 U: q. n4 C( ?! t$ u
、i 0 i_0i ! L1 o! s4 X6 z7 E0 . R9 c* g" q5 n- P * p$ A0 l* [$ L 。 / E+ f6 C& r' h# e2.3 SI 模型的微分方程* q* I% d- S V- ?# P' r& [0 h
由 , T; |* [" ~/ P$ qN d i d t = N λ s i N\frac{di}{dt} = N\lambda s i$ u( Y' g+ H, O; P) t1 P6 f2 Q9 }: m
N % ] c9 Q0 N; W5 `8 U6 G, F' O
dt% v9 h, j3 z7 s
di 1 B" W% C# }9 L: j f( I: \ v# {5 r" Y+ f =Nλsi/ U& h* @! K4 E9 ]
* H- U3 e0 z. T/ a2 b( l/ l# Q- @- Q* P
得:' Z* m5 o7 P, [8 a) f
d i d t = λ i ( 1 − i ) , i ( 0 ) = i 0 \frac{di}{dt} = \lambda i (1-i),\ i(0) = i_0. A" h3 n; }. |( V
dt 1 Y& n0 }6 f, a" cdi 8 P+ s7 w, D/ o 3 h3 Y5 E v; o4 B) v& ^" ~1 z# p =λi(1−i), i(0)=i ) o- X- t- |: m
0' l4 x8 w+ I# w; K( }
2 Z& w4 p/ E m. I ! [( m/ f: K c( @6 W: p
) ^+ C7 Q7 [; h, p" Q9 L2 @& ^" k% f8 g" i+ D+ ^/ K @
这是 Logistic 模型,用分离变量法可以求出其解析解为: 4 B' W' d9 m, I; K" W& Q: Q8 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)" ?' O6 k" \! `. X% \
i(t)= ' N* k' R" Z+ h
1+(1/i 9 c& X; @# |: e) \0- d" p8 K Z$ b6 Z+ `1 l
+ b, A7 O K# v$ x. y8 i% h
−1) e & Q0 |; t; v3 K% l) g \8 @
−λt0 J, K8 c+ _2 W% r. s6 ?
+ t6 s& i7 y7 E
1: U" B/ Q6 T& T: t$ H0 E
0 w' e, c: q9 {: t' v+ Q% Q
# J0 L7 \, F) K( Z& a
I(t)=N i(t)& q* j- i' L' u, f0 S2 `1 h7 {. j
( n8 Q. g2 f. e2 v O0 e
' K6 m& C" E9 ?# O1 D& T+ u' Y; i, H$ s0 X( Z
* e) s1 P1 H: l" L3 ~$ b2 ]# H
3. SI 模型的 Python 编程 / C$ f0 Q6 N$ M5 T$ M3.1 SI 模型的解析解 V2 \) p, @, ?; s: S. U4 L/ I上文已经得到 SI 模型的解析解,对此很容易通过 Python 编程实现,详见本文例程。 4 ?5 h' f% v1 x$ U: O6 V8 ~+ B; P& k4 |! r9 Z
: v6 U* v6 g+ _# j0 n( K) q& h3 \
虽然 SI 模型的解析解并不复杂,而且解的精度当然是最好的,但我们仍然不鼓励用解析解的方法。原因在于,一是对于小白求解析解的过程相对复杂困难,而且可能出错,二是对于更复杂的模型是没有解析解的,即便大神也只能用数值方法求解。既然如此,不如从一开始就学习、掌握数值求解方法,熟悉数值解法的编程实现。 # g: i f9 T5 A+ F. i . a- n' {- k: i2 {; s7 I9 J0 W s2 I 2 Y/ ~( k5 m( p3.2 SI 模型的数值解2 h0 I) ]8 Z# K1 b
SI 模型是常微分方程初值问题,可以使用 Scipy 工具包的 scipy.integrate.odeint() 函数求数值解,具体方法可以参考前文《Python小白的数学建模课-09 微分方程模型》。" v; j" ?3 J. ~- x3 |/ X
0 R; P2 b! p. G: q" x& w5 g0 w0 t7 j# 绘图 9 Q6 o2 P" L6 |; }! r P p4 lplt.plot(t, yAnaly, '-ob', label='analytic') $ M0 `5 R) {' ~8 ?3 Jplt.plot(t, yInteg, ':.r', label='numerical') ; Z# F+ U3 F% s6 r" ^) Q0 Y; t$ vplt.plot(t, yDeriv, '-g', label='dy_dt')% D6 x4 q' m+ h9 C
plt.title("Comparison between analytic and numerical solutions")5 ?# z( o! G2 N- o
plt.legend(loc='right') ) e% @) B! M3 g2 vplt.axis([0, 50, -0.1, 1.1])7 ]' E- J6 K* F: |) i
plt.show() ) @' e4 e& }9 R& U! L6 K1 % r/ h" I3 K1 z; C26 g. p+ ~. M$ Q4 m0 J+ ]. h7 i+ ]" i" V
3 i; D" J6 F- J- f" r
4$ }' v& G8 s7 B
5 ]1 k. L3 f8 D1 v" Z
6( ^' s) Q- A- j$ Z
7' p# U, K" Z' E" `
8" D" Q$ m$ { ?* N8 a
9& |: W* m1 M+ I1 k
10/ R2 T! F- O, A5 R3 @4 C3 H; q
11 . e; J3 H q: ?- S" G9 T2 E12 M) K. Z4 i/ m5 R+ R o13* ~% B1 I, y% X
14 6 ], C2 q4 g8 v& ?6 [15) c7 _) Y3 U2 ]1 v2 {% m. x
16 , M7 N) \4 Y8 v8 ^ X; A17! }) b; ]7 r u) o$ Y& o
18 $ o; z! v. n/ S/ {+ d: e l19% S, F) o+ V4 v: z* E' _& u; {% s
20 3 t( [9 f; J$ w) `$ e0 N21 * R- B: p8 r1 ^2 G1 H. u y& ^3 W/ p22 ( h9 w: B6 O7 B' P% l23% v# Y: u' u' ?, W% Q+ \
24 1 O* v9 o( z9 @3 ^! C: u' M6 g25 * U4 z; `+ D+ r+ Z* J) Q- E26* g6 e% E2 P& u, j1 F: Y) J
27 ! O* B) k* [1 `: [28 F' g; o4 \# l4 s5 M" x29 ) R4 ]/ z0 o+ A, |2 y; k* `" `- d! u: G: I6 |8 s7 S' p
( Z8 w8 o. I- d3.4 解析解与数值解的比较 7 P3 o2 r# g& F& I& ?( o + {4 ]) _2 ~# \3 ?% [0 j; d8 R5 h, K B
本图为例程 2.3 的运行结果,图中对解析解(蓝色)与使用 odeint() 得到的数值解(红色)进行比较。在该例中,无法观察到解析解与数值解的差异,表明数值解的误差很小。 G @% r4 i5 S3 }; J4 l" X5 ~
8 Y: E$ r/ h# }+ C2 T! C2 _% P) m" Q0 Q2 L
图中 d i / d t di/dtdi/dt 具有最大值,最大值表示疫情增长的高潮,达到最大值后 d i / d t di/dtdi/dt 逐渐减小,但患病者比例很快增长到 100%,表明所有人都被感染成为患者。$ k2 z& N: T9 r8 H; W: J0 e) M8 V
; H% j3 H+ _1 h. B9 M4 D0 \' V( K2 j1 e. J, G3 k7 N" L) W$ j: J1 i" x
这是特定参数的结果,还是模型的必然趋势,需要对参数的影响进行更详细的研究。: |9 F# t6 X( C/ a, q7 V* {; ]
% c9 N* [& i3 @( f& g$ Y
# m8 h+ ]/ \* U
9 X8 j/ G) e4 W! C 3 b- D4 t! U2 b( R8 V4. SI 模型参数的影响8 G3 r) j% F( f& e6 \3 ?
对于 SI 模型,只有日接触率 λ \lambdaλ 和患病者比例的初值 i 0 i_0i * O9 I: a4 f* ^* N2 O- }" @0 ' Y+ t& ^& c& i. Y: U1 M j! W 1 P& K0 g+ L) p, ?. ~
会影响模型的结果,其它参数如总人数 N 并没有影响。! j5 ^ v8 }6 \* b# ?
( z; \: s4 k& L+ r5 o% Z ! ?2 O+ A5 Q' k3 K9 B8 d# _8 m; H4.1 日接触率对 SI 模型的影响 * E' |# c) Y. ?* I) }# c; Y% o* A t8 K: _! ?. j0 l; {: k
" g! _9 h u' V0 v* S- g N9 B& j% `对不同日接触率的比较表明:0 P' I4 x' `' p V0 N+ {9 o2 m4 G' m$ j
" e6 Q/ D& E& Y8 f' I1 E
; C) [( x4 Z/ \日接触率越大,疫情从发生到爆发的时间越短,爆发过程的增长速度也越快。9 k$ X: G. f k3 P
不论日接触率多大,患病者的比例最终都会增长到 1,表明所有人都被感染成为患者。 ! Q0 u, e w" y( a4 M不论日接触率多大,都具有缓慢发展、爆发、增长放缓 3 个阶段,进入爆发阶段后患病者的比例急剧增长,疫情就很难控制了。 ) Z7 e& y9 E. `: A! O' q0 l# f3 C }6 J( o( b" _% d
8 I3 o+ T+ V. w2 r" o X4.2 患病者比例的初值对 SI 模型的影响" \0 R" U1 e+ Q