- 在线时间
- 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考研数学 站长系列 |
问题的提出- {2 y+ G2 {. D! b& \
医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。/ X3 M+ b; H' |4 g: a
# U" b6 [1 C8 a, H6 X* D
指数模型
9 l# V: l, n! F- [3 p7 @# a定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
! L. \ I& J1 L0 g# Bi(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t
" K+ r$ j# J) w! _i(t+Δt)−i(t)=λi(t)Δt& ]. y" Y) t2 ^. W' [, }0 b- m
4 O+ U0 Q' P4 ]4 A" c( d& S
将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式2 h1 ^! \" q" _+ c$ G1 U
i(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
% J) F6 f7 ^3 Y! q5 j Y. i9 n% ni(t+Δt)=i(t)+λi(t)Δt
# J" ]' n/ F# d( |# L, s2 G6 q V: e( D$ ^: K8 _: A
以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。 H9 A, T) ~) u* s
, M. ]( I U5 M# S
import matplotlib.pyplot as plt& F9 T* h. N7 z H
%matplotlib inline
. k, d" d+ G% x" j3 P/ \deltaT = 0.014 s4 w& E3 u0 j, u5 t& @2 i' q" e
lamb = 2
2 L' r* U* u) x( M& m/ v& s! X9 Di_list = []
' P; j$ j6 S0 A# Pi0 = 0.08; # 初始有8%的人患病* u- G5 O: S& {9 u
i_list.append(i0)" I4 m. d' g0 D
Tot_Time = 10
, j" Q- G6 t1 v8 {( hTotStep = int(Tot_Time/deltaT)
% ~/ q/ r# B* ^$ N## 1 U% F+ `1 L$ D% x) H; ?! r
for i in range(TotStep):1 p1 m4 B V' _. ]: Y# H0 T! [) J9 h
i_new = i_list[-1] + lamb * i_list[-1] * deltaT1 M$ u' l& d& Z5 y1 A; K [
i_list.append(i_new)
3 a9 B5 v. M* ~% p" Bplt.plot(i_list)
& r2 `7 U. A- Y! B
5 c7 m. V2 D) A/ V- F/ Q将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?3 W2 p( x0 d( E X
7 ~; X$ i2 M0 y7 D, f9 K% A, C
) V/ t, I; A& T; O实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。4 E2 o: p3 F& s. F% J: N2 b
, l9 H G) J- |" b; |
SI模型7 r; U; h3 [, k/ g' V: T$ E3 p; n
现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:2 [# M$ P: S! i9 m$ ]
) n1 i' F2 W6 V5 N+ T0 u6 |* N+ M8 A
在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)' v2 L7 B8 b2 {: E- \; r1 q
每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率
' A. R$ y! y0 Y5 F" u" R: ]7 n仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算. A8 Q" w: n1 m+ K4 p
1 Y8 e3 z/ o. ON[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! ^ A/ ?$ H2 b/ |; ^) J
N[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt6 f% q' c3 \7 J4 {0 [' p5 E3 B' A; y
$ F' Y. D% g9 ~+ D/ E) `0 Y消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
$ L3 m7 U8 |1 Ri(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t$ \- b" `2 G" U6 j: t1 \, e; ~
i(t+Δt)=i(t)+λi(t)s(t)Δt+ S! }0 S/ T6 {/ J; ?. o) b8 ]: G
: {7 h8 ^: x/ [" v同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:
9 S; P2 w! l+ J F/ h% W0 _; r X+ p. E' L! X# {
import matplotlib.pyplot as plt
* q& i$ c- V8 a* P# \5 L& q%matplotlib inline3 N# j+ D, S$ G8 U4 Q1 z7 y5 {
deltaT = 0.017 M) i# }, _3 x! I- z: S* L$ J8 K
lamb = 22 j8 T, b0 s' o: I
i_list = []$ W* L. G" ]& Q' E. [4 a m
s_list = []
8 y q# q: n$ U: X: Mi0 = 0.08; # 初始有8%的人患病
& V9 P( R/ }; x7 Ci_list.append(i0). _7 V4 g8 b, m N. F0 c7 o
s_list.append(1 - i0)
, w% L) k+ a1 c- F% c/ |& VTot_Time =54 @6 J6 h6 @& U2 X, c' s; N
TotStep = int(Tot_Time/deltaT)& u' x: `: v% d7 d% s3 L
## % e/ k% `8 n2 N, Z3 {, x
for i in range(TotStep):
! J$ d7 S$ i7 t$ r- u% ` P* b i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]
% H' I% N7 J% C. G i_list.append(i_new)% R/ b l1 a1 V, G
s_list.append(1- i_new)- |. D3 \; x$ r, b: t
Time = [i * deltaT for i in range(TotStep + 1)]+ v3 c% i; x& c! }2 K0 l
plt.plot(Time,i_list)- n+ m7 b/ _5 `3 ?% w
plt.plot(Time,s_list)5 G9 W4 t% v$ C9 E
plt.title("SI",fontsize = 20)
! r+ }* T$ j5 \' [# Hplt.xlabel("Time")7 O8 e ?) Y/ e: n0 C2 O) }
plt.ylabel('i(t)')/ g+ A# A. [, U( V) ]$ ]
( c9 ~: l0 T6 k; x6 b. \: M7 t
从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。# c# v5 A: q" h7 Q8 A/ N' k
8 C7 ^+ u/ |3 C5 [
然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。
3 T) p5 H% i! B* l4 |' [1 E/ Y————————————————' j# k, Z+ R# }" e! I5 L& j
版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, c8 R+ |3 e( y; P0 J5 ]原文链接:https://blog.csdn.net/baidu_26746963/article/details/93918383+ @& Z. I* r! C& ]1 z8 @+ \" x
+ @1 f" D( F6 M; L! ]* M5 {( o, j- F: @& l8 z+ O
|
zan
|