QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2207|回复: 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 |邮箱已经成功绑定
    问题的提出- {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
    转播转播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, 2026-9-8 19:52 , Processed in 0.432379 second(s), 52 queries .

    回顶部