Clusterização: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
 
(27 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
'''PÁGINA EM CONSTRUÇÃO'''
'''PÁGINA EM CONSTRUÇÃO'''
== Clusterização do Modelo de Ising ==
== Clusterização do Modelo de Ising ==
=== Clusterização ===
O modelo de Ising é definido como uma malha de tamanho L, quadrada quando em duas dimensões e cúbica quando em três dimensões, onde cada vértice apresenta um componente de spin de magnitude fixa que pode apontar para cima ou para baixo (+1 ou -1, respectivamente). O sistema pode ser descrito pelo seguinte hamiltoniano:
 
<math>H_{Ising} = -J \sum_{\langle ij \rangle} s_i s_j</math>
 
onde <math>s</math> representa o valor do spin e a soma é feita sobre os pares de vértices próximas que são conectadas com um acoplamento ferromagnético de força <math>J > 0</math>.
 
Para um modelo de Ising bidimensional (o tipo que consideramos) é possível calcular [1] sua temperatura crítica exata como:
 
<math>T_c = \frac{2J}{\log(1 + \sqrt{2})} \simeq 2.269J</math>
 
Acima dessa temperatura o sistema está na ‘’’fase paramagnética‘’’, onde a magnetização média é nula, e abaixo dessa temperatura o sistema está na fase ‘’’fase ferromagnética’’’, onde a maioria dos spins se alinham e a magnetização se torna não-nula. Ao estudar o modelo de Ising em geral temos maior interesse no comportamento do sistema perto de <math>T_c</math>, onde o sistema forma grupos grandes de spins para cima ou para baixo. Esses grupos contribuem muito para a energia do sistema, causando muita flutuação quando invertem.
 
O algoritmo de Metropolis é um ótimo algoritmo para realizar simulações do modelo de Ising [1]. Porém, sua dinâmica de ''flip'' único é ineficiente especialmente quando próxima da temperatura crítica do sistema. As imprecisões estatísticas de quantidades como magnetização e energia interna do sistema aumentam quando próximo da temperatura crítica. Assim, quando esses grandes grupos de spins alinhados (clusters) invertem, há grandes imprecisões. Essa imprecisão aumenta com o tamanho das flutuações, mas diminui com o número de medidas feitas na simulação, então para se estudar a região perto de <math>T_c</math> de modo mais preciso é necessário que a simulação aconteça por mais tempo. Porém, uma outra fraqueza do algoritmo de Metropolis é seu tempo de correlação <math>\tau</math> grande ao redor da temperatura crítica. Isso significa que o número de medidas de uma simulação é pequena, então para diminuir as imprecisões estatísticas causadas pelas poucas medidas é necessário rodar o algoritmo por mais tempo.
 
Uma das propriedades do modelo de Ising é o fato de flutuações grandes gerarem medidas mais imprecisas. Porém, o tempo de correlação e o modo como ele se comporta próximo a <math>T_c</math> é uma propriedade do algoritmo utilizado para estudar o sistema, e então é algo que pode ser otimizado.
 
=== Expoentes Críticos ===
Para estudar mais sobre a eficiência dos algoritmos no modelo de Ising podemos definir a temperatura reduzida como:
 
<math>t = \frac{T - T_c}{T_c}</math>
 
Essa grandeza indica o quão distante estamos da temperatura crítica <math>T_c</math>, de modo que para <math>t=0</math> estamos em <math>T_c</math>. A partir disso, e sabendo que <math>\xi</math> indica a largura médio dos clusters, temos que a expressão <math>\xi \sim |t|^{- \nu}</math> demonstra a divergência da largura de correlação (largura dos clusters). Se tratando do tempo, definimos <math>\tau \sim |t|^{-z \nu}</math> como o tempo de correlação da simulação, medido em passos de Monte Carlo por sítio da rede. O expoente <math>z</math>, chamado de expoente dinâmico, é um modo de quantificar a diferença de tempo que acontece devido à divergência. Um valor grande de <math>z</math> simboliza que <math>\tau</math> fica grande, por exemplo, fazendo uma simulação mais demorada e menos precisa quando próximo de <math>T_c</math>.
 
Combinando as duas equações vistas, podemos escrever que <math>\tau \sim \xi^z</math>. Essa relação indica que o tempo de correlação aumenta com o tamanho típico dos clusters. Considerando um sistema de tamanho finito porém (os tipos de sistema que simulamos), o valor máximo de <math>\xi</math> vai ser o tamanho <math>L</math> do sistema (e.g. um sistema <math>64</math>x<math>64</math> tem <math>L=64</math>). Podemos assim concluir que <math>\tau \sim L^z</math>.
 
Sabendo a temperatura crítica do sistema (para Ising 2D, <math>T_c = 2.269J</math> é possível usar a relação <math>\tau \sim L^z</math> para medir <math>z</math> por meio de simulações onde a temperatura do sistema é igual à temperatura crítica para vários tamanhos diferentes de <math>L</math>, plotando  <math>\tau</math> versus  <math>L</math> em escala logarítmica. A inclinação da reta que liga todos esses pontos nos dá o valor de  <math>z</math>.
 
Por meio desse método, temos que  o <math>z</math> do algoritmo de Metropolis é <math>z = 2.1655 \pm 0.0012</math> [5] e o <math>z</math> do algoritmo de Wolff (um algoritmo de clusterização) é <math>z = 0.25 \pm 0.001</math> [6].
 
O motivo do tempo grande do algoritmo de Metropolis é a divergência do tamanho de correlação <math>\xi</math> próximo da temperatura crítica. Ao se aproximar de <math>T_c</math>, grandes regiões se formam onde todos os spins estão alinhados, e é demorado para que o algoritmo inverta essas regiões, dado que ele inverte os spins sítio por sítio.
 
Algoritmos de cluster, como o de Wolff, fazem uso da técnica de clusterização. Com isso, os algoritmos encontram agrupam spins alinhados em clusters que apontam para a mesma direção e invertem os spins desse cluster ao mesmo tempo. Algoritmos de clusterização permitem uma exploração mais efetivo do espaço de fase próximo da temperatura crítica por serem mais eficientes e de precisarem de menos iterações para terem medidas precisas.
 
=== Balanço Detalhado ===
=== Balanço Detalhado ===
Para respeitarmos o Balanço Detalhado, precisamos que a mudança da rede de um estado $<math>\nu</math> para um estado <math>\mu</math> ocorra com a mesma probabilidade da mudança de um estado <math>\mu</math> para <math>\nu</math>, denotamos essa mudança por: <math>A(\mu \to \nu) = A(\nu \to \mu)</math>, com <math>A(x \to y)</math> sendo a razão de aceitação da mudança de um estado <math>x</math> para um estado <math>y</math>.
Para respeitarmos o Balanço Detalhado, precisamos que a mudança da rede de um estado $<math>\nu</math> para um estado <math>\mu</math> ocorra com a mesma probabilidade da mudança de um estado <math>\mu</math> para <math>\nu</math>, denotamos essa mudança por: <math>A(\mu \to \nu) = A(\nu \to \mu)</math>, com <math>A(x \to y)</math> sendo a razão de aceitação da mudança de um estado <math>x</math> para um estado <math>y</math>.
Linha 15: Linha 47:
\frac{(1-P_{add})^m A(\mu \to \nu)}{(1-P_{add})^n A(\nu \to \mu) } = e^{-\beta(E_{\nu} - E_{\mu})} = (1-P_{add})^{m-n}\frac{A(\mu \to \nu)}{A(\nu \to \mu)}</math>, tal que,  
\frac{(1-P_{add})^m A(\mu \to \nu)}{(1-P_{add})^n A(\nu \to \mu) } = e^{-\beta(E_{\nu} - E_{\mu})} = (1-P_{add})^{m-n}\frac{A(\mu \to \nu)}{A(\nu \to \mu)}</math>, tal que,  
<math>\frac{A(\mu \to \nu)}{A(\nu \to \mu)} = \big[e^{2\beta J}(1-P_{add})\big]^{n-m}\;\;\;\; \Longrightarrow P_{add} = 1-e^{-2\beta J} \Longrightarrow \frac{(1-P_{add})^m A(\mu \to \nu)}{(1-P_{add})^n A(\nu \to \mu) }=1 </math>
<math>\frac{A(\mu \to \nu)}{A(\nu \to \mu)} = \big[e^{2\beta J}(1-P_{add})\big]^{n-m}\;\;\;\; \Longrightarrow P_{add} = 1-e^{-2\beta J} \Longrightarrow \frac{(1-P_{add})^m A(\mu \to \nu)}{(1-P_{add})^n A(\nu \to \mu) }=1 </math>
== Algoritmo de Wolf ==
== Algoritmo de Wolf ==


=== Dinâmica do Algoritmo ===
=== Dinâmica do Algoritmo ===
O algoritmo de Wolff baseia-se principalmente em 4 passos. são estes:
*'''1 - ''' Escolhe-se um sítio aleatório da rede;
*'''2 - '''Entre seus 4 vizinhos, se o spin do vizinho for igual ao do sítio inicial, adicionamos o vizinho ao cluster com probabilidade <math> P_{add} = 1-e^{2\beta J}</math>
*'''3 - ''' Para cada vizinho que foi adicionado ao cluster no passo anterior, repetimos o processo do passo '''2''' adicionando os vizinhos desse vizinho que possuem spin na mesma direção com a mesma probabilidade <math>P_{add}</math>. Faz-se isso para todos os sítios que são adicionados ao cluster.
*'''4 - ''' Quando todos os vizinhos de todos os sítios adicionados ao cluster tiveram ao menos uma “chance” de serem adicionados ao cluster, ''flipamos'' o cluster.
{| class="wikitable" style="text-align: center;"
{| class="wikitable" style="text-align: center;"
!colspan="2"|Dinâmica do algoritmo.
!colspan="2"|Dinâmica do algoritmo.
Linha 24: Linha 65:
|-
|-
|}
|}
== Simulações ==
=== Animações ===
{| class="wikitable" style="text-align: center;"
!colspan="3"|Animações do algoritmo de Wolff em função da Temperatura <math>T</math>.
|-
|[[Arquivo:TC-.gif|thumb|upright=4|none|alt=Alt text|Simulação para temperatura abaixo da temperatura crítica <math>T_c</math>.|550px]]
|[[Arquivo:hTC.gif|thumb|upright=4|none|alt=Alt text|Simulação na temperatura crítica <math>T_c</math>.|550px]]
|[[Arquivo:TC+.gif|thumb|upright=4|none|alt=Alt text|Simulação para tempetura acima da temperatura crítica <math>T_c</math>.|550px]]
|-
|}
== Propriedades do Algoritmo de Wolff ==
===  <math>P_{add}\;= \;1 - e^{-2\beta J} </math> ===
Nas animações acima, pode-se perceber que a temperatura tem papel importante na dinâmica apresentada em decorrência da forma com a qual está relacionada a probabilidade <math>P_{add}</math>, como podemos ver o gráfico a seguir:
{| class="wikitable" style="text-align: center;"
!colspan="1"|Probabilidade em função da temperatura.
|-
|[[Arquivo:Prob.jpeg|thumb|upright=4|none|alt=Alt text|Gráfico da probabilidade de aceitação <math>P_{add}</math> em função de <math>T</math>|800px]]
|-
|}
Neste gráfico temos a probabilidade de um spin que possui a mesma orientação que o sítio inicial escolhido ser aceito e adicionado ao cluster em função da temperatura da rede. É de se esperar que conforme a temperatura aumente a probabilidade do spin ser adicionado ao cluster diminua e para temperaturas mais baixas espera-se o contrário. Com base nisso, podemos formular a ideia do tamanho médio dos cluster (<math>C_s</math>) que é invertido durante os passos de Monte Carlo em função da temperatura e associar este tamanho com a fração representada por este na rede.
===  Fração do Tamanho dos Clusters (<math>C_s</math>) ===
No gráfico abaixo podemos perceber a mesma natureza que foi observados nas animações desenvolvidas, já que a fração do tamanho dos cluster diminui conforme a temperatura aumenta, ou seja, com a temperatura alta os clusters são menores e por isso representam uma fração menor e para temperatura acima de 3J essa fração é quase zero. Já para temperaturas mais baixas, essa fração aproxima-se de 1 o que significa que grande parte da rede, ou praticamente toda a rede, está sendo invertida em cada passo; exatamente o que observamos na animação para T=1.8J.
{| class="wikitable" style="text-align: center;"
!colspan="1"|Gráfico de <math>C_s</math>.
|-
|[[Arquivo:FCs.jpeg|thumb|upright=4|none|alt=Alt text|Gráfico de <math>C_s</math> em função de <math>T</math>|800px]]
|-
|}
===  Série Temporal para a medida de magnetização ===
{| class="wikitable" style="text-align: center;"
!colspan="1"|Série Temporal da magnetização.
|-
|[[Arquivo:STmag.jpeg|thumb|upright=4|none|alt=Alt text|Gráfico da série temporal da medida de magnetização comparando os algoritmos|800px]]
|-
|}
Podemos observar na figura acima medidas da magnetização usando o algoritmo de Wolff e o algoritmo de Metropolis para um sistema Ising 2D de mesmo tamanho (16x16) na temperatura crítica (<math>T_c=2.269J</math>). Nota-se que o algoritmo de Wolff explora o espaço de fase ao redor dessa temperatura em muito menos passos que o algoritmo de Metropolis, sendo mais eficiente para se obter medidas precisas ao redor dessa região.
Na figura abaixo podemos observar esse mesmo sistema para um número menor de passos. É possível notar que para que o algoritmo de Metropolis inverta os clusters de spins alinhados a fim de chegar nos mesmos limites dos valores de magnetização há uma demora muito maior de tempo, que se deve à sua dinâmica de single spin flip. Nesse caso, enquanto Wolff já explora o espaço de fase ao redor de T_c em menos de 100 passos, Metropolis precisa de pelo menos 600 passos.
Esse comportamento é o que esperamos dado a desaceleração crítica (critical slowing down), onde a medida que o sistema aumenta de tamanho se torna mais difícil de gerar configurações estatisticamente independentes [3]. Os clusters do algoritmo de Wolff mitigam esse efeito, sendo um sistema muito eficiente para eliminar correlações não locais.
{| class="wikitable" style="text-align: center;"
!colspan="1"|Série Temporal da magnetização até 1000 passos.
|-
|[[Arquivo:STmagShort.jpeg|thumb|upright=4|none|alt=Alt text|Gráfico da série temporal da medida de magnetização comparando os algoritmos nos primeiros 1000 passos|800px]]
|-
|}
== Códigos Fonte ==
=== Função da Dinâmica de Clusterização ===
<source lang=Py>
def cluster_din(sitio):
    stack = []
    oldspin = s[sitio]
    newspin = (-1)*s[sitio]
    s[sitio] = newspin
    sp=1
    stack.append(sitio)
   
    while (sp):
        sp = sp-1
        atual = stack[sp]
        stack.pop()       
   
        for j in range(4):
            nn=viz[atual][j]
            if s[nn] == oldspin: #IF da orientação do vizinho
            rfloat1 = rng.random()
            if (rfloat1<prob) : #IF da inclusão no cluster
                stack.append(nn)
                sp = sp+1
                s[nn] = newspin
    return
</source>
=== Função do Cálculo da Magnetização ===
<source lang=Py>
def cluster_din_mag(sitio, mag):
    stack = []
    oldspin = s[sitio]
    newspin = (-1)*s[sitio]
    s[sitio] = newspin
    mag = mag +2*s[sitio]
    sp=1
    stack.append(sitio)
   
    while (sp):
        sp = sp-1
        atual = stack[sp]
        stack.pop()       
   
        for j in range(4):
            nn=viz[atual][j]
            if s[nn] == oldspin: 
            rfloat1 = rng.random()
            if (rfloat1<prob) : #IF da inclusão no buffer
                stack.append(nn)
                sp = sp+1
                s[nn] = newspin
                mag = mag +2*s[nn]
    return mag
</source>
== Conclusão ==
Conclui-se então que os resultados obtidos com o códigos produzidos estão, de certa forma, de acordo com o esperado e fez-se possível elucidar as diferenças entre as duas dinâmicas dos algoritmos (Metropolis e Wolff) mostrando os pontos positivos do algoritmo de Wolff e as razões pelas quais se sai melhor na geração de dados estatisticamente independentes do modelo de Ising 2D. Todos os códigos, imagens e gifs gerados para esta apresentação estão disponíveis em: https://github.com/mgteus/MonteCarlo.
== Referências ==
[1] M. E. J. Newman, G. T. Barkema, "Monte Carlo Methods in Statistical Physics". Oxford University Press Inc., New York, 1999.
[2] Materias da disciplina disponíveis em: <https://moodle.ufrgs.br/course/view.php?id=80767>
[3] E. Luijten, “Introduction to Cluster Monte Carlo Algorithms” <http://csml.northwestern.edu/resources/Reprints/lnp_color.pdf>
[4] <https://fiscomp.if.ufrgs.br/index.php/Ising_2D>
[5] Nightingale and Blöte (1996).
[6] Coddington e Baillie (1992).

Edição atual tal como às 17h32min de 13 de outubro de 2021

PÁGINA EM CONSTRUÇÃO

Clusterização do Modelo de Ising

O modelo de Ising é definido como uma malha de tamanho L, quadrada quando em duas dimensões e cúbica quando em três dimensões, onde cada vértice apresenta um componente de spin de magnitude fixa que pode apontar para cima ou para baixo (+1 ou -1, respectivamente). O sistema pode ser descrito pelo seguinte hamiltoniano:

onde representa o valor do spin e a soma é feita sobre os pares de vértices próximas que são conectadas com um acoplamento ferromagnético de força .

Para um modelo de Ising bidimensional (o tipo que consideramos) é possível calcular [1] sua temperatura crítica exata como:

Acima dessa temperatura o sistema está na ‘’’fase paramagnética‘’’, onde a magnetização média é nula, e abaixo dessa temperatura o sistema está na fase ‘’’fase ferromagnética’’’, onde a maioria dos spins se alinham e a magnetização se torna não-nula. Ao estudar o modelo de Ising em geral temos maior interesse no comportamento do sistema perto de , onde o sistema forma grupos grandes de spins para cima ou para baixo. Esses grupos contribuem muito para a energia do sistema, causando muita flutuação quando invertem.

O algoritmo de Metropolis é um ótimo algoritmo para realizar simulações do modelo de Ising [1]. Porém, sua dinâmica de flip único é ineficiente especialmente quando próxima da temperatura crítica do sistema. As imprecisões estatísticas de quantidades como magnetização e energia interna do sistema aumentam quando próximo da temperatura crítica. Assim, quando esses grandes grupos de spins alinhados (clusters) invertem, há grandes imprecisões. Essa imprecisão aumenta com o tamanho das flutuações, mas diminui com o número de medidas feitas na simulação, então para se estudar a região perto de de modo mais preciso é necessário que a simulação aconteça por mais tempo. Porém, uma outra fraqueza do algoritmo de Metropolis é seu tempo de correlação grande ao redor da temperatura crítica. Isso significa que o número de medidas de uma simulação é pequena, então para diminuir as imprecisões estatísticas causadas pelas poucas medidas é necessário rodar o algoritmo por mais tempo.

Uma das propriedades do modelo de Ising é o fato de flutuações grandes gerarem medidas mais imprecisas. Porém, o tempo de correlação e o modo como ele se comporta próximo a é uma propriedade do algoritmo utilizado para estudar o sistema, e então é algo que pode ser otimizado.

Expoentes Críticos

Para estudar mais sobre a eficiência dos algoritmos no modelo de Ising podemos definir a temperatura reduzida como:

Essa grandeza indica o quão distante estamos da temperatura crítica , de modo que para estamos em . A partir disso, e sabendo que indica a largura médio dos clusters, temos que a expressão demonstra a divergência da largura de correlação (largura dos clusters). Se tratando do tempo, definimos como o tempo de correlação da simulação, medido em passos de Monte Carlo por sítio da rede. O expoente , chamado de expoente dinâmico, é um modo de quantificar a diferença de tempo que acontece devido à divergência. Um valor grande de simboliza que fica grande, por exemplo, fazendo uma simulação mais demorada e menos precisa quando próximo de .

Combinando as duas equações vistas, podemos escrever que . Essa relação indica que o tempo de correlação aumenta com o tamanho típico dos clusters. Considerando um sistema de tamanho finito porém (os tipos de sistema que simulamos), o valor máximo de vai ser o tamanho do sistema (e.g. um sistema x tem ). Podemos assim concluir que .

Sabendo a temperatura crítica do sistema (para Ising 2D, é possível usar a relação para medir por meio de simulações onde a temperatura do sistema é igual à temperatura crítica para vários tamanhos diferentes de , plotando versus em escala logarítmica. A inclinação da reta que liga todos esses pontos nos dá o valor de .

Por meio desse método, temos que o do algoritmo de Metropolis é [5] e o do algoritmo de Wolff (um algoritmo de clusterização) é [6].

O motivo do tempo grande do algoritmo de Metropolis é a divergência do tamanho de correlação próximo da temperatura crítica. Ao se aproximar de , grandes regiões se formam onde todos os spins estão alinhados, e é demorado para que o algoritmo inverta essas regiões, dado que ele inverte os spins sítio por sítio.

Algoritmos de cluster, como o de Wolff, fazem uso da técnica de clusterização. Com isso, os algoritmos encontram agrupam spins alinhados em clusters que apontam para a mesma direção e invertem os spins desse cluster ao mesmo tempo. Algoritmos de clusterização permitem uma exploração mais efetivo do espaço de fase próximo da temperatura crítica por serem mais eficientes e de precisarem de menos iterações para terem medidas precisas.

Balanço Detalhado

Para respeitarmos o Balanço Detalhado, precisamos que a mudança da rede de um estado $ para um estado ocorra com a mesma probabilidade da mudança de um estado para , denotamos essa mudança por: , com sendo a razão de aceitação da mudança de um estado para um estado .

Supondo que estamos mudando de um estado para outro estado , temos que a diferença de energia entre esses dois é resultado da quebra das ligações entre pares de spins orientados na mesma direção que não foram adicionados ao cluster, já que, não há uma garantia que a ida de quebre a mesma quantidade de ligações que a volta de . A probabilidade de não adicionarmos um spin vizinho ao cluster é dada por: ; uma vez que é a probabilidade de incluir esse spin no cluster.

Supondo que existam ligações a serem quebradas na ida de , a probabilidade desse evento é dada por . Porém, o mesmo pode não valer para a volta de , em razão disso, precisamos analisar o caso em que não há o mesmo número de ligações a serem quebradas na volta e então a probabilidade será dada por com sendo o número de ligações a serem quebradas de .

Consideramos agora que e sejam as energias associadas aos estados e , respectivamente, temos que: a cada ligações que são quebradas de a energia aumenta com e para cada novas ligações geradas de a energia diminui com . Pode-se escrever então que a diferença de energia entre e é dada por:

Seguindo a definição do Balanço Detalhado e impondo que o Processo Markoviano dessas mudanças de estados descritas acima respeite a Distribuição de Boltzmann, precisamos que: , tal que,

Algoritmo de Wolf

Dinâmica do Algoritmo

O algoritmo de Wolff baseia-se principalmente em 4 passos. são estes:

  • 1 - Escolhe-se um sítio aleatório da rede;
  • 2 - Entre seus 4 vizinhos, se o spin do vizinho for igual ao do sítio inicial, adicionamos o vizinho ao cluster com probabilidade
  • 3 - Para cada vizinho que foi adicionado ao cluster no passo anterior, repetimos o processo do passo 2 adicionando os vizinhos desse vizinho que possuem spin na mesma direção com a mesma probabilidade . Faz-se isso para todos os sítios que são adicionados ao cluster.
  • 4 - Quando todos os vizinhos de todos os sítios adicionados ao cluster tiveram ao menos uma “chance” de serem adicionados ao cluster, flipamos o cluster.


Dinâmica do algoritmo.
Alt text
Demonstração da dinâmica de clusterização do algoritmo na temperatura crítica .

Simulações

Animações

Animações do algoritmo de Wolff em função da Temperatura .
Alt text
Simulação para temperatura abaixo da temperatura crítica .
Alt text
Simulação na temperatura crítica .
Alt text
Simulação para tempetura acima da temperatura crítica .

Propriedades do Algoritmo de Wolff

Nas animações acima, pode-se perceber que a temperatura tem papel importante na dinâmica apresentada em decorrência da forma com a qual está relacionada a probabilidade , como podemos ver o gráfico a seguir:

Probabilidade em função da temperatura.
Alt text
Gráfico da probabilidade de aceitação em função de

Neste gráfico temos a probabilidade de um spin que possui a mesma orientação que o sítio inicial escolhido ser aceito e adicionado ao cluster em função da temperatura da rede. É de se esperar que conforme a temperatura aumente a probabilidade do spin ser adicionado ao cluster diminua e para temperaturas mais baixas espera-se o contrário. Com base nisso, podemos formular a ideia do tamanho médio dos cluster () que é invertido durante os passos de Monte Carlo em função da temperatura e associar este tamanho com a fração representada por este na rede.


Fração do Tamanho dos Clusters ()

No gráfico abaixo podemos perceber a mesma natureza que foi observados nas animações desenvolvidas, já que a fração do tamanho dos cluster diminui conforme a temperatura aumenta, ou seja, com a temperatura alta os clusters são menores e por isso representam uma fração menor e para temperatura acima de 3J essa fração é quase zero. Já para temperaturas mais baixas, essa fração aproxima-se de 1 o que significa que grande parte da rede, ou praticamente toda a rede, está sendo invertida em cada passo; exatamente o que observamos na animação para T=1.8J.

Gráfico de .
Alt text
Gráfico de em função de

Série Temporal para a medida de magnetização

Série Temporal da magnetização.
Alt text
Gráfico da série temporal da medida de magnetização comparando os algoritmos

Podemos observar na figura acima medidas da magnetização usando o algoritmo de Wolff e o algoritmo de Metropolis para um sistema Ising 2D de mesmo tamanho (16x16) na temperatura crítica (). Nota-se que o algoritmo de Wolff explora o espaço de fase ao redor dessa temperatura em muito menos passos que o algoritmo de Metropolis, sendo mais eficiente para se obter medidas precisas ao redor dessa região.

Na figura abaixo podemos observar esse mesmo sistema para um número menor de passos. É possível notar que para que o algoritmo de Metropolis inverta os clusters de spins alinhados a fim de chegar nos mesmos limites dos valores de magnetização há uma demora muito maior de tempo, que se deve à sua dinâmica de single spin flip. Nesse caso, enquanto Wolff já explora o espaço de fase ao redor de T_c em menos de 100 passos, Metropolis precisa de pelo menos 600 passos.

Esse comportamento é o que esperamos dado a desaceleração crítica (critical slowing down), onde a medida que o sistema aumenta de tamanho se torna mais difícil de gerar configurações estatisticamente independentes [3]. Os clusters do algoritmo de Wolff mitigam esse efeito, sendo um sistema muito eficiente para eliminar correlações não locais.

Série Temporal da magnetização até 1000 passos.
Alt text
Gráfico da série temporal da medida de magnetização comparando os algoritmos nos primeiros 1000 passos

Códigos Fonte

Função da Dinâmica de Clusterização

def cluster_din(sitio):
    stack = []
    oldspin = s[sitio]
    newspin = (-1)*s[sitio]
    s[sitio] = newspin
    sp=1
    stack.append(sitio)
    
    while (sp):
        sp = sp-1
        atual = stack[sp]
        stack.pop()        
    
        for j in range(4):
            nn=viz[atual][j]
            if s[nn] == oldspin: #IF da orientação do vizinho
             rfloat1 = rng.random()
             if (rfloat1<prob) : #IF da inclusão no cluster
                 stack.append(nn)
                 sp = sp+1
                 s[nn] = newspin
    return


Função do Cálculo da Magnetização

def cluster_din_mag(sitio, mag):
    stack = []
    oldspin = s[sitio]
    newspin = (-1)*s[sitio]
    s[sitio] = newspin
    mag = mag +2*s[sitio]
    sp=1
    stack.append(sitio)
    
    while (sp):
        sp = sp-1
        atual = stack[sp]
        stack.pop()        
    
        for j in range(4):
            nn=viz[atual][j]
            if s[nn] == oldspin:   
             rfloat1 = rng.random()
             if (rfloat1<prob) : #IF da inclusão no buffer
                 stack.append(nn)
                 sp = sp+1
                 s[nn] = newspin
                 mag = mag +2*s[nn]
    return mag

Conclusão

Conclui-se então que os resultados obtidos com o códigos produzidos estão, de certa forma, de acordo com o esperado e fez-se possível elucidar as diferenças entre as duas dinâmicas dos algoritmos (Metropolis e Wolff) mostrando os pontos positivos do algoritmo de Wolff e as razões pelas quais se sai melhor na geração de dados estatisticamente independentes do modelo de Ising 2D. Todos os códigos, imagens e gifs gerados para esta apresentação estão disponíveis em: https://github.com/mgteus/MonteCarlo.

Referências

[1] M. E. J. Newman, G. T. Barkema, "Monte Carlo Methods in Statistical Physics". Oxford University Press Inc., New York, 1999.

[2] Materias da disciplina disponíveis em: <https://moodle.ufrgs.br/course/view.php?id=80767>

[3] E. Luijten, “Introduction to Cluster Monte Carlo Algorithms” <http://csml.northwestern.edu/resources/Reprints/lnp_color.pdf>

[4] <https://fiscomp.if.ufrgs.br/index.php/Ising_2D>

[5] Nightingale and Blöte (1996).

[6] Coddington e Baillie (1992).