電卓で「濃厚接触」 - dentagion
HP Primeで、簡易な「感染シミュレーション」をやってみました。
100人程度のごく小さな集団にて、感染者が、どの様に増えていくのか、それを数値実験するものであります。
リスト L1 に100人の状態を設定しております。
リストの要素(セル)1つが1人の「感染状態」を保持していて、
リストのセルを一通り調べ、
という処理を実施します。
最初に、リストの中央に感染セル(状態数 1)を設置、あとは、次の流れでシミュレーションを進行します。
最初に「rate」と、数値入力のテキストボックスが表示されるので、0から1の範囲で、適当な数字を入力してやります。すると、リスト C1, C2, C3, C4 に数値を保存し、実行を終了します。
HP Primeでは「2変数統計」機能で、リストのscatter plotを実施できますから、こうして出来上がったC1, ... C4 のリストデータを用いて、感染者数の推移をグラフに出来る、という具合。
図は、rate=0.5の例で、100人程度の「濃厚接触空間」でも、SIRモデルっぽい曲線が描かれます。

一度、プログラムを読み込んで置けば、後はHOMEボタンを押しdentagi(0.5) の様に打ち込んでやれば、様々な感染レートでのシミュレーションが実施できます。
感染レートが低い場合には、未感染の数がそれなりに増える場合がある、など、様々な事が観察されます。
色々とお試し戴き度。
以下、リストだよん。
# あらまし
簡単な感染シミュレーションです。100人程度のごく小さな集団にて、感染者が、どの様に増えていくのか、それを数値実験するものであります。
リスト L1 に100人の状態を設定しております。
リストの要素(セル)1つが1人の「感染状態」を保持していて、
- 0 - 未感染
- 1〜3 - 感染
- 4 - 発症/隔離
リストのセルを一通り調べ、
- セルの状態が4ならば「発症/隔離」として、特に何もせず
- セルの状態が1〜3ならば「感染」として、感染の状態数を1増やして、更新
- セルの状態が0ならば「未感染」で、両隣のセルを調査
という処理を実施します。
最初に、リストの中央に感染セル(状態数 1)を設置、あとは、次の流れでシミュレーションを進行します。
- セルのランダム移動
- 感染処理
- 未感染(Suscept), 感染(Infection), 発症/回復(Recover) の集計
# 使い方
プログラム「dentagi.ppl」を読み込んで、実行して下さい。最初に「rate」と、数値入力のテキストボックスが表示されるので、0から1の範囲で、適当な数字を入力してやります。すると、リスト C1, C2, C3, C4 に数値を保存し、実行を終了します。
HP Primeでは「2変数統計」機能で、リストのscatter plotを実施できますから、こうして出来上がったC1, ... C4 のリストデータを用いて、感染者数の推移をグラフに出来る、という具合。
- 未感染のグラフを描くには、C1 (X軸), C2 (Y軸)
- 感染のグラフを描くには、 C1 (X軸), C3 (Y軸)
- 発症/回復のグラフを描くには、C1 (X軸), C4 (Y軸)
図は、rate=0.5の例で、100人程度の「濃厚接触空間」でも、SIRモデルっぽい曲線が描かれます。

一度、プログラムを読み込んで置けば、後はHOMEボタンを押しdentagi(0.5) の様に打ち込んでやれば、様々な感染レートでのシミュレーションが実施できます。
感染レートが低い場合には、未感染の数がそれなりに増える場合がある、など、様々な事が観察されます。
色々とお試し戴き度。
以下、リストだよん。
// title : dentagi.ppl - micro contagion simulation for HP Prime // begin : 2020-04-27 00:56:02 // note : // L0 ; cell space // L1 ; cell space next stage // C2 ; Suscept, C3 ; Infect, C4 ; Recovre // rate ; infect Rate [0, 1) EXPORT dentagi(rate) BEGIN LOCAL c, i, j, k, len, p1, p2, tmp; LOCAL idx, sus, inf, rec; // cell space length len := 100; // cell array initialize L1 := MAKELIST(0, X, 1, len, 1); L2 := MAKELIST(0, X, 1, len, 1); C1 := {}; C2 := {}; C3 := {}; C4 := {}; // place first infected cell L1(len/2) := 1; // contagion game loop FOR k FROM 1 TO 30 DO // random walking FOR i FROM 1 TO 30 DO p1 := RANDINT(1, len); p2 := RANDINT(1, len); tmp := L1(p1); L1(p1) := L1(p2); L1(p2) := tmp; END; // infection part L2 := L1; FOR i FROM 2 TO len-1 DO // suscept cell is infected from right infected cell IF L1(i) == 0 AND 0 < L1(i+1) < 4 AND RANDOM() < rate THEN L2(i) := 1; END; // suscept cell is infected from left infected cell IF L1(i) == 0 AND 0 < L1(i-1) < 4 AND RANDOM() < rate THEN L2(i) := 1; END; // infected cell stage number increase IF 0 < L1(i) < 4 THEN L2(i) := L2(i)+1; END; END; L1 := L2; // collect S,I,R sus:=0; inf:=0; rec:=0; FOR i FROM 1 TO len DO c := L1(i); IF c == 0 THEN sus := sus+1; END; IF 0 < c < 4 THEN inf := inf+1; END; IF c == 4 THEN rec := rec+1; END; END; // add SIR summa to C2, C3, C4 C1 := CONCAT(C1, k); C2 := CONCAT(C2, sus); C3 := CONCAT(C3, inf); C4 := CONCAT(C4, rec); END; END;
コメント
コメントを投稿