<?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=Magnetiza%C3%A7%C3%A3o_e_energia_em_fun%C3%A7%C3%A3o_da_temperatura</id>
	<title>Magnetização e energia em função da temperatura - 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=Magnetiza%C3%A7%C3%A3o_e_energia_em_fun%C3%A7%C3%A3o_da_temperatura"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Magnetiza%C3%A7%C3%A3o_e_energia_em_fun%C3%A7%C3%A3o_da_temperatura&amp;action=history"/>
	<updated>2026-05-10T11:21:25Z</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=Magnetiza%C3%A7%C3%A3o_e_energia_em_fun%C3%A7%C3%A3o_da_temperatura&amp;diff=2312&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=Magnetiza%C3%A7%C3%A3o_e_energia_em_fun%C3%A7%C3%A3o_da_temperatura&amp;diff=2312&amp;oldid=prev"/>
		<updated>2018-01-26T21:33:52Z</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;
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;&lt;br /&gt;
	double r, prob, M = 0, T = 2.2, ET, w[9], X, M_t = 0, E_t = 0;	//T = temperatura&lt;br /&gt;
	FILE *arq, *arq2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	// Incialização das matrizes utilizadas no sistema&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;
&lt;br /&gt;
	srand(time(0));&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
///////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
	arq = fopen(&amp;quot;MagnXTl20&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
	arq2 = fopen(&amp;quot;EnerXTl20&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	for(T = 2.1; T &amp;lt;= 2.8; T+=0.01)		// Laço de variação da temperatura&lt;br /&gt;
	{&lt;br /&gt;
		W(w,T);		// Inicializar probabilidades de mudar de estado&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		// Incialização da matriz de spins aleatóriamente para cada temperatura&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;
		ET = ETotal(matrix, vizinhoi, vizinhoj, l);		// Calculo da energia total&lt;br /&gt;
		M = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		// Calculo da magnetização total&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;
		for (MCS = 0; MCS &amp;lt; 1e5; MCS++)			// Laço de equilíbrio do sistema&lt;br /&gt;
		{&lt;br /&gt;
			for (t = 0; t &amp;lt; l*l; t++)&lt;br /&gt;
			{&lt;br /&gt;
				i = rand()%l;&lt;br /&gt;
				j = rand()%l;&lt;br /&gt;
				E = Eflip(l, matrix, i, j, vizinhoi, vizinhoj);&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;
		// Incialização das variáveis de temperatura e magnetização em função da temperatura&lt;br /&gt;
		M_t = 0;&lt;br /&gt;
		E_t = 0;&lt;br /&gt;
&lt;br /&gt;
		for (MCS = 0; MCS &amp;lt; 1e6; MCS++)		// Laço de MCS&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;
			M_t += abs(M);&lt;br /&gt;
			E_t += ET/(l*l);&lt;br /&gt;
		}&lt;br /&gt;
	fprintf(arq, &amp;quot;%lf\t%lf\n&amp;quot;, T, M_t/(l*l*MCS));&lt;br /&gt;
	fprintf(arq2, &amp;quot;%lf\t%lf\n&amp;quot;, T, E_t/(MCS));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	fclose(arq);&lt;br /&gt;
	fclose(arq2);&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[2] = exp(-2.0/T);&lt;br /&gt;
	w[4] = exp(-4.0/T);&lt;br /&gt;
	w[6] = exp(-6.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>