python odeint_让Python告诉你,最近疯传的SIR传染病模型是什么?

007c571f68f373ceaeba959ccc515344.png

最近看到在网上传的一张SIR传染病模型的图,很多人应该对这个模型不是很了解,今天就讲一下这个模型。这一篇只讲学术,不讨论别的。

SIR模型是传染病模型中最经典的一个,类似的还有SI和SIS两种。SIR是三个单词首字母的缩写,其中S是Susceptible的缩写,表示易感者;I是Infective的缩写,表示感染者;R是Removal的缩写,表示移除者。这个模型本身是在研究这三者的关系。在病毒最开始的时候,所有人都是易感者,也就是所有人都有可能中病毒;当一部分人在接触到病毒以后中病毒了,变成了感染者;感染者会接受各种治疗,最后变成了移除者。这三者的关系如下图所示:

a1116158fef6e6733840df53d8e0a6b3.png

在病毒最开始的时候S=N,然后S以每天α的速度变到I,I又以每天β的速度变到R,不同时刻t下这三者的关系为:

N(t) = S(t) + I(t) + R(t)S(t+1) = S(t) - αS(t)I(t+1) = I(t) - βI(t)R(t+1) =  R(t) + βI(t)

如果我们想要获取某个时间t对应的S、I、R人数,需要知道α和β值,以及S0和I0值。这个模型可以利用Python实现,具体代码如下:

%matplotlib inlineimport scipy.integrate as spiimport numpy as npimport pylab as plalpha=1.4247beta=0.14286TS=1.0 #观察间隔ND=70.0 #观察结束日期S0=1-1e-6 #初始易感人数I0=1e-6 #初始感染人数INPUT = (S0, I0, 0.0)def diff_eqs(INP,t):    '''The main set of equations'''    Y=np.zeros((3))    V = INP    Y[0] = - alpha * V[0] * V[1]    Y[1] = alpha * V[0] * V[1] - beta * V[1]    Y[2] = beta * V[1]    return Yt_start = 0.0t_end = NDt_inc = TSt_range = np.arange(t_start, t_end+t_inc, t_inc) #生成日期范围RES = spi.odeint(diff_eqs,INPUT,t_range)pl.subplot(111)pl.plot(RES[:,0], '-g', label='Susceptible')pl.plot(RES[:,1], '-r', label='Infective')pl.plot(RES[:,2], '-k', label='Removal')pl.legend(loc=0)pl.title('SIR_Model')pl.xlabel('Time')pl.ylabel('Numbers')pl.xlabel('Time')

最后运行上面的代码可以得到如下结果图,上面这张图表示了随着时间t的变化S、I、R人数的一个变化趋势。

50e8c7391c17646dd914ae6f3ba44172.png

这个模型有两个假设条件:

1.一段时间内总人数N是不变的,也就是不考虑新生以及自然死亡的人数2.从S到I的变化速度α、从I到R的变化速度β也是保持不变的

在实际环境中上面的两个假设一般是不太容易满足的,所以得出来的结果会和实际数据有偏差。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值