6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

コロナウイルスの拡散シミュレーション

Last updated at Posted at 2020-03-19

ウイルス拡散シミュレーション

コロナウイルスの収束時期を予測するために、感染が拡大していく様子をシミュレーションするプログラムをMATLABで作ってみました。ソースコードを公開しています。下に示すアニメーションgifは実行例で、それぞれの図の意味は次のとおりです。
・左の図:青が未感染で、黄色が回復(抗体獲得済み)
・真ん中の図:黄色が保菌者、青がそれ以外
・右側の図:保菌者の数(保菌者が増え過ぎると、医療現場がパンクのおそれあり)
anim2.gif

シミュレーションの概要

まず、このシミュレーションの時間単位は日です。つまり、1ステップで1日が経過します。次に、300×300の格子を考え、各格子点で人を表します。各人は、上下左右と斜めの人(合計8人)と接触しています。保菌者と接触している人は、一定の確率で接触した保菌者からウイルスが移り感染します。保菌者は、規定の日数が経過すると、回復します。回復した人は抗体を獲得し、二度と感染しません。各パラメータは、次のように設定しました。
・感染確率:3%(1日あたり3%の確率で、接触した保菌者から感染)
・回復までの経過日数:10日

実装方法

このシミュレーションの実装方法を説明します。まず、各格子点(人)の状態を表すために、300×300の配列(9万人分)を用います。配列は整数を格納し、値が0の場合、その人は未感染であることを示します。感染すると、この値を1とします。感染後は、1日経過するごとに、この値を1ずつ増やします。ただし、10(回復までの経過日数)になったら、それ以上は増やしません。そして、値が10の場合、その人は回復して抗体を獲得した人であることを示します。一方で、値が1以上9以下の場合は保菌者であり、接触する未感染者に感染確率に従いウイルスを移します。この配列は、一度にすべての値を更新します。

補足(境界条件)

全員が未感染ですと誰も感染しません。そこで、中央に一人感染者を配置します。この人は回復しないことにします。また、格子の最外周の人は感染しないことにします。そうすると、プログラムが簡単になります(番兵というテクニックですね)。

所感

このシミュレーションは、すべての人は8人と接触することを仮定しており、また、感染確率と経過日数もいい加減な値です。このため、どの程度、現実的かは不明です。しかし、このシミュレーションが示すことの一つは、感染が拡大していく条件下では、ウイルス拡散の収束には年単位の時間が必要な可能性です。ということで、この騒動が収束するには、もう少し時間を要するのかもしれません。あるいは、ある気象条件下で、ウイルスが一気に不活性化するといったことも考えられますが。

移植

MATLABで実装したため、動かせる人が限られます。接触者数等のパラメータを変えた挙動の分析をして欲しいと考えており、このためにPythonやJuliaに移植してもらえると嬉しいです。GPUを使うことで高速に計算できるので、GPUプログラミングの練習にもなると思います。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?