LoginSignup
3
0

More than 3 years have passed since last update.

閉鎖社会で感染数とかどう変化するか

Last updated at Posted at 2020-01-31

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)

HFLF.m
%%
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

結果グラフ

CoronaVirus1.png
CNは一人当たりの接触人数、Incは潜伏期間
横は何日目か
縦は青が潜伏期間の数、赤が発症した数
ちなみにDNはCN=5だと3300人くらいまでで、CN>5だと70000台

考察

パラメータはいろいろ変えられるようにしてあると思う。
今回の条件だと、個人が1日に接触する人が少なくて、潜伏期間が長かった場合、1年ではピークにならない。というか、パンデミとは言わないレベルなのかも。逆に、個人が1日に接触する人が多いと、ピークは早く、収束も早い。今回のパラメーター内では3~4か月。中間だと6~7か月。もちろん、人の行き来とか治療とか、隔離できるかとか全く想定していないので、現実とは大きく異なると思う。

3
0
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
3
0