二年级的我来绘制一下SEIR病毒传播曲线图

最近的这个情况大家都很清楚,本来好好的春节,一个可以和同学出去happy的假期只能老老实实当一个肥宅,还是一直肥的那种!!!每天写点代码,追追剧,看看考研复习,另外就是刷B站。这不,今天下午刷到毕导又来教我们二年级的知识。建议大家都先去看看

链接奉上
二年级的我来绘制一下SEIR病毒传播曲线图_第1张图片

重点来了

一开始映入我们眼帘的是他那帅气的脸庞,随着进度条的蠕动,出现的数学公式和各种病毒传播模型使我不禁思索,我真的是大学生吗?大三学过这玩意?哈哈,不开玩笑,第一遍看可能确实有点懵,但是看完后想想还是能慢慢理解的,然后由于毕导从不放代码的缘故,所以大多时候只能把他的结果图截屏,这一次有了时间,正好闲着没事就动手把模型图画出来。

二年级的我来绘制一下SEIR病毒传播曲线图_第2张图片
大家看完视频,知道了SEIR模型各参数的意义,然后再根据给的微分方程一步步将变化率代入计算,求得明天的值,最后也画出来了这个图。
二年级的我来绘制一下SEIR病毒传播曲线图_第3张图片

代码

很明显,毕导用的是matlab,而我matlab除了数学建模用过几次,基本一直在用python写数据分析之类的,所以这次还是用python

import math
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False

# 首先还是设置一下参数,之后方便修改
N=10000        # 人口总数


E=[]           # 潜伏携带者
E.append(0)

I=[]           # 传染者
I.append(1)

S=[]           # 易感者
S.append(N-I[0])

R=[]           # 康复者
R.append(0)

r=20           # 传染者接触人数
b=0.03         # 传染者传染概率
a=0.1          # 潜伏者患病概率
r2=20          # 潜伏者接触人数
b2=0.03        # 潜伏者传染概率
y=0.1          # 康复概率


T=[i for i in range(0,160)]   # 时间

for i in range(0,len(T)-1):
    S.append(S[i]-r*b*S[i]*I[i]/N-r2*b2*S[i]*E[i]/N)
    E.append(E[i]+r*b*S[i]*I[i]/N-a*E[i]+r2*b2*S[i]*E[i]/N)
    I.append(I[i]+a*E[i]-y*I[i])
    R.append(R[i]+y*I[i])

def plot():
    plt.figure()
    plt.title("SEIR-病毒传播时间曲线")
    plt.plot(T,S,color='r',label='易感者')
    plt.plot(T, E, color='k', label='潜伏者')
    plt.plot(T, I, color='b', label='传染者')
    plt.plot(T, R, color='g', label='康复者')
    plt.grid(False)
    plt.legend()
    plt.xlabel("时间(天)")
    plt.ylabel("人数")
    plt.show()

plot()

并不是很规范,那就改规范点

import math
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False

def calc(T):
    for i in range(0, len(T) - 1):
        S.append(S[i] - r * b * S[i] * I[i] / N - r2 * b2 * S[i] * E[i] / N)
        E.append(E[i] + r * b * S[i] * I[i] / N - a * E[i] + r2 * b2 * S[i] * E[i] / N)
        I.append(I[i] + a * E[i] - y * I[i])
        R.append(R[i] + y * I[i])

def plot(T,S,E,I,R):
    plt.figure()
    plt.title("SEIR-病毒传播时间曲线")
    plt.plot(T,S,color='r',label='易感者')
    plt.plot(T, E, color='k', label='潜伏者')
    plt.plot(T, I, color='b', label='传染者')
    plt.plot(T, R, color='g', label='康复者')
    plt.grid(False)
    plt.legend()
    plt.xlabel("时间(天)")
    plt.ylabel("人数")
    plt.show()

if __name__ == '__main__':
    # 首先还是设置一下参数,之后方便修改
    N = 10000  # 人口总数
    E = []  # 潜伏携带者
    E.append(0)

    I = []  # 传染者
    I.append(1)

    S = []  # 易感者
    S.append(N - I[0])

    R = []  # 康复者
    R.append(0)

    r = 20  # 传染者接触人数
    b = 0.03  # 传染者传染概率
    a = 0.1  # 潜伏者患病概率
    r2 = 20  # 潜伏者接触人数
    b2 = 0.03  # 潜伏者传染概率
    y = 0.1  # 康复概率

    T = [i for i in range(0, 160)]  # 时间
    calc(T)
    plot(T,S,E,I,R)

这样代码就好看多了

最后

身为一个武汉大学生,还是希望武汉能早点恢复过来的,武汉加油,中国加油!!! 另外大家也可以查查资料,用更准确的数据去绘制模型,看看模型到底准确性如何。

你可能感兴趣的:(python,武汉加油,病毒滚粗)