QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2209|回复: 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 |邮箱已经成功绑定
    问题的提出
    + E( J8 n( ^5 y/ k/ f1 z% _医生们发现,在一个民族或地区,当某种传染病流传时,波及到的总人数大体上保持为一个常数。即既非所有人都会得病也非毫无规律,两次流行(同种疾病)的波及人数不会相差太大。如何解释这一现象呢?试用建模方法来加以证明。
    + r- c! m2 D* O/ P5 N& E
    - p$ `5 F4 {; \8 t- e. l指数模型
    7 c0 S4 I& @1 V* j% \, N定义已感染人数为i(t) i(t)i(t),假设每个病人单位时间有效接触(足以使人致病)的人数为λ \lambdaλ,那么,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算
    - A$ ]6 J0 u" D. Ki(t+Δt)−i(t)=λi(t)Δt i(t+\Delta t) - i(t) = \lambda i(t)\Delta t
    & p5 c1 t( _4 i1 Di(t+Δt)−i(t)=λi(t)Δt) h; R1 l: |/ Z9 }# }. P5 E2 E8 `
    6 w# a8 N7 r  z% h  l" ~6 k
    将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
    / ?4 K0 H0 A( g" t1 ti(t+Δt)=i(t)+λi(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)\Delta t5 P& [8 f3 Y; w+ H# m1 ]
    i(t+Δt)=i(t)+λi(t)Δt6 H8 Y  @6 _5 S4 R: t" A+ d* \
    / s, V* q' w1 O+ v* J2 P5 A
    以上递推公式意味着,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下。
    9 I8 L5 f4 O, i% l, ~) v+ [" C
    6 i& `3 {% J* z* k3 P- q' S& K: \import matplotlib.pyplot as plt$ K7 T6 T7 s5 a: W! I! \3 J; v
    %matplotlib inline
    ( @# ?) I0 N9 T% j# f9 ~deltaT = 0.01
    1 b- v' g2 ?, u/ m$ O1 M0 nlamb = 29 c. h1 D/ j2 x0 a+ z5 M& K
    i_list = []5 R; e# l) O* ?4 {
    i0 = 0.08; # 初始有8%的人患病
    6 i; R  I+ t+ Q9 W5 n- Li_list.append(i0)2 M# ^- o, }+ A4 `6 v
    Tot_Time = 10
    " k, `7 d7 x" S: i+ F, ~TotStep = int(Tot_Time/deltaT)
    * v2 x! H/ @- \8 O! ^3 a* w3 N5 b##
    + l: X  ^5 L4 D3 E8 E3 Hfor i in range(TotStep):
    9 z& ]. k: C6 Z% O& Y1 `    i_new = i_list[-1] + lamb * i_list[-1] * deltaT6 t7 j" L3 t9 D
        i_list.append(i_new)* a: o, }1 e8 P9 b- c+ Y/ \
    plt.plot(i_list)
    - V  F! H  w1 Q+ O# s/ v7 M
    4 e' L2 n: D5 T将以上代码在Jupyter Notebook中运行,得到病人人数的变化趋势见下图,从中我们可以看到病人的增长是指数级的,在短短十天后,已经有3000万人患病!这显然不符合实际情况的,那么问题出在哪里了呢?; f: V' M" g# o5 V* D0 I
    # k$ ~% w5 r  K9 x- k% j

    5 H- z: p0 ]- s0 B" w实际上,若病人解除的是病人,并不能够使病人再次患病,实际上以上的算法导致了重复计数现象的发生。解决办法:必须区分已感染者和未感染者。6 i& w2 {( _# t7 M# V4 u- v
    ) @0 H0 O+ h: D9 l' ^& r
    SI模型
    1 c- ?$ Q' R% C; _* v3 {# m" P现在我们将人群分成两个群体:已感染者(病人,Infected)和未感染者(健康者,Suspect),该模型称为SI模型,模型假设:/ T* C9 O9 m8 N) `
    % K' n3 a  s. M$ C! ?7 |
    在研究时间内,不考虑死亡率和出生率,即总人数N NN不变,病人和健康人的比例分别为i(t) i(t)i(t)和s(t) s(t)s(t)
    . A' T* h- T) B* u每个病人在单位时间内有效接触并致病的人数为λ \lambdaλ,且只有接触健康人才会致病,称λ \lambdaλ为日接触率
    9 T% ~& s( @& }6 i仿照指数模型里面的建模方法,在时间段Δt \Delta tΔt内,病人的增量可以用如下的公式进行计算4 i2 H( e9 c# A- v9 R) K
    & I) W( d# |8 K+ |9 R7 v
    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
    . i% \8 a2 i, s& A9 IN[i(t+Δt)−i(t)]=[λs(t)]Ni(t)Δt  ^0 r/ B7 F# c/ j4 n/ X, `' C
    : C0 V1 t% i0 \, \1 b2 C5 H! a
    消去N NN,再将i(t) i(t)i(t)移到等式的右边,我们得到如下的递推公式
    ' Y0 O* [7 ?, s2 Y5 ki(t+Δt)=i(t)+λi(t)s(t)Δt i(t+\Delta t) = i(t) + \lambda i(t)s(t)\Delta t" [& ~, E* B$ J5 }) ?. }: C
    i(t+Δt)=i(t)+λi(t)s(t)Δt
    - [6 R( h# P; g+ T' E
    " x0 K% d" e) u( }: {% r' ?同样地,我们可以通过当前时刻的病人人数和致病参数λ \lambdaλ,计算得到Δt \Delta tΔt时间后的病人人数,将以上思想在Python中进行实现,代码如下:
    , t7 m& P3 v( m; L+ H6 i. f9 Y
    1 X) b( S: y9 H$ h. n+ Limport matplotlib.pyplot as plt
    / C3 i0 j& m6 G" h%matplotlib inline& r, d- g/ P7 ^
    deltaT = 0.013 Q. Z5 @. Q1 X/ ?" t6 ]/ q
    lamb = 26 M, ]( W0 w# f1 Y
    i_list = []
    + L9 C" W; e7 J' m, [! U4 L1 `% Ys_list = []4 \$ H" e/ f6 |6 C+ y9 {
    i0 = 0.08; # 初始有8%的人患病+ }/ l! @( ]8 w9 r, A
    i_list.append(i0)) K6 k8 V5 v8 h4 w; u4 w8 Q
    s_list.append(1 - i0)
    4 a( A- j5 G9 I& [/ y- b; _5 b# n1 W1 ^Tot_Time =5
    # }& {# S1 _( r- jTotStep = int(Tot_Time/deltaT)$ |: B& J7 s+ w# c7 K
    ## ) G; U2 O" A$ }
    for i in range(TotStep):
    " q: r" h( g% L# ~0 O8 \    i_new = i_list[-1] + lamb * i_list[-1] * deltaT * s_list[-1]
    ; J) Q& X3 Y5 f# W; o* m7 A    i_list.append(i_new)
    ( l4 Y+ [: r+ G  N* D' e- E+ f3 b9 a7 I    s_list.append(1- i_new)7 ?$ Q( _" [% Y! g, z
    Time = [i * deltaT for i in range(TotStep + 1)]: D8 i% `, y' Q9 r% V+ M4 V# X
    plt.plot(Time,i_list)6 P' u$ w! i7 j! d7 z0 u
    plt.plot(Time,s_list)4 m, F8 S1 n3 ]/ F  ]5 ?* N
    plt.title("SI",fontsize = 20)
    0 F: W# Y! H7 O4 V  N  r, H9 T" Mplt.xlabel("Time")
    ) V( V7 K- U4 p% jplt.ylabel('i(t)')
    ! l6 @/ I  X8 Q, C! {. p
    ; y. [- b# Y6 x: p  b* V% K从SI模型我们可以看到,病人比例不再会出现"指数爆炸"的情况,在t→∞ t \rightarrow \inftyt→∞时最大患病比例为1。在SI模型中,病人数量的增长曲线是一个典型的S型曲线,又称为Logistic曲线,该曲线在生物学上经常被用来描述物种的增长模。5 L" B0 k0 ]% O' Y# C& M1 Y

    ' s8 j' P% {% q& y然后,SI模型的结论告诉我们,无论λ \lambdaλ多么小,最终人群都会患病,这显然也是不符合实际情况的。
    : v# q( i' \6 Q0 [  d————————————————7 m- Y. u& t1 V3 p9 e
    版权声明:本文为CSDN博主「任公子ha」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. _0 @. G# Y9 g7 _3 y
    原文链接:https://blog.csdn.net/baidu_26746963/article/details/939183838 j) `8 u! ?: z  r
    3 @! `$ ~* A, e- i2 o2 y

    2 T% n$ y2 C( ~% B" 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-9-9 02:06 , Processed in 0.467037 second(s), 51 queries .

    回顶部