QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2162|回复: 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 |邮箱已经成功绑定
    问题的提出& c# ^& X$ ^0 ~
    医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。
    ' N' A- i: j" [  @5 y7 M/ }- y, j* l5 i' q
    指数模型: a! k+ C9 K( D: ]5 B1 s/ r
    定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
    % N3 ]1 c8 k# P- c; t5 b, u5 Pi(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t8 Q# {4 q2 v# R3 N. S2 F- [% g
    i(t+Δt)−i(t)=λi(t)Δt
      f/ l0 f2 i( n9 @9 z8 D4 U" X1 G) b) v* q* ~; ]- r0 J1 G' q1 M
    将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
    8 Y1 x! _5 f1 l! B$ L, Di(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
    & j4 @' o* X& M9 {6 Hi(t+Δt)=i(t)+λi(t)Δt- v3 {5 h) I9 `$ ?( C9 h7 T# i

    6 {2 S6 [$ z1 |以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。, b# e8 i: X% g5 t3 C& K

    " O9 G( B2 `+ S4 n7 `5 S" Himport matplotlib.pyplot as plt
    5 h6 \4 U! N/ C6 t1 a& N3 j%matplotlib inline
    . q! Q7 E; q! Q. d$ C+ Y! UdeltaT = 0.015 c# o- H& s2 E7 h
    lamb = 2) y3 K) o( l6 j7 ?; z8 g; l  d
    i_list = []
    3 X+ v$ L$ e. W# Yi0 = 0.08; # 初始有8%的人患病3 O6 e/ U+ k6 r- t, h
    i_list.append(i0)
    * ?) O3 z# P' ^3 M$ t2 {Tot_Time = 101 w9 [, y- z0 h9 z8 W
    TotStep = int(Tot_Time/deltaT)
    & q7 F* L4 Y) e##
    ' W3 i8 ~- r4 G( G( ?3 |3 C3 Cfor i in range(TotStep):
    9 s6 B$ i: X5 T; ]- w, M( ]    i_new = i_list[-1] + lamb * i_list[-1] * deltaT
    ! `' s* a9 Z! y3 [" j7 `    i_list.append(i_new). S! e4 K, j3 T# s9 V! E
    plt.plot(i_list)
      p* B, A. E. ]! {3 L
    % @9 m" }9 _' T- O( |1 \) @将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?0 ?7 Z! X( U5 _" u4 a# l8 I1 }% w

    7 o' S: @# }( k) ~8 }4 L( O0 u" K/ X8 D, ?6 O$ |
    实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。
    . D, {' \  M& V& [& H- H8 }- u: Y! ^- \$ O' @1 G4 N! r
    SI模型( f8 J* M; w% z( `. ^- A
    现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:
    0 m4 Y. ^" G9 D: \* I% P2 j6 [# h9 ]7 B# ^) \
    在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)9 j" w, D$ U  w0 a* n
    每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率( W4 ~) E! C% {1 A% }
    仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算) S' c: \9 N9 P

    # o, ^3 J; f$ r8 P8 MN[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$ O- W& k3 V* ]& z) d
    N[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt1 ?6 i9 D# V' \

    8 j! i) n) A% a4 H+ z* n消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式4 u4 G: Y0 L! U: j9 G* P; s
    i(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t
    % V  ]# K( ~$ [i(t+Δt)=i(t)+λi(t)s(t)Δt
    % t1 [# L. D5 P- o# s+ [, x( s
    . y) @; x% \4 y" N! E' ^. l$ I7 L: c同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:. U4 x0 [& F! t

    ; @9 E0 E, |) B' `& ximport matplotlib.pyplot as plt, ~8 M. i' ?) Y- X/ Y
    %matplotlib inline
    1 O) I- n& O9 DdeltaT = 0.01
    " W- ~5 A7 T1 s& _lamb = 2
    5 v7 w# {! _- o2 j! b& i% k8 C- ]i_list = []
    8 ~8 D( F. Q9 Js_list = []
    + g9 `- h1 H. o' di0 = 0.08; # 初始有8%的人患病
    + i7 K/ s5 z# |& ^8 b0 hi_list.append(i0)
    9 F' V- I$ Y8 I- U- o2 s/ }s_list.append(1 - i0)' {4 c; k# }. E3 i; k$ F
    Tot_Time =5
    6 ~; y$ A/ p  K8 w- VTotStep = int(Tot_Time/deltaT)
    / C9 m/ \3 _' I# v7 P7 ^8 X## 2 [  p$ _$ P2 l/ Z" e' M# ]( Z9 k
    for i in range(TotStep):
    5 G7 S3 ^! W9 l  W    i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]0 Y7 I8 q8 g* Z2 @- X
        i_list.append(i_new)
    $ p; V% I+ n5 V( F    s_list.append(1- i_new)" {( V- n) [$ [
    Time = [i * deltaT for i in range(TotStep + 1)]
    0 D. q6 ^% a; R( m! h2 Nplt.plot(Time,i_list)4 V9 P- w* F5 a* j
    plt.plot(Time,s_list)
    3 c+ ?* o* B) ^: _& d% B  Aplt.title("SI",fontsize = 20)( c' f: T- k  l3 x! T' K* i, D/ l
    plt.xlabel("Time")6 \( N. \% x+ Q& d" R/ C. S
    plt.ylabel('i(t)')$ n3 \. t4 u8 W. B( m
    , D& a# O* q9 T+ v3 ?0 i
    从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。
    . a5 X- q& t5 N7 o4 t
    & R: k  {$ t* x3 c然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。  i. R: l8 t" b7 x- C: X* G
    ————————————————
    + C" ]9 ~; u, G5 c( E版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & }2 I5 ?* O% ?" V9 \" w( D$ r原文链接:https://blog.csdn.net/baidu_26746963/article/details/93918383
    , h) P& J1 ~, r; f2 @* Z: R3 K2 y9 j( j$ I, B3 [9 W
    & Y" x" z" m+ p% s8 G
    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-7-24 23:53 , Processed in 0.409059 second(s), 51 queries .

    回顶部