- 在线时间
- 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考研数学 站长系列 |
问题的提出
0 L! V# J! P+ g/ j: Z医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。 }; V9 _: X& H5 v
5 I8 { s9 M+ m2 ^8 N7 @指数模型
( B' V4 }" D& k$ c" Z# b定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
# K W% {/ q5 {% Ni(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t
: `9 T# u* ]1 i4 j9 mi(t+Δt)−i(t)=λi(t)Δt
3 \/ A! r" P; E' \; X& g1 k, y9 I/ W
将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式+ k; k4 \4 M8 h! D, p
i(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t8 X6 Z' R# @6 ^& Q7 t- d0 t9 c
i(t+Δt)=i(t)+λi(t)Δt3 J$ S. B* [: m* s; r8 h4 g5 I
! q0 j/ j! y& d; J( g
以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。
9 T- o. t3 \3 W9 e; X$ e$ r- m2 L$ _6 P8 e2 K
import matplotlib.pyplot as plt
+ J0 q$ W& V7 Z* R* G%matplotlib inline$ f% o4 k3 F8 O" c3 {! \
deltaT = 0.01
, l/ G9 `( ^" l" H4 wlamb = 2
1 f. P/ j2 N x# Zi_list = []7 G5 o- [+ O- D3 J% N m
i0 = 0.08; # 初始有8%的人患病
' Z6 L' Q+ u! |" `i_list.append(i0)2 p$ k& u4 j5 r1 o
Tot_Time = 10
# I1 z+ D7 j& M/ i: M3 dTotStep = int(Tot_Time/deltaT)9 {7 b, r" L& L2 ^; a/ b
## $ K7 k8 j* s- W" a6 ?8 j( \5 t
for i in range(TotStep):
, }! x: N9 Q) ^' W9 S: w( | i_new = i_list[-1] + lamb * i_list[-1] * deltaT
/ H+ N! C0 y9 o: q3 R' w3 t i_list.append(i_new)8 @4 X2 F; M- ~
plt.plot(i_list) m+ v, O- Y0 j$ v! l- p
$ Z' I: B: V# J* I4 l1 B) {) ?! ^, B
将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?
}) k5 U8 }# z/ M+ J) Y4 k# F- R" R2 a. y
9 Y* d& p. S, [0 n# A1 ^' O6 G实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。- \/ m: d, h/ `8 Y- n0 Y3 ?
. u+ e$ A' t: j& F& x l5 @$ j4 G
SI模型1 V; g8 q5 O+ Z: ]1 f' o* i
现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:
& D; e: f/ t& s9 @" l- ^$ C$ \3 X [( ?
% l4 J' w) N0 ~) ]# |. h在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)) z- C" C$ r; ^4 A
每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率
M# J3 b/ I8 d6 D, C仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算9 @. {% p- F- }: R$ e1 t; P" y
" ^) p8 B2 f3 X j
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 t5 L; v1 G, R/ L- O5 K0 ~& _
N[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt% Y. W8 M* a5 V6 s5 r- M
4 x# R' Y1 [0 b9 [* V6 w3 G
消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
- m3 P5 x% O7 {& V4 di(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t% U+ P* F& [1 P, e; X
i(t+Δt)=i(t)+λi(t)s(t)Δt
& O; [( S2 h4 G1 p8 t1 ?* v, U, X& B9 X
% {2 K8 R+ V; n! L同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:$ Q- H1 k! z& \. d
. m* ~/ t. E' u4 `- n+ D0 ~
import matplotlib.pyplot as plt t$ q1 L1 j" f
%matplotlib inline
, M. H4 o5 N$ n( Z2 H/ \5 ndeltaT = 0.01
2 h9 f4 _& o' {lamb = 2
1 |# f6 ^, R9 S& B) oi_list = []; g# q& R5 g" p$ F) ~5 m
s_list = []
7 J; e. L! O) L, o, Xi0 = 0.08; # 初始有8%的人患病
- c. h8 Z; U% Y! I/ I' vi_list.append(i0)# G u. w& X9 u
s_list.append(1 - i0)
' D5 v6 B' V7 K) |4 H) | `+ d% STot_Time =5 Z/ V% x- K& H' ^" m0 P$ n6 y
TotStep = int(Tot_Time/deltaT)
) r$ o6 ~# n0 @## 1 d8 T+ Y3 c9 p6 ]9 x
for i in range(TotStep):
1 d8 g ^0 O! W; A1 }& @9 | i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]$ \$ F& R/ F0 v
i_list.append(i_new)1 Q; V& s8 L& A2 K
s_list.append(1- i_new)
; B$ E1 x6 `7 n* t/ ?" x" e+ iTime = [i * deltaT for i in range(TotStep + 1)]
* A2 d" T- ?8 v9 Y, e$ Hplt.plot(Time,i_list)7 N, J* |7 f! P7 U' O9 H( B
plt.plot(Time,s_list)2 z) j' l0 d% h# O, I
plt.title("SI",fontsize = 20)0 }; ] b1 Q* }* i8 K6 |7 | i+ {
plt.xlabel("Time")# }' e8 G! s$ N S! T$ i5 c) y3 i
plt.ylabel('i(t)')
; N$ g/ z Q( c9 ~% b9 E( p( x2 r4 q
从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。
7 X; X/ Q; u4 o$ W3 u* [9 ^5 ]( A
0 h: ~+ Q! y6 [, i! a/ o/ Z# ]- L3 q" n* J然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。
. k. S- X, o6 M* T! W————————————————
: k7 N' ~8 @$ k9 M6 J版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" _) s' I" H/ J# d' J; m
原文链接:https://blog.csdn.net/baidu_26746963/article/details/93918383( X* E, L% Q$ f, A$ E: z4 m
E7 u$ \2 c6 C6 b( O1 _
! O3 E0 b8 [/ s2 D7 |
|
zan
|