<?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=Andreburmeister</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=Andreburmeister"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php/Especial:Contribui%C3%A7%C3%B5es/Andreburmeister"/>
	<updated>2026-04-22T05:29:11Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9152</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9152"/>
		<updated>2022-10-20T06:20:27Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Histogramas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3. Não há dados para a simulação com temperatura 0.5 e densidade 0.9, pois houve um erro na simulação.&lt;br /&gt;
&lt;br /&gt;
=== Histogramas ===&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;3&amp;quot;| Histogramas de energia a partir do MCS 6000&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente os hstogramas de energia para densidade 0.1, 0.5 e 0.9 respectivamente. Os histogramas mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Para checar se a energia segue a distribuição de poisson, olhamos os histogramas. Todos parecem seguir a distribuição de poisson correta, exceto no caso da densidade 0.9 e temperatura 0.5, onde ocorreu algum erro.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperaturas 0.1 e 0.3, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para a temperatura 0.5 e densidades baixas (0.1 e 0.5) as partículas se encontram mais afastadas umas das outras, ou seja, numa fase gasosa. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão. A transição de fase faz sentido com a diferença maior entre a temperatura 0.3 e 0.5 que aparece no gráfico da energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9151</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9151"/>
		<updated>2022-10-20T06:19:38Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Histogramas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3. Não há dados para a simulação com temperatura 0.5 e densidade 0.9, pois houve um erro na simulação.&lt;br /&gt;
&lt;br /&gt;
=== Histogramas ===&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;3&amp;quot;| Histogramas de energia a partir do MCS 6000&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente os hstogramas de energia para densidade 0.1, 0.5 e 0.9 respectivamente. Os histogramas mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Para checar se a energia segue a distribuição de poisson, olhamos os histogramas. Todos parecem seguir a distribuição de poisson&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperaturas 0.1 e 0.3, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para a temperatura 0.5 e densidades baixas (0.1 e 0.5) as partículas se encontram mais afastadas umas das outras, ou seja, numa fase gasosa. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão. A transição de fase faz sentido com a diferença maior entre a temperatura 0.3 e 0.5 que aparece no gráfico da energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9150</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9150"/>
		<updated>2022-10-20T06:19:13Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Resultados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3. Não há dados para a simulação com temperatura 0.5 e densidade 0.9, pois houve um erro na simulação.&lt;br /&gt;
&lt;br /&gt;
=== Histogramas ===&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;3&amp;quot;| Histogramas de energia a partir do MCS 6000&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente os hstogramas de energia para densidade 0.1, 0.5 e 0.9 respectivamente. Os histogramas mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Para checar se a energia segue a distribuição de poisson, olhamos os histogramas.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperaturas 0.1 e 0.3, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para a temperatura 0.5 e densidades baixas (0.1 e 0.5) as partículas se encontram mais afastadas umas das outras, ou seja, numa fase gasosa. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão. A transição de fase faz sentido com a diferença maior entre a temperatura 0.3 e 0.5 que aparece no gráfico da energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.5_N64_d0.9_MCS10000.png&amp;diff=9149</id>
		<title>Arquivo:Energy histogram T0.5 N64 d0.9 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.5_N64_d0.9_MCS10000.png&amp;diff=9149"/>
		<updated>2022-10-20T06:18:03Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.5_N64_d0.5_MCS10000.png&amp;diff=9148</id>
		<title>Arquivo:Energy histogram T0.5 N64 d0.5 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.5_N64_d0.5_MCS10000.png&amp;diff=9148"/>
		<updated>2022-10-20T06:17:46Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.5_N64_d0.1_MCS10000.png&amp;diff=9147</id>
		<title>Arquivo:Energy histogram T0.5 N64 d0.1 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.5_N64_d0.1_MCS10000.png&amp;diff=9147"/>
		<updated>2022-10-20T06:17:30Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.3_N64_d0.5_MCS10000.png&amp;diff=9146</id>
		<title>Arquivo:Energy histogram T0.3 N64 d0.5 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.3_N64_d0.5_MCS10000.png&amp;diff=9146"/>
		<updated>2022-10-20T06:17:15Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.3_N64_d0.9_MCS10000.png&amp;diff=9145</id>
		<title>Arquivo:Energy histogram T0.3 N64 d0.9 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.3_N64_d0.9_MCS10000.png&amp;diff=9145"/>
		<updated>2022-10-20T06:15:41Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.3_N64_d0.1_MCS10000.png&amp;diff=9144</id>
		<title>Arquivo:Energy histogram T0.3 N64 d0.1 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.3_N64_d0.1_MCS10000.png&amp;diff=9144"/>
		<updated>2022-10-20T06:14:30Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.1_N64_d0.9_MCS10000.png&amp;diff=9143</id>
		<title>Arquivo:Energy histogram T0.1 N64 d0.9 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.1_N64_d0.9_MCS10000.png&amp;diff=9143"/>
		<updated>2022-10-20T06:14:16Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.1_N64_d0.5_MCS10000.png&amp;diff=9142</id>
		<title>Arquivo:Energy histogram T0.1 N64 d0.5 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.1_N64_d0.5_MCS10000.png&amp;diff=9142"/>
		<updated>2022-10-20T06:13:58Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.1_N64_d0.1_MCS10000.png&amp;diff=9141</id>
		<title>Arquivo:Energy histogram T0.1 N64 d0.1 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Energy_histogram_T0.1_N64_d0.1_MCS10000.png&amp;diff=9141"/>
		<updated>2022-10-20T06:13:14Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9140</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9140"/>
		<updated>2022-10-20T06:12:56Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Energia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3. Não há dados para a simulação com temperatura 0.5 e densidade 0.9, pois houve um erro na simulação.&lt;br /&gt;
