- 在线时间
- 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考研数学 站长系列 |
问题的提出
' q h2 n: h. t! I( x* w医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。/ x, ]! ]$ {7 _+ X) T& }$ }3 b
0 S- L+ `+ h8 X' t0 ~" D0 l
指数模型
' B5 D" H- q q" g) i) W' _定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
6 x4 `/ J. \ e) {7 `4 F1 R0 fi(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t* X/ n1 R+ K- b5 @+ {4 l* I
i(t+Δt)−i(t)=λi(t)Δt6 @! x8 X2 I, Z& I2 N% i
7 m+ `# Y7 o$ l+ l, G$ K
将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
- Q5 r$ H7 }8 W6 s7 Yi(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
8 p( E; S! h j, }) Ei(t+Δt)=i(t)+λi(t)Δt; b: P1 M" ~6 L- i, n& ^
+ U. T$ k) }8 [. r% Z) H4 _* N以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。) `+ B' Z- K! @
. i+ ^4 p* _1 P2 K" Y2 _4 w! jimport matplotlib.pyplot as plt
2 q9 u2 v9 ?) n+ z/ B$ g3 T%matplotlib inline7 ~, i0 W g& g' t/ l! p4 r; s4 G
deltaT = 0.01
3 S. m. `& Q* Y. g7 blamb = 2
# b% M4 p0 m2 B5 e# j" E0 qi_list = []
, d3 g2 W0 u( F- Bi0 = 0.08; # 初始有8%的人患病
, o- U$ }* X1 \2 y4 k4 D6 Gi_list.append(i0)2 G( d2 {, K% o; S, w! C) J
Tot_Time = 10
f" I# Q7 O4 w: OTotStep = int(Tot_Time/deltaT)6 Z* [( u8 m, |
## 2 w& _/ W, f" ^, d
for i in range(TotStep):7 F) `/ }, Q8 b7 F% B: s y+ a, u
i_new = i_list[-1] + lamb * i_list[-1] * deltaT
W5 \; O. p- l' g v4 m i_list.append(i_new) _5 P8 \6 C# a# @
plt.plot(i_list)
- ~% |, Y. x s: S
% s$ p2 `- A; x2 I: D0 ~- m将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?
0 ~5 {6 Q* X6 u9 \+ p; e3 v' }. T1 a/ P5 j8 ?
0 J7 |( h( N1 i- j" m1 `实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。
- X9 }3 w0 ]8 y3 q7 f A7 a& }9 U8 ] L7 V0 ]
SI模型
& ?8 G y1 D$ s5 E& P- m4 e现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:; U, B" s; G( m$ A6 j. p
9 p& M8 ~( m/ B8 I6 @7 ~
在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)
) v" R6 g* U! y1 l* v( R( Y8 @每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率3 d) I2 `# Y) e; d/ k6 G$ q4 J
仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
m0 G" B0 b: @/ l8 z9 }- z8 K7 J. ?! M# q# c6 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. s7 B1 }# Z% r& E' u- M+ g
N[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt7 N3 N2 M; ?% Z5 d
5 B) ]% q$ Q8 B" Q: @! D* `: e1 m消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
3 B6 q) r K2 a6 `5 e5 Y; C/ Vi(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t
2 k; h/ i6 M6 k. a* [# xi(t+Δt)=i(t)+λi(t)s(t)Δt4 g7 `7 s. ]1 W$ F% f# \1 [
0 M. e' G$ h- L0 o
同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:
7 t3 v! \8 d# K" {" G& p% `) D; y' d+ k, @$ m* K& P
import matplotlib.pyplot as plt+ `* P# c N8 [* P3 _) j; N x
%matplotlib inline9 k" E, n$ \/ \
deltaT = 0.01
6 h7 k1 k9 J* }& Q4 elamb = 2
. s! d; l0 T- ?. li_list = []: M% o$ q v) M; b
s_list = []; Q6 |2 ~) Z( a
i0 = 0.08; # 初始有8%的人患病
, X' X% g/ W+ a( X% [i_list.append(i0)
+ K' M/ _5 W) K7 ^+ is_list.append(1 - i0)
: ?: \+ o! _' n- x% e1 ~- YTot_Time =54 H/ i+ Z w3 o; l& }
TotStep = int(Tot_Time/deltaT)9 h2 { }5 b6 k, |. @$ K- r
##
9 y1 a/ N5 T( O- Mfor i in range(TotStep):
+ b( v' z8 q: E2 w i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]6 |: H7 R% ^6 _
i_list.append(i_new)
6 q/ g; `2 n) T5 N s_list.append(1- i_new)' q: V2 j5 [8 `/ a) o
Time = [i * deltaT for i in range(TotStep + 1)]
" C+ d$ p, D6 _plt.plot(Time,i_list)% H$ L& q3 E& b, H$ M+ |2 a8 B; G
plt.plot(Time,s_list)
8 W0 M* a. a; V1 l& Iplt.title("SI",fontsize = 20)( A6 ? {: g& |# f
plt.xlabel("Time")
9 K/ w1 o/ |8 j8 e) n/ d- Xplt.ylabel('i(t)')3 n8 H+ F* b! _2 K1 `
& v- O8 S' m V# _1 z
从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。
$ n6 ~- p6 t$ s* g4 n" S% w* w% s2 T g$ `. Z
然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。6 F0 q. q9 E$ ]* O; m. y( a
————————————————
( ?( a) s5 I& j! I/ _: s版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 u& p# G5 y& I/ F原文链接:https://blog.csdn.net/baidu_26746963/article/details/939183834 i% j- D! O5 w0 c2 K
7 g- [# F) g, I& |! q( C# r
) ^ Z2 |0 k } [0 m: Q |
zan
|