<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=S%C3%A9ries_temporais_e_histogramas_sem_campo_magn%C3%A9tico</id>
	<title>Séries temporais e histogramas sem campo magnético - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=S%C3%A9ries_temporais_e_histogramas_sem_campo_magn%C3%A9tico"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=S%C3%A9ries_temporais_e_histogramas_sem_campo_magn%C3%A9tico&amp;action=history"/>
	<updated>2026-05-07T14:08:12Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=S%C3%A9ries_temporais_e_histogramas_sem_campo_magn%C3%A9tico&amp;diff=2311&amp;oldid=prev</id>
		<title>Asorander: Criou página com &#039;&lt;source lang = &quot;c&quot;&gt;  #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #include &lt;time.h&gt;   // Função para atribuir as energias do sistema double W(double w[9], double...&#039;</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=S%C3%A9ries_temporais_e_histogramas_sem_campo_magn%C3%A9tico&amp;diff=2311&amp;oldid=prev"/>
		<updated>2018-01-26T21:33:09Z</updated>

		<summary type="html">&lt;p&gt;Criou página com &amp;#039;&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;  #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;math.h&amp;gt; #include &amp;lt;time.h&amp;gt;   // Função para atribuir as energias do sistema double W(double w[9], double...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang = &amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Função para atribuir as energias do sistema&lt;br /&gt;
double W(double w[9], double);&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Função de atribuição de vizinhos em horizontais&lt;br /&gt;
int vizinhancaj(int l, int **vizinhoj)&lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for (i = 0; i &amp;lt; l; i++)&lt;br /&gt;
	{&lt;br /&gt;
		vizinhoj[i][1] = i+1;&lt;br /&gt;
		vizinhoj[i][3] = i-1;&lt;br /&gt;
		vizinhoj[i][2] = i;&lt;br /&gt;
		vizinhoj[i][4] = i;&lt;br /&gt;
	}&lt;br /&gt;
	vizinhoj[0][3] = l-1;&lt;br /&gt;
	vizinhoj[l-1][1] = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Função de atribuição de vizinhos verticais&lt;br /&gt;
int vizinhancai(int l, int **vizinhoi)&lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
	for (i = 0; i &amp;lt; l; i++)&lt;br /&gt;
	{&lt;br /&gt;
		vizinhoi[i][2] = i+1;&lt;br /&gt;
		vizinhoi[i][4] = i-1;&lt;br /&gt;
		vizinhoi[i][1] = i;&lt;br /&gt;
		vizinhoi[i][3] = i;&lt;br /&gt;
	}&lt;br /&gt;
	vizinhoi[0][4] = l-1;&lt;br /&gt;
	vizinhoi[l-1][2] = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Função responsável por calcular a variação de energia entre dois estados&lt;br /&gt;