&lt;br /&gt;
=== Histogramas ===&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;3&amp;quot;| Histogramas de energia a partir do MCS 6000&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_histogram_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Para checar se a energia segue a distribuição de poisson, olhamos os histogramas.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperaturas 0.1 e 0.3, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para a temperatura 0.5 e densidades baixas (0.1 e 0.5) as partículas se encontram mais afastadas umas das outras, ou seja, numa fase gasosa. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão. A transição de fase faz sentido com a diferença maior entre a temperatura 0.3 e 0.5 que aparece no gráfico da energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9139</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9139"/>
		<updated>2022-10-20T06:04:40Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Transição de Fase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3. Não há dados para a simulação com temperatura 0.5 e densidade 0.9, pois houve um erro na simulação.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperaturas 0.1 e 0.3, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para a temperatura 0.5 e densidades baixas (0.1 e 0.5) as partículas se encontram mais afastadas umas das outras, ou seja, numa fase gasosa. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão. A transição de fase faz sentido com a diferença maior entre a temperatura 0.3 e 0.5 que aparece no gráfico da energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9138</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9138"/>
		<updated>2022-10-20T06:03:33Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Transição de Fase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3. Não há dados para a simulação com temperatura 0.5 e densidade 0.9, pois houve um erro na simulação.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperaturas 0.1 e 0.3, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para a temperatura 0.5 e densidades baixas (0.1 e 0.5) as partículas se encontram mais afastadas umas das outras, ou seja, numa fase gasosa. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9137</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9137"/>
		<updated>2022-10-20T06:02:32Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Transição de Fase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3. Não há dados para a simulação com temperatura 0.5 e densidade 0.9, pois houve um erro na simulação.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperaturas 0.1 e 0.3, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para a temperatura 0.5 e densidades baixas (0.1 e 0.5) as partículas se encontram mais afastadas umas das outras. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9136</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9136"/>
		<updated>2022-10-20T06:01:00Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Transição de Fase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3. Não há dados para a simulação com temperatura 0.5 e densidade 0.9, pois houve um erro na simulação.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperaturas 0.1 e 0.3, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para a temperatura 0.5 e densidades baixas as partículas se encontram mais afastadas umas das outras. &lt;br /&gt;
&lt;br /&gt;
Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9135</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9135"/>
		<updated>2022-10-20T05:59:07Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Energia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3. Não há dados para a simulação com temperatura 0.5 e densidade 0.9, pois houve um erro na simulação.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9134</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9134"/>
		<updated>2022-10-20T05:58:27Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Energia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
