数学建模社区-数学中国

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

作者: 浅夏110    时间: 2020-5-17 09:59
标题: 数学建模中的传染病模型及其编程求解
问题的提出
4 C4 v, x4 I& e+ l) V  U医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。6 w0 M- N1 l( A7 V! z2 h8 f

8 r1 e, s. P; J6 S% t" j指数模型  v! J$ A5 |* [+ T# n' j+ D5 b
定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
8 Q7 L7 ^6 b5 c  Y8 Y: c! [8 r: Ci(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t
6 D! q1 d8 [+ q9 ki(t+Δt)−i(t)=λi(t)Δt6 F& U& K1 u9 @/ M: y9 Y5 u

% T' M2 i" l; e4 w6 L: J; N* ^将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式% [- c" @- D9 r0 I  }
i(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t. K) x4 g- W0 U3 l
i(t+Δt)=i(t)+λi(t)Δt+ N# K; h* d" r% @9 s& l3 x3 C3 N8 I
" A) |+ V2 E- r6 a% @
以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。- N, T3 ?, Z/ Z4 }9 F

  w7 Y8 H5 u- Z. W* h: @import matplotlib.pyplot as plt
6 e3 X1 B( {: V6 C( Z  o%matplotlib inline
( X( S7 I: [& U0 bdeltaT = 0.01. Z, R" z( |; M0 Q
lamb = 2
( ]& e$ Q5 \! C3 }' R" pi_list = [], F" x1 x6 V/ u2 \9 V( r
i0 = 0.08; # 初始有8%的人患病% S) \3 S+ R- ~6 d- j
i_list.append(i0)3 s# O0 ]2 ]6 i3 W
Tot_Time = 106 }3 e- H+ w. `4 J, i9 x
TotStep = int(Tot_Time/deltaT)
$ D* H6 q% O1 O" E/ C##
# m, h! i% x# h+ j6 G% D! y1 J0 ]for i in range(TotStep):
; S6 N/ k2 f+ H+ \9 \  x2 k0 V5 `$ r    i_new = i_list[-1] + lamb * i_list[-1] * deltaT
$ q; A5 X" f. Z7 E& U2 P4 C: n    i_list.append(i_new)
* B- q2 [. a( S# Rplt.plot(i_list)
, t1 O0 P. ~/ X: K' d& i5 m! l# @5 E2 [' N: x! ]  {1 m
将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?
) o( e. a' p. Q! J7 [& i$ c. c9 ]* I0 ?

& M' o2 P0 E; l, _1 F实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。% r- r9 f/ D2 e* ]; M9 }

6 n% |4 g; ~* q7 R4 ]SI模型$ ]+ t) [- ^1 T/ U, O5 u5 A  ~
现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:' Z7 c; }8 W6 C$ Q$ Y$ q! b+ X- f

4 \( X# U- E! D4 D! }1 g在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t): ?" d  o" M) }+ {/ F
每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率& ?4 w) ?- G0 x% S7 s
仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算  c$ d2 M  w2 c, S8 _  z; X

9 U6 p5 {; L7 ^; q. h/ kN[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
' C' X9 d- Q! vN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt
0 d/ ^1 {4 ~! ~/ \# ~
: o9 L( k' m7 N( y! d消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式' f7 J' }( t4 V. F
i(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t
( w7 |8 P1 B0 O4 ai(t+Δt)=i(t)+λi(t)s(t)Δt
# V. j$ x& X3 P9 v' {$ S! }3 w
1 c( {- k. a3 A/ U; I, _  l4 I. J同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:
7 a" h" O1 F; p! }9 ^. E1 z
9 {. [- |) c2 G5 [8 Oimport matplotlib.pyplot as plt
  [5 j1 h! ]  Q% Q4 ]% o5 o- R0 o8 n%matplotlib inline
( \* }2 I9 \5 A% p* F  B9 edeltaT = 0.01
% Q# q0 C- ~" H1 B( Y' Qlamb = 29 F- y$ u. W/ F7 i
i_list = []
3 C: h  w+ q5 S+ Os_list = []
$ d0 f9 r) ]' y" O2 l5 gi0 = 0.08; # 初始有8%的人患病' z9 V; R0 |$ q  I. R
i_list.append(i0)& d$ _. `8 |% Q) ?0 f* f
s_list.append(1 - i0)
6 D3 |! i4 H( `+ yTot_Time =5
4 D5 `8 f' A/ n; `TotStep = int(Tot_Time/deltaT)
& |4 r/ C, G4 n- V1 g##
* d2 b+ M+ G& O3 a8 ffor i in range(TotStep):
5 q3 d( \4 g) v  g' u7 D    i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]
; i3 c/ Q; B& Z, n/ D2 m    i_list.append(i_new)
1 ^2 E! t8 Y. h) K1 z+ q    s_list.append(1- i_new)6 @  }' M; F( V8 }( m6 B$ Q
Time = [i * deltaT for i in range(TotStep + 1)]
- Z) D$ }. @0 f2 P) D: i8 w% rplt.plot(Time,i_list)
% R" R- m7 c! j! Lplt.plot(Time,s_list)
$ A9 Y- X8 |$ p# m% X0 S5 Uplt.title("SI",fontsize = 20)
& P7 X+ \+ U+ U9 iplt.xlabel("Time")" y8 L, n& V: c* ?
plt.ylabel('i(t)'); C& h" d& ^0 e% Y
5 _: c; G) k% h. p
从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。
, M- O# {4 Q9 `, i% W  q! W, `# U! A) b" h2 u
然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。
6 k) x* h# i, H5 h————————————————% W) U% L# K$ D, H" d
版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- s3 x& J! Z; u9 x/ A8 _# u原文链接:https://blog.csdn.net/baidu_26746963/article/details/93918383
- o" r: q( L- g+ B7 G. X& w+ W5 ~# B9 x9 L5 E
0 V* a5 r" c/ F( U1 m% t% X





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