- 在线时间
- 791 小时
- 最后登录
- 2022-11-28
- 注册时间
- 2017-6-12
- 听众数
- 15
- 收听数
- 0
- 能力
- 120 分
- 体力
- 36450 点
- 威望
- 11 点
- 阅读权限
- 255
- 积分
- 13896
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 616
- 主题
- 542
- 精华
- 12
- 分享
- 0
- 好友
- 225
TA的每日心情 | 开心 2020-11-14 17:15 |
|---|
签到天数: 74 天 [LV.6]常住居民II
 群组: 2019美赛冲刺课程 群组: 站长地区赛培训 群组: 2019考研数学 桃子老师 群组: 2018教师培训(呼伦贝 群组: 2019考研数学 站长系列 |
问题的提出
+ E( J8 n( ^5 y/ k/ f1 z% _医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。
+ r- c! m2 D* O/ P5 N& E
- p$ `5 F4 {; \8 t- e. l指数模型
7 c0 S4 I& @1 V* j% \, N定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
- A$ ]6 J0 u" D. Ki(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t
& p5 c1 t( _4 i1 Di(t+Δt)−i(t)=λi(t)Δt) h; R1 l: |/ Z9 }# }. P5 E2 E8 `
6 w# a8 N7 r z% h l" ~6 k
将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
/ ?4 K0 H0 A( g" t1 ti(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t5 P& [8 f3 Y; w+ H# m1 ]
i(t+Δt)=i(t)+λi(t)Δt6 H8 Y @6 _5 S4 R: t" A+ d* \
/ s, V* q' w1 O+ v* J2 P5 A
以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。
9 I8 L5 f4 O, i% l, ~) v+ [" C
6 i& `3 {% J* z* k3 P- q' S& K: \import matplotlib.pyplot as plt$ K7 T6 T7 s5 a: W! I! \3 J; v
%matplotlib inline
( @# ?) I0 N9 T% j# f9 ~deltaT = 0.01
1 b- v' g2 ?, u/ m$ O1 M0 nlamb = 29 c. h1 D/ j2 x0 a+ z5 M& K
i_list = []5 R; e# l) O* ?4 {
i0 = 0.08; # 初始有8%的人患病
6 i; R I+ t+ Q9 W5 n- Li_list.append(i0)2 M# ^- o, }+ A4 `6 v
Tot_Time = 10
" k, `7 d7 x" S: i+ F, ~TotStep = int(Tot_Time/deltaT)
* v2 x! H/ @- \8 O! ^3 a* w3 N5 b##
+ l: X ^5 L4 D3 E8 E3 Hfor i in range(TotStep):
9 z& ]. k: C6 Z% O& Y1 ` i_new = i_list[-1] + lamb * i_list[-1] * deltaT6 t7 j" L3 t9 D
i_list.append(i_new)* a: o, }1 e8 P9 b- c+ Y/ \
plt.plot(i_list)
- V F! H w1 Q+ O# s/ v7 M
4 e' L2 n: D5 T将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?; f: V' M" g# o5 V* D0 I
# k$ ~% w5 r K9 x- k% j
5 H- z: p0 ]- s0 B" w实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。6 i& w2 {( _# t7 M# V4 u- v
) @0 H0 O+ h: D9 l' ^& r
SI模型
1 c- ?$ Q' R% C; _* v3 {# m" P现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:/ T* C9 O9 m8 N) `
% K' n3 a s. M$ C! ?7 |
在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)
. A' T* h- T) B* u每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率
9 T% ~& s( @& }6 i仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算4 i2 H( e9 c# A- v9 R) K
& I) W( d# |8 K+ |9 R7 v
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
. i% \8 a2 i, s& A9 IN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt ^0 r/ B7 F# c/ j4 n/ X, `' C
: C0 V1 t% i0 \, \1 b2 C5 H! a
消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
' Y0 O* [7 ?, s2 Y5 ki(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t" [& ~, E* B$ J5 }) ?. }: C
i(t+Δt)=i(t)+λi(t)s(t)Δt
- [6 R( h# P; g+ T' E
" x0 K% d" e) u( }: {% r' ?同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:
, t7 m& P3 v( m; L+ H6 i. f9 Y
1 X) b( S: y9 H$ h. n+ Limport matplotlib.pyplot as plt
/ C3 i0 j& m6 G" h%matplotlib inline& r, d- g/ P7 ^
deltaT = 0.013 Q. Z5 @. Q1 X/ ?" t6 ]/ q
lamb = 26 M, ]( W0 w# f1 Y
i_list = []
+ L9 C" W; e7 J' m, [! U4 L1 `% Ys_list = []4 \$ H" e/ f6 |6 C+ y9 {
i0 = 0.08; # 初始有8%的人患病+ }/ l! @( ]8 w9 r, A
i_list.append(i0)) K6 k8 V5 v8 h4 w; u4 w8 Q
s_list.append(1 - i0)
4 a( A- j5 G9 I& [/ y- b; _5 b# n1 W1 ^Tot_Time =5
# }& {# S1 _( r- jTotStep = int(Tot_Time/deltaT)$ |: B& J7 s+ w# c7 K
## ) G; U2 O" A$ }
for i in range(TotStep):
" q: r" h( g% L# ~0 O8 \ i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]
; J) Q& X3 Y5 f# W; o* m7 A i_list.append(i_new)
( l4 Y+ [: r+ G N* D' e- E+ f3 b9 a7 I s_list.append(1- i_new)7 ?$ Q( _" [% Y! g, z
Time = [i * deltaT for i in range(TotStep + 1)]: D8 i% `, y' Q9 r% V+ M4 V# X
plt.plot(Time,i_list)6 P' u$ w! i7 j! d7 z0 u
plt.plot(Time,s_list)4 m, F8 S1 n3 ]/ F ]5 ?* N
plt.title("SI",fontsize = 20)
0 F: W# Y! H7 O4 V N r, H9 T" Mplt.xlabel("Time")
) V( V7 K- U4 p% jplt.ylabel('i(t)')
! l6 @/ I X8 Q, C! {. p
; y. [- b# Y6 x: p b* V% K从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。5 L" B0 k0 ]% O' Y# C& M1 Y
' s8 j' P% {% q& y然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。
: v# q( i' \6 Q0 [ d————————————————7 m- Y. u& t1 V3 p9 e
版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. _0 @. G# Y9 g7 _3 y
原文链接:https://blog.csdn.net/baidu_26746963/article/details/939183838 j) `8 u! ?: z r
3 @! `$ ~* A, e- i2 o2 y
2 T% n$ y2 C( ~% B" E |
zan
|