<1>小白的数学建模课-B4. 新冠疫情 SIR模型

近期爆发的新冠疫情让人们对传染病的研究和防控产生了更大的关注。在传染病的研究中,使用SIR模型是一种常见的方法。SIR模型是指将人群分为三类:易感者(Susceptible)、感染者(Infected)、康复者(Recovered)三部分,分析它们之间不断变化的关系。

下面将分别介绍SIR模型的基本概念与方程、使用Python实现SIR模型的方法,以及通过实际案例来说明SIR模型的应用与优缺点。

1. SIR模型的基本概念与方程

在疫情中,将人群分为三类,分别是易感者(Susceptible)、感染者(Infected) 和康复者(Recovered),用S、I、R表示其人数。其中,易感者指的是还没有接受疫苗或者还没有感染过该疾病的人群,感染者指的是那些已经感染上该疾病的人群,康复者指的是那些已经从该疾病中康复或痊愈的人群。

假设S、I、R三者的数值存在如下的关系:

- 根据守恒原理,易感者的减少量正比于易感者和感染者之间发生疾病传播的增加量:$-\frac{dS}{dt}=\beta IS$

- 感染者可以分为两类:已知未被治愈的新感染者;已知被治愈者以及新治愈者。由于感染者增加只能来自于易感者,因此感染者的增加量正比于易感者和感染者之间发生疾病传播的增加量,感染者的减少量正比于感染者被治愈的数量:$\frac{dI}{dt}=\beta IS-\gamma I$

- 康复者的增加量正比于感染者被治愈的数量:$\frac{dR}{dt}=\gamma I$

$\beta$是传染率(疾病传播的效率),$\gamma$是治愈率(患者痊愈的速度)。这些方程可以描述易感者、感染者和康复者三者之间的数学关系和变化趋势。

2. 使用Python实现SIR模型的方法

Python是一种流行的编程语言,对于进行数据处理和科学计算有着很好的支持。我们可以通过Python实现SIR模型,这里我们需要使用Numpy和Matplotlib这两个Python的库,Numpy用于数学计算,Matplotlib用于数据可视化。

下面是一个简单的Python代码实现SIR模型:

```python

import numpy as np

from scipy.integrate import odeint

import matplotlib.pyplot as plt

# SIR model

def SIR_model(y,t,beta,gamma):

S,I,R=y

dS_dt=-beta*S*I

dI_dt=beta*S*I-gamma*I

dR_dt=gamma*I

return([dS_dt,dI_dt,dR_dt])

# Initial conditions

S0=0.99

I0=0.01

R0=0.0

y0=[S0,I0,R0]

# Time vector

t=np.linspace(0,100,1000)

# Parameters

beta=0.3

gamma=0.05

# SIR model solution

solution=odeint(SIR_model,y0,t,args=(beta,gamma))

# Ploting

plt.plot(t,solution[:,0],'g',label='S(t)')

plt.plot(t,solution[:,1],'r',label='I(t)')

plt.plot(t,solution[:,2],'b',label='R(t)')

plt.grid()

plt.legend()

plt.xlabel('Time')

plt.ylabel('Proportions')

plt.title('SIR Model')

plt.show()

```

代码中我们使用了`odeint`函数,它可以求解一般形式的微分方程。我们先定义了一个`SIR_model`函数来描述SIR模型的方程,其中`y`, `t`, `beta`和`gamma`分别代表三类人群数值向量、时间向量,传染率和治愈率。接着我们定义了初始条件和时间向量,以及传染率和治愈率。最后我们使用`odeint`求解微分方程,用Matplotlib库进行数据可视化。

3. 案例说明:SIR模型在新冠疫情预测中的应用

新冠疫情是当前人们普遍关注的传染病研究对象,SIR模型也可以应用于该疫情的预测和分析。

以美国新冠疫情为例,我们可以通过收集已有的人数信息来构建SIR模型,并预测未来的病例变化情况。

首先我们需要获得疫情相关的数据,可以通过公开的数据平台获取,这里我们使用美国Johns Hopkins大学提供的疫情数据进行分析。

```python

import pandas as pd

import numpy as np

# Import data

url = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_US.csv'

confirmed_US = pd.read_csv(url, error_bad_lines=False)

# Preprocessing

confirmed_US['FIPS'] = confirmed_US['FIPS'].fillna(0.0).astype(int)

confirmed_US.set_index('FIPS', inplace=True)

confirmed_US_T = confirmed_US.iloc[:,11:].transpose()

```

数据导入后,我们将其转置以便进行接下来的数学建模。

接着我们可以构建SIR模型:

```python

import numpy as np

from scipy.integrate import odeint

# SIR model

def SIR_model(y,t,beta,gamma):

S,I,R=y

dS_dt=-beta*S*I

dI_dt=beta*S*I-gamma*I

dR_dt=gamma*I

return([dS_dt,dI_dt,dR_dt])

# Initial conditions

N = 331449281

I0 = 2150000

R0 = 0

S0 = N - I0 - R0

# Time vector

t=np.arange(0,confirmed_US_T.shape[0])

# Parameters

beta=0.6

gamma=0.1

# SIR model solution

solution=odeint(SIR_model,[S0,I0,R0],t,args=(beta,gamma))

# Ploting

plt.plot(t,solution[:,0]/N,'g',label='Susceptible')

plt.plot(t,solution[:,1]/N,'r',label='Infected')

plt.plot(t,solution[:,2]/N,'b',label='Recovered')

plt.plot(np.arange(0,confirmed_US_T.shape[0]),np.array(confirmed_US_T.sum(axis=1))/N,color='black',label='Reported Cases')

plt.legend()

plt.xlabel('Days')

plt.ylabel('Proportion of Population')

plt.title('SIR Model of COVID-19 in the US')

plt.show()

```

这段代码中,我们使用了美国的总人口数和已知感染人数来求出易感者的初始数目,然后通过SIR模型预测未来的感染人数,由于新冠疫情已经在美国发生数月,我们可以使用已知的感染人数进行模型校正。我们设定感染率$\beta$为0.6,治愈率$\gamma$为0.1。最后我们将模型结果进行可视化,并且将已知的感染人数也放到同一个图中进行对比。

可以看到,模型的预测结果与实际情况较为接近,SIR模型在疫情数据分析方面具有一定的应用价值。

但是,需要注意的是,SIR模型有其自身的局限性。例如,SIR模型假设人口随时间不变,也就是说没有新生儿或者新移民,同时也没有人流动或者交换环节。在现实中,这些因素很容易影响疾病的传播和控制,因此SIR模型在一些情况下并不能准确地预测病例变化情况。此外,我们还需要考虑传染病的特性和变异,从而优化和改进SIR模型的参数设置。

总之,SIR模型是一种常用的传染病数学模型,在疫情的研究和分析中具有重要的作用。但是它只是一个简单的模型,需要根据实际需要进行参数调整和模型改进。

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(31) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部