<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rafabel</id>
	<title>Física Computacional - Contribuições do usuário [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rafabel"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Rafabel"/>
	<updated>2026-05-07T11:32:01Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6671</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6671"/>
		<updated>2021-12-04T21:13:41Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Conclusões */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e \ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D.&lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Newdistcano23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite em que o tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
==Magnetização==&lt;br /&gt;
&lt;br /&gt;
Na presença de um campo magnético externo &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, o hamiltoniano do modelo de Ising 2D é dado por &amp;lt;math&amp;gt;\mathcal{H} =-\sum_{\langle i,j\rangle} \sigma_i \sigma_j - h \sum_{i=1} \sigma_i&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt; M&#039; = \sum_{i=1} \sigma_i &amp;lt;/math&amp;gt; é a magnetização e &amp;lt;math&amp;gt;E&#039; =-\sum_{\langle i,j\rangle} \sigma_i \sigma_j &amp;lt;/math&amp;gt; é a energia de troca.&lt;br /&gt;
&lt;br /&gt;
A diferença para o algoritmo anterior é que o passeio aleatório agora é executando tanto na energia &amp;lt;math&amp;gt; E&#039; &amp;lt;/math&amp;gt; quanto no parâmetro de ordem &amp;lt;math&amp;gt; M&#039; &amp;lt;/math&amp;gt;, e um histograma 2D &amp;lt;math&amp;gt; H(E&#039;,M&#039;) &amp;lt;/math&amp;gt; é acumulado.&lt;br /&gt;
&lt;br /&gt;
A função de partição pode ser calculada como &amp;lt;math&amp;gt; Z(T,h)=\sum_{E&#039;,M&#039;}g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT} &amp;lt;/math&amp;gt; e, a parir dela, podemos obter quantidades termodinâmicas para todos os valores de temperatura e campo magnético.&lt;br /&gt;
&lt;br /&gt;
Ainda, a magnetização média do sistema é dada por &amp;lt;math&amp;gt; M(T,h) = \frac{\sum_{E&#039;,M&#039;}M&#039;g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT}}{\sum_{E&#039;,M&#039;}g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Conclusões==&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Wang-Landau é uma ferramenta eficiente para o cálculo direto da densidade de estados para grandes sistemas. A alta precisão do método se dá pela modificação da estimativa em cada etapa do passeio aleatório no espaço de energia &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e pelo controle cuidadoso do fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Diferentemente das simulações convencionais de MC, quantidades termodinâmicas como a energia livre de Helmholtz estão diretamente disponíveis uma vez que, usando a densidade de estados, essas quantidades podem ser calculadas essencialmente a qualquer temperatura.&lt;br /&gt;
&lt;br /&gt;
É importante ressaltar que o método de Wang-Landau não está limitado ao passeio aleatório no espaço de energia ou a modelos simples em redes pequenas. Ele pode ser aplicado a qualquer parâmetro e também se mostra eficiente para sistemas grandes, como sistemas complexos gerais com paisagens irregulares.&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6670</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6670"/>
		<updated>2021-12-04T21:13:30Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Magnetização */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e \ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D.&lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Newdistcano23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite em que o tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
==Magnetização==&lt;br /&gt;
&lt;br /&gt;
Na presença de um campo magnético externo &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, o hamiltoniano do modelo de Ising 2D é dado por &amp;lt;math&amp;gt;\mathcal{H} =-\sum_{\langle i,j\rangle} \sigma_i \sigma_j - h \sum_{i=1} \sigma_i&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt; M&#039; = \sum_{i=1} \sigma_i &amp;lt;/math&amp;gt; é a magnetização e &amp;lt;math&amp;gt;E&#039; =-\sum_{\langle i,j\rangle} \sigma_i \sigma_j &amp;lt;/math&amp;gt; é a energia de troca.&lt;br /&gt;
&lt;br /&gt;
A diferença para o algoritmo anterior é que o passeio aleatório agora é executando tanto na energia &amp;lt;math&amp;gt; E&#039; &amp;lt;/math&amp;gt; quanto no parâmetro de ordem &amp;lt;math&amp;gt; M&#039; &amp;lt;/math&amp;gt;, e um histograma 2D &amp;lt;math&amp;gt; H(E&#039;,M&#039;) &amp;lt;/math&amp;gt; é acumulado.&lt;br /&gt;
&lt;br /&gt;
A função de partição pode ser calculada como &amp;lt;math&amp;gt; Z(T,h)=\sum_{E&#039;,M&#039;}g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT} &amp;lt;/math&amp;gt; e, a parir dela, podemos obter quantidades termodinâmicas para todos os valores de temperatura e campo magnético.&lt;br /&gt;
&lt;br /&gt;
Ainda, a magnetização média do sistema é dada por &amp;lt;math&amp;gt; M(T,h) = \frac{\sum_{E&#039;,M&#039;}M&#039;g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT}}{\sum_{E&#039;,M&#039;}g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Conclusões==&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6669</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6669"/>
		<updated>2021-12-04T21:13:14Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Magnetização */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e \ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D.&lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Newdistcano23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite em que o tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
==Magnetização==&lt;br /&gt;
&lt;br /&gt;
Na presença de um campo magnético externo &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, o hamiltoniano do modelo de Ising 2D é dado por &amp;lt;math&amp;gt;\mathcal{H} =-\sum_{\langle i,j\rangle} \sigma_i \sigma_j - h \sum_{i=1} \sigma_i&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt; M&#039; = \sum_{i=1} \sigma_i &amp;lt;/math&amp;gt; é a magnetização e &amp;lt;math&amp;gt;E&#039; =-\sum_{\left&amp;lt;i,j\right&amp;gt;} \sigma_i \sigma_j &amp;lt;/math&amp;gt; é a energia de troca.&lt;br /&gt;
&lt;br /&gt;
A diferença para o algoritmo anterior é que o passeio aleatório agora é executando tanto na energia &amp;lt;math&amp;gt; E&#039; &amp;lt;/math&amp;gt; quanto no parâmetro de ordem &amp;lt;math&amp;gt; M&#039; &amp;lt;/math&amp;gt;, e um histograma 2D &amp;lt;math&amp;gt; H(E&#039;,M&#039;) &amp;lt;/math&amp;gt; é acumulado.&lt;br /&gt;
&lt;br /&gt;
A função de partição pode ser calculada como &amp;lt;math&amp;gt; Z(T,h)=\sum_{E&#039;,M&#039;}g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT} &amp;lt;/math&amp;gt; e, a parir dela, podemos obter quantidades termodinâmicas para todos os valores de temperatura e campo magnético.&lt;br /&gt;
&lt;br /&gt;
Ainda, a magnetização média do sistema é dada por &amp;lt;math&amp;gt; M(T,h) = \frac{\sum_{E&#039;,M&#039;}M&#039;g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT}}{\sum_{E&#039;,M&#039;}g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Conclusões==&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6668</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6668"/>
		<updated>2021-12-04T21:12:54Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Magnetização */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e \ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D.&lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Newdistcano23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite em que o tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
==Magnetização==&lt;br /&gt;
&lt;br /&gt;
Na presença de um campo magnético externo &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;, o hamiltoniano do modelo de Ising 2D é dado por &amp;lt;math&amp;gt;\mathcal{H} =-\sum_{\left&amp;lt;i,j\right&amp;gt;} \sigma_i \sigma_j - h \sum_{i=1} \sigma_i&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt; M&#039; = \sum_{i=1} \sigma_i &amp;lt;/math&amp;gt; é a magnetização e &amp;lt;math&amp;gt;E&#039; =-\sum_{\left&amp;lt;i,j\right&amp;gt;} \sigma_i \sigma_j &amp;lt;/math&amp;gt; é a energia de troca.&lt;br /&gt;
&lt;br /&gt;
A diferença para o algoritmo anterior é que o passeio aleatório agora é executando tanto na energia &amp;lt;math&amp;gt; E&#039; &amp;lt;/math&amp;gt; quanto no parâmetro de ordem &amp;lt;math&amp;gt; M&#039; &amp;lt;/math&amp;gt;, e um histograma 2D &amp;lt;math&amp;gt; H(E&#039;,M&#039;) &amp;lt;/math&amp;gt; é acumulado.&lt;br /&gt;
&lt;br /&gt;
A função de partição pode ser calculada como &amp;lt;math&amp;gt; Z(T,h)=\sum_{E&#039;,M&#039;}g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT} &amp;lt;/math&amp;gt; e, a parir dela, podemos obter quantidades termodinâmicas para todos os valores de temperatura e campo magnético.&lt;br /&gt;
&lt;br /&gt;
Ainda, a magnetização média do sistema é dada por &amp;lt;math&amp;gt; M(T,h) = \frac{\sum_{E&#039;,M&#039;}M&#039;g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT}}{\sum_{E&#039;,M&#039;}g(E&#039;,M&#039;)e^{-(E&#039;-hM&#039;)/k_BT}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Conclusões==&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6667</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6667"/>
		<updated>2021-12-04T21:12:43Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e \ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D.&lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Newdistcano23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite em que o tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
==Magnetização==&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;br /&gt;
&lt;br /&gt;
==Conclusões==&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6666</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6666"/>
		<updated>2021-12-04T21:11:56Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Quantidades termodinâmicas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e \ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D.&lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Newdistcano23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite em que o tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6665</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6665"/>
		<updated>2021-12-04T21:11:16Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Distribuição canônica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e \ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D.&lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Newdistcano23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Newdistcano23.png&amp;diff=6664</id>
		<title>Arquivo:Newdistcano23.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Newdistcano23.png&amp;diff=6664"/>
		<updated>2021-12-04T21:10:24Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6663</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6663"/>
		<updated>2021-12-04T21:10:05Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Densidade de estados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e \ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D.&lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6662</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6662"/>
		<updated>2021-12-04T21:02:09Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Densidade de estados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e \ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6661</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6661"/>
		<updated>2021-12-04T21:01:55Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Algoritmo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar plano, então diminuo o valor de &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, fazendo &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt; e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6660</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6660"/>
		<updated>2021-12-04T21:00:32Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Fator de modificação */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt{f_0} &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6659</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6659"/>
		<updated>2021-12-04T21:00:18Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Fator de modificação */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = \sqrt(f_0) &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6658</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6658"/>
		<updated>2021-12-04T20:59:06Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Flatness */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6657</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6657"/>
		<updated>2021-12-04T20:58:51Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Flatness */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados muitas vezes.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; (L*L)^2 &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado várias vezes.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6656</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6656"/>
		<updated>2021-12-04T20:57:18Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Amostragem de Wang-Landau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado (&#039;&#039;single-spin flip&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o balanço detalhado no limite em que &amp;lt;math&amp;gt; f \to 1 &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1/g(E_1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar plano (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está plano, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado plano, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6529</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6529"/>
		<updated>2021-11-29T14:40:30Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Densidade de estados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|400px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6528</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6528"/>
		<updated>2021-11-29T14:40:23Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Distribuição canônica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|400px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|400px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6527</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6527"/>
		<updated>2021-11-29T14:40:13Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Quantidades termodinâmicas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Fig33.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Fig33.png&amp;diff=6526</id>
		<title>Arquivo:Fig33.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Fig33.png&amp;diff=6526"/>
		<updated>2021-11-29T14:39:40Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: fig com leg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;fig com leg&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6525</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6525"/>
		<updated>2021-11-29T14:27:23Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Algoritmo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = \min (g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6523</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6523"/>
		<updated>2021-11-29T14:15:10Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Aplicação ao Modelo de Ising 2D */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6522</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6522"/>
		<updated>2021-11-29T14:05:47Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def redeAleatoria(L):&lt;br /&gt;
    latt=zeros((L,L),dtype=int)&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def energia(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
#Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def quantTermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N,cv/N,F/N,S/N)&lt;br /&gt;
    &lt;br /&gt;
#Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(L,N,indices,E0,flatness,fmin):&lt;br /&gt;
    latt=redeAleatoria(L)&lt;br /&gt;
    Ene=energia(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N)       &lt;br /&gt;
        (i,j)=(ii%L,ii/L) &lt;br /&gt;
        i=int(rand()*L)&lt;br /&gt;
        j=int(rand()*L)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%L,j]+latt[i,(j+1)%L]+latt[(i-1)%L,j]+latt[i,(j-1)%L]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indices[Ene+E0]]-lngE[indices[Enew+E0]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indices[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indices[Ene+E0]]+=lnf&lt;br /&gt;
        if itt%1000==0:&lt;br /&gt;
            aH=sum(Hist)/(N) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
L=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N=L*L&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N+1)-2*N).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indices=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indices[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
(lngE, Hist) = WangLandau(L, N, indices, E0, flatness, fmin)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(L*L)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plt.plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plt.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plt.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plt.plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plt.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plt.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plt.plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plt.plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(quantTermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(quantTermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6503</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6503"/>
		<updated>2021-11-29T01:31:10Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Modelo de Ising */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j \rangle &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
Adicionar código&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6502</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6502"/>
		<updated>2021-11-29T01:30:49Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Código */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
Adicionar código&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6501</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6501"/>
		<updated>2021-11-29T01:30:49Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Código */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
Adicionar código&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6500</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6500"/>
		<updated>2021-11-29T01:30:39Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Código */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
Adicionar programas usados&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6499</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6499"/>
		<updated>2021-11-29T01:29:58Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Código */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def RandomL(N):&lt;br /&gt;
    latt=zeros((N,N),dtype=int)&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def CEnergy(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%N,j]+latt[i,(j+1)%N]+latt[(i-1)%N,j]+latt[i,(j-1)%N]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
    #Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def Thermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        #w=exp(lngE[i]-lngE[0]-(E+E0)/T)&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
        #print(i, E, lngE[i], w, Z, Ev)&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N2,cv/N2,F/N2,S/N2)&lt;br /&gt;
    &lt;br /&gt;
    #Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(Nitt,N,N2,indE,E0,flatness):&lt;br /&gt;
    latt=RandomL(N)&lt;br /&gt;
    Ene=CEnergy(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N2)       &lt;br /&gt;
        (i,j)=(ii%N,ii/N) &lt;br /&gt;
        i=int(rand()*N)&lt;br /&gt;
        j=int(rand()*N)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%N,j]+latt[i,(j+1)%N]+latt[(i-1)%N,j]+latt[i,(j-1)%N]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indE[Ene+E0]]-lngE[indE[Enew+E0]])&lt;br /&gt;
        #P=exp(lngE[indE[Ene]]-lngE[indE[Enew]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indE[Ene+E0]]+=1.&lt;br /&gt;
        #Hist[indE[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indE[Ene+E0]]+=lnf&lt;br /&gt;
        #lngE[indE[Ene]]+=lnf&lt;br /&gt;
        if itt%100==0:&lt;br /&gt;
            aH=sum(Hist)/(N2+0.0) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
Nitt=10000000 #remover essa parte, não é mais usado&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
N=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N2=N*N&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N2+1)-2*N2).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indE=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indE[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
lngE=np.load(&#039;lngE.npy&#039;)&lt;br /&gt;
Hist=np.load(&#039;Hist.npy&#039;)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(N*N)&lt;br /&gt;
plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N2&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N2&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(Thermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(Thermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6498</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6498"/>
		<updated>2021-11-29T01:29:13Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def RandomL(N):&lt;br /&gt;
    latt=zeros((N,N),dtype=int)&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def CEnergy(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%N,j]+latt[i,(j+1)%N]+latt[(i-1)%N,j]+latt[i,(j-1)%N]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
    #Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def Thermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        #w=exp(lngE[i]-lngE[0]-(E+E0)/T)&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
        #print(i, E, lngE[i], w, Z, Ev)&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N2,cv/N2,F/N2,S/N2)&lt;br /&gt;
    &lt;br /&gt;
    #Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(Nitt,N,N2,indE,E0,flatness):&lt;br /&gt;
    latt=RandomL(N)&lt;br /&gt;
    Ene=CEnergy(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N2)       &lt;br /&gt;
        (i,j)=(ii%N,ii/N) &lt;br /&gt;
        i=int(rand()*N)&lt;br /&gt;
        j=int(rand()*N)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%N,j]+latt[i,(j+1)%N]+latt[(i-1)%N,j]+latt[i,(j-1)%N]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indE[Ene+E0]]-lngE[indE[Enew+E0]])&lt;br /&gt;
        #P=exp(lngE[indE[Ene]]-lngE[indE[Enew]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indE[Ene+E0]]+=1.&lt;br /&gt;
        #Hist[indE[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indE[Ene+E0]]+=lnf&lt;br /&gt;
        #lngE[indE[Ene]]+=lnf&lt;br /&gt;
        if itt%100==0:&lt;br /&gt;
            aH=sum(Hist)/(N2+0.0) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
Nitt=10000000&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
N=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N2=N*N&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N2+1)-2*N2).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indE=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indE[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
lngE=np.load(&#039;lngE.npy&#039;)&lt;br /&gt;
Hist=np.load(&#039;Hist.npy&#039;)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(N*N)&lt;br /&gt;
plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N2&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N2&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(Thermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(Thermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6497</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6497"/>
		<updated>2021-11-29T01:28:40Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
#Rede aleatória para Ising 2D&lt;br /&gt;
def RandomL(N):&lt;br /&gt;
    latt=zeros((N,N),dtype=int)&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            latt[i,j]=sign(2*rand()-1)&lt;br /&gt;
    return latt&lt;br /&gt;
    &lt;br /&gt;
#Energia da rede&lt;br /&gt;
def CEnergy(latt):&lt;br /&gt;
    Ene=0&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        for j in range(N):&lt;br /&gt;
            S=latt[i,j]&lt;br /&gt;
            WF=latt[(i+1)%N,j]+latt[i,(j+1)%N]+latt[(i-1)%N,j]+latt[i,(j-1)%N]&lt;br /&gt;
            Ene+=-WF*S&lt;br /&gt;
    return int(Ene/2.)&lt;br /&gt;
    &lt;br /&gt;
    #Quantidades termodinâmicas usando a densidade de estados&lt;br /&gt;
def Thermod(T,lngE,Energies,E0):&lt;br /&gt;
    Z=0&lt;br /&gt;
    Ev=0&lt;br /&gt;
    E2v=0&lt;br /&gt;
    for i,E in enumerate(Energies):&lt;br /&gt;
        #w=exp(lngE[i]-lngE[0]-(E+E0)/T)&lt;br /&gt;
        w=exp(lngE[i]-E/T)&lt;br /&gt;
        Z+=w&lt;br /&gt;
        Ev+=w*E&lt;br /&gt;
        E2v+=w*E**2&lt;br /&gt;
        #print(i, E, lngE[i], w, Z, Ev)&lt;br /&gt;
    Ev*=1./Z&lt;br /&gt;
    cv=(E2v/Z-Ev**2)/T**2&lt;br /&gt;
    F = -T*np.log(Z)&lt;br /&gt;
    S = (Ev - F)/T&lt;br /&gt;
    return (Ev/N2,cv/N2,F/N2,S/N2)&lt;br /&gt;
    &lt;br /&gt;
    #Algoritmo de Wang-Landau&lt;br /&gt;
def WangLandau(Nitt,N,N2,indE,E0,flatness):&lt;br /&gt;
    latt=RandomL(N)&lt;br /&gt;
    Ene=CEnergy(latt)&lt;br /&gt;
    lngE=zeros(len(Energies),dtype=float)&lt;br /&gt;
    Hist=zeros(len(Energies),dtype=float)&lt;br /&gt;
    lnf=1.0&lt;br /&gt;
    itt = 0&lt;br /&gt;
    while exp(lnf) &amp;gt; fmin:&lt;br /&gt;
        itt = itt + 1&lt;br /&gt;
        ii=int(rand()*N2)       &lt;br /&gt;
        (i,j)=(ii%N,ii/N) &lt;br /&gt;
        i=int(rand()*N)&lt;br /&gt;
        j=int(rand()*N)&lt;br /&gt;
        S=latt[i,j] &lt;br /&gt;
        WF=latt[(i+1)%N,j]+latt[i,(j+1)%N]+latt[(i-1)%N,j]+latt[i,(j-1)%N]&lt;br /&gt;
        Enew=Ene+2*S*WF&lt;br /&gt;
        P=exp(lngE[indE[Ene+E0]]-lngE[indE[Enew+E0]])&lt;br /&gt;
        #P=exp(lngE[indE[Ene]]-lngE[indE[Enew]])&lt;br /&gt;
        if P&amp;gt;rand():   &lt;br /&gt;
            latt[i,j]=-S        &lt;br /&gt;
            Ene=Enew       &lt;br /&gt;
        Hist[indE[Ene+E0]]+=1.&lt;br /&gt;
        #Hist[indE[Ene+E0]]+=1.&lt;br /&gt;
        lngE[indE[Ene+E0]]+=lnf&lt;br /&gt;
        #lngE[indE[Ene]]+=lnf&lt;br /&gt;
        if itt%100==0:&lt;br /&gt;
            aH=sum(Hist)/(N2+0.0) &lt;br /&gt;
            mH=min(Hist)          &lt;br /&gt;
            if mH&amp;gt;aH*flatness:  &lt;br /&gt;
                Hist=zeros(len(Hist)) &lt;br /&gt;
                lnf/=2.             &lt;br /&gt;
                print(&amp;quot;iteracao =&amp;quot;, itt, &#039;f=&#039;, exp(lnf))&lt;br /&gt;
    return lngE,Hist&lt;br /&gt;
    &lt;br /&gt;
from scipy import *&lt;br /&gt;
import sys&lt;br /&gt;
from pylab import *&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
Nitt=10000000&lt;br /&gt;
fmin = 1.00000001&lt;br /&gt;
print(fmin)&lt;br /&gt;
N=16&lt;br /&gt;
flatness=0.8&lt;br /&gt;
N2=N*N&lt;br /&gt;
&lt;br /&gt;
# energias possiveis&lt;br /&gt;
Energies = (4*arange(N2+1)-2*N2).tolist()&lt;br /&gt;
print(Energies)&lt;br /&gt;
Energies.pop(1)   &lt;br /&gt;
Energies.pop(-2)&lt;br /&gt;
E0=Energies[-1]&lt;br /&gt;
print(Energies)                      &lt;br /&gt;
indE=-ones(E0*2+1,dtype=int)&lt;br /&gt;
&lt;br /&gt;
for i,E in enumerate(Energies):&lt;br /&gt;
  indE[E+E0]=i&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
lngE=np.load(&#039;lngE.npy&#039;)&lt;br /&gt;
Hist=np.load(&#039;Hist.npy&#039;)&lt;br /&gt;
&lt;br /&gt;
Hist *= len(Hist)/sum(Hist)&lt;br /&gt;
&lt;br /&gt;
len(lngE),len(Hist)&lt;br /&gt;
&lt;br /&gt;
from pylab import *&lt;br /&gt;
EE=array(Energies);EE=EE/(N*N)&lt;br /&gt;
plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
#plot(EE,Hist,&#039;-s&#039;,markersize=2.0,label=&#039;Histogram&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
f=open(&#039;bealeL16.dat&#039;,&#039;r&#039;);f=f.readlines()&lt;br /&gt;
&lt;br /&gt;
beale=[]&lt;br /&gt;
for i in range(len(f)):&lt;br /&gt;
  beale.append(float(f[i]))&lt;br /&gt;
&lt;br /&gt;
plot(Energies,beale,label=&#039;Exata&#039;)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(&#039;ln[g(E)]&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
xlabel(r&#039;$E/N$&#039;)&lt;br /&gt;
ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo&lt;br /&gt;
&lt;br /&gt;
erro=[]&lt;br /&gt;
for i in range(len(lngE)):&lt;br /&gt;
  erro.append((abs(lngE[i]-beale[i]))/beale[i])&lt;br /&gt;
&lt;br /&gt;
plot(Energies,erro)&lt;br /&gt;
xlabel(&#039;Energia&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
#legend(loc=&#039;best&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
from mpl_toolkits.axes_grid.inset_locator import (inset_axes,InsetPosition,mark_inset)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(EE,lngE,&#039;o&#039;,markersize=1.5,label=&#039;Simulação&#039;)&lt;br /&gt;
ax1.plot(EE,beale,label=&#039;Exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$ln[g(E)]$&#039;)&lt;br /&gt;
ax1.set_xlim(-2.,4.)&lt;br /&gt;
ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(EE,erro)&lt;br /&gt;
ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$\epsilon [ln(g)]$&#039;)&lt;br /&gt;
savefig(&#039;fig1.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
print(beale[0:5])&lt;br /&gt;
&lt;br /&gt;
print(lngE[0:5])&lt;br /&gt;
&lt;br /&gt;
lmb23 = -1**300&lt;br /&gt;
lmb23e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo23 = lngE[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23 &amp;gt; lmb23:&lt;br /&gt;
    lmb23 = termo23&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo23e = beale[i] - Energies[i]/2.3&lt;br /&gt;
  if termo23e &amp;gt; lmb23e:&lt;br /&gt;
    lmb23e = termo23e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb23,lmb23e)&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N2&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
E=array(Energies);E1=E/N2&lt;br /&gt;
P=exp(lngE-E/2.3 - lmb23)&lt;br /&gt;
Pexact=exp(beale-E/2.3 - lmb23e)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
#plot(Energies,P2,label=r&#039;$k_B T_c = 2.2$&#039;)&lt;br /&gt;
#plot(Energies,P3,label=r&#039;$k_B T_c = 2.4$&#039;)&lt;br /&gt;
xlabel(&#039;E/N&#039;)&lt;br /&gt;
ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
legend(loc=&#039;best&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
lmb22 = -1**300&lt;br /&gt;
lmb22e = -1**300&lt;br /&gt;
lmb24 = -1**300&lt;br /&gt;
lmb24e = -1**300&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22 = lngE[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22 &amp;gt; lmb22:&lt;br /&gt;
    lmb22 = termo22&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo22e = beale[i] - Energies[i]/2.2&lt;br /&gt;
  if termo22e &amp;gt; lmb22e:&lt;br /&gt;
    lmb22e = termo22e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24 = lngE[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24 &amp;gt; lmb24:&lt;br /&gt;
    lmb24 = termo24&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
i=0&lt;br /&gt;
while i&amp;lt;N2-1:&lt;br /&gt;
  termo24e = beale[i] - Energies[i]/2.4&lt;br /&gt;
  if termo24e &amp;gt; lmb24e:&lt;br /&gt;
    lmb24e = termo24e&lt;br /&gt;
  i = i+1&lt;br /&gt;
&lt;br /&gt;
print(lmb22,lmb22e,lmb24,lmb24e)&lt;br /&gt;
&lt;br /&gt;
P2=exp(lngE-E/2.2-lmb22)&lt;br /&gt;
P2exact=exp(beale-E/2.2-lmb22e)&lt;br /&gt;
P3=exp(lngE-E/2.4-lmb24)&lt;br /&gt;
P3exact=exp(beale-E/2.4-lmb24e)&lt;br /&gt;
&lt;br /&gt;
fig,ax1=subplots()&lt;br /&gt;
ax1.plot(E1,P,label=r&#039;$k_B T_c = 2.3$&#039;)&lt;br /&gt;
#ax1.plot(E1,Pexact,label=r&#039;$k_B T_c = 2.3$ exata&#039;)&lt;br /&gt;
ax1.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$g(E)e^{-E/k_B T_c}$&#039;)&lt;br /&gt;
#ax1.set_ylim(0.,200.)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax2=axes([0,0,1,1])&lt;br /&gt;
ip=InsetPosition(ax1,[0.5,0.3,0.5,0.5])&lt;br /&gt;
ax2.set_axes_locator(ip)&lt;br /&gt;
ax2.plot(E1,P2,label=r&#039;$k_B T = 2.2$&#039;)&lt;br /&gt;
#ax2.plot(E1,P2exact,label=r&#039;$k_B T = 2.2$ exata&#039;)&lt;br /&gt;
ax2.plot(E1,P3,label=r&#039;$k_B T = 2.4$&#039;)&lt;br /&gt;
#ax2.plot(E1,P3exact,label=r&#039;$k_B T = 2.4$ exata&#039;)&lt;br /&gt;
#ax2.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax2.set_xlabel(&#039;E/N&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$g(E)e^{-E/k_B T}$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
savefig(&#039;fig2.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
Te = linspace(0,8,255)&lt;br /&gt;
Thm=[];Thm_exact=[]&lt;br /&gt;
&lt;br /&gt;
for T in Te:&lt;br /&gt;
  Thm.append(Thermod(T, lngE, Energies, E0))&lt;br /&gt;
  Thm_exact.append(Thermod(T, beale, Energies, E0))&lt;br /&gt;
&lt;br /&gt;
Thm = array(Thm)&lt;br /&gt;
Thm_exact=array(Thm_exact)&lt;br /&gt;
&lt;br /&gt;
#Energia interna&lt;br /&gt;
plt.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Calor específico&lt;br /&gt;
plt.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Entropia&lt;br /&gt;
plt.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
plt.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
plt.legend(loc=&#039;best&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
erroUt=(abs(Thm[:,0]-Thm_exact[:,0]))/abs(Thm_exact[:,0])&lt;br /&gt;
erroCt=(abs(Thm[:,1]-Thm_exact[:,1]))/Thm_exact[:,1]&lt;br /&gt;
erroFt=(abs(Thm[:,2]-Thm_exact[:,2]))/abs(Thm_exact[:,2])&lt;br /&gt;
erroSt=(abs(Thm[:,3]-Thm_exact[:,3]))/Thm_exact[:,3]&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia interna&lt;br /&gt;
plt.plot(Te,erroUt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para calor específico&lt;br /&gt;
plt.plot(Te,erroCt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para energia livre de Helmholtz&lt;br /&gt;
plt.plot(Te,erroFt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
#Erro relativo para entropia&lt;br /&gt;
plt.plot(Te,erroSt)&lt;br /&gt;
xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
yscale(&#039;log&#039;)&lt;br /&gt;
plt.show()&lt;br /&gt;
&lt;br /&gt;
figure(figsize=(10,8))&lt;br /&gt;
&lt;br /&gt;
ax1=subplot(2,2,1)&lt;br /&gt;
ax1.plot(Te,Thm_exact[:,0],label=&#039;exata&#039;)&lt;br /&gt;
ax1.plot(Te,Thm[:,0],label=&#039;simulação&#039;)&lt;br /&gt;
ax1.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax1.set_ylabel(r&#039;$U(T)/N$&#039;)&lt;br /&gt;
ax1.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax12=axes([1,0,0,0])&lt;br /&gt;
ip=InsetPosition(ax1,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax12.set_axes_locator(ip)&lt;br /&gt;
ax12.plot(Te,erroUt)&lt;br /&gt;
ax12.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax12.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax12.set_ylabel(r&#039;$\epsilon [U(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax2=subplot(2,2,2)&lt;br /&gt;
ax2.plot(Te,Thm_exact[:,1],label=&#039;exata&#039;)&lt;br /&gt;
ax2.plot(Te,Thm[:,1],label=&#039;simulação&#039;)&lt;br /&gt;
ax2.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax2.set_ylabel(r&#039;$C(T)/N$&#039;)&lt;br /&gt;
ax2.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax22=axes([0,1,0,0])&lt;br /&gt;
ip=InsetPosition(ax2,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax22.set_axes_locator(ip)&lt;br /&gt;
ax22.plot(Te,erroCt)&lt;br /&gt;
ax22.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax22.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax22.set_ylabel(r&#039;$\epsilon [C(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax3=subplot(2,2,3)&lt;br /&gt;
ax3.plot(Te,Thm_exact[:,2],label=&#039;exata&#039;)&lt;br /&gt;
ax3.plot(Te,Thm[:,2],label=&#039;simulação&#039;)&lt;br /&gt;
ax3.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax3.set_ylabel(r&#039;$F(T)/N$&#039;)&lt;br /&gt;
ax3.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax32=axes([0,0,1,0])&lt;br /&gt;
ip=InsetPosition(ax3,[0.25,0.2,0.3,0.3])&lt;br /&gt;
ax32.set_axes_locator(ip)&lt;br /&gt;
ax32.plot(Te,erroFt)&lt;br /&gt;
ax32.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax32.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax32.set_ylabel(r&#039;$\epsilon [F(T)]$&#039;)&lt;br /&gt;
&lt;br /&gt;
ax4=subplot(2,2,4)&lt;br /&gt;
ax4.plot(Te,Thm_exact[:,3],label=&#039;exata&#039;)&lt;br /&gt;
ax4.plot(Te,Thm[:,3],label=&#039;simulação&#039;)&lt;br /&gt;
ax4.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax4.set_ylabel(r&#039;$S(T)/N$&#039;)&lt;br /&gt;
ax4.legend(loc=&#039;best&#039;)&lt;br /&gt;
ax42=axes([0,0,0,1])&lt;br /&gt;
ip=InsetPosition(ax4,[0.685,0.5,0.3,0.3])&lt;br /&gt;
ax42.set_axes_locator(ip)&lt;br /&gt;
ax42.plot(Te,erroSt)&lt;br /&gt;
ax42.set_yscale(&#039;log&#039;)&lt;br /&gt;
ax42.set_xlabel(r&#039;$k_B T$&#039;)&lt;br /&gt;
ax42.set_ylabel(r&#039;$\epsilon [S(T)]$&#039;)&lt;br /&gt;
savefig(&#039;fig3.png&#039;)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6496</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6496"/>
		<updated>2021-11-29T01:27:16Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wiki da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6494</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6494"/>
		<updated>2021-11-29T01:26:27Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Densidade de estados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\langle H(E)\rangle &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6492</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6492"/>
		<updated>2021-11-29T01:25:35Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Quantidades termodinâmicas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\left&amp;lt;H(E)\right&amp;gt;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 - 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6491</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6491"/>
		<updated>2021-11-29T01:24:22Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Resultados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
===Densidade de estados===&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Os fatores de modificação inicial e final para os passeios aleatórios foram &amp;lt;math&amp;gt;ln(f_0) = 1 e ln(f_{final}) = 10^{−8}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
O histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; foi considerado plano quando todas as entradas não eram inferiores a 80% da média &amp;lt;math&amp;gt;\left&amp;lt;H(E)\right&amp;gt;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A densidade absoluta de estados na Fig. 1 é obtida pela condição de que o número de estados fundamentais seja 2 para o modelo de Ising 2D. &lt;br /&gt;
&lt;br /&gt;
Com a escala logarítmica usada na Fig. 1, os dados simulados e a solução exata se sobrepõem perfeitamente. Na inserção da Fig. 1, vemos que o erro relativo é, de fato, muito pequeno.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
===Distribuição canônica===&lt;br /&gt;
&lt;br /&gt;
Podemos calcular a distribuição canônica usando a equação &amp;lt;math&amp;gt; P(E, T) = g(E)e^{−E/k_BT}&amp;lt;/math&amp;gt; a qualquer temperatura, sem a necessidade de realizar várias simulações. &lt;br /&gt;
&lt;br /&gt;
Na Fig. 2, mostramos a distribuição canônica resultante na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, que exibe um único pico. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
As distribuições em temperaturas acima e abaixo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; também apresentam pico único, conforme ilustrado no detalhe da Fig. 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Quantidades termodinâmicas===&lt;br /&gt;
&lt;br /&gt;
Os resultados simulados, calculados diretamente com as equações descritas no capítulo anterior, e as soluções exatas se sobrepõem quase perfeitamente em uma ampla região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 − 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Testes mais rigorosos de precisão são fornecidos a partir dos erros relativos para as respectivas quantidades termodinâmicas. Os erros relativos são muito pequenos para toda a região de temperatura de &amp;lt;math&amp;gt;k_BT = 0 − 8&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como o sistema tem uma transição de fase de segunda ordem, a primeira derivada da energia livre é uma função contínua da temperatura. Não há saltos na energia interna ou na entropia, mesmo no limite, pois o&lt;br /&gt;
tamanho do sistema vai para o infinito.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6488</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6488"/>
		<updated>2021-11-29T01:21:40Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
A estimativa da densidade de estados para &amp;lt;math&amp;gt;L = 16&amp;lt;/math&amp;gt; usando a amostragem de Wang-Landau é mostrada na Fig. 1, junto com os resultados exatos de Beale &amp;lt;ref name=&amp;quot;beale&amp;quot; /&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6482</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6482"/>
		<updated>2021-11-29T00:30:32Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Referências */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
Discutir a densidade de estados&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6481</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6481"/>
		<updated>2021-11-29T00:30:32Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Referências */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
Discutir a densidade de estados&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
asdfasdf&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6480</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6480"/>
		<updated>2021-11-29T00:30:24Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Referências */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
Discutir a densidade de estados&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
==Referências==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Código==&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6479</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6479"/>
		<updated>2021-11-29T00:30:06Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Resultados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
Discutir a densidade de estados&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
====Referências====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Código====&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6477</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6477"/>
		<updated>2021-11-29T00:17:06Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
==Resultados==&lt;br /&gt;
&lt;br /&gt;
Discutir a densidade de estados&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
====Referências====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Código====&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6476</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6476"/>
		<updated>2021-11-29T00:16:37Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Resultados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
====Resultados====&lt;br /&gt;
&lt;br /&gt;
Discutir a densidade de estados&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
====Referências====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Código====&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6475</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6475"/>
		<updated>2021-11-29T00:16:24Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Resultados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
====Resultados====&lt;br /&gt;
&lt;br /&gt;
Discutir a densidade de estados&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|300px|thumb|left| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|left| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|300px|thumb|left| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|700px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
====Referências====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Código====&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6474</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6474"/>
		<updated>2021-11-29T00:15:58Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
====Resultados====&lt;br /&gt;
&lt;br /&gt;
Discutir a densidade de estados&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png|500px|thumb|center| Figura 1: Logaritmo da densidade de estados &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|500px|thumb|center| Figura 2: Distribuição canônica &amp;lt;math&amp;gt; P(E,T_c) = g(E)e^{-E/k_BT_c} &amp;lt;/math&amp;gt; na temperatura de transição do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; k_BT_c = 2.3 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png|500px|thumb|center| Figura 3: Distribuição canônica &amp;lt;math&amp;gt; P(E,T) = g(E)e^{-E/k_BT} &amp;lt;/math&amp;gt; nas temperaturas &amp;lt;math&amp;gt; T = 2.2 &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; T = 2.4 &amp;lt;/math&amp;gt; do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png|500px|thumb|center| Figura 4: Quantidades termodinâmicas do modelo de Ising 2D com &amp;lt;math&amp;gt; L = 16 &amp;lt;/math&amp;gt; calculado a partir da densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;. Na figura, estão mostrados: (a) energia interna, (b) calor específico, (c) energia livre de Helmholtz e (d) entropia. Os gráficos &#039;&#039;inset&#039;&#039; são os erros relativos.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Referências====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Código====&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6473</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6473"/>
		<updated>2021-11-29T00:09:05Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
====Resultados====&lt;br /&gt;
&lt;br /&gt;
Discutir a densidade de estados&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Discutir a distribuição canônica&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png]]&lt;br /&gt;
&lt;br /&gt;
Discutir as quantidades termodinâmicas&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png]]&lt;br /&gt;
&lt;br /&gt;
====Referências====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Código====&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6471</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6471"/>
		<updated>2021-11-29T00:06:42Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; U(T) = \frac{\sum_E Eg(E) e^{-E/k_BT}}{\sum_E g(E) e^{-E/k_BT}} = \langle E \rangle &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Calor específico:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; C(T) = \frac{\partial U(T)}{\partial T} = \frac{\langle E^2 \rangle - \langle E \rangle ^2}{k_BT^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Energia livre de Helmoltz:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; F(T) = -k_BT\ln(Z) = -k_BT\ln\left( \sum_E g(E) e^{-E/k_BT} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Entropia:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;math&amp;gt; S(T) = \frac{U(T) - F(T)}{T} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
====Implementação====&lt;br /&gt;
&lt;br /&gt;
====Resultados====&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png]]&lt;br /&gt;
&lt;br /&gt;
====Referências====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Código====&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6470</id>
		<title>Algoritmo de Wang-Landau</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Algoritmo_de_Wang-Landau&amp;diff=6470"/>
		<updated>2021-11-29T00:05:27Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: /* Resultados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nomes: &#039;&#039;&#039;Rafael Abel da Silveira e William Machado Pantaleão&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Introdução==&lt;br /&gt;
Simulações computacionais, como o método de Monte Carlo, são vastamente utilizadas para estudar transições de fase e fenômenos críticos. O método padrão para simulações de Monte Carlo é o algoritmo de Metropolis, entretanto, algoritmos novos e mais eficientes são usados em simulações modernas, como o algoritmo de Wang-Landau. Ao contrário dos métodos convencionais de Monte Carlo, que geram diretamente uma distribuição canônica &amp;lt;math&amp;gt;g(E) e^{-E/k_B T}&amp;lt;/math&amp;gt; a uma dada temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, a abordagem de Wang-Landau estima a densidade de estados &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; diretamente por meio de um passeio aleatório, que produz um histograma plano no espaço de energia &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;. &amp;lt;ref name=wanglandau&amp;gt; D. P. Landau, Shan-ho Tsai, M. Exler, &#039;&#039;&#039;A new approach to Monte Carlo simulations in statistical physics: Wang-Landau sampling&#039;&#039;&#039;, American Journal of Physics 72, 1294 (2004). https://doi.org/10.1119/1.1707017 &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mesmo para modelos que podem ser resolvidos analiticamente, a densidade de estados &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; não pode ser determinada para sistemas maiores &amp;lt;ref name=beale&amp;gt; P. D. Beale, &#039;&#039;&#039;Exact Distribution of Energies in the Two-Dimensional Ising Model&#039;&#039;&#039;, Phys. Rev. Lett. 76,78 (1996). https://doi.org/10.1103/PhysRevLett.76.78 &amp;lt;/ref&amp;gt;. Com o algoritmo de Wang-Landau, é possível obter a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; a partir de um passeio aleatório. A estimativa para &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; é melhorada a cada etapa do passeio aleatório, usando um fator de modificação &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; cuidadosamente controlado, para produzir um resultado que converge para o valor real rapidamente.&lt;br /&gt;
&lt;br /&gt;
==Amostragem de Wang-Landau==&lt;br /&gt;
No início da simulação, &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é desconhecido e fazemos uma estimativa inicial para ele. A abordagem mais simples é definir &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todas as energias possíveis &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;. A configuração de spin inicial para toda a rede pode ser escolhida arbitrariamente. Então, uma caminhada aleatória no espaço de energia é iniciada pela formação de estados de teste, cada um dos quais é produzido escolhendo aleatoriamente um spin e alterando seu estado.&lt;br /&gt;
&lt;br /&gt;
Cada vez que uma energia &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; é visitada, o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt; é incrementado em 1. A estimativa de &amp;lt;math&amp;gt;g(E)&amp;lt;/math&amp;gt; é então modificada por um fator multiplicativo &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, e o valor atualizado realiza um passeio aleatório adicional no espaço de &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Se &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; são as energias antes e depois de um valor de spin ser alterado, a probabilidade de transição da energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; é dada por&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p(E_1 \rightarrow E_2) = min \left( \frac{g(E_1)}{g(E_2)}, 1\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A razão das probabilidades de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; e de &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt; a &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; podem ser calculados como&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{p(E_1 \rightarrow E_2)}{p(E_2 \rightarrow E_1)} = \frac{g(E_1)}{g(E_2)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Logo, o algoritmo de passeio aleatório satisfaz o equilíbrio detalhado:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{1}{g(E_1)}p(E_1 \rightarrow E_2) = \frac{1}{g(E_2)}p(E_2 \rightarrow E_1),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;1 / g (E1)&amp;lt;/math&amp;gt; é a probabilidade na energia &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;p (E_1\rightarrow E_2)&amp;lt;/math&amp;gt; é a probabilidade de transição de &amp;lt;math&amp;gt;E_1&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;E_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Se o estado de energia &amp;lt;math&amp;gt; E_2 &amp;lt;/math&amp;gt; é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_2) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação &amp;lt;math&amp;gt; f &amp;gt; 1 &amp;lt;/math&amp;gt; de maneira que &amp;lt;math&amp;gt; g(E_2) \to f \times g(E_2) &amp;lt;/math&amp;gt; e a entrada no histograma para &amp;lt;math&amp;gt; H(E_2) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_2) \to H(E_2) + 1 &amp;lt;/math&amp;gt;. Se o estado de energia não é aceito, a densidade de estados &amp;lt;math&amp;gt; g(E_1) &amp;lt;/math&amp;gt; é multiplicada pelo fator de modificação, &amp;lt;math&amp;gt; g(E_1) \to f \times g(E_1) &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; H(E_1) &amp;lt;/math&amp;gt; é atualizada de forma &amp;lt;math&amp;gt; H(E_1) \to H(E_1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;Flatness&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
O procedimento de passeio aleatório é seguido até o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; estar reto (do inglês, &amp;quot;&#039;&#039;flat&#039;&#039;&amp;quot;), e para determinar isso, a cada &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; iterações verificamos se todos valores possíveis de &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; estão a uma distância, no máximo, &amp;lt;math&amp;gt; x% &amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt; \langle H(E) \rangle &amp;lt;/math&amp;gt;. A variável &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; é denominada &amp;quot;&#039;&#039;flatness&#039;&#039;&amp;quot;. Quando o histograma está reto, todos estados de energia foram visitados aproximadamente igualmente.&lt;br /&gt;
&lt;br /&gt;
O número de passos, &amp;lt;/math&amp;gt; n &amp;lt;/math&amp;gt; que devemos realizar antes de checar deve ser maior que &amp;lt;math&amp;gt; L*L &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; L &amp;lt;/math&amp;gt; indica o tamanho da rede, para que o algoritmo tenha a oportunidade de visitar cada estado pelo menos uma vez.&lt;br /&gt;
&lt;br /&gt;
Para sistemas simples, podemos utilizar um valor tão alto quanto 95%, entretanto, para este trabalho foi escolhido o valor de 80%.&lt;br /&gt;
&lt;br /&gt;
====Fator de modificação====&lt;br /&gt;
&lt;br /&gt;
Em geral, como &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt; se torna muito grande, trabalhamos com o logaritmo natural dessas quantidades, &amp;lt;math&amp;gt; \ln g(E) &amp;lt;/math&amp;gt;. Portanto, cada atualização da densidade de estados é dada por &amp;lt;math&amp;gt; \ln g(E) \to \ln g(E) + \ln f &amp;lt;/math&amp;gt;. O valor comumente utilizado para o fator de modificação é &amp;lt;math&amp;gt; f = f_0 = e &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Quando o histograma é considerado reto, pelas condições descritas acima, reduzimos o valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; de forma que o novo valor será &amp;lt;math&amp;gt; f_1 = f_0/2 &amp;lt;/math&amp;gt;, resetamos o histograma &amp;lt;math&amp;gt; H(E) &amp;lt;/math&amp;gt; e recomeçamos o passeio aleatório.&lt;br /&gt;
&lt;br /&gt;
A simulação é parada para um valor de &amp;lt;math&amp;gt; f &amp;lt;/math&amp;gt; predeterminado. No caso, usamos &amp;lt;math&amp;gt; f_{final} = \exp (10^{-8}) = 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aplicação ao Modelo de Ising 2D==&lt;br /&gt;
&lt;br /&gt;
===Modelo de Ising===&lt;br /&gt;
&lt;br /&gt;
O modelo de Ising é uma rede 2D, de tamanho &amp;lt;math&amp;gt; L \times L &amp;lt;/math&amp;gt; que consiste de uma variável discreta em cada sítio que pode ser usada para representar o momento de dipolo magnético de um átomo&amp;lt;ref name=ising&amp;gt; A. Rosa, C. Pires, L. Doria, Ising 2D, Wikia da Física Computacional da UFRGS. https://fiscomp.if.ufrgs.br/index.php/Ising_2D#Modelo_de_Ising &amp;lt;/ref&amp;gt;  Cada sítio pode ter o valor de spin &amp;lt;math&amp;gt;+1&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para este trabalho, o hamiltoniano de interação pode ser calculado por &amp;lt;math&amp;gt; \mathcal{H} = -\sum_{\langle i,j \rangle}\sigma_i \sigma_j &amp;lt;/math&amp;gt; onde &amp;lt;math&amp;gt; \langle i,j &amp;lt;/math&amp;gt; indica pares distintos de vizinhos-mais-próximos.&lt;br /&gt;
&lt;br /&gt;
Com a densidade de estados, podemos calcular as seguintes quantidades termodinâmicas:&lt;br /&gt;
&lt;br /&gt;
Energia interna:&lt;br /&gt;
&lt;br /&gt;
Calor específico:&lt;br /&gt;
&lt;br /&gt;
Energia livre de Helmholtz:&lt;br /&gt;
&lt;br /&gt;
Entropia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Finalmente, podemos também calcular a distribuição canônica usando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; P(E,T) = g(E) e^{-E/k_BT} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Algoritmo====&lt;br /&gt;
&lt;br /&gt;
Resumindo, o passo a passo do algoritmo pode ser escrito como:&lt;br /&gt;
&lt;br /&gt;
1. Defino &amp;lt;math&amp;gt;g(E) = 1&amp;lt;/math&amp;gt; para todos &amp;lt;math&amp;gt; E &amp;lt;/math&amp;gt; e o fator de modificação inicial &amp;lt;math&amp;gt;f_0 = e&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2. Aleatoriamente, escolho um spin e troco o seu valor. Aceito a transição com probabilidade &amp;lt;math&amp;gt; p(E_1 \to E_2) = min(g(E_1)/g(E_2), 1) &amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3. Modifico a densidade de estados &amp;lt;math&amp;gt; g(E) \to g(E) \times f &amp;lt;/math&amp;gt; e atualizo o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
4. Continuo até o histograma estar reto, então diminuo o valor de &amp;lt;math&amp;gt;\ln f&amp;lt;/math&amp;gt; pela metade e reseto o histograma &amp;lt;math&amp;gt;H(E)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5. Repito os passos 2-4 até &amp;lt;math&amp;gt; f &amp;lt; 1.00000001 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
6. Obtendo a &amp;lt;math&amp;gt; g(E) &amp;lt;/math&amp;gt;, posso calcular as quantidades termodinâmicas descritas anteriormente.&lt;br /&gt;
&lt;br /&gt;
====Implementação====&lt;br /&gt;
&lt;br /&gt;
====Resultados====&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Densidade de estado.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dist cano 23.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Dists cano.png]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Qnt termo.png]]&lt;br /&gt;
&lt;br /&gt;
====Referências====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Código====&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Qnt_termo.png&amp;diff=6469</id>
		<title>Arquivo:Qnt termo.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Qnt_termo.png&amp;diff=6469"/>
		<updated>2021-11-29T00:04:01Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: quantidades termodinâmicas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;quantidades termodinâmicas&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Dists_cano.png&amp;diff=6467</id>
		<title>Arquivo:Dists cano.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Dists_cano.png&amp;diff=6467"/>
		<updated>2021-11-29T00:02:25Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: Distribuição canonica para kBT = 2.2 2.3 2.4&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distribuição canonica para kBT = 2.2 2.3 2.4&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Dist_cano_23.png&amp;diff=6465</id>
		<title>Arquivo:Dist cano 23.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Dist_cano_23.png&amp;diff=6465"/>
		<updated>2021-11-29T00:01:56Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: Distribuição canonica para kBT = 2.3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Distribuição canonica para kBT = 2.3&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Densidade_de_estado.png&amp;diff=6463</id>
		<title>Arquivo:Densidade de estado.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Densidade_de_estado.png&amp;diff=6463"/>
		<updated>2021-11-29T00:00:33Z</updated>

		<summary type="html">&lt;p&gt;Rafabel: Logaritmo da densidade de estados do modelo de Ising 2D para L=16&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Logaritmo da densidade de estados do modelo de Ising 2D para L=16&lt;/div&gt;</summary>
		<author><name>Rafabel</name></author>
	</entry>
</feed>