Outra consideração importante é que, com densidades 0.1 e 0.3, há uma separação maior entre a energia com temperatura 0.3 e 0.5, do que há entre a energia com temperatura 0.1 e 0.3.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9133</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9133"/>
		<updated>2022-10-20T05:55:45Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Energia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]]. Já com menores densidades, as partículas se agrupam em grupos separados, que dificilmente se juntam. A separaçao desses grupos faz com que o potencial de um grupo no outro não seja tão negativo, aumentando a energia potencial total do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9132</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9132"/>
		<updated>2022-10-20T05:53:43Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Energia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia [[https://fiscomp.if.ufrgs.br/index.php/Arquivo:Raio_lennard_jones.png]].&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9131</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9131"/>
		<updated>2022-10-20T05:52:31Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Energia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Isso provavelmente acontece, pois com maior densidade as partículas ficam confinadas à configuração típica de menor energia[[Título do link]].&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9130</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9130"/>
		<updated>2022-10-20T05:50:00Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Energia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente. O gráfico a direita, com densidade 0.9 não possui dados para temperatura 0.5, pois ococrreu um erro na simulação.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9129</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9129"/>
		<updated>2022-10-20T05:48:01Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da coluna mais a esquerda, central e mais a direita mostram respectivamente a posição final das partículas para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos mais acima têm temperatura 0.1, os da segunda linha têm temperatura 0.3 e os da terceira têm temperatura 0.5.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9128</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9128"/>
		<updated>2022-10-20T05:43:51Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos mostram da esquerda para a direita: a energia potencial total do sistema (&amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9127</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9127"/>
		<updated>2022-10-20T05:41:22Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Escolha de \Delta L_{max} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&lt;br /&gt;
&lt;br /&gt;
O deslocamento máximo e a aceitação ao longo da simulação são mostrados na imagem abaixo:&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | Os gráficos da primeira linha, mostram da esquerda para a direita: o deslocamento máximo (&amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. Os gráficos da segunda linha, mostram da esquerda para a direita: a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) para densidade 0.1, 0.5 e 0.9 respectivamente. As linhas em azul, laranja e verde são as medidas feitas nas simulações com temperatura de 0.1, 0.3 e 0.5 respectivamente.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9126</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9126"/>
		<updated>2022-10-20T05:34:14Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Escolha de \Delta L_{max} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;\text{acc}&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9125</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9125"/>
		<updated>2022-10-20T05:33:53Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Escolha de \Delta L_{max} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;acc&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9124</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9124"/>
		<updated>2022-10-20T05:33:27Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Escolha de \Delta L_{max} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação (&amp;lt;math&amp;gt;acc&amp;lt;/math&amp;gt;) sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{acc}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9123</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9123"/>
		<updated>2022-10-20T05:32:16Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Escolha de \Delta L_{max} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. &lt;br /&gt;
&lt;br /&gt;
Se deslocamento máximo é muito grande, muitos movimentos acabam caindo próximos de outras partículas onde o potencial é muito alto, fazendo com que poucos movimentos sejam aceitos. Por outro lado, se o deslocamento é pequeno demais, muitos movimentos são aceitos (pequenos ajustes que fazem a energia ficar levemente menor), mas as partículas não exploram suficientemente as configurações possíveis. Portando, o valor de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; deve variar, dependendo da taxa de aceitação. &lt;br /&gt;
&lt;br /&gt;
Na simulação, foi usado o seguinte algoritmo: Se a taxa de aceitação sobe acima de 70%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{aceitação}}{0.7} &amp;gt; 1&amp;lt;/math&amp;gt; (para que a aceitação suba). Se a taxa de aceitação fica abaixo de 30%, &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt; é multiplicado por &amp;lt;math&amp;gt;\frac{\text{aceitação}}{0.3} &amp;lt; 1&amp;lt;/math&amp;gt; (para que a aceitação desça).&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9122</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9122"/>
		<updated>2022-10-20T05:20:55Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Escolha de \Delta L_{max} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo inicial de &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial. Mesmo assim, a depender da densidade e temperatura, pode ser que o deslocamento escolhido seja muito grande ou muito pequeno. Se deslocamento máximo não pode ser muito pequeno&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9121</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9121"/>
		<updated>2022-10-20T05:11:42Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Resultados */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi feita com 64 partículas, para temperaturas de 0.1, 0.3 e 0.5, densidades de 0.1, 0.5 e 0.9 e com 10 mil MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 64 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9120</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9120"/>
		<updated>2022-10-20T05:07:19Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Escolha de \Delta L_{max} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9119</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9119"/>
		<updated>2022-10-20T05:05:47Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Energia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\Delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9118</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9118"/>
		<updated>2022-10-20T05:05:35Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Energia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (&amp;lt;math&amp;gt;\delta U &amp;gt; 0&amp;lt;/math&amp;gt;) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9117</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9117"/>
		<updated>2022-10-20T05:04:23Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Escolha de \delta L_{max} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;\Delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (dU &amp;gt;0) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9116</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9116"/>
		<updated>2022-10-20T05:04:00Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Escolha de dL_{max} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;\delta L_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;\delta L_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (dU &amp;gt;0) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9115</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9115"/>
		<updated>2022-10-20T05:02:57Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* O Método de Monte Carlo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\Delta L} = \Delta \vec{x} + \Delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\Delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\Delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\Delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\Delta U) = min{(1,  e^{-\beta \Delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;dL_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (dU &amp;gt;0) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9114</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9114"/>
		<updated>2022-10-20T05:01:55Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* O Método de Monte Carlo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{\delta L} = \delta \vec{x} + \delta \vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;\delta x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\delta y&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\delta L_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{\delta L}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;\delta U = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(\delta U)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(\delta U) = min{(1,  e^{-\beta \delta U} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;dL_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (dU &amp;gt;0) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9113</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9113"/>
		<updated>2022-10-20T04:58:16Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Gráficos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{dL} = d\vec{x} + d\vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;dx&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dy&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{dL}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;dU = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(dU)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(dU) = min{(1,  e^{-\beta dU} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;dL_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (dU &amp;gt;0) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/N32/'&lt;br /&gt;
save_path = '/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9112</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9112"/>
		<updated>2022-10-20T04:57:07Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Gráficos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{dL} = d\vec{x} + d\vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;dx&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dy&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{dL}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;dU = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(dU)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(dU) = min{(1,  e^{-\beta dU} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;dL_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (dU &amp;gt;0) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/home/a_burmeister/AA_CADEIRAS_UFRGS/7-semestre/Monte Carlo/lennard_jones/colab/N32/'&lt;br /&gt;
save_path = '/home/a_burmeister/AA_CADEIRAS_UFRGS/7-semestre/Monte Carlo/lennard_jones/colab/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, dLmax, acceptance, circles=True, n_particles=64):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs, figsize=(4 * graphs, 4.5))&lt;br /&gt;
    fig.suptitle(&lt;br /&gt;
        f'T = {T}   N = {n_particles}   d = {densidade_round} \n dLmax = {round(dLmax, 2)}    acceptance = {acceptance}',&lt;br /&gt;
        fontsize=14)&lt;br /&gt;
    &lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            ax = axes&lt;br /&gt;
        else:&lt;br /&gt;
            ax = axes[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio / 2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                ax.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a * L, pos[k][1][i] + b * L], raio / 2, fill=False,&lt;br /&gt;
                                       edgecolor='black', alpha=0.25)&lt;br /&gt;
                        ax.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = ax.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio / 2&lt;br /&gt;
        ax.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid(visible=False)&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        ax.set_title(f'passo {k}')&lt;br /&gt;
        if graphs == 1:&lt;br /&gt;
            axes = ax&lt;br /&gt;
        else:&lt;br /&gt;
            axes[j] = ax&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=n_particles)&lt;br /&gt;
        acceptance = round(np.loadtxt(f'{path}acceptance{file_end}.txt')[-1], 2)&lt;br /&gt;
        dLmax = round(np.loadtxt(f'{path}dLmax{file_end}.txt')[-1], 2)&lt;br /&gt;
        &lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[len(pos) - 1], T=T, L=L, dLmax=dLmax, acceptance=acceptance, circles=True)&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy/ acceptance / dLmax graphs:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig_acc, ax_acc = plt.subplots(1, 1)&lt;br /&gt;
    fig_dLmax, ax_dLmax = plt.subplots(1, 1)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_acc.suptitle(titulo, fontsize=20)&lt;br /&gt;
    fig_dLmax.suptitle(titulo, fontsize=20)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        acc = np.loadtxt(f&amp;quot;{path}acceptance{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_acc.plot(np.arange(len(acc)), acc, label=f'T = {T}')&lt;br /&gt;
        dLmax = np.loadtxt(f&amp;quot;{path}dLmax{file_end}.txt&amp;quot;)&lt;br /&gt;
        ax_dLmax.plot(np.arange(len(dLmax)), dLmax, label=f'T = {T}')&lt;br /&gt;
        &lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(f'{titulo} \n dLmax = {round(dLmax[-1], 2)}    acceptance = {round(acc[-1], 2)}', fontsize=20)&lt;br /&gt;
        ax2.hist(energy[6000:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy', fontsize=16)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
        &lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U', fontsize=16)&lt;br /&gt;
    ax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    ax.legend(fontsize=16)&lt;br /&gt;
&lt;br /&gt;
    ax_acc.set_ylabel('acceptance', fontsize=16)&lt;br /&gt;
    ax_acc.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_acc.savefig(f&amp;quot;{save_path}acceptance_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_acc)&lt;br /&gt;
    &lt;br /&gt;
    ax_dLmax.set_ylabel('deslocamento máximo', fontsize=16)&lt;br /&gt;
    ax_dLmax.set_xlabel('tempo em MCS', fontsize=16)&lt;br /&gt;
    fig_dLmax.savefig(f&amp;quot;{save_path}dLmax_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig_dLmax)&lt;br /&gt;
    &lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
# plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9111</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9111"/>
		<updated>2022-10-20T04:55:32Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: /* Simulação */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{dL} = d\vec{x} + d\vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;dx&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dy&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{dL}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;dU = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(dU)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(dU) = min{(1,  e^{-\beta dU} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;dL_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (dU &amp;gt;0) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5*L:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(beta, n_particles, MCS, L, raio = 2 ** (1/6), time_check=2000):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # print(pos_particles)&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # dLmax:&lt;br /&gt;
    dLmax = 2 ** (-5/6)&lt;br /&gt;
    dLmax_arr = np.zeros(MCS + 1)&lt;br /&gt;
    dLmax_arr[0] = dLmax&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    t0 = time.time()&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            # print()&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # print(f'p = {p}')&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            # print(f'displacement = {displacement}')&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            # print(f'new_pos = {new_pos}')&lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
&lt;br /&gt;
        pos_MCS[m+1] = pos_particles&lt;br /&gt;
        energy_arr[m+1] = energy&lt;br /&gt;
        acceptance = accepted / (n_particles*(m + 1))&lt;br /&gt;
        acceptance_arr[m] = acceptance&lt;br /&gt;
        if m &amp;gt; 100:&lt;br /&gt;
            if acceptance &amp;lt; 0.3:&lt;br /&gt;
                dLmax = dLmax * (acceptance / 0.3)&lt;br /&gt;
            elif acceptance &amp;gt; 0.7:&lt;br /&gt;
                dLmax = np.min([dLmax * (acceptance / 0.7), 2*raio])&lt;br /&gt;
            dLmax_arr[m+1] = dLmax&lt;br /&gt;
        if (m!=0) and (m % time_check == 0):&lt;br /&gt;
            t1 = time.time()&lt;br /&gt;
            dt = round((t1 - t0) / 60, 1)&lt;br /&gt;
            min_to_go = round(dt * (MCS - m)/m, 1)&lt;br /&gt;
            print(f'{m} steps done in t = {dt}min, {MCS - m} steps (~{min_to_go}min)to go')&lt;br /&gt;
    return pos_MCS, energy_arr, acceptance_arr, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade, fixed_dLmax = False, dLmax=2 ** (-5/6)):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(f'L={L}')&lt;br /&gt;
    pos, energy, acceptance, dLmax_arr = main_loop(beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
&lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;acceptance_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               acceptance)&lt;br /&gt;
    &lt;br /&gt;
    # save acceptance:&lt;br /&gt;
    np.savetxt(f&amp;quot;dLmax_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}.txt&amp;quot;, &lt;br /&gt;
               dLmax_arr)&lt;br /&gt;
    &lt;br /&gt;
    return pos, energy, acceptance, dLmax_arr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
n_particles = 64&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
MCS = 10000&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance, dLmax_arr = save_data(n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance[-1]}')&lt;br /&gt;
        print(f'dLmax = {dLmax_arr[-1]}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/home/a_burmeister/AA_CADEIRAS_UFRGS/7-semestre/Monte Carlo/lennard_jones/colab/N32/'&lt;br /&gt;
save_path = '/home/a_burmeister/AA_CADEIRAS_UFRGS/7-semestre/Monte Carlo/lennard_jones/colab/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, circles=True, n_particles=32):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs)&lt;br /&gt;
    fig.suptitle(f'T = {T}   N = {n_particles}   d = {densidade_round}    dLmax = {round(dLmax, 2)}', fontsize=14)&lt;br /&gt;
&lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio/2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                axes.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a*L, pos[k][1][i] + b*L], raio/2, fill=False, edgecolor='black', alpha=0.25)&lt;br /&gt;
                        axes.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = axes.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio/2&lt;br /&gt;
        axes.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        axes.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        axes.grid(visible=False)&lt;br /&gt;
        axes.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        axes.set_title(f'passo {k}')&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5, 1.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
n_particles = 32&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=32)&lt;br /&gt;
&lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[pos.shape[0] - 1], T=T, L=L, circles=True)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy graph:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}    dLmax = {round(dLmax, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=14)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(titulo, fontsize=14)&lt;br /&gt;
        ax2.hist(energy[100:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy')&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U')&lt;br /&gt;
    ax.set_xlabel('tempo em MCS')&lt;br /&gt;
    ax.legend()&lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Animação&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        pos = open_pos(file_name, n_particles=32)&lt;br /&gt;
        fig, ax = plt.subplots(1,1, figsize=(5, 6))&lt;br /&gt;
        fig.suptitle(f'T = {T}   N = {n_particles}   d = {densidade_round} \n L = {round(L, 2)}     dLmax = {round(dLmax, 2)}',&lt;br /&gt;
                     fontsize=14)&lt;br /&gt;
        margem = raio&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid()&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        c = []&lt;br /&gt;
        for i in range(n_particles):&lt;br /&gt;
            c.append(plt.Circle([pos[0][0][i], pos[0][1][i]], raio, fill=False, color='lightgrey'))&lt;br /&gt;
            ax.add_patch(c[i])&lt;br /&gt;
        scatter_points = ax.scatter(pos[0][0], pos[0][1], s=1000)&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        def animate(i):&lt;br /&gt;
            for k in range(n_particles):&lt;br /&gt;
                c[k].center = (pos[i][0][k], pos[i][1][k])&lt;br /&gt;
            scatter_points.set_offsets(pos[i].T)&lt;br /&gt;
            return scatter_points&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        anim = FuncAnimation(fig, animate, interval = 10, frames = MCS)&lt;br /&gt;
        &lt;br /&gt;
        anim_file = f'animacao_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}.mp4'&lt;br /&gt;
        print(anim_file)&lt;br /&gt;
        anim.save(anim_file, writer = 'ffmpeg', fps = 20)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9110</id>
		<title>Potencial de Lennard-Jones</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Potencial_de_Lennard-Jones&amp;diff=9110"/>
		<updated>2022-10-20T04:35:54Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nome: '''André Bracht Burmeister'''&lt;br /&gt;
&lt;br /&gt;
Fluidos estão em todos os lugares e, portanto, estudá-los é muito importante. Como são objetos de estudo extremamente complicados, se fazem necessários modelos e simplificações.&lt;br /&gt;
Uma simplificação muito usada é a análise do sistema em duas dimensões apenas, excluindo a terceira dimensão espacial. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= O Modelo =&lt;br /&gt;
&lt;br /&gt;
Um fluido bidimensional pode ser modelado como &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; partículas em um plano com densidade &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt; (partículas por &amp;lt;math&amp;gt;\sigma^2&amp;lt;/math&amp;gt;). O plano é um quadrado de lado &amp;lt;math&amp;gt;L = \sqrt{\frac{N}{\rho}}&amp;lt;/math&amp;gt;. Para escolher a posição inicial de uma partícula, são escolhidas coordenadas &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; aleatórias entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== O Método de Monte Carlo ==&lt;br /&gt;
Para evoluir o sistema, usaremos caminhadas aletórias, escolhendo as partículas com o método de Monte Carlo[[https://fiscomp.if.ufrgs.br/index.php/Modelo_de_Potts_2D#M.C3.A9todo_de_Monte_Carlo]]. O método de Monte Carlo consiste em escolher uma partícula aleatoriamente entre as &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;. Então escolhemos aleatoriamente um deslocamento proposto para a partícula &amp;lt;math&amp;gt; \vec{dL} = d\vec{x} + d\vec{y} &amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;dx&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dy&amp;lt;/math&amp;gt; estão entre &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;. A partícula só é realmente deslocada em &amp;lt;math&amp;gt;\vec{dL}&amp;lt;/math&amp;gt; de acordo com o Algoritmo de Metropolis-Hasting.&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo de Metropolis-Hasting ===&lt;br /&gt;
&lt;br /&gt;
O Algoritmo de Metropolis-Hasting consiste em escolher se o movimento será ou não aceito usando a diferença de energia potencial entre o estado após o movimento e anterior ao movimento &amp;lt;math&amp;gt;dU = U(r_2) - U(r_1)&amp;lt;/math&amp;gt;. A probabilidade &amp;lt;math&amp;gt;P(dU)&amp;lt;/math&amp;gt; de aceitar o movimento é dada por:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;P(dU) = min{(1,  e^{-\beta dU} )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;\beta = \frac{1}{T \cdot k_B}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann.&lt;br /&gt;
&lt;br /&gt;
== O Potencial de Lennard Jones ==&lt;br /&gt;
&lt;br /&gt;
Para que o algoritmo funcione, precisamos então encontrar uma maneira de calcular a energia potencial de cada partícula. O potencial &amp;lt;math&amp;gt;U'&amp;lt;/math&amp;gt; que uma partícula causa na outra, pode ser aproximado a uma distribuição em termos da distância &amp;lt;math&amp;gt;r'&amp;lt;/math&amp;gt; entre elas:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U'(r') = 4 \epsilon \left [ \left ( \frac{\sigma}{r'} \right )^{12} - \left ( \frac{\sigma}{r'} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esse potencial é conhecido como o potencial de Lennard-Jones, primeiro apresentado por ele em seu artigo &amp;lt;ref&amp;gt; J E Lennard-Jones 1931 Proc. Phys. Soc. 43 461&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Unidades Reduzidas ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Raio_lennard_jones.png|300px|thumb|right|Configuração de menor energia entre três partículas. Os círculos têm raio &amp;lt;math&amp;gt;2^{-5/6}\sigma&amp;lt;/math&amp;gt;, metade da distância de menor potencial.]]&lt;br /&gt;
&lt;br /&gt;
Ao realizar a simulação computacionalmente, usar unidades do sistema internacional faria com que os números ficassem muito grandes ou muito pequenos, fazendo com que perdêssemos em precisão. Portanto, faz sentido que usemos unidades reduzidas em termos de &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; e a constante de Boltzmann &amp;lt;math&amp;gt; k_{B} &amp;lt;/math&amp;gt;. As unidades utilizadas foram:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! '''Grandeza'''&lt;br /&gt;
! '''Comprimento'''&lt;br /&gt;
! '''Temperatura'''&lt;br /&gt;
! '''Energia'''&lt;br /&gt;
! '''Densidade'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Unidade''' &lt;br /&gt;
| &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon/k_B&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;1 / \sigma^{3}&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Usando as novas unidades o potencial de Lennard-Jones fica:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt;U(r) = 4  \left [ \left ( \frac{1}{r} \right )^{12} - \left ( \frac{1}{r} \right )^{6} \right ]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O formato do potencial faz com que para distâncias grandes, a interação entre partículas seja muito pequena e, para distâncias muito pequenas, haja uma força de repulsão que tende ao infinito. Além disso, a região de potencial mínimo se encontra a &amp;lt;math&amp;gt;2^{1/6}\sigma \approx 1.12\sigma &amp;lt;/math&amp;gt; do centro da partícula. Ou seja, as partículas tendem a se organizar em uma configuração similar a da figura à direita, onde o raio dos círculos é &amp;lt;math&amp;gt;\frac{2^{1/6}\sigma}{2} = 2^{-5/6}\sigma \approx 0.56&amp;lt;/math&amp;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;1&amp;quot;|Potencial de Lennard-Jones com unidades reduzidas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:potencial_lennard_jones.png|1100px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Escolha de &amp;lt;math&amp;gt;dL_{max}&amp;lt;/math&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Foi escolhido um deslocamento máximo &amp;lt;math&amp;gt;dL_{max} = \frac{2^{1/6}}{2} = 2^{-5/6}&amp;lt;/math&amp;gt;, pois isso faz com que o deslocamento não seja maior que metade da distância ao mínimo do potencial.&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;3&amp;quot;| Deslocamento máximo e aceitação ao longo da simulação&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:dLmax_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:acceptance_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Resultados =&lt;br /&gt;
&lt;br /&gt;
A simulação foi rodada com 32 partículas, para temperaturas de 0.1, 0.3, 0.5 e 1.5 e densidades de 0.1, 0.5 e 0.9 e com 1000 MCS. Onde 1 MCS (monte carlo step) é o número de passos correspondente ao número de partículas (nesse caso, 1 MCS = 32 passos).&lt;br /&gt;
&lt;br /&gt;
== Energia ==&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;|Medidas de energia &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; a cada &amp;lt;math&amp;gt;MCS&amp;lt;/math&amp;gt; para diferentes densidades e temperaturas&lt;br /&gt;
|-|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:energy_graph_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Olhando para os gráficos de energia podemos notar uma grande diferença entre temperaturas e densidades. Claramente quanto maior a temperatura, maior a energia, o que é esperado. Além disso, quando maior a temperatura, aparentemente há uma maior variabilidade na energia, o que também é esperado, pois a temperatura maior, faz com que mais movimentos desfavoráveis (dU &amp;gt;0) sejam aceitos. &lt;br /&gt;
&lt;br /&gt;
Olhando para a densidade, fica claro, que quanto maior a densidade, menor a energia. Para densidade 0.1 e temperaturas baixas (0.5 e 1.5), a energia chega até a ficar positiva em alguns pontos, logo voltando a ficar zero ou menor. Isso provavelmente acontece, pois com menos densidade, os movimentos tendem a não cair pŕoximos do mínimo do potencial de uma partícula. Na verdade, como há muito espaço livre, tendem a ficar mais afastados, o que faz com que as vezes possam ficar a uma distância de &amp;lt;math&amp;gt;\approx 0.75&amp;lt;/math&amp;gt; de uma partícula (e não 0.56 como esperado). Assim é mais provável que possam dar saltos próximos do centro (para 0.4, por exemplo) e aumentar muito a energia do sistema.&lt;br /&gt;
&lt;br /&gt;
== Posição final das Partículas ==&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;3&amp;quot;|Posição das partículas ao fim da simulação com diferentes densidades e temperaturas&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.1_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.3_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.1_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.5_MCS10000.png|300px|center]]&lt;br /&gt;
|[[Arquivo:first_last_positions_T0.5_N64_d0.9_MCS10000.png|300px|center]]&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | LEGENDA CARALEO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transição de Fase ===&lt;br /&gt;
&lt;br /&gt;
Olhando para a posição das partículas, podemos ver claramente uma transição de fase. Com temperatura 0.1, para todas as densidades as partículas se encontram juntas, na configuração de menor energia, ou seja, numa fase líquida. Já para as temperaturas 0.5 e 1.5, e densidades baixas as partículas se encontram mais afastadas umas das outras. Para temperaturas de 0.3 podemos ver que para as densidades 0.1 e 0.5, algumas partículas se encontram juntas, na configuração de menor energia, e outras se encontram mais afastadas, o que indica que estamos perto da temperatura de transição de fase para essa densidade. Com densidade 0.9, isso não ocorre, pois as partículas são forçadas a continuarem juntas, por não terem espaço para se afastar. Esse caso seria o de maior pressão.&lt;br /&gt;
&lt;br /&gt;
A transição de fase também aparece no gráfico da energia. Se observarmos a temperatura 0.3, notamos que a energia média é instável fazendo movimentos no sentido de maior e menor energia.&lt;br /&gt;
&lt;br /&gt;
= Código =&lt;br /&gt;
&lt;br /&gt;
== Simulação ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;lennard_jones.ipynb&lt;br /&gt;
&lt;br /&gt;
Automatically generated by Colaboratory.&lt;br /&gt;
&lt;br /&gt;
Original file is located at&lt;br /&gt;
    https://colab.research.google.com/drive/1jSPjBz0RXXWLEAzf3zcHgdlQpzjyO_ni&lt;br /&gt;
&lt;br /&gt;
# Potencial de Lennard-Jones&lt;br /&gt;
# Monte Carlo no contínuo&lt;br /&gt;
&lt;br /&gt;
#### Delete variables and import packages&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;import sys&lt;br /&gt;
this = sys.modules[__name__]&lt;br /&gt;
for n in dir():&lt;br /&gt;
    if n[0]!='_': delattr(this, n)&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;## Simulação:&lt;br /&gt;
&lt;br /&gt;
### Definições Numéricas:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
densidade = 0.1 #(2 ** (2/3)) * (3 ** (-1/2))  # partícula(s) por sigma^2 (partículas por area)&lt;br /&gt;
densidade_round = round(densidade, 2)&lt;br /&gt;
n_particles = 64&lt;br /&gt;
L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
print(L)&lt;br /&gt;
dLmax = 0.1&lt;br /&gt;
MCS = 10000&lt;br /&gt;
eps = 1&lt;br /&gt;
T = .1&lt;br /&gt;
k = 1&lt;br /&gt;
beta = 1/(k*T)&lt;br /&gt;
raio = 2**(1/6)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Funcões:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def lennard_jones(r1, r2, L):  # r1 e r2 em unidades de sigma (na vdd seria r1/sig e r2/sig)&lt;br /&gt;
    dr = np.absolute(np.subtract(r2, r1))&lt;br /&gt;
    for i in np.arange(2):&lt;br /&gt;
        if dr[i] &amp;gt; 0.5:&lt;br /&gt;
            dr[i] = L - dr[i]&lt;br /&gt;
&lt;br /&gt;
    r2 = (dr[0] ** 2) + (dr[1] ** 2)&lt;br /&gt;
    sr2 = 1/r2&lt;br /&gt;
    return 4 * (((sr2) ** 6) - ((sr2) ** 3))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def initial_energy(pos_particles, n_particles, L):&lt;br /&gt;
    U0 = 0&lt;br /&gt;
    for xxx in range(n_particles - 1):&lt;br /&gt;
        for yyy in range(xxx+1, n_particles):&lt;br /&gt;
            U0 += lennard_jones(pos_particles[:, xxx], pos_particles[:, yyy], L=L)&lt;br /&gt;
    return U0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def energy_var(p, pos_particles, n_particles, L, new_pos=np.zeros(2)):&lt;br /&gt;
    U1 = 0&lt;br /&gt;
    U2 = 0&lt;br /&gt;
    for i in range(n_particles - 1):&lt;br /&gt;
        j = (i + p + 1) % n_particles  # j vai ser todas as partículas &lt;br /&gt;
        # exceto a partícula p (porque p interage com todas, menos com ela mesma)&lt;br /&gt;
        U1 += lennard_jones(pos_particles[:, j], pos_particles[:, p], L=L)&lt;br /&gt;
        U2 += lennard_jones(pos_particles[:, j], new_pos, L=L)&lt;br /&gt;
    return U2 - U1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main_loop(dLmax, beta, n_particles, MCS, L, acceptance_array=False, &lt;br /&gt;
              last_acceptance=False):&lt;br /&gt;
    &lt;br /&gt;
    pos_particles = L * np.random.random([2, n_particles])&lt;br /&gt;
    # Random positions:&lt;br /&gt;
    pos_MCS = np.zeros([MCS+1, 2, n_particles])&lt;br /&gt;
    pos_particles = pos_particles&lt;br /&gt;
    pos_MCS[0] = pos_particles&lt;br /&gt;
&lt;br /&gt;
    # Energy:&lt;br /&gt;
    energy_arr = np.zeros(MCS+1)&lt;br /&gt;
    energy = initial_energy(pos_particles, n_particles, L=L)&lt;br /&gt;
    energy_arr[0] = energy&lt;br /&gt;
&lt;br /&gt;
    # Acceptance:&lt;br /&gt;
    accepted = 0&lt;br /&gt;
    if acceptance_array:&lt;br /&gt;
        acceptance_arr = np.zeros(MCS)&lt;br /&gt;
&lt;br /&gt;
    # Main Loop:&lt;br /&gt;
    for m in range(MCS):&lt;br /&gt;
        for _ in range(n_particles):&lt;br /&gt;
            p = random.randint(0, n_particles - 1)&lt;br /&gt;
            # change position:&lt;br /&gt;
            displacement = dLmax * ((2 * np.random.random([2])) - 1)&lt;br /&gt;
            new_pos = pos_particles[:, p] + displacement&lt;br /&gt;
            for i in range(2):&lt;br /&gt;
                if new_pos[i] &amp;lt; 0:&lt;br /&gt;
                    new_pos[i] += L&lt;br /&gt;
                elif new_pos[i] &amp;gt; L:&lt;br /&gt;
                    new_pos[i] -= L &lt;br /&gt;
            dU = energy_var(p, pos_particles, n_particles, L, new_pos)&lt;br /&gt;
            if dU &amp;lt;= 0:&lt;br /&gt;
                pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                energy += dU&lt;br /&gt;
                accepted += 1&lt;br /&gt;
            else:&lt;br /&gt;
                if random.random() &amp;lt; np.exp(-beta * dU):&lt;br /&gt;
                    pos_particles[0][p] = new_pos[0]&lt;br /&gt;
                    pos_particles[1][p] = new_pos[1]&lt;br /&gt;
                    energy += dU&lt;br /&gt;
                    accepted += 1&lt;br /&gt;
        if not (acceptance_array):&lt;br /&gt;
            pos_MCS[m+1] = pos_particles&lt;br /&gt;
            energy_arr[m+1] = energy&lt;br /&gt;
&lt;br /&gt;
        if acceptance_array:&lt;br /&gt;
            acceptance_arr[m] = accepted / (n_particles*(m + 1))&lt;br /&gt;
    if acceptance_array:&lt;br /&gt;
        return acceptance_arr&lt;br /&gt;
    elif last_acceptance:&lt;br /&gt;
        return accepted / (n_particles*MCS)&lt;br /&gt;
    else:&lt;br /&gt;
        return pos_MCS, energy_arr, (accepted / (n_particles*(m + 1)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def save_data(dLmax=dLmax, n_particles=n_particles, MCS=MCS, T=T, densidade=densidade):&lt;br /&gt;
    beta = 1 / (k*T)&lt;br /&gt;
    L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
    print(L)&lt;br /&gt;
    pos, energy, acceptance = main_loop(dLmax=dLmax, beta=beta, n_particles=n_particles, &lt;br /&gt;
                                        MCS=MCS, L=L)&lt;br /&gt;
    &lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    # save positions:&lt;br /&gt;
    pos_reshaped = pos.reshape(pos.shape[0], -1)&lt;br /&gt;
    np.savetxt(f&amp;quot;positions_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}.txt&amp;quot;, &lt;br /&gt;
               pos_reshaped)&lt;br /&gt;
&lt;br /&gt;
    # save energy:&lt;br /&gt;
    np.savetxt(f&amp;quot;energy_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}.txt&amp;quot;, &lt;br /&gt;
               energy)&lt;br /&gt;
    return pos, energy, acceptance&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Rodar e salvar dados:&lt;br /&gt;
&lt;br /&gt;
#### Rodar uma vez:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
pos, energy, acceptance = save_data(dLmax=dLmax)&lt;br /&gt;
print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
print(acceptance)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Rodar para vários T e rô:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
n_particles = 32 &lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5, 1.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        pos, energy, acceptance = save_data(dLmax=dLmax, n_particles=n_particles, MCS=MCS, T=T, densidade=densidade)&lt;br /&gt;
        #print(f'dLmax={dLmax} \n beta={beta} \n n_particles={n_particles} \n MCS={MCS} \n\n pos[0]: \n {pos[0]}')&lt;br /&gt;
        print(f'acceptance = {acceptance}')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gráficos == &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
from matplotlib import pyplot as plt&lt;br /&gt;
from matplotlib.animation import FuncAnimation &lt;br /&gt;
import random&lt;br /&gt;
from scipy.optimize import bisect as find_root&lt;br /&gt;
&lt;br /&gt;
raio = 2 ** (1/6)&lt;br /&gt;
path = '/home/a_burmeister/AA_CADEIRAS_UFRGS/7-semestre/Monte Carlo/lennard_jones/colab/N32/'&lt;br /&gt;
save_path = '/home/a_burmeister/AA_CADEIRAS_UFRGS/7-semestre/Monte Carlo/lennard_jones/colab/N32/figures/'&lt;br /&gt;
dLmax = round(0.5*raio, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def open_pos(file, n_particles=32):&lt;br /&gt;
    loaded_pos = np.loadtxt(file)&lt;br /&gt;
    load_original_pos = loaded_pos.reshape(loaded_pos.shape[0], loaded_pos.shape[1] // n_particles, n_particles)&lt;br /&gt;
    return load_original_pos&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
## Figuras&lt;br /&gt;
&lt;br /&gt;
### Intial and final positions:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def scatter_pos(pos, indices, T, L, circles=True, n_particles=32):&lt;br /&gt;
    graphs = len(indices)&lt;br /&gt;
    fig, axes = plt.subplots(1, graphs)&lt;br /&gt;
    fig.suptitle(f'T = {T}   N = {n_particles}   d = {densidade_round}    dLmax = {round(dLmax, 2)}', fontsize=14)&lt;br /&gt;
&lt;br /&gt;
    for j in range(graphs):&lt;br /&gt;
        k = indices[j]&lt;br /&gt;
        if circles:&lt;br /&gt;
            # draw the circles where they are&lt;br /&gt;
            for i in range(n_particles):&lt;br /&gt;
                c = plt.Circle([pos[k][0][i], pos[k][1][i]], raio/2, fill=False, edgecolor='black', alpha=0.5)&lt;br /&gt;
                axes.add_patch(c)&lt;br /&gt;
            # draw the circle's projections:&lt;br /&gt;
            for a in range(-1, 2):&lt;br /&gt;
                for b in range(-1, 2):&lt;br /&gt;
                    for i in range(n_particles):&lt;br /&gt;
                        c = plt.Circle([pos[k][0][i] + a*L, pos[k][1][i] + b*L], raio/2, fill=False, edgecolor='black', alpha=0.25)&lt;br /&gt;
                        axes.add_patch(c)&lt;br /&gt;
        &lt;br /&gt;
        points = axes.scatter(pos[k][0], pos[k][1])&lt;br /&gt;
        margem = raio/2&lt;br /&gt;
        axes.plot([0, L, L, 0, 0], [0, 0, L, L, 0], color='black')&lt;br /&gt;
        axes.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        axes.grid(visible=False)&lt;br /&gt;
        axes.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        axes.set_title(f'passo {k}')&lt;br /&gt;
    return fig, axes, points&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
T_arr = np.array([0.1, 0.3, 0.5, 1.5])&lt;br /&gt;
dens_arr = np.array([0.1, 0.5, 0.9])&lt;br /&gt;
n_particles = 32&lt;br /&gt;
MCS = 10000&lt;br /&gt;
&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        pos = open_pos(file_name, n_particles=32)&lt;br /&gt;
&lt;br /&gt;
        L = np.sqrt(n_particles / densidade)  # unidade de sigma&lt;br /&gt;
        plot = scatter_pos(pos=pos, indices=[pos.shape[0] - 1], T=T, L=L, circles=True)&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        plt.savefig(f&amp;quot;{save_path}first_last_positions{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Energy:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def y_limits(energy, limites):&lt;br /&gt;
    energy_hist_range = energy[int(round(0.2*len(energy), 0)):]&lt;br /&gt;
    max_energy_range = max(energy_hist_range)&lt;br /&gt;
    if max_energy_range &amp;gt; 100:&lt;br /&gt;
        max_energy_range = 0&lt;br /&gt;
    return [min([min(energy_hist_range)-1, limites[0]]), max([0, max_energy_range + 1, limites[1]])]&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;#### Energy graph:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
for densidade in dens_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'd = {densidade}')&lt;br /&gt;
    densidade_round = round(densidade, 3)&lt;br /&gt;
    fig, ax = plt.subplots(1, 1)&lt;br /&gt;
    titulo = f'densidade = {densidade_round}     N = {n_particles}    L = {round(L, 2)}    dLmax = {round(dLmax, 2)}'&lt;br /&gt;
    fig.suptitle(titulo, fontsize=14)&lt;br /&gt;
    limites = [0, 0]&lt;br /&gt;
    for T in T_arr:&lt;br /&gt;
        print(f'T = {T}')&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}&amp;quot;&lt;br /&gt;
        energy = np.loadtxt(f&amp;quot;{path}energy{file_end}.txt&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Histogram:&lt;br /&gt;
        fig2, ax2 = plt.subplots(1, 1)&lt;br /&gt;
        fig2.suptitle(titulo, fontsize=14)&lt;br /&gt;
        ax2.hist(energy[100:], density=True)&lt;br /&gt;
        ax2.set_xlabel('energy')&lt;br /&gt;
        # plt.show()&lt;br /&gt;
        fig2.savefig(f&amp;quot;{save_path}energy_histogram{file_end}.png&amp;quot;)&lt;br /&gt;
        plt.close(fig2)&lt;br /&gt;
        # Plot:&lt;br /&gt;
        energy_range = energy&lt;br /&gt;
        ax.plot(np.arange(len(energy_range)), energy_range, label=f'T = {T}')&lt;br /&gt;
        limites = y_limits(energy, limites)&lt;br /&gt;
    ax.set_ylim(limites)&lt;br /&gt;
    ax.set_ylabel('U')&lt;br /&gt;
    ax.set_xlabel('tempo em MCS')&lt;br /&gt;
    ax.legend()&lt;br /&gt;
    # plt.show()&lt;br /&gt;
    file_end2 = f&amp;quot;N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}&amp;quot;&lt;br /&gt;
    fig.savefig(f&amp;quot;{save_path}energy_graph{file_end}.png&amp;quot;)&lt;br /&gt;
    plt.close(fig)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Animação&lt;br /&gt;
for T in T_arr:&lt;br /&gt;
    print()&lt;br /&gt;
    print(f'T = {T}')&lt;br /&gt;
    for densidade in dens_arr:&lt;br /&gt;
        print(f'd = {densidade}')&lt;br /&gt;
        densidade_round = round(densidade, 3)&lt;br /&gt;
        file_end = f&amp;quot;_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}&amp;quot;&lt;br /&gt;
        file_name = f&amp;quot;{path}positions{file_end}.txt&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        pos = open_pos(file_name, n_particles=32)&lt;br /&gt;
        fig, ax = plt.subplots(1,1, figsize=(5, 6))&lt;br /&gt;
        fig.suptitle(f'T = {T}   N = {n_particles}   d = {densidade_round} \n L = {round(L, 2)}     dLmax = {round(dLmax, 2)}',&lt;br /&gt;
                     fontsize=14)&lt;br /&gt;
        margem = raio&lt;br /&gt;
        ax.axis([-margem, L + margem, -margem, L + margem], 'equal')&lt;br /&gt;
        ax.grid()&lt;br /&gt;
        ax.set_aspect(&amp;quot;equal&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        c = []&lt;br /&gt;
        for i in range(n_particles):&lt;br /&gt;
            c.append(plt.Circle([pos[0][0][i], pos[0][1][i]], raio, fill=False, color='lightgrey'))&lt;br /&gt;
            ax.add_patch(c[i])&lt;br /&gt;
        scatter_points = ax.scatter(pos[0][0], pos[0][1], s=1000)&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        def animate(i):&lt;br /&gt;
            for k in range(n_particles):&lt;br /&gt;
                c[k].center = (pos[i][0][k], pos[i][1][k])&lt;br /&gt;
            scatter_points.set_offsets(pos[i].T)&lt;br /&gt;
            return scatter_points&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        anim = FuncAnimation(fig, animate, interval = 10, frames = MCS)&lt;br /&gt;
        &lt;br /&gt;
        anim_file = f'animacao_T{T}_N{n_particles}_d{densidade_round}_MCS{MCS}_dL_{dLmax}.mp4'&lt;br /&gt;
        print(anim_file)&lt;br /&gt;
        anim.save(anim_file, writer = 'ffmpeg', fps = 20)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;### Potencial Lennard Jones:&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def lennard_jones1d(r):&lt;br /&gt;
    sr6 = 1/(r ** 6)&lt;br /&gt;
    return 4 * (((sr6) ** 2) - (sr6))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
xx = np.linspace(0, 4, 100)&lt;br /&gt;
yy = lennard_jones1d(xx)&lt;br /&gt;
fig, ax = plt.subplots(1, 1, figsize=(10, 4))&lt;br /&gt;
ax.plot([-10, 10], [0, 0], color='black')&lt;br /&gt;
ax.plot(xx, yy)&lt;br /&gt;
ax.set_ylabel('U(r)')&lt;br /&gt;
ax.set_xlabel('r')&lt;br /&gt;
ax.set_ylim([-1.5, 5])&lt;br /&gt;
ax.set_xlim([0, 3])&lt;br /&gt;
plt.show()&lt;br /&gt;
fig.savefig('lennard_jones_potential.png')&lt;br /&gt;
plt.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.5_N64_d0.9_MCS10000.png&amp;diff=9109</id>
		<title>Arquivo:First last positions T0.5 N64 d0.9 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.5_N64_d0.9_MCS10000.png&amp;diff=9109"/>
		<updated>2022-10-20T04:35:38Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.5_N64_d0.5_MCS10000.png&amp;diff=9108</id>
		<title>Arquivo:First last positions T0.5 N64 d0.5 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.5_N64_d0.5_MCS10000.png&amp;diff=9108"/>
		<updated>2022-10-20T04:35:22Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.5_N64_d0.1_MCS10000.png&amp;diff=9107</id>
		<title>Arquivo:First last positions T0.5 N64 d0.1 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.5_N64_d0.1_MCS10000.png&amp;diff=9107"/>
		<updated>2022-10-20T04:35:07Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.3_N64_d0.9_MCS10000.png&amp;diff=9106</id>
		<title>Arquivo:First last positions T0.3 N64 d0.9 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.3_N64_d0.9_MCS10000.png&amp;diff=9106"/>
		<updated>2022-10-20T04:34:52Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.3_N64_d0.5_MCS10000.png&amp;diff=9105</id>
		<title>Arquivo:First last positions T0.3 N64 d0.5 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.3_N64_d0.5_MCS10000.png&amp;diff=9105"/>
		<updated>2022-10-20T04:34:33Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.3_N64_d0.1_MCS10000.png&amp;diff=9104</id>
		<title>Arquivo:First last positions T0.3 N64 d0.1 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.3_N64_d0.1_MCS10000.png&amp;diff=9104"/>
		<updated>2022-10-20T04:34:18Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.1_N64_d0.9_MCS10000.png&amp;diff=9103</id>
		<title>Arquivo:First last positions T0.1 N64 d0.9 MCS10000.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:First_last_positions_T0.1_N64_d0.9_MCS10000.png&amp;diff=9103"/>
		<updated>2022-10-20T04:33:58Z</updated>

		<summary type="html">&lt;p&gt;Andreburmeister: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andreburmeister</name></author>
	</entry>
</feed>