Clusterização

De Física Computacional
Revisão de 18h14min de 28 de maio de 2021 por Mtdaastro (discussão | contribs) (teoria e tal)
Ir para navegação Ir para pesquisar

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 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 flipam.

O algoritmo de Metropolis é um ótimo algoritmo para realizar simulações do modelo de Ising. 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) flipam, 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 é e o do algoritmo de Wolff (um algoritmo de clusterização) é .

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 flipe essas regiões, dado que ele flipa 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 flipam 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 crpitica .

Obs: Nossos gifs ficaram com mais de 2mb, limite da wiki, estamos refazendo...



Propriedades do Algoritmo de Wolff

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


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

Referências