QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2073|回复: 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 |邮箱已经成功绑定
    问题的提出
    * w* g9 H' u8 d- O医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。8 K% Z! j8 i/ C

    . H! D0 _/ {2 c指数模型8 W& B- a7 h/ v
    定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算" s$ p4 V9 H) N5 M6 r0 `$ X# M
    i(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t& K' d3 P4 g+ |/ I
    i(t+Δt)−i(t)=λi(t)Δt
    4 M9 D5 \0 X) j2 W, D- ~- T0 p/ P* T3 N: c
    将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
    * U! W: e! M% P3 }0 O% h% ei(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
    9 u4 W( W3 l9 o5 r1 Xi(t+Δt)=i(t)+λi(t)Δt
    $ Q7 J( j7 ?3 q& n( x* u- [
    8 H7 S$ t/ z* ]7 J& U. i以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。* x" E: c) F% K$ z
    ; a- l2 L5 l$ |
    import matplotlib.pyplot as plt9 N) A) C* F/ m# u) d' P
    %matplotlib inline  b' W" y% ~0 ^+ }/ J. ?
    deltaT = 0.01  t" E! G% M( b" y. |6 S5 }
    lamb = 2
    3 q9 J5 t8 p4 u+ S+ y0 F; Fi_list = []
    ; l0 Q( |  K" }" I8 E7 Ji0 = 0.08; # 初始有8%的人患病
    / V; v6 C0 l2 P7 ]0 Y1 L( q. L( `i_list.append(i0)% ]0 ?$ j( c9 |5 I- G
    Tot_Time = 10
      w' Q! K& w0 `2 g/ LTotStep = int(Tot_Time/deltaT)! t5 g0 ^" \# o1 [( ]- C' G; I- `
    ## + [& r  K3 g& d/ C* F
    for i in range(TotStep):' l1 v: v& V& w6 h) W* a5 d' x
        i_new = i_list[-1] + lamb * i_list[-1] * deltaT9 {: a# {3 G; D0 x6 ?
        i_list.append(i_new); w' |8 `0 `9 N" \+ D' f1 `8 ^
    plt.plot(i_list)
    ; F3 e5 V1 B7 a# ]4 S; U- J' U3 U! k" z7 G
    将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?; ?! O5 t! B6 E. X

    / p& z- Y+ I) Q( e* r2 @8 z9 c3 z; z& v  L2 y* k% G) Z6 O% {0 z" V
    实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。
    3 i$ J( m& F. r, q- [+ M$ J% H) C5 f0 ]% k
    SI模型
    / f9 y8 k; W2 I8 ?现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:4 y" R0 D* `; Y! ]' B9 f* X
    / Y: r- J3 {5 ^; x
    在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)
      ]$ q( _8 W- |8 c0 B* g8 [7 }每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率
    , P  j) K% T" q& M/ H9 ]仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算. c6 V: V3 ]" Y) C$ j. R
      C) j6 u4 I* J( L# j, d
    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
    ! @* y. d" Q# T2 S  m& L* GN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt+ p2 I! b* I* C% x  y! Q( V

    , j8 l# D& M; N  W6 ~0 D+ l8 x  J5 a$ R消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
    ! ~& ]* d5 K; T; n6 r' Z8 R! Mi(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t' i! Q- h! V* L3 z1 `3 G" |
    i(t+Δt)=i(t)+λi(t)s(t)Δt
    / p; h" I  U" A9 m: V2 [! q$ X
    8 U( b! q  q8 U& y0 i同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:# V$ v6 p  l- r" x: A0 a

    % E1 j. P+ \" |' x( I. M+ x7 @import matplotlib.pyplot as plt
    $ }& \+ r3 x" o; m! T' @0 N%matplotlib inline  t- m2 m% ]& H, s* s( w
    deltaT = 0.01
    * a) K0 b8 S+ klamb = 2$ @0 x4 H& K; X- l) a2 Y. L( N+ O
    i_list = []4 x( _: c5 ?' A. R
    s_list = []
    ; s) D7 r3 V$ E; R' l7 ]: D" qi0 = 0.08; # 初始有8%的人患病. Z# q9 E* Z+ I% Y* c4 e9 B
    i_list.append(i0)
    , x; j" n$ Z( l9 as_list.append(1 - i0)6 U4 g" u4 p3 Y  M) K" T
    Tot_Time =5
    " g5 m: m4 H  O! L# }, lTotStep = int(Tot_Time/deltaT)
    8 j7 @  u5 k4 D! h% y## : B6 q" C' w: _2 r- n  \" i/ S
    for i in range(TotStep):3 T3 @# g+ L) ?& R5 f& Q
        i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]8 p5 F( @+ \$ e  K
        i_list.append(i_new)& X6 c3 T& q2 M" f
        s_list.append(1- i_new). v  V7 F* @- c/ w$ t7 x# G
    Time = [i * deltaT for i in range(TotStep + 1)]
    8 @0 P) A2 @6 vplt.plot(Time,i_list)5 U& M+ R' U" @" B4 T7 n* z/ u/ l
    plt.plot(Time,s_list)3 J$ K1 ~4 ~  q
    plt.title("SI",fontsize = 20)4 {9 R9 M3 H+ a5 V, s
    plt.xlabel("Time")
    * L" h7 O3 {8 {3 I* p6 splt.ylabel('i(t)'), ?8 f6 `, t5 a% U( [
    $ f1 ]4 s6 O9 ^! Y8 p& S6 v
    从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。
    " t$ b% `6 C3 W" l' s+ M+ y% J5 s  d$ s+ _0 d
    然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。5 r. S1 o8 s' H% d1 `7 G
    ————————————————
    8 ^. u" v  O9 ?% v3 |( z: a版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " R+ K/ V: a* s3 C/ b- q/ `原文链接:https://blog.csdn.net/baidu_26746963/article/details/93918383
    ( ~  a( n2 j; E
    * _  Z" I8 ^) {( I
    6 E/ N! U" X8 ^; k) \0 \7 Y) k
    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 12:20 , Processed in 1.274815 second(s), 50 queries .

    回顶部