数学建模社区-数学中国
标题:
数学建模中的传染病模型及其编程求解
[打印本页]
作者:
浅夏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)Δt
0 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+ t
i(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
8 X. t- A# Q( D' A
i(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 Q
i0 = 0.08; # 初始有8%的人患病
& _3 z9 T9 i9 p' b& V4 Z
i_list.append(i0)
" R% O4 ?/ @0 O7 ~6 E( t) ?2 X
Tot_Time = 10
0 B' B$ r% c( u* y! M3 y
TotStep = 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- a
8 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 P
N[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 r
N[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! Q
i(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 = 2
9 ?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$ B
i0 = 0.08; # 初始有8%的人患病
3 ]7 j5 o7 N5 i2 W! y: b$ t0 w
i_list.append(i0)
7 [ [" {5 o( j" L% A
s_list.append(1 - i0)
; w( |+ H; b, c+ k7 c& Y* |0 ~5 R3 A
Tot_Time =5
- d/ T+ L1 }' y% z1 Y, R
TotStep = 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/93918383
0 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