MATLABで思いつくまま感染者の数やら収束までの期間を見てみた (いつものように素人の試行錯誤)
凡例
パラメータは分かるように書いたつもりだけどあまりにも投げやりなので少し補足する。
ContactN 一人の潜伏期間の感染者が1日に何人と接触するか
ContactQ 症状が出て隔離された感染者が1日に何人と接触するか
Incubation 潜伏期
DiseaseD 症状がある期間
で、この最終日に助かるか(RN)助からないか(DN)に振り分けている
IR 潜在期間が終わって顕在化する確率
DR 致死率
RN 社会の中で免疫を獲得した人数
DR 社会の中で助からなかった人数
InfectionR1 潜伏期間の感染者が誰かと会ってどれくらい感染させるか率
InfectionR2 隔離された感染者が誰かと会ってどれくらい感染させるか率
DiseaseN 潜伏期1日目から退院日までの配列
今回の初期値では潜伏期間の感染者は1日当たりが3人ずつ、発症者1日目を20人にとった。なんとなく、ここが変わると全体も変わる。
スペルミスとかあるとは思う。根本的な考え違いもあるかもしれない。
結果としてみたいと思ったのは、発症していない感染者のピーク日(d1)、発症した感染者のピーク日(d2)、収束日(d3)。一人当たりの接触数(ContactN)と潜伏期間(Incubation)をいくつか変えてみた。パラメータを変えての結果はd1M,d2M,d3M。他は固定したけど、気が向いたら変えてみます。
MATLAB code (modoki)
%%
ContactNM=[5 10 15 20 25] % mean contact number for one day before quarantine
IncubationM=[8 11 14]; %Incubation period (days)
ContactQ = 5; % mean contact number for one day after quarantine (medial staff and family members)
DiseaseD = 10; % mean disease duration for each patients with symptoms
IR= 60/100; % Rate for getting Illness (fever cough)
DR = 2/100; % Death rate
InfectR1 = 1/100 % mean infection rate for each contact before quarantine
InfectR2 = 2/100 % mean infection rate for each contact after quarantine
figure(1);clf
for j = 1:size(ContactNM,2)
for k = 1:size(IncubationM,2)
ContactN=ContactNM(j)
Incubation=IncubationM(k)
DiseaseN = [ones(1,Incubation)*3 20 zeros(1,DiseaseD-1)]; % Initial number of patients in matrix
n1 = InfectR1 * Incubation * ContactN % Infection number per person before quarantine
n2 = InfectR2 * DiseaseD * ContactQ % Infection number per person after quarantine
Population0 = 10000000; % TOKYO, JAPAN, as closed city
DN= 0; % total death number
RN=0; % total immuned number
Day = 0;
sum1max=0; sum2max=0;
d= 0; % Initial day
d1=0;d2=0;d3=0;
for i = 1:365
d= d +1;
sum1=int32(sum(DiseaseN(1:Incubation))); % before quarantine
sum2=int32(sum(DiseaseN(Incubation+1:Incubation+DiseaseD))); % after quarantine
if sum1 > sum1max
sum1max = sum1;d1=d;
else sum1max = sum1max;d1=d1;
end
if sum2 > sum2max
sum2max = sum2;d2=d;
else sum2max = sum2max;d2=d2;
end
if sum1 + sum2 ==0
d3(d)=d;
end
N = Population0 - sum1 - sum2 - DN - RN; % population without immune for Corona
if N < 0
N = 0;
return;
end
IN1 = int32(sum1 * ContactN * InfectR1 * (N/Population0));
IN2 = int32(sum2 * ContactQ * InfectR2 * (N/Population0));
IN = IN1 + IN2;
EN=DiseaseN(Incubation+DiseaseD); % one day before discharged from hospital; judge alive or death on the day
DN = DN + int32(EN*DR);
RN = RN + int32(EN*(1-DR))+ int32(DiseaseN(Incubation+1)*(1-IR));
DiseaseN=[IN DiseaseN(1:Incubation+DiseaseD-1)];
DiseaseN(Incubation+1)= DiseaseN(Incubation+1)*IR; % multiply the rate of getting illness
subplot(size(ContactNM,2),size(IncubationM,2),(size(IncubationM,2)*(j-1)+k))
plot(d,sum1,'.b');hold on
plot(d,sum2,'.r');
end
DNM(j,k)=DN;nn(j,k)=n1;
sum1maxM(j,k)=sum1max; sum2maxM(j,k)=sum2max;
d1M(j,k)=d1;d2M(j,k)=d2;d3M(j,k)=365-size(d3(d3>0),2);
end
end
結果グラフ
CNは一人当たりの接触人数、Incは潜伏期間
横は何日目か
縦は青が潜伏期間の数、赤が発症した数
ちなみにDNはCN=5だと3300人くらいまでで、CN>5だと70000台
考察
パラメータはいろいろ変えられるようにしてあると思う。
今回の条件だと、個人が1日に接触する人が少なくて、潜伏期間が長かった場合、1年ではピークにならない。というか、パンデミとは言わないレベルなのかも。逆に、個人が1日に接触する人が多いと、ピークは早く、収束も早い。今回のパラメーター内では3~4か月。中間だと6~7か月。もちろん、人の行き来とか治療とか、隔離できるかとか全く想定していないので、現実とは大きく異なると思う。