疫情分析(4)基于流动模型的SEIR病毒模型

之前我们已经获得了疫情数据和百度迁徙的相关数据。接下来就要针对疫情进行数据建模和数据分析。

本次我们使用到的数学模型是SEIR病毒传播动力学的模型,其具体模型的内容不在本次记录中。简而言之SEIR病毒模型就是根据相关参数针对S(易感染者),E(潜伏者),I(感染者),R(康复者)的数据进行数学运算之后得到相关结果。本人针对学习了几个大佬的相关博客后

,在SEIR模型的基础上,引入新的参数和新的算法公式来对SEIR模型进行改进,做出相关的预测。

模型预测内容:假设不进行封城的举措,中国疫情形式将会是如何?也就是说封城的举措对疫情传播的发展的影响。

改进1:在SEIR模型的基础上引入D人数,和d;在传播通途上引入迁入和迁出数据作为新的易感者和潜伏期人群。

SEIR模型设计:

一:符号说明:

符号相关意义N区域总人数E潜伏携带者I感染者S易感者R治愈者DD者r接触人数b传染概率a潜伏者发病率y治愈率kd率Move_in迁入人数Move_out迁出人

传统SEIR公式:

dS/dt=−rbIS/N
dE/dt = rbIS/N − aE
dI/dt=aE−yI
dR/dt=yI

二:改进模型

疫情分析(4)基于流动模型的SEIR病毒模型

改进后的SEIR模型 :

疫情分析(4)基于流动模型的SEIR病毒模型

首先D和d很好引入,只需要引入列表D和d。

迁入和迁出的引入方式比较困难,我们需要首先需要假定只用S和E的人群可以自由流动,所以迁入和迁出的人群全都是S和E,在此基础上因为SEIR模型的N人口总数量的一定的(水平有限先先埋个坑,以后如果有能力再改进为N能变动的模型),所以S的人口流动是没有意义的(对原本的模型不产生影响),综上人口的流动仅仅影响E的大小。所以我们可以改进SEIR模型如下:

dS/dt=−rbIS/N
dE/dt = rbIS/N − aE+Move_inE湖北/(N湖北)-Move_outE/(N)
dI/dt=aE−yI-kI
dR/dt=yI

dD/dt = kI

三:相关参数的确定:

我们已经初步完成了初步改进完成的具有迁入数据影响的SEIR病毒动力模型的数学公式的推导。

下一步我们将进行参数的确定,来完成数学建模。

N:总人口:爬取各省的人口数据。

r:接触人数:通过百度百科得到没人每天平均接触20人左右

b:传播概率;和y:治愈率的求法比较特殊。

传播概率和治愈率以及d率的求法:

为什么说这三个值比较特殊,在建模起初我像直接使用国家统计出来的疫情传播概率和治愈率,但仔细思考一下这样是不正确的做法,因为首先我们模拟的是无干预下的疫情发展趋势,所以其传播率和治愈率都和现实中不一样(我们采用了封城来阻止传染源,用口罩和手套来限制传播途径,最后还用疫苗的方式来增加治愈率和d率),所以直接使用网上的统计数据是不正确的。

求法:我参考了终南山院士团队所研究的模型进行数据的分析:

假设,第一例病例和病毒自己变异形成的,所以初试感染人数就是1,S=N-1 S约等于N

所以dI/dt = rbIS/N – yI 约等于 rbI – yI = I(rb-y) 我们手动解微分方程 I = exp((rb-y)*t)

我们用早期的湖北数据拟合函数就可以算出无干预下的covid-19的传播概率和治愈率以及d率。

封城之前湖北数据17号到23号(作为拟合数据):

疫情分析(4)基于流动模型的SEIR病毒模型

疫情分析(4)基于流动模型的SEIR病毒模型

函数拟合:

指定的公式
x = np.arange(1, 9)
y = np.array([45, 62, 121, 198, 270, 375, 444, 549])
print(x)
print(y)
def func(x,a,b):
    return np.exp((15*a-b)*x)
popt, pcov = curve_fit(func, x, y, [0.05, 0.1])#训练函数
a=popt[0]
b=popt[1]
print(a)
print(b)
yvals=func(x,a,b)
plot1=plt.plot(x, y, '*',label='original values')
plot2=plt.plot(x, yvals, 'r',label='curve_fit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc=4)
plt.title('curve_fit')
plt.show()

人口迁徙数据的使用:
上次我们已经拿到了湖北向各省市的人口流动的数据。

疫情分析(4)基于流动模型的SEIR病毒模型

计算出湖北流入其他各省的人口百分比

得到

1:2020年一月的时候,湖北向各个城市的人口流动数据百分比。

2:我们需要通过百分比计算具体值,就先得到湖北人口流动总数。

3:因为我们要计算从1月23号到之后的若干天后的疫情传播情况,1月23到2月要经历春运和之后的非春运时间,所以针对春运和非春运人口流动的情况也是大不相同的。

我们首先通过2019年春节统计数据得到春运流量大概是4000万人次。

疫情分析(4)基于流动模型的SEIR病毒模型

最后,我们就可以算出湖北向各个省人口流动的大致数据。

注意:在赋微分方程初值的时候,我们要将I(0) = 0 ,让第一例”感染者”是由迁入E中数据来的,这样更能真实的模拟疫情传播的情况。

四:模型的关键代码实现:

迁徙参数

N_GD = 113460000
N_HEN = 96050000
N_HUB = 59170000
N_HUN = 68990000
N_ZJ = 57370000

HU_Bei_move = 40000000
P_spring_out = int((HU_Bei_move/2 * 0.2389)/40)
P_normal_out = int((HU_Bei_move/2 * 0.2389)/80)
percent_GD = 0.008

马科夫链的迭代调用。

 for i in range(0, len(self.T) - 1):
            self.S.append(
                self.S[i] - self.r * self.b * self.S[i] * self.I[i] / self.N)
            if len(self.S) <= 40: self.e.append(self.e[i] + self.r * self.b self.s[i] self.i[i] self.n - self.a self.e[ i] p_spring_out*percent_gd*self.e_hb[i]*100) else: p_normal_out percent_gd self.e_hb[i]*100) self.i.append(self.i[i] self.e[i] self.g self.i[i]*self.d) self.r.append(self.r[i] self.i[i]) self.d.append(self.d[i] self.i[i]*self.d)< code></=>

五:预测结果:

我们选取了2020年收到疫情影响最严重的两个省(广东省和浙江省)进行分析。

疫情分析(4)基于流动模型的SEIR病毒模型

累计确诊无症状感染者D人数3205104632051046293545

疫情分析(4)基于流动模型的SEIR病毒模型

累计确诊无症状感染者最终d人数1620634512373786148485

通过预测结果我们可以清楚的看到封城这一举措的正确性,它有效快捷的切断了传播源头,让其他城市不受到大规模迁徙的影响。如不是封城的举措疫情将会更加肆无忌惮的弥漫开来,对我国各行各业造成不可估计的损失。

本次湖北疫情的预测到此结束,我们所构造的SEIR模型还有很多不足和没有考虑的地方,因为我想把本次重点放在刚刚发生的上海疫情上,所以本次就当练习一下。接下来我会完善和再次改进我们的SEIR模型来对上海刚刚发生的疫情进行建模和预测。届时我将会考虑疫苗等相关对疫情有很大影响的参数。

Original: https://blog.csdn.net/stu2019/article/details/125023747
Author: stu2019
Title: 疫情分析(4)基于流动模型的SEIR病毒模型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/623626/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球