NIM : 180402101
MATA KULIAH : PEMODELAN DAN SIMULASI
TUGAS KE-V (5)
b) Model SEIR
Model ini secara umum identik dengan penurunan model SIR, hanya mengalami
penambahan sebuah variabel Exposed (E), yaitu individu yang telah terpapar oleh
penyakit namun belum sepenuhnya terinfeksi. Dalam hal ini populasi dibagi menjadi 4
kelompok, yaitu Susceptible (S), Exposed (E), Infected (I ), dan Recovered (R). Total
keseluruhan populasi adalah N = S + E + I + R yang sifatnya konstan.
Model ini memiliki dua parameter tambahan yaitu satu adalah latar belakang
kematian yang tidak terpengaruh oleh keadaan penyakit, sedangkan yang lainnya adalah
vaksinasi. Vaksinasi memindahkan orang dari yang rentan menjadi resistan langsung,
tanpa menjadi terpapar atau terinfeksi. SEIR berbeda dari model SIR dalam penambahan
periode latensi. Individu yang terpapar (E) telah melakukan kontak dengan orang yang
terinfeksi, tetapi mereka sendiri tidak menular. Model SEIR dapat dikonstrusikan
sebagai:
Keterangan:
E : Individu laten/ terpapar
b : Laju penularan penyakit
x : Laju kesembuhan
m : Laju kelahiran dan laju kematian
a: Laju vaksinasi
r: Laju kekebalan tubuh
B. Model SIS
C. Model SEIR
3. Cari dan buatlah program untuk implementasi dengan bahasa pemrogaman yang anda kuasai
a. Model SIR
function dPop=Diff_2_1(t, pop, parameter)
beta=parameter(1);
gamma=parameter(2);
S=pop(1);
I=pop(2);
R=pop(3);
dPop=zeros(3,1);
dPop(1)= -beta*S*I;
dPop(2)= beta*S*I - gamma*I;
dPop(3)= gamma*I;
endfunction
function [t,S,I,R] = Program_2_1(beta,gamma,S0,I0,MaxTime)
S=S0;
I=I0;
R=1-S-I;
[t, pop]=ode45(@(t,y) Diff_2_1(t,y,[beta gamma]),[0 MaxTime],[S I
R]);
S=pop(:,1); I=pop(:,2); R=pop(:,3);
Endfunction
[t,S,I,R] = Program_2_1(1.4247,0.14286,1-1e-6,1e-6,70);
plot(t,S,"-r",t,I,"-g",t,R,"-b")
xlim([0 200])
xlabel("Time","fontweight","bold")
ylabel("Number","fontweight","bold")
h = legend("S","I","R");
legend(h,"show")
B. Model SIS
beta = 0.8; delta = 1;
Para = Para_SIS (delta , beta )
Net = NetCmbn ([ MyNet (G) ])
def Para_SIS (delta , beta ) :
M = 2; q = np. array ([1]) ; L = len(q) ;
A_d = np. zeros ((M,M) ) ; A_d [1][0] = delta
A_b = []
for l in range (L) :
A_b. append (np. zeros ((M,M) ) )
A_b [0][0][1] = beta #[l][M][M]
Para =[M,q,L,A_d ,A_b ]
return Para
x0 = np. zeros (N)
x0 = Initial_Cond_Gen (N, Para [1][0] , 2 , x0)
StopCond = [’RunTime ’,
20]
ts , n_index ,
i_index , j_index =
GEMF_SIM (Para , Net ,
x0 , StopCond ,n)
T, StateCount =
Post_Population (x0 ,
M, n, ts , i_index ,
j_index )
T, StateCount =
Post_Population (x0 ,
M, n, ts , i_index ,
j_index )
C.Model SEIR
library(deSolve)
seir_ode<-function(t,Y,par){
S<-Y[1]
E<-Y[2]
I<-Y[3]
R<-Y[4]
beta<-par[1]
sigma<-par[2]
gamma<-par[3]
mu<-par[4]
dYdt<-vector(length=3)
dYdt[1]=mu-beta*I*S-mu*S
dYdt[2]=beta*I*S-(sigma+mu)*E
dYdt[3]=sigma*E-(gamma+mu)*I
return(list(dYdt))
}
beta<-520/365;
sigma<-1/60;
gamma<-1/30;
mu<-774835/(65640000*365) # UK birth and population figures 2016
init<-c(0.8,0.1,0.1)
t<-seq(0,365)
par<-c(beta,sigma,gamma,mu)
# Solve system using lsoda
sol<-lsoda(init,t,seir_ode,par)
# Plot solution
plot(t,sol[,2],type="l",col="blue",ylim=c(0,1),ylab="Proportion")
lines(t,sol[,3],col="orange")
lines(t,sol[,4],col="red")
lines(t,1-rowSums(sol[,2:4]),col="green")
legend(300,0.7,legend=c("S","E","I","R"),col=c("blue","orange","red","
green"), lty=1, cex=0.8)
4. Cari perangkat lunak baik open source maupun komersial yang menyediakan pemodelan dan
simulasi penyakit epidemik khususnya Covid-19 dan buatlah program untuk implementasi
dengan perangkat lunak tersebut
a. Model SIR
import numpy as np
# initialize the population vector from the origin-destination flow
matrix
N_k = np.abs(np.diagonal(OD) + OD.sum(axis=0) - OD.sum(axis=1))
locs_len = len(N_k) # number of locations
SIR = np.zeros(shape=(locs_len, 3)) # make a numpy array with 3
columns for keeping track of the S, I, R groups
SIR[:,0] = N_k # initialize the S group with the respective
populations
# row normalize the SIR matrix for keeping track of group proportions
row_sums = SIR.sum(axis=1)
SIR_n = SIR / row_sums[:, np.newaxis]
# initialize parameters
beta = 1.6
gamma = 0.04
public_trans = 0.5 # alpha
R0 = beta/gamma
beta_vec = np.random.gamma(1.6, 2, locs_len)
gamma_vec = np.full(locs_len, gamma)
public_trans_vec = np.full(locs_len, public_trans)
# run model
print(SIR_sim.sum(axis=0).sum() == N_k.sum())
from tqdm import tqdm_notebook
infected_pop_norm = []
susceptible_pop_norm = []
recovered_pop_norm = []
for time_step in tqdm_notebook(range(100)):
infected_mat = np.array([SIR_nsim[:,1],]*locs_len).transpose()
OD_infected = np.round(OD*infected_mat)
inflow_infected = OD_infected.sum(axis=0)
inflow_infected = np.round(inflow_infected*public_trans_vec)
print('total infected inflow: ', inflow_infected.sum())
new_infect = beta_vec*SIR_sim[:, 0]*inflow_infected/(N_k +
OD.sum(axis=0))
new_recovered = gamma_vec*SIR_sim[:, 1]
new_infect = np.where(new_infect>SIR_sim[:, 0], SIR_sim[:, 0],
new_infect)
SIR_sim[:, 0] = SIR_sim[:, 0] - new_infect
SIR_sim[:, 1] = SIR_sim[:, 1] + new_infect - new_recovered
SIR_sim[:, 2] = SIR_sim[:, 2] + new_recovered
SIR_sim = np.where(SIR_sim<0,0,SIR_sim)
# recompute the normalized SIR matrix
row_sums = SIR_sim.sum(axis=1)
SIR_nsim = SIR_sim / row_sums[:, np.newaxis]
S = SIR_sim[:,0].sum()/N_k.sum()
I = SIR_sim[:,1].sum()/N_k.sum()
R = SIR_sim[:,2].sum()/N_k.sum()
print(S, I, R, (S+I+R)*N_k.sum(), N_k.sum())
print('\n')
infected_pop_norm.append(I)
susceptible_pop_norm.append(S)
recovered_pop_norm.append(R
\
b. Model SIS
beta = 0.8; delta = 1;
Para = Para_SIS (delta , beta )
Net = NetCmbn ([ MyNet (G) ])
def Para_SIS (delta , beta ) :
M = 2; q = np. array ([1]) ; L = len(q) ;
A_d = np. zeros ((M,M) ) ; A_d [1][0] = delta
A_b = []
for l in range (L) :
A_b. append (np. zeros ((M,M) ) )
A_b [0][0][1] = beta #[l][M][M]
Para =[M,q,L,A_d ,A_b ]
return Para
x0 = np. zeros (N)
x0 = Initial_Cond_Gen (N, Para [1][0] , 2 , x0)
StopCond = [’RunTime ’, 20]
ts , n_index , i_index , j_index = GEMF_SIM (Para , Net , x0 ,
StopCond ,n)
T, StateCount = Post_Population (x0 , M, n, ts , i_index ,
j_index )
T, StateCount = Post_Population (x0 , M, n, ts , i_index ,
j_index )
c. Model SEIR
def base_seir_model(init_vals, params, t):
S_0, E_0, I_0, R_0 = init_vals
S, E, I, R = [S_0], [E_0], [I_0], [R_0]
alpha, beta, gamma = params
dt = t[1] - t[0]
for _ in t[1:]:
next_S = S[-1] - (beta*S[-1]*I[-1])*dt
next_E = E[-1] + (beta*S[-1]*I[-1] - alpha*E[-1])*dt
next_I = I[-1] + (alpha*E[-1] - gamma*I[-1])*dt
next_R = R[-1] + (gamma*I[-1])*dt
S.append(next_S)
E.append(next_E)
I.append(next_I)
R.append(next_R)
return np.stack([S, E, I, R]).T
# Define parameters
t_max = 100
dt = .1
t = np.linspace(0, t_max, int(t_max/dt) + 1)N = 10000
init_vals = 1 - 1/N, 1/N, 0, 0
alpha = 0.2
beta = 1.75
gamma = 0.5
params = alpha, beta, gamma
# Run simulation
results = base_seir_model(init_vals, params, t)
def seir_model_with_soc_dist(init_vals, params, t):
S_0, E_0, I_0, R_0 = init_vals
S, E, I, R = [S_0], [E_0], [I_0], [R_0]
alpha, beta, gamma, rho = params
dt = t[1] - t[0]
for _ in t[1:]:
next_S = S[-1] - (rho*beta*S[-1]*I[-1])*dt
next_E = E[-1] + (rho*beta*S[-1]*I[-1] - alpha*E[-1])*dt
next_I = I[-1] + (alpha*E[-1] - gamma*I[-1])*dt
next_R = R[-1] + (gamma*I[-1])*dt
S.append(next_S)
E.append(next_E)
I.append(next_I)
R.append(next_R)
return np.stack([S, E, I, R]).T