double Eflip(int l, int** matrix, int i, int j, int **vizinhoi, int **vizinhoj)&lt;br /&gt;
{&lt;br /&gt;
	int k, J = 1;&lt;br /&gt;
	int E = 0;&lt;br /&gt;
&lt;br /&gt;
	for (k = 1; k &amp;lt; 5; k++)&lt;br /&gt;
	{&lt;br /&gt;
		E += matrix[vizinhoi[i][k]][vizinhoj[j][k]];&lt;br /&gt;
	}&lt;br /&gt;
	E = 2*J*E*matrix[i][j];&lt;br /&gt;
	return E;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Função responsável por calcular a energia total do sistema&lt;br /&gt;
double ETotal(int** matrix, int **vizinhoi, int **vizinhoj, int l)&lt;br /&gt;
{&lt;br /&gt;
	int i, j, k, J = 1;&lt;br /&gt;
	double E = 0;&lt;br /&gt;
&lt;br /&gt;
	for(i = 0; i &amp;lt; l; i++)&lt;br /&gt;
		for (j = 0; j &amp;lt; l; j++)&lt;br /&gt;
		{&lt;br /&gt;
			for (k = 1; k &amp;lt; 5; k++)&lt;br /&gt;
			{&lt;br /&gt;
				E += matrix[i][j]*matrix[vizinhoi[i][k]][vizinhoj[j][k]];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	E *= -J;&lt;br /&gt;
	return E/2.0; //Divisão por 2 por somamos duas vezes cada interação entre vizinhos&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
main()&lt;br /&gt;
{&lt;br /&gt;
	int i, j, k, l = 20, MCS = 0, E;			// l = Tamanho do lado da matriz&lt;br /&gt;
 	int t = 0, h[2*l*l], hE[8*l*l];&lt;br /&gt;
	char m[50], e[50], EH[50], MH[50], R[50];&lt;br /&gt;
	double r, prob, M = 0, T = 2.2, ET, w[9];&lt;br /&gt;
	FILE *arq, *arq2, *arq3, *arq4;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Nomes dos arquivos em que os dados serão salvos&lt;br /&gt;
	sprintf(m, &amp;quot;MagnT%.1lfl%d&amp;quot;, T, l);&lt;br /&gt;
	sprintf(MH, &amp;quot;MagnhistT%.1lfl%d&amp;quot;, T, l);&lt;br /&gt;
	sprintf(e, &amp;quot;EnerT%.1lfl%d&amp;quot;, T, l);&lt;br /&gt;
	sprintf(EH, &amp;quot;EnerhistT%.1lfl%d&amp;quot;, T, l);&lt;br /&gt;
	sprintf(R, &amp;quot;ResultsT%.1lfl%d&amp;quot;, T, l);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Inicialização dos valores de probabilidades&lt;br /&gt;
	W(w,T);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Inicialização das matrizes&lt;br /&gt;
	int ** matrix = (int **)malloc(l*sizeof(int*));&lt;br /&gt;
	int **vizinhoi = (int **)malloc(l*sizeof(int*));&lt;br /&gt;
	int **vizinhoj = (int **)malloc(l*sizeof(int*));&lt;br /&gt;
&lt;br /&gt;
	for(i=0;i&amp;lt;l;i++)&lt;br /&gt;
	{&lt;br /&gt;
		vizinhoi[i] = (int*)malloc(5*sizeof(int));&lt;br /&gt;
		vizinhoj[i] = (int*)malloc(5*sizeof(int));&lt;br /&gt;
		matrix[i] = (int *) malloc(l*sizeof(int*));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	vizinhancai(l,vizinhoi);&lt;br /&gt;
	vizinhancaj(l,vizinhoj);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Inicialização dos histogramas&lt;br /&gt;
	for (i = 0; i &amp;lt; 2*l*l; ++i)&lt;br /&gt;
		h[i] = 0;&lt;br /&gt;
	for (i = 0; i &amp;lt; 8*l*l; ++i)&lt;br /&gt;
		hE[i] = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	// Atribuição aletória de estratégias //&lt;br /&gt;
&lt;br /&gt;
	////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	srand(time(0));&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; l; i++)&lt;br /&gt;
	{&lt;br /&gt;
		for (j = 0; j &amp;lt; l; j++)&lt;br /&gt;
		{&lt;br /&gt;
			r = (double)rand()/RAND_MAX;&lt;br /&gt;
			if (r &amp;lt; 0.5)&lt;br /&gt;
				//Cooperadores recebem valor 0&lt;br /&gt;
				matrix[i][j] = (int)-1;&lt;br /&gt;
			else&lt;br /&gt;
				//Desertores ganham valor 1&lt;br /&gt;
				matrix[i][j] = (int)1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Calculo da energia total inicial&lt;br /&gt;
	ET = ETotal(matrix, vizinhoi, vizinhoj, l);&lt;br /&gt;
&lt;br /&gt;
	// Calculo da magnetização total inicial&lt;br /&gt;
	for (i = 0; i &amp;lt; l; i++)&lt;br /&gt;
		for (j = 0; j &amp;lt; l; j++)&lt;br /&gt;
			M += matrix[i][j];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	for (MCS = 0; MCS &amp;lt; 1e5; MCS++)	// Laço de Monte Carlo Steps para o equilíbrio do sistema&lt;br /&gt;
	{&lt;br /&gt;
		for (t = 0; t &amp;lt; l*l; t++)		// Laço de tempo para 1 MCS&lt;br /&gt;
		{&lt;br /&gt;
&lt;br /&gt;
			// Escolha aleatória de um spin&lt;br /&gt;
			i = rand()%l;&lt;br /&gt;
			j = rand()%l;&lt;br /&gt;
&lt;br /&gt;
			// Calculo da variação de energia&lt;br /&gt;
			E = Eflip(l, matrix, i, j, vizinhoi, vizinhoj);&lt;br /&gt;
			&lt;br /&gt;
			// Condicional do método de Metropolis&lt;br /&gt;
			if(E &amp;lt;= 0)&lt;br /&gt;
			{&lt;br /&gt;
				matrix[i][j] = -matrix[i][j];&lt;br /&gt;
				ET += E;&lt;br /&gt;
				M += 2*matrix[i][j];&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				prob = w[E];&lt;br /&gt;
				r = 1.*rand()/RAND_MAX;&lt;br /&gt;
				if(r &amp;lt; prob)&lt;br /&gt;
				{&lt;br /&gt;
					matrix[i][j] = -matrix[i][j];&lt;br /&gt;
					ET += E;&lt;br /&gt;
					M += 2*matrix[i][j];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	arq = fopen(m, &amp;quot;w&amp;quot;);&lt;br /&gt;
	arq2 = fopen(MH, &amp;quot;w&amp;quot;);&lt;br /&gt;
	arq3 = fopen(e, &amp;quot;w&amp;quot;);&lt;br /&gt;
	arq4 = fopen(EH, &amp;quot;w&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	for (MCS = 0; MCS &amp;lt; 1e6; MCS++)			// Laço de Monte Carlo Steps&lt;br /&gt;
	{&lt;br /&gt;
		for (t = 0; t &amp;lt; l*l; t++)			// Laço de tempo para 1 MCS&lt;br /&gt;
		{&lt;br /&gt;
			// Escolha aleatória de um spin&lt;br /&gt;
			i = rand()%l;&lt;br /&gt;
			j = rand()%l;&lt;br /&gt;
&lt;br /&gt;
			// Calculo da variação de energia&lt;br /&gt;
			E = Eflip(l, matrix, i, j, vizinhoi, vizinhoj);&lt;br /&gt;
			&lt;br /&gt;
			// Condicional do método de Metropolis&lt;br /&gt;
			if(E &amp;lt;= 0)&lt;br /&gt;
			{&lt;br /&gt;
				matrix[i][j] = -matrix[i][j];&lt;br /&gt;
				ET += E;&lt;br /&gt;
				M += 2*matrix[i][j];&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				prob = w[E];&lt;br /&gt;
				r = 1.*rand()/RAND_MAX;&lt;br /&gt;
				if(r &amp;lt; prob)&lt;br /&gt;
				{&lt;br /&gt;
					matrix[i][j] = -matrix[i][j];&lt;br /&gt;
					ET += E;&lt;br /&gt;
					M += 2*matrix[i][j];&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	    &lt;br /&gt;
		// Impressão das séries temporais da magnetização e da energia&lt;br /&gt;
		fprintf(arq, &amp;quot;%d\t%lf\n&amp;quot;, MCS, M/(l*l));&lt;br /&gt;
		fprintf(arq3, &amp;quot;%d\t%lf\n&amp;quot;, MCS, ET/(l*l));&lt;br /&gt;
&lt;br /&gt;
		// Soma nos histogramas da magnetização e da energia&lt;br /&gt;
		h[(int)M+(l*l)]++;&lt;br /&gt;
		hE[(int)ET+(4*l*l)]++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Impressão dos histogramas&lt;br /&gt;
	for (i = 0; i &amp;lt; 2*l*l; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		if(i%2 == 0)	// Magnetização sempre será um multiplo de 2 nessas configurações&lt;br /&gt;
			fprintf(arq2, &amp;quot;%lf\t%lf\n&amp;quot;, (double)(i-(l*l))/(l*l), (double)h[i]/MCS);&lt;br /&gt;
	}&lt;br /&gt;
	for (i = 0; i &amp;lt; 8*l*l; ++i)&lt;br /&gt;
	{&lt;br /&gt;
		if(i%4 == 0)	// Energia sempre será um multiplo de 4 nessas configurações&lt;br /&gt;
			fprintf(arq4, &amp;quot;%lf\t%lf\n&amp;quot;, (double)(i-(4*l*l))/(l*l), (double)hE[i]/MCS);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	fclose(arq);&lt;br /&gt;
	fclose(arq2);&lt;br /&gt;
	fclose(arq3);&lt;br /&gt;
	fclose(arq4);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	// Impressão do snapshot do estado final do sistema&lt;br /&gt;
	arq = fopen(R, &amp;quot;w&amp;quot;);&lt;br /&gt;
	for (i = l-1; i &amp;gt;= 0; i--)&lt;br /&gt;
	{&lt;br /&gt;
		for (j = 0; j &amp;lt; l; j++)&lt;br /&gt;
		{&lt;br /&gt;
			fprintf(arq,&amp;quot;%d\t&amp;quot;, matrix[i][j]);&lt;br /&gt;
		}&lt;br /&gt;
		fprintf(arq,&amp;quot;\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	fclose(arq);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Função de probabilidade de mudar para a estratégia do vizinho&lt;br /&gt;
double W(double w[9], double T)&lt;br /&gt;
{&lt;br /&gt;
	//return exp(-1.*E/(T));&lt;br /&gt;
	w[4] = exp(-4.0/T);&lt;br /&gt;
	w[8] = exp(-8.0/T);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asorander</name></author>
	</entry>
</feed>