http://fiscomp.if.ufrgs.br/index.php?title=C%C3%B3digo_Modelo_Sir&feed=atom&action=historyCódigo Modelo Sir - Histórico de revisão2024-03-28T20:22:25ZHistórico de revisões para esta página neste wikiMediaWiki 1.39.4http://fiscomp.if.ufrgs.br/index.php?title=C%C3%B3digo_Modelo_Sir&diff=6535&oldid=prevSchmokel: Criou página com 'A primeira parte do código consiste na chamada das bibliotecas e na definição das constantes que serão utilizadas, o arquivo "mc.h" serve como suporte para gerar os númer...'2021-11-29T19:06:09Z<p>Criou página com 'A primeira parte do código consiste na chamada das bibliotecas e na definição das constantes que serão utilizadas, o arquivo "mc.h" serve como suporte para gerar os númer...'</p>
<p><b>Página nova</b></p><div>A primeira parte do código consiste na chamada das bibliotecas e na definição das constantes que serão utilizadas, o arquivo "mc.h" serve como suporte para gerar os números aleatórios e se encontra no [https://replit.com/@JuliaRemus/sirmodificado#README.md projeto criado no Replit].<br />
<br />
<source lang="c"><br />
<br />
#include <stdio.h><br />
#include <math.h><br />
#include <time.h><br />
#include "mc.h"<br />
#include <limits.h><br />
#include <string.h><br />
<br />
<br />
// ***************** CONSTANTES ************************************************************//<br />
<br />
#define L 1000<br />
#define L2 (L*L) // número total de indivíduos<br />
#define TEMPO 100 // quantidade de passos<br />
#define S 2 // estado dos suscetíveis<br />
#define I 0 // estado dos infectados<br />
#define R 1 // estado dos recuperados<br />
#define BETA 0.1 // taxa de transmissão da doença<br />
#define GAMA 0.3 // taxa de remoção da doença<br />
<br />
// *****************************************************************************************//<br />
<br />
</source><br />
<br />
<br />
A segunda parte do código define as funções ''SIR()'', ''inicializacao()'', ''openfiles()'', ''plot_func()''. A primeira função implementa a dinâmica do modelo SIR apresentada no fluxograma da WIKI, a segunda função inicializa os estados dos indivíduos do sistema e identifica a posição dos vizinhos de todos os sítios, a terceira função abre um arquivo pra escrever os resultados ao longo do tempo e a última função plota e salva a imagem da saída dos arquivos. Nesta parte do código também definimos as variáveis globais, onde ''s[]'' e ''viz[][]'', respectivamente, armazenam os estados dos indivíduos e a posição dos vizinhos. As variáveis ''infectado'', ''suscetível'' e ''recuperado'' dão a fração dos indivíduos infectados, suscetíveis e recuperados.<br />
<br />
<br />
<source lang="c"><br />
// ***************** FUNÇÕES ***************************************************************//<br />
<br />
void SIR(void); // implementa a dinâmica SIR mostrado no fluxograma da WIKI<br />
void inicializacao(int m); // inicializa os estados dos indivíduos do sistema e identifica a posição dos vizinhos de todos os sítios<br />
void openfiles(int tempo); // abre um arquivo pra escrever os resultados ao longo do tempo<br />
void plot_func(void); // plota e salva a imagem da saída dos arquivos <br />
<br />
// ****************************************************************************************//<br />
<br />
<br />
// ***************** VARIÁVEIS GLOBAIS ****************************************************//<br />
<br />
int s[L2],viz[L2][5]; // s[L2] armazena os estados dos indivíduos // viz[L2][5] armazena a posição dos vizinhos<br />
float infectado, suscetivel, recuperado; // fração de indivíduos infectados, suscetíveis e recuperados<br />
<br />
// ****************************************************************************************//<br />
</source><br />
<br />
A estrutura principal do código é dada pelo laço temporal onde a cada tempo é chamado o modelo SIR, antes de entrar no loop é realizada a inicialização do sistema definindo o estado SIR. A medida que o tempo avança é escrito os dados dos estados da fração da população em um arquivo texto, posteriormente após o loop é gerado um gráfico. <br />
<br />
<source lang="c"><br />
// ***************** MAIN *****************************************************************//<br />
<br />
int main (void){<br />
<br />
unsigned t;<br />
seed = start_randomic();<br />
<br />
inicializacao(0);<br />
openfiles(0);<br />
<br />
for (t=0;t<TEMPO;t++){<br />
<br />
// ----- Cálculo dos estados dos indíviduos no instante de tempo t ------<br />
SIR();<br />
<br />
// ----- Armazenamento em um arquivo texto da fração dos estados dos indivíduos no tempo t ------<br />
openfiles(j+1); <br />
}<br />
<br />
<br />
// ----- Plot dos dados ------<br />
plot_func();<br />
<br />
return 1;<br />
}<br />
<br />
// ****************************************************************************************//<br />
</source><br />
<br />
<source lang="c"><br />
<br />
// ****************** DEFINICAO DE FUNCOES ************************************************//<br />
<br />
<br />
<br />
// PLOTA A FRAÇÃO DOS INDIVÍDUOS S. I. R. // OS PRINTF COMENTADOS PLOTAM A FUNÇÃO i(s) <br />
void plot_func(void){<br />
<br />
printf("plot \"output.txt\" u 1:2 w l title \"suscetivel s(t)\", \"output.txt\" u 1:3 w l title \"infectados i(t)\", \"output.txt\" u 1:4 w l title \"recuperados r(t)\"\n");<br />
//printf("plot \"output.txt\" u 2:3 w l title \"i(s) numérico\" \n");<br />
printf("set title \"Modelo SIR - β = 0.1 - γ = 0.3 - R0 = 0.333*s0\" \n");<br />
//printf("f(x) = 0.25*log(x) -x +1 \n");<br />
//printf("replot f(x) title \" i(s) analítico\"\n");<br />
printf("set xlabel \"Tempo\" \n");<br />
printf("set ylabel \"Fração da População N\" \n");<br />
printf("set yrange [-0.3:1.1] \n");<br />
printf("set term eps \n");<br />
printf("set output \"imagem.eps\"\n");<br />
printf("replot\n");<br />
printf("set terminal wxt;\n"); <br />
}<br />
<br />
<br />
// INICIALIZAÇÃO DOS DADOS<br />
void inicializacao(int m){<br />
<br />
unsigned long i,n1,n2,n3,n4;<br />
int sitio;<br />
<br />
//inicializando estados dos indivíduos na rede REDE<br />
for(i=0;i<L2;i++){<br />
if(FRANDOM < 0.998) s[i]= S;<br />
else s[i]= I;<br />
} <br />
<br />
<br />
//contagem do número de estados S. I. R. na REDE<br />
for(i=0;i<L2;i++){<br />
<br />
if( s[i] == I){<br />
infectado += 1; <br />
}<br />
<br />
if(s[i] == S){<br />
suscetivel += 1; <br />
}<br />
<br />
if(s[i] == R){<br />
recuperado += 1; <br />
}<br />
}<br />
<br />
//Fração do número de indivíduos S. I. R.<br />
suscetivel = suscetivel/L2;<br />
infectado = infectado/L2;<br />
recuperado = 0;<br />
<br />
<br />
//identifica a posição dos vizinhos de todos os sítios<br />
for (i=0;i<L2;i++) {<br />
<br />
n1 = (i-L+L2)%L2;<br />
n2 = (i+1)%L + (i/L)*L;<br />
n3 = (i+L)%L2;<br />
n4 = (i-1+L)%L + (i/L)*L;<br />
//printf("%d %d %d %d %d\n",i,n1,n2,n3,n4);<br />
<br />
sitio = i; <br />
viz[i][0] = i;<br />
viz[i][1] = n1;<br />
viz[i][2] = n2;<br />
viz[i][3] = n3;<br />
viz[i][4] = n4;<br />
//printf("%d %d %d %d %d\n",viz[i][0],viz[i][1],viz[i][2],viz[i][3],viz[i][4]);<br />
}<br />
<br />
return;<br />
}<br />
<br />
<br />
//FUNÇÃO DINÂMICA SIR<br />
void SIR(void){<br />
<br />
int celula,i,j,estado,chave;<br />
float prob;<br />
<br />
chave == 0;<br />
<br />
for(i=0;i<L2;i++){<br />
<br />
<br />
celula = FRANDOM*L2; //sorteia um indivíduo na REDE<br />
estado = s[celula]; // determina o estado do indivíduo na REDE<br />
<br />
<br />
for(j=1;j<5;j++) { //verifica se um dos vizinhos do indivíduo sorteado está infectado<br />
if(s[viz[celula][j]] == I){<br />
chave =1; //condição para verificar se um indivíduo suscetível pode se tornar infectado<br />
}<br />
}<br />
<br />
if(chave == 1){ <br />
<br />
if(estado == S){<br />
<br />
if(FRANDOM < BETA) //sorteia um número --> probabilidade do indivíduo S tornar-se I <br />
s[celula] = I;<br />
}<br />
<br />
chave = 0;<br />
}<br />
<br />
if(estado == I){ //sorteia um número --> probabilidade do indivíduo I tornar-se R<br />
if(FRANDOM < GAMA) <br />
s[celula] = R;<br />
}<br />
}<br />
<br />
//Zera o número de indivíduos sucsetível, infectado e recuperado<br />
infectado = 0;<br />
suscetivel = 0;<br />
recuperado = 0;<br />
<br />
//contagem do número de estados S. I. R. na REDE<br />
for(i=0;i<L2;i++){<br />
<br />
if( s[i] == I){<br />
infectado += 1; <br />
}<br />
<br />
if(s[i] == S){<br />
suscetivel += 1; <br />
}<br />
<br />
if(s[i] == R){<br />
recuperado += 1; <br />
}<br />
}<br />
<br />
//Fração do número de indivíduos S. I. R.<br />
suscetivel = suscetivel/L2;<br />
infectado = infectado/L2;<br />
recuperado = recuperado/L2;<br />
<br />
return;<br />
}<br />
<br />
/*ESCREVER NO ARQUIVO TEXTO OS DADOS OBTIDOS*/<br />
void openfiles(int tempo){<br />
<br />
FILE *fp;<br />
<br />
char output[100];<br />
sprintf(output,"output.txt");<br />
<br />
fp = fopen(output,"a");<br />
fprintf(fp,"%d %lf %lf %lf \n",tempo,suscetivel,infectado,recuperado);<br />
fclose(fp);<br />
}<br />
<br />
<br />
</source></div>Schmokel