QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2130|回复: 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 |邮箱已经成功绑定
    问题的提出) _' Y3 n: U+ W  o  H8 o
    医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。
    0 g* ?  M9 t+ G, i4 y
    4 j0 P8 e8 u3 b- S+ s' i) o指数模型
    5 s( }% ~* u1 @( p# J+ J定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
    3 x) L. }3 v+ b0 d( D. a1 \i(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t
    $ c5 B+ q+ y' J! U* \) Mi(t+Δt)−i(t)=λi(t)Δt
    1 M" T) h+ F# O% _$ `6 L5 j
    : W' |- @% n7 Q! v将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
    $ i% l# D+ s2 d: ai(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
    & v) y4 w: H/ V3 {5 li(t+Δt)=i(t)+λi(t)Δt$ F1 W0 ~; ~) T  A
    - R$ A' {  o1 T6 G1 h
    以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。& K& l$ E5 E. n" z' K% B

    2 s% j- F# M( T3 U1 G0 Qimport matplotlib.pyplot as plt( L) h) ^3 O' k. ^, w
    %matplotlib inline# Q, k8 {/ f# ]6 [
    deltaT = 0.01
    , V. \  x6 V( i6 i% ulamb = 2
    + T1 w* f! ^; g1 Ii_list = []4 P) r: s% w0 E1 F1 q. D
    i0 = 0.08; # 初始有8%的人患病
      C  R7 b4 D$ A) S  Z, ^- Ri_list.append(i0)& {% ]! \* b& }
    Tot_Time = 10
    # D( i0 f: B) b7 GTotStep = int(Tot_Time/deltaT)/ q2 ~  ^# a  I  D& ]5 u5 K
    ##
    . |6 z0 q' Z, A1 s! L: Xfor i in range(TotStep):
    5 a7 J' n, r7 M8 w" H6 r    i_new = i_list[-1] + lamb * i_list[-1] * deltaT" m6 H# C+ Y8 {% f# X& y1 f' R& p& \
        i_list.append(i_new)
    3 ~" s. y( w1 P1 k9 lplt.plot(i_list)6 u- k4 J4 o/ _! h1 N/ q: v, t; Z5 e) m

    2 L1 Y0 F' g& e7 V将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?3 W# ?% T0 \" o8 s/ {
    ! P7 ?/ R. A% K* g  y

    1 T, }/ T! R3 \/ h1 l% @. J& _  k' N实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。8 i: a) r5 S1 v
    8 f$ D8 P3 b7 t: x$ O: a
    SI模型
    # f1 }+ F! s. K7 D& w现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:
    ! y4 J3 \9 T9 q5 y3 V0 {0 E) X' B5 y1 N' N8 V6 {* v4 t) z
    在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)% Z8 h% x3 O' O) |6 d# Y
    每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率1 f3 @/ N1 O- Z" i+ ?$ a( D. q* B
    仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
    1 u0 A: T% f% T5 w# f/ e9 X8 j$ {, E: L
    . m: j- E- C0 H1 {( d& P8 O1 s/ ~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
    6 [( a6 P. E  uN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt
    , [" h. f3 E- |, Y' \& o, j3 Q7 G# {# q( E
    消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式- x  i6 C7 a0 V
    i(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t
    5 `+ E: D9 V' ]2 Y/ t! ^; Gi(t+Δt)=i(t)+λi(t)s(t)Δt
    % J3 A- r% G$ }8 M& @5 p4 w/ ?4 S* @* i6 h/ ^7 ]
    同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:5 Z& L1 D4 r3 l% N8 u

    $ l) w% K  R) Mimport matplotlib.pyplot as plt; I4 j9 b9 v, S4 W$ z( M1 B3 z
    %matplotlib inline4 D) h# Q5 y: V7 R( J' R- n
    deltaT = 0.01* [" s3 ?8 c  X
    lamb = 2
    ( b3 M4 @. r1 Q' f5 ni_list = []
    / r! b: C4 P1 v8 p+ Q7 @# hs_list = []
    5 h* Y+ W& ?0 I3 V" I- s! }i0 = 0.08; # 初始有8%的人患病- j  ?1 f) S7 J/ [2 d  ]! i+ ]* E: ~
    i_list.append(i0). Y  q1 C  V7 T+ v' ?8 c" q
    s_list.append(1 - i0)
    2 P- w- |. h* m4 B2 l# g! y: cTot_Time =5
    ( D0 z# J8 g+ t1 YTotStep = int(Tot_Time/deltaT)# l# Z  r" I4 [" H6 C) q& `
    ##
    , \! M3 k# C7 ^- v/ p  U) L% C4 Mfor i in range(TotStep):. y* k. ?9 R4 j( C) u% S  }
        i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]) t- K0 p; o, d: q/ c
        i_list.append(i_new)' k/ z6 c0 U+ G7 A
        s_list.append(1- i_new), d$ {2 `2 V% G" A$ K: x5 w, D
    Time = [i * deltaT for i in range(TotStep + 1)]  {. l3 e( Z+ {2 U$ P, h$ {
    plt.plot(Time,i_list)
    ! Q: S# s+ `: F% r1 N' I" ?plt.plot(Time,s_list)) M9 R  j# y1 P8 L
    plt.title("SI",fontsize = 20)
    ; p9 Z6 q3 _" b1 N) F; @plt.xlabel("Time")4 G# \9 C0 ?8 {% ~3 D" q+ ~0 V: k
    plt.ylabel('i(t)')
    " Z7 q- E: [; }8 I# o7 d
    . h  e: e/ G- a/ Y8 n5 u( j从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。
    8 m9 {# f# W5 [) w; R% P4 O$ L* a( x5 J7 h5 M" F: A
    然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。& M$ L- C# l1 U' H0 `
    ————————————————
    5 Q# |0 F  E+ _$ n" p) m' g+ h  Z版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, y; i: e: f, u0 T2 R+ ]
    原文链接:https://blog.csdn.net/baidu_26746963/article/details/939183832 M* F" P$ L+ R- {
      [* k3 Z2 H6 H  R/ r

    . I, @# |' y- M; }0 E. ]
    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-6-14 07:05 , Processed in 0.526918 second(s), 51 queries .

    回顶部