写在前面:
上两篇文章链接为
【Python数学建模】SEIR传染病模型模型延伸-SEIDR模型(一),加入疫苗接种、政府管控、病毒变异等因素的影响
【Python数学建模】SEIR传染病模型模型延伸-SEIDR模型(二),加入外部输入等因素的影响,延伸模型
需要源代码的小伙伴可以移步到我的GitHub仓库https://github.com/moyuweiqing/SEIR-Model-extension 中进行获取,如果觉得我的文章或代码帮助到你的话,不妨在文章或GitHub代码中给我点个赞,谢谢大家!
在上一篇文章中,我们从原始的SEIR传染病模型进行出发延伸模型,得到了一个基本的SEIDR模型,并考虑了多个因素通过影响模型的参数从而影响最终的模型效果。在这部分,将会考虑把经济发展引入进来,将模型从单纯的一个简单的传染病模型而转变为一个传染病和经济发展的模型。
第一部分,首先先简化一下原本的SEIDR模型,假设在一个相对封闭的社会中有且只有四种人:
S (Susceptible),易感者,指缺乏免疫能力健康人,与感染者接触后容易受到感染;
I (Infectious),患病者,指有传染性的病人,可以传播给 S,将其变为 I ;
W (White),大白,指大白,负责管理患病者 I 的人群, 从易感者 S 中来,数量随着患病者 I 的数量的变化而变化,成为大白时不会被感染,但从大白又还原回易感者时会感染;
R (Recovered),康复者,指病愈后具有免疫力的人。
此设定从基本的SIR模型中来,加入了大白这一特殊的人物设定,为了简化模型,我们不考虑过多的不同人群之间转化因素,因此,模型的基本参数如下:
参数 | 参数解释 |
N | 总人口数 |
i0 | 输入感染人数,即一开始的患病者人数 |
r0 | r0值,ji即一个患病人一天可以传染给多少人 |
r | 恢复天数,即从患病者转到康复者所需要的时间 |
s | 一个大白管几个人 |
Day | 观察期长度 |
该模型有如下前置假定:
设定模型参数后,计算每日各类人群的数量,代码如下:
import math
N = 100000 # 总人口数
i0 = 1 # 输入感染人数
r0 = 2 # R0值,即一个传染源一天能传染多少人
r = 15 # 恢复天数
s = 9 # 一个大白管几个人
Day = 100 # 观察期长度
I = i0 # I: illness -> 得病者,初始值为输入感染人数
W = math.ceil(I / s) # W: white -> 大白
R = 0 # R: recover -> 恢复者
S = N - I - W - R # S: susceptible -> 易感者,即易感人群
I_list = [I]
W_list = [W]
R_list = [R]
S_list = [S]
ill_dict = dict(zip(range(1, r + 1, 1), [0] * 15))
ill_dict[1] = 1
def ill_dis():
global ill_dict
recover = ill_dict[r]
for i in range(r - 1, 0, -1):
ill_dict[i + 1] = ill_dict[i]
return recover
def cal_per_day(day):
global I, W, R, S, ill_dict, I_list, W_list, R_list, E_list
It = I * r0
max_e = math.ceil(s / (s + 1) * S) # 最大的可能新增感染数
It = max_e if It > max_e else It
Rt = ill_dis()
I = I + It - Rt
W = math.ceil(I / s)
R = R + Rt
S = N - I - W - R
ill_dict[1] = It
I_list.append(I)
W_list.append(W)
R_list.append(R)
S_list.append(S)
return I, W, R, S
这里需要注意两个地方:
对于上述的SIWR模型,我们暂时仅考虑r0值对模型的影响,在以下参数设定一致的情况下,我们考虑不同r0值对模型的影响:
参数 | 设定值 |
N | 100000 |
i0 | 1 |
r | 15 |
s | 9 |
Day | 100 |
在r0=2的情况下,模型效果如下:
在r0=20的情况下,模型效果如下:
可以看到, 模型的趋势几乎是一致的,感染人数呈指数级增长在r0=2的时候,单日感染峰值在第10天达到峰值,在第75天达到所有人感染,在第90天达到最高康复人数;在r0=20的时候,单日感染峰值在第4天达到峰值,在第68天达到所有人感染,在第83天达到最高康复人数。
有以下的部分需要我们去理解和思考:
在上面模型的基础上,推广到经济层面,假定易感者S、患病者I、大白W、康复者R在该封闭社会中进行生产或消耗,其中,易感者S和康复者R对经济进行生产,患病者I和大白W对经济进行消耗,统计观察期内的经济生产净值情况。
其中,生产人员在单日的生产净值为Gc,消耗人员在单日的生产净值为Ge,每日的经济生产净值为:
代码情况如下:
Gc = 1000 # 单人单日贡献值
Ge = 1000 # 单人单日消耗值
economy_list = []
def cal_economy(I, W, R, S):
global alleconomy
creation = (S + R) * Gc
expenditrue = (I + W) * Ge
economy_list.append(creation - expenditrue)
给定如下参数:
参数 | 参数值 |
Gc | 1000 |
Ge | 1000 |
即,在一天中,经济的生产人一天会生产1000的经济净值,经济的消耗人一天会消耗1000的经济净值,在该情况下,计算模型在观察期内的总经济生产净值。
在SIWR模型保持上述参数的前提下,给定上述的Gc和Ge值,计算不同情况下的观察期内的总经济生产净值。
在r0=2的情况下,每日的经济生产净值情况如下:
在r0=20的情况下,每日的经济生产净值情况如下:
其中,r0=2的时候观察期内的总经济生产净值为6666670000,r2=2-的时候观察期内的总经济生产净值为6666690000,几乎相等。
r0对于在相对较长的一个经济观察期内并没有什么特别的影响,原因也容易分析,在这个设定中,几乎每个人都会被感染,每个人都至少会占用r(15)天的时间去消耗经济净值,此时该部分将会是15 * 100000 * 100 * 2000 = 30000000000,加上部分的人员将会在大白和患病者中间进行身份切换,故会有人将会占用比r(15)天更多的时间去消耗经济净值,故最后总的经济净值将会几乎相等。
但即便如此,由于该疫情冲击,该封闭环境内的经济净值比原先的要低33.33%,严重影响经济发展。
由于时间紧迫,暂时只给出最基本的模型,后续会补充模型的参数,进一步发展模型。
以下为从模型的方法,从经济的角度去解释国家防疫措施的转变。
看到这,你是否会对于我国对于防疫政策的放开,和疫情防控的发展有了一个新的认识。