<?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=Mtdaastro</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=Mtdaastro"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Mtdaastro"/>
	<updated>2026-06-03T19:58:21Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Clusteriza%C3%A7%C3%A3o&amp;diff=5476</id>
		<title>Clusterização</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Clusteriza%C3%A7%C3%A3o&amp;diff=5476"/>
		<updated>2021-05-28T21:14:22Z</updated>

		<summary type="html">&lt;p&gt;Mtdaastro: teoria e tal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;PÁGINA EM CONSTRUÇÃO&#039;&#039;&#039;&lt;br /&gt;
==  Clusterização do Modelo de Ising ==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_{Ising} = -J \sum_{\langle ij \rangle} s_i s_j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;J &amp;gt; 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Para um modelo de Ising bidimensional (o tipo que consideramos) é possível calcular sua temperatura crítica exata como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_c = \frac{2J}{\log(1 + \sqrt{2})} \simeq 2.269J&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, 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 &#039;&#039;flipam&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
O algoritmo de Metropolis é um ótimo algoritmo para realizar simulações do modelo de Ising. Porém, sua dinâmica de &#039;&#039;flip&#039;&#039; ú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) &#039;&#039;flipam&#039;&#039;, 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 &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt; é uma propriedade do algoritmo utilizado para estudar o sistema, e então é algo que pode ser otimizado.&lt;br /&gt;
&lt;br /&gt;
=== Expoentes Críticos ===&lt;br /&gt;
Para estudar mais sobre a eficiência dos algoritmos no modelo de Ising podemos definir a temperatura reduzida como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;t = \frac{T - T_c}{T_c}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa grandeza indica o quão distante estamos da temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, de modo que para &amp;lt;math&amp;gt;t=0&amp;lt;/math&amp;gt; estamos em &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;. A partir disso, e sabendo que &amp;lt;math&amp;gt;\xi&amp;lt;/math&amp;gt; indica a largura médio dos clusters, temos que a expressão &amp;lt;math&amp;gt;\xi \sim |t|^{- \nu}&amp;lt;/math&amp;gt; demonstra a divergência da largura de correlação (largura dos clusters). Se tratando do tempo, definimos &amp;lt;math&amp;gt;\tau \sim |t|^{-z \nu}&amp;lt;/math&amp;gt; como o tempo de correlação da simulação, medido em passos de Monte Carlo por sítio da rede. O expoente &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, chamado de expoente dinâmico, é um modo de quantificar a diferença de tempo que acontece devido à divergência. Um valor grande de &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; simboliza que &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; fica grande, por exemplo, fazendo uma simulação mais demorada e menos precisa quando próximo de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Combinando as duas equações vistas, podemos escrever que &amp;lt;math&amp;gt;\tau \sim \xi^z&amp;lt;/math&amp;gt;. 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 &amp;lt;math&amp;gt;\xi&amp;lt;/math&amp;gt; vai ser o tamanho &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; do sistema (e.g. um sistema &amp;lt;math&amp;gt;64&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;64&amp;lt;/math&amp;gt; tem &amp;lt;math&amp;gt;L=64&amp;lt;/math&amp;gt;). Podemos assim concluir que &amp;lt;math&amp;gt;\tau \sim L^z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sabendo a temperatura crítica do sistema (para Ising 2D, &amp;lt;math&amp;gt;T_c = 2.269J&amp;lt;/math&amp;gt; é possível usar a relação &amp;lt;math&amp;gt;\tau \sim L^z&amp;lt;/math&amp;gt; para medir &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; por meio de simulações onde a temperatura do sistema é igual à temperatura crítica para vários tamanhos diferentes de &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, plotando  &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; versus  &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; em escala logarítmica. A inclinação da reta que liga todos esses pontos nos dá o valor de  &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Por meio desse método, temos que  o &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; do algoritmo de Metropolis é &amp;lt;math&amp;gt;z = 2.1655 \pm 0.0012&amp;lt;/math&amp;gt; e o &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; do algoritmo de Wolff (um algoritmo de clusterização) é &amp;lt;math&amp;gt;z = 0.25 \pm 0.001&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
O motivo do tempo grande do algoritmo de Metropolis é a divergência do tamanho de correlação &amp;lt;math&amp;gt;\xi&amp;lt;/math&amp;gt; próximo da temperatura crítica. Ao se aproximar de &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;, grandes regiões se formam onde todos os spins estão alinhados, e é demorado para que o algoritmo &#039;&#039;flipe&#039;&#039; essas regiões, dado que ele &#039;&#039;flipa&#039;&#039; os spins sítio por sítio.&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;flipam&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
=== Balanço Detalhado ===&lt;br /&gt;
Para respeitarmos o Balanço Detalhado, precisamos que a mudança da rede de um estado $&amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; para um estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; ocorra com a mesma probabilidade da mudança de um estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; para &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt;, denotamos essa mudança por: &amp;lt;math&amp;gt;A(\mu \to \nu) = A(\nu \to \mu)&amp;lt;/math&amp;gt;, com &amp;lt;math&amp;gt;A(x \to y)&amp;lt;/math&amp;gt; sendo a razão de aceitação da mudança de um estado &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; para um estado &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Supondo que estamos mudando de um estado &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; para outro estado &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;, 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 &#039;&#039;ida&#039;&#039; de &amp;lt;math&amp;gt; \nu \to \mu &amp;lt;/math&amp;gt; quebre a mesma quantidade de ligações que a &#039;&#039;volta&#039;&#039; de &amp;lt;math&amp;gt; \mu \to \nu&amp;lt;/math&amp;gt;. A probabilidade de não adicionarmos um spin vizinho ao cluster é dada por: &amp;lt;math&amp;gt;1 - P_{add}&amp;lt;/math&amp;gt;; uma vez que &amp;lt;math&amp;gt;P_{add}&amp;lt;/math&amp;gt; é  a probabilidade de incluir esse spin no cluster.&lt;br /&gt;
&lt;br /&gt;
Supondo que existam &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ligações a serem quebradas na &#039;&#039;ida&#039;&#039; de &amp;lt;math&amp;gt;\nu \to \mu&amp;lt;/math&amp;gt;, a probabilidade desse evento é dada por &amp;lt;math&amp;gt;(1-P_{add})^m&amp;lt;/math&amp;gt;. Porém, o mesmo pode não valer para a &#039;&#039;volta&#039;&#039; de &amp;lt;math&amp;gt;\mu \to \nu&amp;lt;/math&amp;gt;, em razão disso, precisamos analisar o caso em que não há o mesmo número de ligações a serem quebradas na &#039;&#039;volta&#039;&#039; e então a probabilidade será dada por &amp;lt;math&amp;gt;(1-P_{add})^n&amp;lt;/math&amp;gt; com &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; sendo o número de ligações a serem quebradas de &amp;lt;math&amp;gt;\mu \to \nu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Consideramos agora que &amp;lt;math&amp;gt;E_{\nu}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;E_{\mu}&amp;lt;/math&amp;gt; sejam as energias associadas aos estados &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \mu &amp;lt;/math&amp;gt;, respectivamente, temos que: a cada &amp;lt;math&amp;gt; m&amp;lt;/math&amp;gt; ligações que são quebradas de &amp;lt;math&amp;gt;\mu \to \nu&amp;lt;/math&amp;gt; a energia aumenta com &amp;lt;math&amp;gt;+2J&amp;lt;/math&amp;gt; e para cada &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; novas ligações geradas de &amp;lt;math&amp;gt;\mu \to \nu&amp;lt;/math&amp;gt; a energia diminui com &amp;lt;math&amp;gt;-2J&amp;lt;/math&amp;gt;. Pode-se escrever então que a diferença de energia entre &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\nu&amp;lt;/math&amp;gt; é dada por: &amp;lt;math&amp;gt;E_{\nu} - E_{\mu} = 2mJ -2nJ = 2J(m-n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\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)}&amp;lt;/math&amp;gt;, tal que, &lt;br /&gt;
&amp;lt;math&amp;gt;\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 &amp;lt;/math&amp;gt;&lt;br /&gt;
== Algoritmo de Wolf ==&lt;br /&gt;
&lt;br /&gt;
=== Dinâmica do Algoritmo ===&lt;br /&gt;
O algoritmo de Wolff baseia-se principalmente em 4 passos. são estes:&lt;br /&gt;
*&#039;&#039;&#039;1 - &#039;&#039;&#039; Escolhe-se um sítio aleatório da rede;&lt;br /&gt;
*&#039;&#039;&#039;2 - &#039;&#039;&#039;Entre seus 4 vizinhos, se o spin do vizinho for igual ao do sítio inicial, adicionamos o vizinho ao cluster com probabilidade &amp;lt;math&amp;gt; P_{add} = 1-e^{2\beta J}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;3 - &#039;&#039;&#039; Para cada vizinho que foi adicionado ao cluster no passo anterior, repetimos o processo do passo &#039;&#039;&#039;2&#039;&#039;&#039; adicionando os vizinhos desse vizinho que possuem spin na mesma direção com a mesma probabilidade &amp;lt;math&amp;gt;P_{add}&amp;lt;/math&amp;gt;. Faz-se isso para todos os sítios que são adicionados ao cluster.&lt;br /&gt;
*&#039;&#039;&#039;4 - &#039;&#039;&#039; Quando todos os vizinhos de todos os sítios adicionados ao cluster tiveram ao menos uma “chance” de serem adicionados ao cluster, &#039;&#039;flipamos&#039;&#039; o cluster.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Dinâmica do algoritmo.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dinamica_wolff.gif|thumb|upright=4|none|alt=Alt text|Demonstração da dinâmica de clusterização do algoritmo na temperatura crítica &amp;lt;math&amp;gt;\; T_c = 2.269J &amp;lt;/math&amp;gt;.|1080px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Simulações ==&lt;br /&gt;
=== Animações ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Animações do algoritmo de Wolff em função da Temperatura &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:TC-.gif|thumb|upright=4|none|alt=Alt text|Simulação para temperatura abaixo da temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo:hTC.gif|thumb|upright=4|none|alt=Alt text|Simulação na temperatura crítica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|[[Arquivo:TC+.gif|thumb|upright=4|none|alt=Alt text|Simulação para tempetura acima da temperatura crpitica &amp;lt;math&amp;gt;T_c&amp;lt;/math&amp;gt;.|500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Obs: Nossos gifs ficaram com mais de 2mb, limite da wiki, estamos refazendo...&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Propriedades do Algoritmo de Wolff ==&lt;br /&gt;
===  &amp;lt;math&amp;gt;P_{add}\;= \;1 - e^{-2\beta J} &amp;lt;/math&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;1&amp;quot;|Probabilidade em função da temperatura.&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:Prob.jpeg|thumb|upright=4|none|alt=Alt text|Gráfico da probabilidade de aceitação &amp;lt;math&amp;gt;P_{add}&amp;lt;/math&amp;gt; em função de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;|300px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Códigos Fonte ==&lt;br /&gt;
=== Função da Dinâmica de Clusterização ===&lt;br /&gt;
&amp;lt;source lang=Py&amp;gt;&lt;br /&gt;
def cluster_din(sitio):&lt;br /&gt;
    stack = []&lt;br /&gt;
    oldspin = s[sitio]&lt;br /&gt;
    newspin = (-1)*s[sitio]&lt;br /&gt;
    s[sitio] = newspin&lt;br /&gt;
    sp=1&lt;br /&gt;
    stack.append(sitio)&lt;br /&gt;
    &lt;br /&gt;
    while (sp):&lt;br /&gt;
        sp = sp-1&lt;br /&gt;
        atual = stack[sp]&lt;br /&gt;
        stack.pop()        &lt;br /&gt;
    &lt;br /&gt;
        for j in range(4):&lt;br /&gt;
            nn=viz[atual][j]&lt;br /&gt;
            if s[nn] == oldspin: #IF da orientação do vizinho&lt;br /&gt;
             rfloat1 = rng.random()&lt;br /&gt;
             if (rfloat1&amp;lt;prob) : #IF da inclusão no cluster&lt;br /&gt;
                 stack.append(nn)&lt;br /&gt;
                 sp = sp+1&lt;br /&gt;
                 s[nn] = newspin&lt;br /&gt;
    return&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;/div&gt;</summary>
		<author><name>Mtdaastro</name></author>
	</entry>
</feed>