QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2074|回复: 0
打印 上一主题 下一主题

数学建模中的传染病模型及其编程求解

[复制链接]
字体大小: 正常 放大
浅夏110 实名认证       

542

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2020-11-14 17:15
  • 签到天数: 74 天

    [LV.6]常住居民II

    邮箱绑定达人

    群组2019美赛冲刺课程

    群组站长地区赛培训

    群组2019考研数学 桃子老师

    群组2018教师培训(呼伦贝

    群组2019考研数学 站长系列

    跳转到指定楼层
    1#
    发表于 2020-5-17 09:59 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    问题的提出
    ' 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
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-12-29 18:52 , Processed in 1.807637 second(s), 51 queries .

    回顶部