数学建模社区-数学中国

标题: 数学建模中的传染病模型及其编程求解 [打印本页]

作者: 浅夏110    时间: 2020-5-17 09:59
标题: 数学建模中的传染病模型及其编程求解
问题的提出
& ]2 J9 q/ |  x. ~医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。
& Q% W7 c0 \  V2 w# g6 `2 x$ d
7 w& Y5 P  s* v& N0 U" d指数模型
7 ~4 E9 j( j* [1 l  S% A5 @定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算  c* I' [4 Q3 a
i(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t
& k" {& y( {7 r" q2 T. _i(t+Δt)−i(t)=λi(t)Δt0 A7 U+ I7 b: d8 M! a6 a
- C& f& y' k. t: M, T
将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
6 R4 N3 U! v+ ti(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
8 X. t- A# Q( D' Ai(t+Δt)=i(t)+λi(t)Δt% D' `5 R. k4 ]$ Y% T; J

' r- H& S2 S" z$ ~3 h. ^; B以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。2 l5 b# n" O6 ]: @: n
  j+ m0 r8 q) X4 H( V" F
import matplotlib.pyplot as plt
+ A; O8 t5 q5 R3 j1 v%matplotlib inline& \' _& P- ]& {4 w$ v" b$ Y0 y( X
deltaT = 0.01/ _0 Y- \1 ~4 E  X, Z4 R
lamb = 2% Y2 N  h9 h! e8 J
i_list = []
1 Y7 b! ]0 }9 w9 j  k1 P' d  Qi0 = 0.08; # 初始有8%的人患病& _3 z9 T9 i9 p' b& V4 Z
i_list.append(i0)
" R% O4 ?/ @0 O7 ~6 E( t) ?2 XTot_Time = 10
0 B' B$ r% c( u* y! M3 yTotStep = int(Tot_Time/deltaT)7 C# h) l5 ?% i& N# K; h9 A
##
* T( z6 g0 G4 B/ L" I, ?for i in range(TotStep):  K( s& W% ?7 T+ h; @1 X
    i_new = i_list[-1] + lamb * i_list[-1] * deltaT  t6 }. ?; Y% ?1 g" V$ H
    i_list.append(i_new)
) e* K% {/ t; X  }9 |plt.plot(i_list)3 M8 I  A- n6 h4 Z4 h% V7 |
+ [4 ^$ m- j. G% ]) ~8 i
将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?- Z# d2 W7 v1 H% P$ z

. D% N# j' f* z5 ]9 M( d- a8 i4 t3 [) [% N- _& e
实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。
4 |' A1 h( A" `/ x5 |0 d* ?1 S' E+ r* X- n: x. I: {7 x) v
SI模型
0 F) d- S, z  p) P& S( B现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:3 I1 {6 F* ~1 g4 V$ J
# D: n! H+ y( D
在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)+ l$ q$ d7 D: x# i( f
每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率
! z5 w3 f9 i5 ?仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算* v5 S2 I3 E2 I+ a* t

; _. g% x" _, U# q* }- d0 PN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt N[i(t+\Delta t)-i(t)]=[\lambda s(t)] N i(t) \Delta t
! n7 {; _' v8 y" {4 rN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt" O# o+ e3 X: l2 X9 ]# ~
! k0 b4 d. a+ k* K7 u( s
消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式7 m- ?' ]0 Z# d$ v
i(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t
1 e6 G2 ]' q9 t! Qi(t+Δt)=i(t)+λi(t)s(t)Δt
- j$ b1 k8 H4 b+ a6 Y9 z. t- K' L! p: T9 F" c: s" a
同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:
5 \; W8 x$ f3 V" \2 h7 ^1 F' ?9 P" M
$ B3 i* n( u) R( }import matplotlib.pyplot as plt
; r' s5 A  d9 K/ t% Q%matplotlib inline
0 H2 V  o! Q  {$ ^1 e  }deltaT = 0.01% J# [9 j* F  g  L5 }2 Z. N
lamb = 29 ?1 `. M6 Y5 K( b7 F1 r* h  [
i_list = []/ }& u  Q4 c0 Q" Y% {9 q
s_list = []
& J; Q  }8 S4 l2 Y$ Bi0 = 0.08; # 初始有8%的人患病3 ]7 j5 o7 N5 i2 W! y: b$ t0 w
i_list.append(i0)
7 [  [" {5 o( j" L% As_list.append(1 - i0)
; w( |+ H; b, c+ k7 c& Y* |0 ~5 R3 ATot_Time =5
- d/ T+ L1 }' y% z1 Y, RTotStep = int(Tot_Time/deltaT)% ]$ L- f7 K" l4 y2 X" l
##
' K: a- T2 V  z9 N8 Q% `6 ~for i in range(TotStep):
; J) P2 z% V: i7 A( Q3 e    i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]& Y' w$ r3 F" l5 }1 @& ~6 ?1 v; D
    i_list.append(i_new)
$ S/ f: [+ Y4 c* @; S    s_list.append(1- i_new)
3 u  E  E( V" b1 S3 D7 v1 n' W0 G! |Time = [i * deltaT for i in range(TotStep + 1)]4 o+ K1 O8 y; Y
plt.plot(Time,i_list): C! l# b% Z2 _) G1 e4 f
plt.plot(Time,s_list)5 D8 J% ]8 @5 _+ p0 ^, L
plt.title("SI",fontsize = 20)" k2 v! a6 E% z- ~
plt.xlabel("Time")6 g8 h& s; W4 h. j! p& Z! E) k6 ?5 s
plt.ylabel('i(t)')) s' w/ T0 @8 M0 ~$ [$ |

) e- w  O6 l: I5 K0 I$ _; l从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。
/ D9 I( p# Y5 y0 v. F0 d
: [  D8 K3 p( E6 U6 Q1 a$ y# D- u% ~然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。
3 u2 v6 Y' E1 ~! B. u- Y  u7 M. `————————————————/ i) z4 N" j* h, f* F/ L
版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 g& ]! G4 z) ?, P5 d原文链接:https://blog.csdn.net/baidu_26746963/article/details/939183830 l- f# N7 M6 i. v. ~7 E9 q
4 B8 E6 X  b( W, t" Q! `" E1 I/ |
! W5 ?! q+ c2 G





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5