- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36261 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13819
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 616
- 主题
- 542
- 精华
- 10
- 分享
- 0
- 好友
- 225
TA的每日心情 | 开心 2020-11-14 17:15 |
|---|
签到天数: 74 天 [LV.6]常住居民II
 群组: 2019美赛冲刺课程 群组: 站长地区赛培训 群组: 2019考研数学 桃子老师 群组: 2018教师培训(呼伦贝 群组: 2019考研数学 站长系列 |
问题的提出
* w* g9 H' u8 d- O医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。8 K% Z! j8 i/ C
. H! D0 _/ {2 c指数模型8 W& B- a7 h/ v
定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算" s$ p4 V9 H) N5 M6 r0 `$ X# M
i(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t& K' d3 P4 g+ |/ I
i(t+Δt)−i(t)=λi(t)Δt
4 M9 D5 \0 X) j2 W, D- ~- T0 p/ P* T3 N: c
将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
* U! W: e! M% P3 }0 O% h% ei(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
9 u4 W( W3 l9 o5 r1 Xi(t+Δt)=i(t)+λi(t)Δt
$ Q7 J( j7 ?3 q& n( x* u- [
8 H7 S$ t/ z* ]7 J& U. i以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。* x" E: c) F% K$ z
; a- l2 L5 l$ |
import matplotlib.pyplot as plt9 N) A) C* F/ m# u) d' P
%matplotlib inline b' W" y% ~0 ^+ }/ J. ?
deltaT = 0.01 t" E! G% M( b" y. |6 S5 }
lamb = 2
3 q9 J5 t8 p4 u+ S+ y0 F; Fi_list = []
; l0 Q( | K" }" I8 E7 Ji0 = 0.08; # 初始有8%的人患病
/ V; v6 C0 l2 P7 ]0 Y1 L( q. L( `i_list.append(i0)% ]0 ?$ j( c9 |5 I- G
Tot_Time = 10
w' Q! K& w0 `2 g/ LTotStep = int(Tot_Time/deltaT)! t5 g0 ^" \# o1 [( ]- C' G; I- `
## + [& r K3 g& d/ C* F
for i in range(TotStep):' l1 v: v& V& w6 h) W* a5 d' x
i_new = i_list[-1] + lamb * i_list[-1] * deltaT9 {: a# {3 G; D0 x6 ?
i_list.append(i_new); w' |8 `0 `9 N" \+ D' f1 `8 ^
plt.plot(i_list)
; F3 e5 V1 B7 a# ]4 S; U- J' U3 U! k" z7 G
将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?; ?! O5 t! B6 E. X
/ p& z- Y+ I) Q( e* r2 @8 z9 c3 z; z& v L2 y* k% G) Z6 O% {0 z" V
实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。
3 i$ J( m& F. r, q- [+ M$ J% H) C5 f0 ]% k
SI模型
/ f9 y8 k; W2 I8 ?现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:4 y" R0 D* `; Y! ]' B9 f* X
/ Y: r- J3 {5 ^; x
在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)
]$ q( _8 W- |8 c0 B* g8 [7 }每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率
, P j) K% T" q& M/ H9 ]仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算. c6 V: V3 ]" Y) C$ j. R
C) j6 u4 I* J( L# j, d
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
! @* y. d" Q# T2 S m& L* GN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt+ p2 I! b* I* C% x y! Q( V
, j8 l# D& M; N W6 ~0 D+ l8 x J5 a$ R消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
! ~& ]* d5 K; T; n6 r' Z8 R! Mi(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t' i! Q- h! V* L3 z1 `3 G" |
i(t+Δt)=i(t)+λi(t)s(t)Δt
/ p; h" I U" A9 m: V2 [! q$ X
8 U( b! q q8 U& y0 i同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:# V$ v6 p l- r" x: A0 a
% E1 j. P+ \" |' x( I. M+ x7 @import matplotlib.pyplot as plt
$ }& \+ r3 x" o; m! T' @0 N%matplotlib inline t- m2 m% ]& H, s* s( w
deltaT = 0.01
* a) K0 b8 S+ klamb = 2$ @0 x4 H& K; X- l) a2 Y. L( N+ O
i_list = []4 x( _: c5 ?' A. R
s_list = []
; s) D7 r3 V$ E; R' l7 ]: D" qi0 = 0.08; # 初始有8%的人患病. Z# q9 E* Z+ I% Y* c4 e9 B
i_list.append(i0)
, x; j" n$ Z( l9 as_list.append(1 - i0)6 U4 g" u4 p3 Y M) K" T
Tot_Time =5
" g5 m: m4 H O! L# }, lTotStep = int(Tot_Time/deltaT)
8 j7 @ u5 k4 D! h% y## : B6 q" C' w: _2 r- n \" i/ S
for i in range(TotStep):3 T3 @# g+ L) ?& R5 f& Q
i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]8 p5 F( @+ \$ e K
i_list.append(i_new)& X6 c3 T& q2 M" f
s_list.append(1- i_new). v V7 F* @- c/ w$ t7 x# G
Time = [i * deltaT for i in range(TotStep + 1)]
8 @0 P) A2 @6 vplt.plot(Time,i_list)5 U& M+ R' U" @" B4 T7 n* z/ u/ l
plt.plot(Time,s_list)3 J$ K1 ~4 ~ q
plt.title("SI",fontsize = 20)4 {9 R9 M3 H+ a5 V, s
plt.xlabel("Time")
* L" h7 O3 {8 {3 I* p6 splt.ylabel('i(t)'), ?8 f6 `, t5 a% U( [
$ f1 ]4 s6 O9 ^! Y8 p& S6 v
从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。
" t$ b% `6 C3 W" l' s+ M+ y% J5 s d$ s+ _0 d
然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。5 r. S1 o8 s' H% d1 `7 G
————————————————
8 ^. u" v O9 ?% v3 |( z: a版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" R+ K/ V: a* s3 C/ b- q/ `原文链接:https://blog.csdn.net/baidu_26746963/article/details/93918383
( ~ a( n2 j; E
* _ Z" I8 ^) {( I
6 E/ N! U" X8 ^; k) \0 \7 Y) k |
zan
|