Modelo de progressão da Covid-19 em Pernambuco
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
# Setando as constantes
eficacia_media_vacinas = 0.765
beta = 0.89
gamma = 0.07143
alpha = 0.004*eficacia_media_vacinas
mi = 0.0000147
N = 9278000
I0 = 4508
R0 = 68496
numero_absoluto_vacinados = N*0.7951 #NOTE que o numero absoluto de vacinados não é o nosso V0! V0 é o numero de vacinados de forma EFICAZ! Precisamos considerar a eficacia de cada vacina
V0 = numero_absoluto_vacinados*eficacia_media_vacinas #V0 considera a eficacia de cada vacina!
D0 = 0
S0 = N - I0 - R0 - V0
t = np.linspace(0, 120, 120) # Vamos ver qual será a progressão da doença nos próximos 4 meses
# Código de métodos
def modelo_SIR(y, t):
S, I, R, D = y
dSdt = (-beta * S * I / N)
dIdt = (beta * S * I / N) - (gamma * I) - mi * I
dRdt = (gamma * I)
dDdt = mi * I
return dSdt, dIdt, dRdt, dDdt
def modelo_SIRVD(y, t):
S, I, R, V, D = y
dSdt = (-beta * S * I / N) - S*alpha
dIdt = (beta * S * I / N) - (gamma * I) - mi * I
dRdt = (gamma * I) - alpha*R
dVdt = alpha * (S + R)
dDdt = mi * I
return dSdt, dIdt, dRdt, dVdt, dDdt
def modelo_SIRVD_omicron(y, t):
S, I, R, V, D = y
dSdt = (-(beta_omicron(t)) * S * I / N) - S*alpha
dIdt = (beta_omicron(t) * S * I / N) - (gamma * I) - mi * I
dRdt = (gamma * I) - alpha*R
dVdt = alpha * (S + R)
dDdt = mi * I
return dSdt, dIdt, dRdt, dVdt, dDdt
y0 = (S0, I0, R0, V0, D0)
# Resolvendo as equações numericamente e obtendo os resultados do modelo
results = odeint(modelo_SIRVD, y0, t)
S, I, R, V, D = results.T
fig, axs = plt.subplots(1, 2, figsize=(12, 5), constrained_layout=True,
sharex=True, sharey=False, facecolor='#eeeeee')
axs.flat[0].plot(t, S/N, 'g', label = 'Susceptiveis')
axs.flat[0].plot(t, I/N, 'y', label = 'Infectados')
axs.flat[0].plot(t, R/N, 'b', label = 'Recuperados')
axs.flat[0].plot(t, V/N, 'c', label = 'Vacinados')
axs.flat[0].plot(t, D/N, 'r', label = 'Mortos')
axs.flat[0].set_xlabel('Dias a partir de 13/11/2021')
axs.flat[0].set_ylabel('Fração da população')
axs.flat[0].grid(b=True, which='major', c='#eeeeee', lw=2, ls='-')
axs.flat[0].legend(['Susceptiveis','Infectados', 'Recuperados', 'Vacinados', 'Mortos'], loc='upper right')
axs.flat[1].plot(t, D, 'r', label = 'Mortos')
axs.flat[1].set_xlabel('Dias a partir de 13/11/2021')
axs.flat[1].set_ylabel('Número acumulado de mortes')
axs.flat[1].grid(b=True, which='major', c='#eeeeee', lw=2, ls='-')
axs.flat[1].legend(['Mortos'], loc='upper right')
plt.show()
# Pegando a maior fração da população infectada em um dia
print("O maior número de pessoas na classe de 'infectados' em um dia é: "+ str(round(max(I)/1000000, 2)) + " milhões de pessoas")
# Pegando a quantidade de mortos depois de 120 dias
print("O número de mortos depois de 120 dias é de: " + str(int(max(D))) + " mortos")
y0_SIR = (S0 + V0, I0, R0, D0)
# Resolvendo as equações numericamente e obtendo os resultados do modelo
results_SIR = odeint(modelo_SIR, y0_SIR, t)
S_SIR, I_SIR, R_SIR, D_SIR = results_SIR.T
fig, axs = plt.subplots(1, 2, figsize=(12, 5), constrained_layout=True,
sharex=True, sharey=False, facecolor='#eeeeee')
axs.flat[0].plot(t, I/N, 'y', label = 'Considerando o efeito da vacina')
axs.flat[0].plot(t, I_SIR/N, 'm', label = 'Desconsiderando o efeito da vacina')
axs.flat[0].set_xlabel('Dias a partir de 13/11/2021')
axs.flat[0].set_ylabel('Fração da população')
axs.flat[0].grid(b=True, which='major', c='#eeeeee', lw=2, ls='-')
axs.flat[0].legend(['Considerando o efeito da vacina','Desconsiderando o efeito da vacina'], loc='upper right')
axs.flat[1].plot(t, D, 'y', label = 'Considerando o efeito da vacina')
axs.flat[1].plot(t, D_SIR, 'm', label = 'Desconsiderando o efeito da vacina')
axs.flat[1].set_xlabel('Dias a partir de 13/11/2021')
axs.flat[1].set_ylabel('Mortes acumuladas')
axs.flat[1].grid(b=True, which='major', c='#eeeeee', lw=2, ls='-')
axs.flat[1].legend(['Considerando o efeito da vacina','Desconsiderando o efeito da vacina'], loc='upper right')
plt.show()
print("O maior número de pessoas na classe de 'infectados' em um dia, considerando o efeito das vacinas, é de: "+ str(round(max(I)/1000000, 2)) + " milhões de pessoas versus " + str(round(max(I_SIR)/1000000, 2)) + " milhões de pessoas, desconsiderando o efeito das vacinas")
# Pegando a quantidade de mortos depois de 120 dias
print("O número de mortos depois de 120 dias, considerando o efeito das vacinas, é de: "+ str(int(max(D))) + " versus " + str(int((max(D_SIR)))) + " mortos, desconsiderando o efeito das vacinas")
y0 = (S0, I0, R0, V0, D0)
beta = 1.3 # Taxa máxima de transmissão já registrada no Brasil
# Resolvendo as equações numericamente e obtendo os resultados do modelo
results_mod = odeint(modelo_SIRVD, y0, t)
S_mod, I_mod, R_mod, V_mod, D_mod = results_mod.T
plt.suptitle("Modelo SIRV comparação de betas")
plt.plot(t, I, 'y', label = 'Taxa de transmissão atual')
plt.plot(t, I_mod, 'm', label = 'Taxa de transmissão aumentada')
plt.xlabel('Dias a partir de 13/11/2021')
plt.ylabel('Número absoluto de infectados')
plt.grid(b=True, which='major', c='#eeeeee', lw=2, ls='-')
plt.legend(['Taxa de transmissão atual','Taxa de transmissão aumentada'], loc='upper right')
beta = 0.89
print("Considerando a taxa de transmissão atual, o maior número de pessoas na classe de 'infectados' em um dia é: "+ str(round(max(I)/1000000, 2)) + " milhões de pessoas")
print("Considerando uma das taxas de transmissão mais elevadas do Brasil, o maior número de infectados em um dia é: "+ str(round(max(I_mod)/1000000, 2)) + " milhões de pessoas")
eficacia_vacinas = {}
eficacia_vacinas['coronavac'] = 0.538
eficacia_vacinas['astrazeneca'] = 0.824
eficacia_vacinas['pfizer'] = 0.95
eficacia_vacinas['janssen'] = 0.85
############# SELICIONE A EFICACIA DE UMA VACINA PARA TESTAR A EVOLUÇÃO #############
vacina = input("Digite 'coronavac', 'astrazeneca', 'pfizer' ou 'janssen' para verificar a evolução dos casos caso todas as pessoas fossem vacinadas por essa vacina da sua escolha! ")
vacina.lower()
while vacina not in eficacia_vacinas:
vacina = input("Você digitou uma vacina invalida! Digite 'coronavac', 'astrazeneca', 'pfizer' ou 'janssen'")
print("Hmmm, a sua escolha foi: " + "'" + vacina + "'. " + "Interessante! Execute agora a célula abaixo para checar os resultados")
eficacia = eficacia_vacinas[vacina]
print(eficacia)
alpha = 0.004*eficacia
V0_vac = numero_absoluto_vacinados*eficacia
y0 = (S0, I0, R0, V0_vac, D0)
# Resolvendo as equações numericamente e obtendo os resultados do modelo
results_vac = odeint(modelo_SIRVD, y0, t)
S_vac, I_vac, R_vac, V_vac, D_vac = results_vac.T
fig, axs = plt.subplots(1, 2, figsize=(12, 5), constrained_layout=True,
sharex=True, sharey=False, facecolor='#eeeeee')
axs.flat[0].plot(t, S_vac/N, 'g', label = 'Susceptiveis')
axs.flat[0].plot(t, I_vac/N, 'y', label = 'Infectados')
axs.flat[0].plot(t, R_vac/N, 'b', label = 'Recuperados')
axs.flat[0].plot(t, V_vac/N, 'c', label = 'Vacinados')
axs.flat[0].plot(t, D_vac/N, 'r', label = 'Mortos')
axs.flat[0].set_xlabel('Dias a partir de 13/11/2021')
axs.flat[0].set_ylabel('Fração da população')
axs.flat[0].grid(b=True, which='major', c='#eeeeee', lw=2, ls='-')
axs.flat[0].legend(['Susceptiveis','Infectados', 'Recuperados', 'Vacinados', 'Mortos'], loc='upper right')
axs.flat[1].plot(t, D_vac, 'r', label = 'Mortos')
axs.flat[1].set_xlabel('Dias a partir de 13/11/2021')
axs.flat[1].set_ylabel('Número acumulado de mortes')
axs.flat[1].grid(b=True, which='major', c='#eeeeee', lw=2, ls='-')
axs.flat[1].legend(['Mortos'], loc='upper right')
plt.show()
# Pegando a maior fração da população infectada em um dia
print("O maior número de pessoas na classe de 'infectados' em um dia é: "+ str(round(max(I_vac)/1000000, 2)) + " milhões de pessoas")
# Pegando a quantidade de mortos depois de 120 dias
print("O número de mortos depois de 120 dias é de: " + str(int(max(D_vac))) + " mortos")
#According to the latest figures, the R value was highest for London, which was at 1.1 to 1.3 and had a growth rate of 2 to 4% per day.
#De acordo com a referência [7]
#Daí, em 30 dias podemos ter um R value de 1.3 * (1.04)^30
alpha = 0.004*0.765
def beta_omicron(t):
if t > 30:
return 1.3*(1.04**30)
return 1.3*(1.04**t)
y0 = (S0, I0, R0, V0, D0)
# Resolvendo as equações numericamente e obtendo os resultados do modelo
results_omicron = odeint(modelo_SIRVD_omicron, y0, t)
S_omicron, I_omicron, R_omicron, V_omicron, D_omicron = results_omicron.T
fig, axs = plt.subplots(1, 2, figsize=(12, 5), constrained_layout=True,
sharex=True, sharey=False, facecolor='#eeeeee')
axs.flat[0].plot(t, S_omicron/N, 'g', label = 'Susceptiveis')
axs.flat[0].plot(t, I_omicron/N, 'y', label = 'Infectados')
axs.flat[0].plot(t, R_omicron/N, 'b', label = 'Recuperados')
axs.flat[0].plot(t, V_omicron/N, 'c', label = 'Vacinados')
axs.flat[0].plot(t, D_omicron/N, 'r', label = 'Mortos')
axs.flat[0].set_xlabel('Dias a partir de 13/11/2021')
axs.flat[0].set_ylabel('Fração da população')
axs.flat[0].grid(b=True, which='major', c='#eeeeee', lw=2, ls='-')
axs.flat[0].legend(['Susceptiveis','Infectados', 'Recuperados', 'Vacinados', 'Mortos'], loc='upper right')
axs.flat[1].plot(t, D_omicron, 'r', label = 'Mortos')
axs.flat[1].set_xlabel('Dias a partir de 13/11/2021')
axs.flat[1].set_ylabel('Número absoluto de mortes')
axs.flat[1].grid(b=True, which='major', c='#eeeeee', lw=2, ls='-')
axs.flat[1].legend(['Mortos'], loc='upper right')
plt.show()
# Pegando a maior fração da população infectada em um dia
print("O maior número de pessoas na classe de 'infectados' em um dia é: "+ str(round(max(I_omicron)/1000000, 2)) + " milhões de pessoas")
# Pegando a quantidade de mortos depois de 120 dias
print("O número de mortos depois de 120 dias é de: " + str(int(max(D_omicron))) + " mortos")