当前位置 博文首页 > shelgi的博客:二年级的我来绘制一下SEIR病毒传播曲线图

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

    作者:[db:作者] 时间:2021-07-27 21:00

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

    链接奉上
    在这里插入图片描述

    重点来了

    一开始映入我们眼帘的是他那帅气的脸庞,随着进度条的蠕动,出现的数学公式和各种病毒传播模型使我不禁思索,我真的是大学生吗?大三学过这玩意?哈哈,不开玩笑,第一遍看可能确实有点懵,但是看完后想想还是能慢慢理解的,然后由于毕导从不放代码的缘故,所以大多时候只能把他的结果图截屏,这一次有了时间,正好闲着没事就动手把模型图画出来。
    在这里插入图片描述
    在这里插入图片描述
    大家看完视频,知道了SEIR模型各参数的意义,然后再根据给的微分方程一步步将变化率代入计算,求得明天的值,最后也画出来了这个图。
    在这里插入图片描述

    代码

    很明显,毕导用的是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)
    

    这样代码就好看多了

    最后

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

    cs
    下一篇:没有了