QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2206|回复: 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 |邮箱已经成功绑定
    问题的提出
    - Q2 X2 y; A4 h医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。/ G$ `4 t5 U% S. O: v- Z0 D
    / v- d7 i# B1 H( Q& d
    指数模型
    7 K% M: o& q- H* ~定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算2 J0 i* m+ C9 ?& }* R. h: Y. k' b6 u
    i(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t/ s( s7 t! E& E. n1 ^! x& X/ u
    i(t+Δt)−i(t)=λi(t)Δt  Y1 V, V7 H! _2 {9 D

    . M% L& d' v; T  P  l+ {将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
    ( T$ m2 A1 {1 d8 ?% d& s+ Ji(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t
    / I: X; O. D1 Li(t+Δt)=i(t)+λi(t)Δt
    0 c! [' A! J7 o# Y, O! O1 H0 s
    " U: Q& s( L6 K  L7 H2 `以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。% u. o0 Q# o0 f2 s1 b
    ; C/ l! a1 x  i5 f- E" o
    import matplotlib.pyplot as plt1 N" u9 J7 k' }
    %matplotlib inline
    - }# f8 A1 T8 l; ~4 L3 r3 f& DdeltaT = 0.01" D, h, R% l% }2 E2 p% c" |
    lamb = 2
    % }1 g# S! G" D/ \i_list = []5 i2 x, j9 m9 |# D* r; f6 f& v7 K
    i0 = 0.08; # 初始有8%的人患病6 Y7 r( F: g+ r" f& O
    i_list.append(i0)% {7 Y. F3 x2 V; ~" d
    Tot_Time = 105 G; {( Q9 g; q
    TotStep = int(Tot_Time/deltaT)
    6 v- V( b, d! l4 X" k% N' c##
    0 p: o1 X! c0 G4 p$ Rfor i in range(TotStep):
    5 G0 G. [- w' Q    i_new = i_list[-1] + lamb * i_list[-1] * deltaT6 T0 Z7 c9 L" E" z  Z) E
        i_list.append(i_new)6 ^/ x1 E' h' m8 A0 ?& X
    plt.plot(i_list)  K0 F5 R2 B1 k) s

    1 p* T+ |* n, b0 L将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?
    ; ^* ?; C6 ]' E9 B2 j4 Z2 S; i, V) @$ H6 L( m

    - d& d, X/ E- R# e( c% d( I实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。
    7 U- i* u7 K9 o- o0 Z6 s% ^5 D3 b
    SI模型
    9 p" {  M/ K) |3 [现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:, K3 T8 Q( a9 j& b
    # o" p/ J0 \) z/ @/ L
    在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)1 L  w$ A: f" S0 Q! D
    每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率6 W' F- O9 w. P0 j/ Y* W7 Z
    仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算( k$ W& I8 M& |* a) D8 v+ @# F

    : W+ l+ U7 Q& U9 o; W+ t5 [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
    4 R( t2 q" z+ j. g- uN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt2 r, c6 {/ m. F  M

    % R% T) Q7 v, s& i+ a消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式, `- w, u: R" b) T$ ]* z
    i(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t/ ~- b. A! @$ ^5 ~
    i(t+Δt)=i(t)+λi(t)s(t)Δt
    ' S# C8 V5 f8 Z' D
    6 P4 N! ^. }: G' c: f同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:
    , ^. g' ^- l1 {8 |9 G9 g
    6 {/ J: r) o( U+ b, T, uimport matplotlib.pyplot as plt
    8 V& p+ c+ c) P% J8 h4 p%matplotlib inline: B! J& t% Y( N* H+ |' u' Y
    deltaT = 0.01
    : ~3 v, I# ]; o4 q: Q7 Y9 qlamb = 20 {$ D. _+ f1 x  y( G3 k! y
    i_list = []8 Y( u% H; j+ X* ]
    s_list = []* H4 o6 V, E. ~
    i0 = 0.08; # 初始有8%的人患病/ R8 Q3 m) f) b
    i_list.append(i0)' c8 I+ L; T, Z% Y1 h
    s_list.append(1 - i0)
    3 y% x5 v, J: l6 P$ zTot_Time =58 D3 ?0 \! p1 ^% C( E: M6 ~& o
    TotStep = int(Tot_Time/deltaT)
    3 I! b8 y. o7 o# s9 i7 h5 O" X5 w##
    0 w9 `1 u5 N" F0 {5 Vfor i in range(TotStep):/ K0 W6 o" Y- J% L
        i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]1 W8 }, D! p. d" {% ^1 Z
        i_list.append(i_new)
    6 L- H# _/ k9 T+ r) M+ {    s_list.append(1- i_new)$ B  e- I& z+ K& C
    Time = [i * deltaT for i in range(TotStep + 1)]/ o6 @& R! I( @: h
    plt.plot(Time,i_list)1 z6 f1 B& s) S* T3 H! ]: r
    plt.plot(Time,s_list)
    $ ]0 I7 y% n% Splt.title("SI",fontsize = 20): K, n! _, J6 E7 j) O
    plt.xlabel("Time")
    % i& ]1 e% Z) W* u; z: O9 V  O' ~plt.ylabel('i(t)'): ]) i7 q. d& p2 J0 T

    % g% c  e  W- f0 B1 q5 V8 @1 P! ]从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。2 \, J3 Y1 W0 \; u( P6 M2 s

    . E, w- G# z: c( z9 B/ R然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。' Y8 V. K! G* J5 p9 h& \& M4 p9 @
    ————————————————
    * A  j: J2 z7 u5 f版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) m& k( {. V" y9 X# D& A
    原文链接:https://blog.csdn.net/baidu_26746963/article/details/93918383! S2 a' h% R# X$ b: H1 q

    + S% v# T7 P$ L) }2 u" E0 y. m! T: p0 w0 p% `. W0 Y
    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:08 , Processed in 0.413157 second(s), 50 queries .

    回顶部