社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用python模拟在地图上疫情扩散

python • 8 年前 • 920 次点击  

效果图:
                                             瘟疫蔓延,连芬兰都难以幸免

在分享文章前还是分享自己的Python学习交流群:643692991,需要更多免费python资料 可以加群获取!

     来展示一些病毒传播模型。需要注意的是这个模型并不反映现实情况,因此不要误以为是西非可怕的传染病。相反,它更应该被看做是某种虚构的僵尸爆发现象。那么,让我们进入主题。

这就是SIR模型,其中字母S、I和R反映的是在僵尸疫情中,个体可能处于的不同状态。

  • S 代表易感群体,即健康个体中潜在的可能转变的数量。

  • I 代表染病群体,即僵尸数量。

  • R 代表移除量,即因死亡而退出游戏的僵尸数量,或者感染后又转回人类的数量。但对与僵尸不存在治愈者,所以我们就不要自我愚弄了(如果要把SIR模型应用到流感传染中,还是有治愈者的)。

至于β(beta)和γ(gamma):

  • β(beta)表示疾病的传染性程度,只要被咬就会感染。

  • γ(gamma)表示从僵尸走向死亡的速率,取决于僵尸猎人的平均工作速率,当然,这不是一个完美的模型,请对我保持耐心。

S′=−βIS告诉我们健康者变成僵尸的速率,S′是对时间的导数。

I′=βIS−γI告诉我们感染者是如何增加的,以及行尸进入移除态速率(双关语)。

R′=γI只是加上(gamma I),这一项在前面的等式中是负的。

上面的模型没有考虑S/I/R的空间分布,下面来修正一下!

一种方法是把瑞典和北欧国家分割成网格,每个单元可以感染邻近单元,描述如下:


其中对于单元是它周围的四个单元。(不要因为对角单元而脑疲劳,我们需要我们的大脑不被吃掉)。

初始化一些东东。

适当的beta和gamma值就能够摧毁大半江山

还记得导数的定义么?当导数已知,假设Δt很小的情况下,经过重新整理,它可以用来近似预测函数的下一个取值,我们已经声明过u′(t)。

回想前面:

我们把函数(u(t +△t))在下一个时间步记为表示当前时间步。

这种方法叫做欧拉法,代码如下:

我们需要函数f(u)。友好的numpy提供了简洁的数组操作。我可能会在另一篇文章中回顾它,因为它们太强大了,需要更多的解释,但现在这样就能达到效果:

导入北欧国家的人口密度图并进行下采样,以便较快地得到结果


北欧国家的人口密度图(未包含丹麦)

S矩阵,也就是易感个体,应该近似于人口密度。感染者初始值是0,我们把斯德哥尔摩作为第一感染源。

因为还没人死亡,所以把矩阵也置为0.

接着初始化模拟时长等。

我们需要自定义一个颜色表,这样才能将感染矩阵显示在地图上。

下面坐下来欣赏吧…

让我们再做一下图像渲染,把它做成gif,每个人都喜欢gifs!

瘟疫蔓延的gif图,连芬兰都难以幸免

看,唯一安全的地方是人口密度不太高的北部地区,动画中连芬兰最后都被感染了,现在你明白了吧。


每一位读者都是python大牛

    (长按二维码加关注)


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/6P7G86BgNz
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2741
 
920 次点击