2019コロナウイルスの感染者数について

2020/02/16 山田 泰司

差分方程式による単純化した問題設定

問題1

2019コロナウイルスに罹患した人が \(n_0=1\) 名、本日判明した。罹患したのは \(T\) 日前であるとする。

この罹患者が1日に2人感染させると仮定し、
かつ、\(T\) 日間でこの罹患者から感染した罹患者も、この罹患者と同様に1日に2人感染させ、
かつ、\(T\) 日間ですべての罹患者が感染に気づかず、そして、回復も死亡もせず、1日に2人感染させ続けた場合、
一週間後である本日、つまり \(T=7\) であるときの罹患者の総数 \(n\) を求めよ。

問題1の解答例1

漸化式による解答から述べる。漸化式は以下の通りである。但し、\(t+1\) を経過日数とし、\(n\) を罹患者の総数、そして \(n_0 = 1\) とする。 \[\tag{1} n_{t+1} = 2\times n_t + n_t \]

これを、閲覧していただいている其方のブラウザ搭載のプログラミング言語Javascriptで、\(t+1=T=7\) まで手元で計算して列挙すると以下のようになる。

問題1の解答例2

漸化式(1)は明らかに、 \[ n_{t+1} = 3\times n_t \] の等比数列であり、以下の一般解をもつ。 \[\tag{2} n_{t+1} = n_0\times 3^t \]

これを、閲覧していただいている其方のブラウザ搭載のプログラミング言語 Javascript で、\(t+1=T=7\) まで手元で計算して列挙すると以下のようになる。

問題2

先の問題1の前提において、罹患者数 \(n\) が \(90000\) 人を超える日数 \(t+1=T\) を求めよ。

問題2の解答例1

式(2)より、\(n_0 = 1\)、\(n_{t+1} > 90000\) となるような日数 \(t+1\) を求めればよい。 \[\tag{3} n_0\times 3^t > 90000 \]

これを、閲覧していただいている其方のブラウザ搭載のプログラミング言語 Javascript で、式(3) となる \(t+1=T\) まで手元で計算して列挙すると以下のようになる。 なんと、たったの\(12\)日である。

問題2の解答例2

これは関数電卓などを用いれば、式(3)より、直接求めることができる。 \[\tag{4} \begin{alignedat}{1} 3^t &> 90000\\\Rightarrow 3^t &> 90000\\\Rightarrow e^{t\log 3} &> 90000\\\Rightarrow e^t e^{\log 3} &> 90000\\\Rightarrow 3e^t &> 90000\\\Rightarrow e^t &> 30000\\\Rightarrow t &> \log(30000)\fallingdotseq 10.31 \end{alignedat} \]

これを、閲覧していただいている其方のブラウザ搭載のプログラミング言語Javascriptで、式(4) となる \(t+1=T\) まで手元で計算して列挙すると以下のようになる。 \(t > 10\) なので \(t+1 = T\) は確かに\(12\)日となる。これは(全快したり、死亡したりして)感染させない人々を考慮していないなど仮定が単純化されているからだろうか。実は、あながちそうとは言えないことを次に示す。

単純化した問題設定に、条件を加える

問題3

問題1の設定において、過去 \(t+1-R\) 時点の罹患者が(全快したり、死亡したりして)感染させないようになり、罹患者ではなくなるという仮定を加える。このときの罹患者数 \(n\) が \(90000\) 人を超える日数 \(t+1=T\) を求めよ。但し、\(R=7\) とする。

問題3の解答例

漸化式は以下の通りである。但し、\(t+1\) を経過日数とし、\(n\) を罹患者の総数、そして \(n_0 = 1\) とする。 \[\tag{5} n_{t+1} = 2\times n_t + n_t - n_{t+1-R} > 90000 \] 但しここで、\(t+1 < R\) のとき \(n_{t+1-R} = 0\) とする。

これを、閲覧していただいている其方のブラウザ搭載のプログラミング言語Javascriptで、式(5) となる \(t+1=T\) まで手元で計算して列挙すると以下のようになる。 \(R=7\) などという場合、つまり、1週間もの間誰かに感染させ続けてしまった場合は、このように指数関数的な増大に全快や死亡による罹患者の減少がとても追いつかず、大して変化がない。では、次の場合はどうであろうか。

問題4

問題3の設定において、\(R=2\) とした場合を求めよ。つまり、自覚症状などで誰かに感染させないような配慮が働くか、すぐに重傷になって死亡するか、という仮定となる。

問題4の解答例

漸化式は式(5)の通りである。

これを、閲覧していただいている其方のブラウザ搭載のプログラミング言語Javascriptで、式(5) となる \(t+1=T\) まで手元で計算して列挙すると以下のようになる。 \(12\)日が\(17\)日に多少マシになったが、それでも指数関数的な増大は免れない。

ちなみに、この過去 \(R\) 分の値を保持する必要があるプログラムコードは多少工夫が必要なので、以下に紹介しておく。

document.write(`\\[\\begin{alignedat}{4}`);
const r = 2;
const R = 1;
let n = new Array(R);
n.fill(0);
n[0] = 1;
for (t=0; ; ++t) {
  const n_R = (t+1 < R ? 0 : n[(t+1-R) % R]);
  n[(t+1) % R] = r*n[t % R] + n[t % R] - n_R;
  document.write(`n_{${t+1}} &= ${r}\\times n_{${t}} + n_{${t}} - n_{${t}+1-${R}} =&\\; ` +
                 `${r}\\times ${n[t % R]} + ${n[t % R]} - ${n_R} &= ${n[(t+1) % R]}\\;&` +
                 `${n[(t+1) % R] > 90000 ? '>' : '\\ngtr'} 90000\\\\`);
  if (n[(t+1) % R] > 90000) break;
}
document.write(`\\end{alignedat}\\]`);
  

結論

罹患者が1日に2人感染させるという仮定がかなり絶望的であることがわかる。\(R>2\) として、1日に1人感染させるとしても指数関数的な増大となる。以下は \(R=3\) の例:

以上の単純化した問題設定では、罹患者が誰かに感染させることが絶望的な指数関数的増加を免れないことが明らかであるが、きちんとした疫学の数理モデルなどを調べた訳ではないので、他をあたることをお勧めする。

注記:これは、報道等で「1人から1日に1.5人感染すると仮定して」などと聞き齧ったので(筆者の勘違いかもしれませんが)、その仮定は「ドラえもんのバイバイン」のように絶望的すぎるのではないかと思い、簡単な計算を Javascript で実装してみたまでです。実装はソースコードをご覧ください。

Written by Taiji Yamada at 2020/02/16