- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36446 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13894
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 616
- 主题
- 542
- 精华
- 12
- 分享
- 0
- 好友
- 225
TA的每日心情 | 开心 2020-11-14 17:15 |
|---|
签到天数: 74 天 [LV.6]常住居民II
 群组: 2019美赛冲刺课程 群组: 站长地区赛培训 群组: 2019考研数学 桃子老师 群组: 2018教师培训(呼伦贝 群组: 2019考研数学 站长系列 |
问题的提出
- Q2 X2 y; A4 h医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。/ G$ `4 t5 U% S. O: v- Z0 D
/ v- d7 i# B1 H( Q& d
指数模型
7 K% M: o& q- H* ~定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算2 J0 i* m+ C9 ?& }* R. h: Y. k' b6 u
i(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t/ s( s7 t! E& E. n1 ^! x& X/ u
i(t+Δt)−i(t)=λi(t)Δt Y1 V, V7 H! _2 {9 D
. M% L& d' v; T P l+ {将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
( T$ m2 A1 {1 d8 ?% d& s+ Ji(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
/ I: X; O. D1 Li(t+Δt)=i(t)+λi(t)Δt
0 c! [' A! J7 o# Y, O! O1 H0 s
" U: Q& s( L6 K L7 H2 `以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。% u. o0 Q# o0 f2 s1 b
; C/ l! a1 x i5 f- E" o
import matplotlib.pyplot as plt1 N" u9 J7 k' }
%matplotlib inline
- }# f8 A1 T8 l; ~4 L3 r3 f& DdeltaT = 0.01" D, h, R% l% }2 E2 p% c" |
lamb = 2
% }1 g# S! G" D/ \i_list = []5 i2 x, j9 m9 |# D* r; f6 f& v7 K
i0 = 0.08; # 初始有8%的人患病6 Y7 r( F: g+ r" f& O
i_list.append(i0)% {7 Y. F3 x2 V; ~" d
Tot_Time = 105 G; {( Q9 g; q
TotStep = int(Tot_Time/deltaT)
6 v- V( b, d! l4 X" k% N' c##
0 p: o1 X! c0 G4 p$ Rfor i in range(TotStep):
5 G0 G. [- w' Q i_new = i_list[-1] + lamb * i_list[-1] * deltaT6 T0 Z7 c9 L" E" z Z) E
i_list.append(i_new)6 ^/ x1 E' h' m8 A0 ?& X
plt.plot(i_list) K0 F5 R2 B1 k) s
1 p* T+ |* n, b0 L将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?
; ^* ?; C6 ]' E9 B2 j4 Z2 S; i, V) @$ H6 L( m
- d& d, X/ E- R# e( c% d( I实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。
7 U- i* u7 K9 o- o0 Z6 s% ^5 D3 b
SI模型
9 p" { M/ K) |3 [现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:, K3 T8 Q( a9 j& b
# o" p/ J0 \) z/ @/ L
在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)1 L w$ A: f" S0 Q! D
每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率6 W' F- O9 w. P0 j/ Y* W7 Z
仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算( k$ W& I8 M& |* a) D8 v+ @# F
: W+ l+ U7 Q& U9 o; W+ t5 [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
4 R( t2 q" z+ j. g- uN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt2 r, c6 {/ m. F M
% R% T) Q7 v, s& i+ a消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式, `- w, u: R" b) T$ ]* z
i(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t/ ~- b. A! @$ ^5 ~
i(t+Δt)=i(t)+λi(t)s(t)Δt
' S# C8 V5 f8 Z' D
6 P4 N! ^. }: G' c: f同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:
, ^. g' ^- l1 {8 |9 G9 g
6 {/ J: r) o( U+ b, T, uimport matplotlib.pyplot as plt
8 V& p+ c+ c) P% J8 h4 p%matplotlib inline: B! J& t% Y( N* H+ |' u' Y
deltaT = 0.01
: ~3 v, I# ]; o4 q: Q7 Y9 qlamb = 20 {$ D. _+ f1 x y( G3 k! y
i_list = []8 Y( u% H; j+ X* ]
s_list = []* H4 o6 V, E. ~
i0 = 0.08; # 初始有8%的人患病/ R8 Q3 m) f) b
i_list.append(i0)' c8 I+ L; T, Z% Y1 h
s_list.append(1 - i0)
3 y% x5 v, J: l6 P$ zTot_Time =58 D3 ?0 \! p1 ^% C( E: M6 ~& o
TotStep = int(Tot_Time/deltaT)
3 I! b8 y. o7 o# s9 i7 h5 O" X5 w##
0 w9 `1 u5 N" F0 {5 Vfor i in range(TotStep):/ K0 W6 o" Y- J% L
i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]1 W8 }, D! p. d" {% ^1 Z
i_list.append(i_new)
6 L- H# _/ k9 T+ r) M+ { s_list.append(1- i_new)$ B e- I& z+ K& C
Time = [i * deltaT for i in range(TotStep + 1)]/ o6 @& R! I( @: h
plt.plot(Time,i_list)1 z6 f1 B& s) S* T3 H! ]: r
plt.plot(Time,s_list)
$ ]0 I7 y% n% Splt.title("SI",fontsize = 20): K, n! _, J6 E7 j) O
plt.xlabel("Time")
% i& ]1 e% Z) W* u; z: O9 V O' ~plt.ylabel('i(t)'): ]) i7 q. d& p2 J0 T
% g% c e W- f0 B1 q5 V8 @1 P! ]从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。2 \, J3 Y1 W0 \; u( P6 M2 s
. E, w- G# z: c( z9 B/ R然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。' Y8 V. K! G* J5 p9 h& \& M4 p9 @
————————————————
* A j: J2 z7 u5 f版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) m& k( {. V" y9 X# D& A
原文链接:https://blog.csdn.net/baidu_26746963/article/details/93918383! S2 a' h% R# X$ b: H1 q
+ S% v# T7 P$ L) }2 u" E0 y. m! T: p0 w0 p% `. W0 Y
|
zan
|