<?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=Leomigotto</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=Leomigotto"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Leomigotto"/>
	<updated>2026-06-13T01:12:09Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Cahn-Hilliard_em_2D&amp;diff=10599</id>
		<title>Equação de Cahn-Hilliard em 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Cahn-Hilliard_em_2D&amp;diff=10599"/>
		<updated>2024-07-22T19:14:59Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Cahn-Hilliard utilizando a Transformada Rápida de Fourier &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/FFT&amp;lt;/ref&amp;gt; em uma e (principalmente) em duas dimensões. Será explorado as variações em concentração inicial e seus respectivos padrões formados, dados coeficientes de difusão e dimensões da superfície fixos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:NOPBC03.gif|thumb|Cahn-Hilliard bidimensional com condições de contorno periódicas.]]&lt;br /&gt;
&lt;br /&gt;
A equação de Cahn-Hilliard descreve a decomposição espinoidal&amp;lt;ref&amp;gt;CAHN, John W.; HILLIARD, John E. &#039;&#039;&#039;Spinodal decomposition: A reprise&#039;&#039;&#039;Acta Metallurgica, Volume 19, Issue 2, 1971&amp;lt;/ref&amp;gt; em uma mistura binária, originando da primeira lei de Fick e a energia livre de Gibbs&amp;lt;ref&amp;gt;CAHN, John W.; HILLIARD, John E. &#039;&#039;&#039;Free Energy of a Nonuniform System. I. Interfacial Free Energy&#039;&#039;&#039;. The Journal of Chemical Physics, 1958.&amp;lt;/ref&amp;gt;. Esta equação já foi tratada em detalhes por colegas anteriores a mim &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Equa%C3%A7%C3%A3o_de_Cahn-Hilliard&amp;lt;/ref&amp;gt;, onde os aspectos físicos da equação são explicados em detalhes. Recomendo a leitura completa da página para melhor entendimento dos processos envolvidos na equação. O foco deste trabalho é explorar a solução numérica para a equação quando tratada em duas dimensões, onde a formação de padrões apresenta resultados mais interessantes. No entanto, a fim de facilitar a implementação e entendimento em duas dimensões, também será exibida uma implementação em uma dimensão.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Todos códigos desenvolvidos para duas dimensões foram feitos a fim de que qualquer pessoa, com Python e as bibliotecas necessárias instaladas, possa executá-los sem nenhum conhecimento prévio. Estes códigos podem ser encontrados no final desta página.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Equação de Cahn-Hiliiard Utilizando Transformada de Fourier ==&lt;br /&gt;
Para encontrar a equação que implementaremos com o uso da Transformada Rápida de Fourier, precisamos encontrar a nossa equação representada no espaço de Fourier. Seguirei a literatura de S. Bulent Biner &amp;lt;ref&amp;gt;BINER, S. Bulent. Programming Phase-Field Modeling. Idaho National Laboratory, Idaho Falls, ID, USA: Springer, 2017. 400 p. ISBN 978-3-319-41196-5.&amp;lt;/ref&amp;gt;, onde há um capítulo dedicado a resolver equações de difusão com métodos desse tipo. Primeiro, resolveremos a equação em uma dimensão, que segue abaixo:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial c}{\partial t} = D {\nabla}^2 (c^3 - c - \gamma {\nabla}^2 c).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lembrando que, conforme explicado no trabalho anterior a este, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; é a soma da concentração de duas fases, e seu valor varia de -1 (presença de só uma das fases) a +1 (presença somente da outra fase), e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é um valor relacionado à largura da interface das concentrações.&lt;br /&gt;
&lt;br /&gt;
Em uma dimensão, os laplacianos podem ser substituídos pela derivada segunda em relação a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, resultando na seguinte equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial c}{\partial t} = D \Bigl( \frac{\partial^2 (c^3 - c)}{\partial x^2} - \gamma \frac{\partial^4 c}{\partial x^4} \Bigr).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para solucioná-la numericamente, aplicaremos a Transformada de Fourier à frente em ambos os lados, da maneira descrita abaixo, onde k é o respectivo coeficiente de Fourier):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial \{c\}_k}{\partial t} = D \Bigl( \Bigl\{ \frac{ \partial^2 c^3 - c}{\partial x^2} \Bigr\}_k - \gamma \Bigl\{ \frac{\partial^4 c}{\partial x^4} \Bigr\}_k \Bigr).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em seguida, substituimos as derivadas espaciais pela sua equivalente no espaço de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Bigl\{ \frac{\partial^n c}{\partial x^n} \Bigr\}_k \to (ik)^n \{c\}_k.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, obtemos a seguinte equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial \{c\}_k}{\partial t} = D \bigl(-k^2 (\{c^3\}_k - \{c\}_k) - \gamma k^4 \{c\}_k \bigr).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O próximo passo é fazer a derivada à direita quanto ao tempo, da seguinte maneira:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial \{c\}_k}{\partial t}\to \frac{\{c\}_k^{n+1}-\{c\}_k^n}{\Delta t}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Substituindo na equação e reescrevendo-a a fim de isolar &amp;lt;math&amp;gt;\{c\}_k^{n+1}&amp;lt;/math&amp;gt;, obtemos a equação final:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\{c\}_k^{n+1} = \{c\}_k^n + D \Delta t \bigl(-k^2 (\{c^3\}_k^n - \{c\}_k^n) - \gamma k^4 \{c\}_k^n \bigr).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A equação que descobrimos para uma dimensão possui a mesma forma quando em duas dimensões. No entanto, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; representará um vetor com coordenada &amp;lt;math&amp;gt;(k_{1}, k_{2})&amp;lt;/math&amp;gt; com módulo &amp;lt;math&amp;gt;\sqrt{k_1^2 + k_2^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;k_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;k_2&amp;lt;/math&amp;gt; são os coeficientes em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Código em Uma Dimensão ==&lt;br /&gt;
O código completo está disponível no final desta página. Abaixo há o excerto da funcão, em Python, que calcula o instante seguinte do nosso sistema, utilizando as funções RFFT e IRFFT do pacote Scipy.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def cahnfourier1d(cc, k2, k4):&lt;br /&gt;
    cct = rfft(cc)&lt;br /&gt;
    cct3 = rfft(cc**3 - cc)&lt;br /&gt;
    cct = cct + difd*dt*(-k2*(cct3) - k4*cct)&lt;br /&gt;
    cc = irfft(cct)&lt;br /&gt;
    return cc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Gostaria de destacar que, para o uso correto do método, é necessário, para o termo cúbico, calcular a transformada &#039;&#039;&#039;após&#039;&#039;&#039; elevá-lo à potência, e não elevar o valor transformado à potência. No código, k2 e k4 são os coeficientes elevados às respectivas potências, além de que k4 está multiplicado pelo valor de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Calcular o quadrado de k2 e multiplica-lo por gamma fora da função evita que essas multiplicações sejam feito toda vez que a função é chamada. Também é importante destacar que as funções RFFT e IRFFT funcionam utilizando o vetor completo de pontos para fazer os cálculos, assim como os vetores completos de frequências, eliminando qualquer necessidade de iteração sobre o vetor de valores (uma diferença notável do método FTCS, onde é necessário iterar sobre o vetor).&lt;br /&gt;
&lt;br /&gt;
== Resultados em Uma Dimensão e Discussão==&lt;br /&gt;
Como já há um trabalho que trata em detalhes a implementação unidimensional e seus resultados, irei comparar aqui ambas implementações. Abaixo, vemos alguns instantes comparando ambos métodos (FTCS e por Transformadas de Fourier) a partir de uma condição inicial aleatória, utillizando condições de contorno periódicas, com o maior valor da diferença entre os dois métodos destacado no topo. O valor das constantes relevantes são:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Delta t = \frac{1}{22 \cdot 10^{6}}, \Delta x = \frac{1}{128}, D = 1, \gamma = \Bigl(\frac{3.4}{128}\Bigr)^2, x_{max} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
É interessante citar que a escolha de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; como um valor tão específico não é em vão: a função RFFT utilizada no código apresenta maior rapidez de execução quando o vetor utilizado é de tamanho &amp;lt;math&amp;gt;2^n , n = 1, 2, 3, ...&amp;lt;/math&amp;gt;. Com este valor de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt;, nosso vetor é composto de 128 elementos, ou &amp;lt;math&amp;gt;2^7&amp;lt;/math&amp;gt; elementos, fazendo uso dessa vantagem.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:1d100passos.png]] [[Arquivo:1d1000passos.png]] [[Arquivo:1d10000.png]]&lt;br /&gt;
&lt;br /&gt;
Repare na mudança de limites no eixo vertical dos gráficos, a fim de ressaltar a posição dos valores maiores da diferença. Como podemos ver, a diferença dos valores entre os resultados obtidos pelo método FTCS e o método das transformadas é pequena (após poucos instantes o maior módulo da diferença aproxima-se de 0,01). A fim de avaliar com maior precisão a diferença entre ambos métodos,  quatro pontos foram escolhidos ao acaso, e a diferença de valor entre ambos métodos sob cada ponto foram graficadas, e podem ser vistas abaixo.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:diferencalog.png]]&lt;br /&gt;
&lt;br /&gt;
No gráfico acima, vemos que a diferença entre os valores varia erráticamente até logo após um tempo de 0.1. Repare que, logo em seguida, a diferença entre os pontos estabiliza em um certo valor. O comportamento do erro torna evidente que a diferença numérica entre ambos métodos se dá principalmente nos instantes iniciais, enquanto as concentrações aleatórias estão começando o processo de difusão. A estabilização da diferença indica que ambos métodos, para tempos mais longos, possuem diferença numérica mínima, somente preservando a diferença obtida no tempo inicial. &lt;br /&gt;
&lt;br /&gt;
É interessante citar que a escolha de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; como um valor tão específico não é em vão: a função RFFT utilizada no código apresenta maior rapidez de execução quando o vetor utilizado é de tamanho &amp;lt;math&amp;gt;2^n , n = 1, 2, 3, ...&amp;lt;/math&amp;gt;. Com este valor de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt;, nosso vetor é composto de 128 elementos, ou &amp;lt;math&amp;gt;2^7&amp;lt;/math&amp;gt; elementos, fazendo uso dessa vantagem. Dado a escala utilizada no sistema acima, os tempos de processamento foram pequenos. No entanto, para sistemas maiores (como o bidimensional), onde o número de operações necessárias aumenta drasticamente, o método das transformadas será distintamente ágil.&lt;br /&gt;
&lt;br /&gt;
== Código em Duas Dimensões ==&lt;br /&gt;
Todos códigos estão disponíveis na íntegra no final desta página. A fim de poupar tempo, quatro programas foram criados:&lt;br /&gt;
:- Um programa que gera, a partir de valores aleatórios parametrizados, dados até um certo instante de tempo, salvando-os em um arquivo.&lt;br /&gt;
:- Um programa que, lê um arquivo de valores já gerados e gera mais valores até um certo instante de tempo, salvando-os neste mesmo arquivo.&lt;br /&gt;
:- Um programa que lê um arquivo gerado previamente, criando frames dos valores salvos no arquivo.&lt;br /&gt;
:- Um programa que lê um arquivo gerado previamente, criando uma animação dos valores salvos no arquivo.&lt;br /&gt;
&lt;br /&gt;
Dois arquivos de formato .npy são criados, para armazenar os arrays e as informações necessárias para gerar mais valores ou plotar os gráficos, além de um .txt que serve como uma consulta local dos valores pelo usuário (arquivos .npy não podem ser lidos no bloco de notas). Todos arquivos são salvos em pastas individuias cujo nome é um número aleatório único, sendo este número o nome do arquivo de texto, o do arquivo .npy e o arquivo com os valores calculados.&lt;br /&gt;
Abaixo há o excerto da funcão, em Python, que calcula o instante seguinte do nosso sistema, utilizando as funções RFFT2 e IRFFT2 do pacote Scipy.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def cahnfourier2d(aa, kk2, kk4):&lt;br /&gt;
    cct = rfft2(aa)&lt;br /&gt;
    cct3 = rfft2(aa**3)&lt;br /&gt;
    cct = cct + difd*dt*(-kk2*(cct3 - cct) - kk4*cct)&lt;br /&gt;
    ccn = irfft2(cct)&lt;br /&gt;
    return ccn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No código, kk2 e kk4 são os coeficientes elevados às respectivas potências, além de que k4 está multiplicado pelo valor de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Vale destacar a semelhança entre este código e o unidimensional, fruto da discretização quase idêntica.&lt;br /&gt;
&lt;br /&gt;
== Resultado em Duas Dimensões: Concentração Média 0 ==&lt;br /&gt;
Para todos resultados abaixo, foram utilizados as seguintes constantes relevantes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Delta t = \frac{1.8}{10^7}, \Delta x = \Delta y = \frac{1}{128}, D = 1, \gamma = 0.01^2, x_{max} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Também foram utilizadas condições de contorno periódicas. Como observado anteriormente, o valor de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; escolhido serve para que nosso array de valores possua &amp;lt;math&amp;gt;10^{14}&amp;lt;/math&amp;gt; elementos, também fazendo uso da eficiência completa da função RFFT2 (equivalente bidimensional da função RFFT).&lt;br /&gt;
&lt;br /&gt;
O motivo de não explorarmos valores diferentes de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; nem de &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; está na sensibilidade da estabilidade da equação: pequenas mudanças na ordem de grandeza de qualquer uma das constantes pode resultar num sistema instável.&lt;br /&gt;
&lt;br /&gt;
Segue abaixo mídias da difusão sob estes parâmetros com concentração média 0. As cores variam de vermelho (-1) a violeta (+1), de modo que as cores variam de acordo com o espectro visível, onde a cor amarela corresponde a 0. A &amp;quot;baixa qualidade&amp;quot; das imagens se dá pelo tamanho de array utilizado (128x128), de modo que cada célula é distintamente visível nas mídias. Mesmo &amp;quot;pequeno&amp;quot;, o tamanho de array escolhido já permite a análise dos dados, além de ter um tempo de processamento rápido.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: NOPBCINICIAL.png|thumb|none|256px|Instante inicial com concentrações aleatórias.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: PBC BEM CEDO1.png|thumb|none|384px|Instante expandido a fim de demonstrar as condições de contorno periódicas. Esta imagem é composta por uma grade 3x3 de imagens iguais das de tamanho menor, dando origem a uma imagem de resolução 384x384.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FINALDOGIF1.png|frame|left|256px|Tempo: 0.011. Repare na rápida formação das fases.]][[Arquivo: NOPBCCURTO.gif|frame|center|256px|Tempo máximo da animação: 0.011.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FINALDOGIF2.png|frame|left|256px|Tempo: 0.3.]][[Arquivo: NOPBC03.gif|frame|center|256px|Tempo máximo da animação: 0.3. Este vídeo está acelerado em relação ao anterior. Repare na difusão das &amp;quot;bolhas&amp;quot; que não entraram em contato com outras concentrações. Repare que as outras concentrações crescem de tamanho conforme a bolha &amp;quot;difunde&amp;quot; no meio.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FINALDOGIF3.png|frame|left|256px|Tempo: 3. Repare no arredondamento da concentração singular que se formou.]] [[Arquivo: NOPBC3NOVO.gif|frame|center|256px|Tempo máximo da animação: 3. Este vídeo está acelerado em relação ao anterior.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: PBCFINAL5050.png|frame|none|384px|Tempo: 6. Aqui, as fases já atingiram a estabilidade. Utilizando da visualização expandida, podemos ver que uma das fases formou uma concentração circular, enquanto a outra ocupou o espaço remanescente.]] [[Arquivo: MOSTRANDO ESTABILIDADE.gif|frame|none|512px|Tempo máximo da animação: 6. Este vídeo está acelerado em relação ao anterior.]]&lt;br /&gt;
&lt;br /&gt;
== Resultado em Duas Dimensões: Concentração Média 0.5 ==&lt;br /&gt;
Abaixo seguem mídias da simulação de condições iniciais idênticas às anteriores, porém com concentração média inicial 0.5 (equivalente a 75% em uma fase e 25% em outra).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FRAMEINICIAL.png|thumb|none|256px|Instante inicial com concentrações aleatórias. Repare nas cores serem majoritariamente verdes ou azuis, relativas à concentrações de valor positivo.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: DESTAQUEPBC.png|thumb|none|384px|Instante expandido a fim de demonstrar as condições de contorno periódicas. Esta imagem é composta por uma grade 3x3 de imagens iguais das de tamanho menor, dando origem a uma imagem de resolução 384x384.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FRAMENOVO10.png|frame|left|256px|Tempo: 0.010. Repare na rápida formação de concentrações pequenas da fase em minoria.]] [[Arquivo: TEMPOCURTO.gif|frame|center|256px|Tempo máximo da animação: 0.010.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FRAMENOVO11.png|frame|left|256px|Tempo: 0.3. Repare na homogenização da fase em maior quantidade.]] [[Arquivo: TMAX03.gif|frame|center|256px|Tempo máximo da animação: 0.3. Este vídeo está acelerado em relação ao anterior. Repare na difusão das &amp;quot;bolhas&amp;quot; que não entraram em contato com outras concentrações.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FRAMENOVO12.png|frame|left|256px|Tempo: 3. Repare na formação de 3 concentrações já circulares de forma.]] [[Arquivo: TMAX3.gif|frame|center|256px|Tempo máximo da animação: 3. Este vídeo está acelerado em relação ao anterior. Repare no início da difusão de uma das concentrações.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FINALPEQUENOCONC.png|thumb|none|384px|Tempo: 7. As fases já atingiram a estabilidade.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIFINAL GRANDE.gif|frame|none|512px|Tempo máximo da animação: 7. Este vídeo está acelerado em relação ao anterior.]]&lt;br /&gt;
&lt;br /&gt;
== Discussão dos resultados em duas dimensões==&lt;br /&gt;
Dado que, utilizando valores aleatórios, nosso sistema é equivalente a uma mistura homogênea com perturbações, percebemos instantaneamente a formação das regiões das diferentes fases.&lt;br /&gt;
&lt;br /&gt;
Após poucos instantes, já percebemos a separação completa das fases, com exceção das fronteiras, que apresentam uma mistura de ambas. É importante destacar que, conforme maiores as concentrações de fases se tornam, menor a velocidade que elas se &amp;quot;movem&amp;quot;. Ao lembrar que a equação de Cahn-Hilliard descreve a separação de fases em um sistema homogêneo termodiamicamente instável, que reduz sua energia conforme a separação delas, fica evidente que a desaçeleração da separação ocorre pela aproximação da sua energia atual à energia mínima do sistema. A redução da energia com o tempo pode ser visto no livro de S. Bulent Biner.&lt;br /&gt;
&lt;br /&gt;
Também percebemos que concentrações menores difundiam, quando não entravam em contato com outra concentração maior. Mesmo aparentando, em alguns momentos, desaparecer, na realidade a área das outras concentrações aumenta, de modo que a quantidade de cada fase se mantem igual.&lt;br /&gt;
&lt;br /&gt;
Percebemos que o estado de menor energia é uma concentração circular, enquanto o restante do meio é ocupado pela outra. Mesmo sem saber que este é o estado estacionário, poderíamos intuir que seria ele ao ver os instantes iniciais da simulação: o círculo é a forma que possui maior área por perímetro, e vimos que as fases diferentes difundem de modo a diminuir sua interface. No caso de uma quantidade diferente entre as fases, a de menor volume (ou neste caso, área) total, forma o círculo, caso contrário, a concentração que forma é escolhida &amp;quot;aleatoriamente&amp;quot; (depende dos locais das perturbações, que, no nosso caso, são aleatórias). O motivo de ambas fases poderem formar a concentração circular é o fato da equação possuir todos termos de expoente ímpar, de modo que valores positivos ou negativos são tradados da mesma maneira (ao contrário de termos com expoente par, que retornam um valor positivo independente do sinal, agindo de forma diferente dependendo do sinal do valor original).&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Todos códigos para resolução numérica em duas dimensões possuem, nas primeiras linhas, comentários que destacam quais valores o usuário é recomendado a alterar, além da semente aleatória utilizada para gerar as mídias vistas na página. Caso você não possua experiência com programação, é recomendado não alterar as linhas de código abaixo dos locais indicados.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2dfourier]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo código.npy principal, que consiste nos arrays.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;framer&amp;quot; e &amp;quot;animador&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2dfouriercontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. O arquivo com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo o arquivo antigo. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2dframer]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ele salvará os frames em uma pasta dentro da pasta com nome do código do arquivo, e serão numerados de acordo com qual frame da simulação ela se refere.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2danimador]]&#039;&#039;&#039; Programa utilizado para gerar as animações vistas neste trabalho. Os gifs são salvos em uma pasta dentro da pasta com nome do código do arquivo, com o nome dele identificando algumas características dele. Atente que, para computadores sem placa de vídeo dedicada, a renderização dos gifs pode levar muito tempo, em casos como este recomendo gerar as animações em menor resolução ou com intervalos maiores entre as imagens.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn1dcompare]]&#039;&#039;&#039; Código utilizado para gerar o frame de comparação em uma dimensão. Não recomendo acessá-lo, por não possuir um resultado interessante, além de não estar otimizado nem comentado.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn1ddiflog]]&#039;&#039;&#039; Código utilizado para avaliar a diferença entre os métodos em escala logarítmica. Não recomendo acessá-lo, por não possuir um resultado interessante, além de não estar otimizado nem comentado.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As bibliotecas utilizadas que requerem instalação são: Numpy, Scipy e Matplotlib. O renderizador de vídeo FFMPEG foi utilizado, porém na maioria dos computadores modernos executando Windows, na ausência deste, outro renderizador será utilizado sem necessidade de alterar o código. Porém, caso seja necessário instalar o renderizador, este link possui um tutorial simples em inglês para Windows: [https://stackoverflow.com/posts/65860115/revisions]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Cahn-Hilliard_em_2D&amp;diff=9711</id>
		<title>Equação de Cahn-Hilliard em 2D</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Cahn-Hilliard_em_2D&amp;diff=9711"/>
		<updated>2023-05-20T18:47:15Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Leonardo Dasso Migottto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Cahn-Hilliard utilizando a Transformada Rápida de Fourier &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/FFT&amp;lt;/ref&amp;gt; em uma e (principalmente) em duas dimensões. Será explorado as variações em concentração inicial e seus respectivos padrões formados, dados coeficientes de difusão e dimensões da superfície fixos.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:NOPBC03.gif|thumb|Cahn-Hilliard bidimensional com condições de contorno periódicas.]]&lt;br /&gt;
&lt;br /&gt;
A equação de Cahn-Hilliard descreve a decomposição espinoidal&amp;lt;ref&amp;gt;CAHN, John W.; HILLIARD, John E. &#039;&#039;&#039;Spinodal decomposition: A reprise&#039;&#039;&#039;Acta Metallurgica, Volume 19, Issue 2, 1971&amp;lt;/ref&amp;gt; em uma mistura binária, originando da primeira lei de Fick e a energia livre de Gibbs&amp;lt;ref&amp;gt;CAHN, John W.; HILLIARD, John E. &#039;&#039;&#039;Free Energy of a Nonuniform System. I. Interfacial Free Energy&#039;&#039;&#039;. The Journal of Chemical Physics, 1958.&amp;lt;/ref&amp;gt;. Esta equação já foi tratada em detalhes por colegas anteriores a mim &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Equa%C3%A7%C3%A3o_de_Cahn-Hilliard&amp;lt;/ref&amp;gt;, onde os aspectos físicos da equação são explicados em detalhes. Recomendo a leitura completa da página para melhor entendimento dos processos envolvidos na equação. O foco deste trabalho é explorar a solução numérica para a equação quando tratada em duas dimensões, onde a formação de padrões apresenta resultados mais interessantes. No entanto, a fim de facilitar a implementação e entendimento em duas dimensões, também será exibida uma implementação em uma dimensão.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Todos códigos desenvolvidos para duas dimensões foram feitos a fim de que qualquer pessoa, com Python e as bibliotecas necessárias instaladas, possa executá-los sem nenhum conhecimento prévio. Estes códigos podem ser encontrados no final desta página.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Equação de Cahn-Hiliiard Utilizando Transformada de Fourier ==&lt;br /&gt;
Para encontrar a equação que implementaremos com o uso da Transformada Rápida de Fourier, precisamos encontrar a nossa equação representada no espaço de Fourier. Seguirei a literatura de S. Bulent Biner &amp;lt;ref&amp;gt;BINER, S. Bulent. Programming Phase-Field Modeling. Idaho National Laboratory, Idaho Falls, ID, USA: Springer, 2017. 400 p. ISBN 978-3-319-41196-5.&amp;lt;/ref&amp;gt;, onde há um capítulo dedicado a resolver equações de difusão com métodos desse tipo. Primeiro, resolveremos a equação em uma dimensão, que segue abaixo:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial c}{\partial t} = D {\nabla}^2 (c^3 - c - \gamma {\nabla}^2 c).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lembrando que, conforme explicado no trabalho anterior a este, &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; é a soma da concentração de duas fases, e seu valor varia de -1 (presença de só uma das fases) a +1 (presença somente da outra fase), e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é um valor relacionado à largura da interface das concentrações.&lt;br /&gt;
&lt;br /&gt;
Em uma dimensão, os laplacianos podem ser substituídos pela derivada segunda em relação a &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, resultando na seguinte equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial c}{\partial t} = D \Bigl( \frac{\partial^2 (c^3 - c)}{\partial x^2} - \gamma \frac{\partial^4 c}{\partial x^4} \Bigr).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para solucioná-la numericamente, aplicaremos a Transformada de Fourier à frente em ambos os lados, da maneira descrita abaixo, onde k é o respectivo coeficiente de Fourier):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial \{c\}_k}{\partial t} = D \Bigl( \Bigl\{ \frac{ \partial^2 c^3 - c}{\partial x^2} \Bigr\}_k - \gamma \Bigl\{ \frac{\partial^4 c}{\partial x^4} \Bigr\}_k \Bigr).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em seguida, substituimos as derivadas espaciais pela sua equivalente no espaço de Fourier:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Bigl\{ \frac{\partial^n c}{\partial x^n} \Bigr\}_k \to (ik)^n \{c\}_k.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assim, obtemos a seguinte equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial \{c\}_k}{\partial t} = D \bigl(-k^2 (\{c^3\}_k - \{c\}_k) - \gamma k^4 \{c\}_k \bigr).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O próximo passo é fazer a derivada à direita quanto ao tempo, da seguinte maneira:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial \{c\}_k}{\partial t}\to \frac{\{c\}_k^{n+1}-\{c\}_k^n}{\Delta t}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Substituindo na equação e reescrevendo-a a fim de isolar &amp;lt;math&amp;gt;\{c\}_k^{n+1}&amp;lt;/math&amp;gt;, obtemos a equação final:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\{c\}_k^{n+1} = \{c\}_k^n + D \Delta t \bigl(-k^2 (\{c^3\}_k^n - \{c\}_k^n) - \gamma k^4 \{c\}_k^n \bigr).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A equação que descobrimos para uma dimensão possui a mesma forma quando em duas dimensões. No entanto, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; representará um vetor com coordenada &amp;lt;math&amp;gt;(k_{1}, k_{2})&amp;lt;/math&amp;gt; com módulo &amp;lt;math&amp;gt;\sqrt{k_1^2 + k_2^2}&amp;lt;/math&amp;gt;, onde &amp;lt;math&amp;gt;k_1&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;k_2&amp;lt;/math&amp;gt; são os coeficientes em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; respectivamente.&lt;br /&gt;
&lt;br /&gt;
== Código em Uma Dimensão ==&lt;br /&gt;
O código completo está disponível no final desta página. Abaixo há o excerto da funcão, em Python, que calcula o instante seguinte do nosso sistema, utilizando as funções RFFT e IRFFT do pacote Scipy.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def cahnfourier1d(cc, k2, k4):&lt;br /&gt;
    cct = rfft(cc)&lt;br /&gt;
    cct3 = rfft(cc**3 - cc)&lt;br /&gt;
    cct = cct + difd*dt*(-k2*(cct3) - k4*cct)&lt;br /&gt;
    cc = irfft(cct)&lt;br /&gt;
    return cc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Gostaria de destacar que, para o uso correto do método, é necessário, para o termo cúbico, calcular a transformada &#039;&#039;&#039;após&#039;&#039;&#039; elevá-lo à potência, e não elevar o valor transformado à potência. No código, k2 e k4 são os coeficientes elevados às respectivas potências, além de que k4 está multiplicado pelo valor de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Calcular o quadrado de k2 e multiplica-lo por gamma fora da função evita que essas multiplicações sejam feito toda vez que a função é chamada. Também é importante destacar que as funções RFFT e IRFFT funcionam utilizando o vetor completo de pontos para fazer os cálculos, assim como os vetores completos de frequências, eliminando qualquer necessidade de iteração sobre o vetor de valores (uma diferença notável do método FTCS, onde é necessário iterar sobre o vetor).&lt;br /&gt;
&lt;br /&gt;
== Resultados em Uma Dimensão e Discussão==&lt;br /&gt;
Como já há um trabalho que trata em detalhes a implementação unidimensional e seus resultados, irei comparar aqui ambas implementações. Abaixo, vemos alguns instantes comparando ambos métodos (FTCS e por Transformadas de Fourier) a partir de uma condição inicial aleatória, utillizando condições de contorno periódicas, com o maior valor da diferença entre os dois métodos destacado no topo. O valor das constantes relevantes são:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Delta t = \frac{1}{22 \cdot 10^{6}}, \Delta x = \frac{1}{128}, D = 1, \gamma = \Bigl(\frac{3.4}{128}\Bigr)^2, x_{max} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
É interessante citar que a escolha de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; como um valor tão específico não é em vão: a função RFFT utilizada no código apresenta maior rapidez de execução quando o vetor utilizado é de tamanho &amp;lt;math&amp;gt;2^n , n = 1, 2, 3, ...&amp;lt;/math&amp;gt;. Com este valor de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt;, nosso vetor é composto de 128 elementos, ou &amp;lt;math&amp;gt;2^7&amp;lt;/math&amp;gt; elementos, fazendo uso dessa vantagem.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:1d100passos.png]] [[Arquivo:1d1000passos.png]] [[Arquivo:1d10000.png]]&lt;br /&gt;
&lt;br /&gt;
Repare na mudança de limites no eixo vertical dos gráficos, a fim de ressaltar a posição dos valores maiores da diferença. Como podemos ver, a diferença dos valores entre os resultados obtidos pelo método FTCS e o método das transformadas é pequena (após poucos instantes o maior módulo da diferença aproxima-se de 0,01). A fim de avaliar com maior precisão a diferença entre ambos métodos,  quatro pontos foram escolhidos ao acaso, e a diferença de valor entre ambos métodos sob cada ponto foram graficadas, e podem ser vistas abaixo.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:diferencalog.png]]&lt;br /&gt;
&lt;br /&gt;
No gráfico acima, vemos que a diferença entre os valores varia erráticamente até logo após um tempo de 0.1. Repare que, logo em seguida, a diferença entre os pontos estabiliza em um certo valor. O comportamento do erro torna evidente que a diferença numérica entre ambos métodos se dá principalmente nos instantes iniciais, enquanto as concentrações aleatórias estão começando o processo de difusão. A estabilização da diferença indica que ambos métodos, para tempos mais longos, possuem diferença numérica mínima, somente preservando a diferença obtida no tempo inicial. &lt;br /&gt;
&lt;br /&gt;
É interessante citar que a escolha de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; como um valor tão específico não é em vão: a função RFFT utilizada no código apresenta maior rapidez de execução quando o vetor utilizado é de tamanho &amp;lt;math&amp;gt;2^n , n = 1, 2, 3, ...&amp;lt;/math&amp;gt;. Com este valor de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt;, nosso vetor é composto de 128 elementos, ou &amp;lt;math&amp;gt;2^7&amp;lt;/math&amp;gt; elementos, fazendo uso dessa vantagem. Dado a escala utilizada no sistema acima, os tempos de processamento foram pequenos. No entanto, para sistemas maiores (como o bidimensional), onde o número de operações necessárias aumenta drasticamente, o método das transformadas será distintamente ágil.&lt;br /&gt;
&lt;br /&gt;
== Código em Duas Dimensões ==&lt;br /&gt;
Todos códigos estão disponíveis na íntegra no final desta página. A fim de poupar tempo, quatro programas foram criados:&lt;br /&gt;
:- Um programa que gera, a partir de valores aleatórios parametrizados, dados até um certo instante de tempo, salvando-os em um arquivo.&lt;br /&gt;
:- Um programa que, lê um arquivo de valores já gerados e gera mais valores até um certo instante de tempo, salvando-os neste mesmo arquivo.&lt;br /&gt;
:- Um programa que lê um arquivo gerado previamente, criando frames dos valores salvos no arquivo.&lt;br /&gt;
:- Um programa que lê um arquivo gerado previamente, criando uma animação dos valores salvos no arquivo.&lt;br /&gt;
&lt;br /&gt;
Dois arquivos de formato .npy são criados, para armazenar os arrays e as informações necessárias para gerar mais valores ou plotar os gráficos, além de um .txt que serve como uma consulta local dos valores pelo usuário (arquivos .npy não podem ser lidos no bloco de notas). Todos arquivos são salvos em pastas individuias cujo nome é um número aleatório único, sendo este número o nome do arquivo de texto, o do arquivo .npy e o arquivo com os valores calculados.&lt;br /&gt;
Abaixo há o excerto da funcão, em Python, que calcula o instante seguinte do nosso sistema, utilizando as funções RFFT2 e IRFFT2 do pacote Scipy.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def cahnfourier2d(aa, kk2, kk4):&lt;br /&gt;
    cct = rfft2(aa)&lt;br /&gt;
    cct3 = rfft2(aa**3)&lt;br /&gt;
    cct = cct + difd*dt*(-kk2*(cct3 - cct) - kk4*cct)&lt;br /&gt;
    ccn = irfft2(cct)&lt;br /&gt;
    return ccn&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No código, kk2 e kk4 são os coeficientes elevados às respectivas potências, além de que k4 está multiplicado pelo valor de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;. Vale destacar a semelhança entre este código e o unidimensional, fruto da discretização quase idêntica.&lt;br /&gt;
&lt;br /&gt;
== Resultado em Duas Dimensões: Concentração Média 0 ==&lt;br /&gt;
Para todos resultados abaixo, foram utilizados as seguintes constantes relevantes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Delta t = \frac{1.8}{10^7}, \Delta x = \Delta y = \frac{1}{128}, D = 1, \gamma = 0.01^2, x_{max} = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Também foram utilizadas condições de contorno periódicas. Como observado anteriormente, o valor de &amp;lt;math&amp;gt;\Delta x&amp;lt;/math&amp;gt; escolhido serve para que nosso array de valores possua &amp;lt;math&amp;gt;10^{14}&amp;lt;/math&amp;gt; elementos, também fazendo uso da eficiência completa da função RFFT2 (equivalente bidimensional da função RFFT).&lt;br /&gt;
&lt;br /&gt;
O motivo de não explorarmos valores diferentes de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; nem de &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; está na sensibilidade da estabilidade da equação: pequenas mudanças na ordem de grandeza de qualquer uma das constantes pode resultar num sistema instável.&lt;br /&gt;
&lt;br /&gt;
Segue abaixo mídias da difusão sob estes parâmetros com concentração média 0. As cores variam de vermelho (-1) a violeta (+1), de modo que as cores variam de acordo com o espectro visível, onde a cor amarela corresponde a 0. A &amp;quot;baixa qualidade&amp;quot; das imagens se dá pelo tamanho de array utilizado (128x128), de modo que cada célula é distintamente visível nas mídias. Mesmo &amp;quot;pequeno&amp;quot;, o tamanho de array escolhido já permite a análise dos dados, além de ter um tempo de processamento rápido.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: NOPBCINICIAL.png|thumb|none|256px|Instante inicial com concentrações aleatórias.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: PBC BEM CEDO1.png|thumb|none|384px|Instante expandido a fim de demonstrar as condições de contorno periódicas. Esta imagem é composta por uma grade 3x3 de imagens iguais das de tamanho menor, dando origem a uma imagem de resolução 384x384.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FINALDOGIF1.png|frame|left|256px|Tempo: 0.011. Repare na rápida formação das fases.]][[Arquivo: NOPBCCURTO.gif|frame|center|256px|Tempo máximo da animação: 0.011.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FINALDOGIF2.png|frame|left|256px|Tempo: 0.3.]][[Arquivo: NOPBC03.gif|frame|center|256px|Tempo máximo da animação: 0.3. Este vídeo está acelerado em relação ao anterior. Repare na difusão das &amp;quot;bolhas&amp;quot; que não entraram em contato com outras concentrações. Repare que as outras concentrações crescem de tamanho conforme a bolha &amp;quot;difunde&amp;quot; no meio.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FINALDOGIF3.png|frame|left|256px|Tempo: 3. Repare no arredondamento da concentração singular que se formou.]] [[Arquivo: NOPBC3NOVO.gif|frame|center|256px|Tempo máximo da animação: 3. Este vídeo está acelerado em relação ao anterior.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: PBCFINAL5050.png|frame|none|384px|Tempo: 6. Aqui, as fases já atingiram a estabilidade. Utilizando da visualização expandida, podemos ver que uma das fases formou uma concentração circular, enquanto a outra ocupou o espaço remanescente.]] [[Arquivo: MOSTRANDO ESTABILIDADE.gif|frame|none|512px|Tempo máximo da animação: 6. Este vídeo está acelerado em relação ao anterior.]]&lt;br /&gt;
&lt;br /&gt;
== Resultado em Duas Dimensões: Concentração Média 0.5 ==&lt;br /&gt;
Abaixo seguem mídias da simulação de condições iniciais idênticas às anteriores, porém com concentração média inicial 0.5 (equivalente a 75% em uma fase e 25% em outra).&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FRAMEINICIAL.png|thumb|none|256px|Instante inicial com concentrações aleatórias. Repare nas cores serem majoritariamente verdes ou azuis, relativas à concentrações de valor positivo.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: DESTAQUEPBC.png|thumb|none|384px|Instante expandido a fim de demonstrar as condições de contorno periódicas. Esta imagem é composta por uma grade 3x3 de imagens iguais das de tamanho menor, dando origem a uma imagem de resolução 384x384.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FRAMENOVO10.png|frame|left|256px|Tempo: 0.010. Repare na rápida formação de concentrações pequenas da fase em minoria.]] [[Arquivo: TEMPOCURTO.gif|frame|center|256px|Tempo máximo da animação: 0.010.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FRAMENOVO11.png|frame|left|256px|Tempo: 0.3. Repare na homogenização da fase em maior quantidade.]] [[Arquivo: TMAX03.gif|frame|center|256px|Tempo máximo da animação: 0.3. Este vídeo está acelerado em relação ao anterior. Repare na difusão das &amp;quot;bolhas&amp;quot; que não entraram em contato com outras concentrações.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FRAMENOVO12.png|frame|left|256px|Tempo: 3. Repare na formação de 3 concentrações já circulares de forma.]] [[Arquivo: TMAX3.gif|frame|center|256px|Tempo máximo da animação: 3. Este vídeo está acelerado em relação ao anterior. Repare no início da difusão de uma das concentrações.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo: FINALPEQUENOCONC.png|thumb|none|384px|Tempo: 7. As fases já atingiram a estabilidade.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:GIFINAL GRANDE.gif|frame|none|512px|Tempo máximo da animação: 7. Este vídeo está acelerado em relação ao anterior.]]&lt;br /&gt;
&lt;br /&gt;
== Discussão dos resultados em duas dimensões==&lt;br /&gt;
Dado que, utilizando valores aleatórios, nosso sistema é equivalente a uma mistura homogênea com perturbações, percebemos instantaneamente a formação das regiões das diferentes fases.&lt;br /&gt;
&lt;br /&gt;
Após poucos instantes, já percebemos a separação completa das fases, com exceção das fronteiras, que apresentam uma mistura de ambas. É importante destacar que, conforme maiores as concentrações de fases se tornam, menor a velocidade que elas se &amp;quot;movem&amp;quot;. Ao lembrar que a equação de Cahn-Hilliard descreve a separação de fases em um sistema homogêneo termodiamicamente instável, que reduz sua energia conforme a separação delas, fica evidente que a desaçeleração da separação ocorre pela aproximação da sua energia atual à energia mínima do sistema. A redução da energia com o tempo pode ser visto no livro de S. Bulent Biner.&lt;br /&gt;
&lt;br /&gt;
Também percebemos que concentrações menores difundiam, quando não entravam em contato com outra concentração maior. Mesmo aparentando, em alguns momentos, desaparecer, na realidade a área das outras concentrações aumenta, de modo que a quantidade de cada fase se mantem igual.&lt;br /&gt;
&lt;br /&gt;
Percebemos que o estado de menor energia é uma concentração circular, enquanto o restante do meio é ocupado pela outra. Mesmo sem saber que este é o estado estacionário, poderíamos intuir que seria ele ao ver os instantes iniciais da simulação: o círculo é a forma que possui maior área por perímetro, e vimos que as fases diferentes difundem de modo a diminuir sua interface. No caso de uma quantidade diferente entre as fases, a de menor volume (ou neste caso, área) total, forma o círculo, caso contrário, a concentração que forma é escolhida &amp;quot;aleatoriamente&amp;quot; (depende dos locais das perturbações, que, no nosso caso, são aleatórias). O motivo de ambas fases poderem formar a concentração circular é o fato da equação possuir todos termos de expoente ímpar, de modo que valores positivos ou negativos são tradados da mesma maneira (ao contrário de termos com expoente par, que retornam um valor positivo independente do sinal, agindo de forma diferente dependendo do sinal do valor original).&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Todos códigos para resolução numérica em duas dimensões possuem, nas primeiras linhas, comentários que destacam quais valores o usuário é recomendado a alterar, além da semente aleatória utilizada para gerar as mídias vistas na página. Caso você não possua experiência com programação, é recomendado não alterar as linhas de código abaixo dos locais indicados.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2dfourier]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo código.npy principal, que consiste nos arrays.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;framer&amp;quot; e &amp;quot;animador&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2dfouriercontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. O arquivo com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo o arquivo antigo. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2dframer]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ele salvará os frames em uma pasta dentro da pasta com nome do código do arquivo, e serão numerados de acordo com qual frame da simulação ela se refere.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2danimador]]&#039;&#039;&#039; Programa utilizado para gerar as animações vistas neste trabalho. Os gifs são salvos em uma pasta dentro da pasta com nome do código do arquivo, com o nome dele identificando algumas características dele. Atente que, para computadores sem placa de vídeo dedicada, a renderização dos gifs pode levar muito tempo, em casos como este recomendo gerar as animações em menor resolução ou com intervalos maiores entre as imagens.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn1dcompare]]&#039;&#039;&#039; Código utilizado para gerar o frame de comparação em uma dimensão. Não recomendo acessá-lo, por não possuir um resultado interessante, além de não estar otimizado nem comentado.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn1ddiflog]]&#039;&#039;&#039; Código utilizado para avaliar a diferença entre os métodos em escala logarítmica. Não recomendo acessá-lo, por não possuir um resultado interessante, além de não estar otimizado nem comentado.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As bibliotecas utilizadas que requerem instalação são: Numpy, Scipy e Matplotlib. O renderizador de vídeo FFMPEG foi utilizado, porém na maioria dos computadores modernos executando Windows, na ausência deste, outro renderizador será utilizado sem necessidade de alterar o código. Porém, caso seja necessário instalar o renderizador, este link possui um tutorial simples em inglês para Windows: [https://stackoverflow.com/posts/65860115/revisions]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9178</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9178"/>
		<updated>2022-10-20T14:55:23Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação do Deslocamento Quadrático Médio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes quanto aos parâmetros, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Geração de Gráficos do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um &amp;quot;graficador&amp;quot; do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor de &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{x \to 0} Log_{10}x = - \infty&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9177</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9177"/>
		<updated>2022-10-20T14:54:58Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação do Deslocamento Quadrático Médio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes quanto aos parâmetros, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Geração de Gráficos do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um &amp;quot;graficador&amp;quot; do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor de &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{x \to -0} Log_{10}x = - \infty&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9176</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9176"/>
		<updated>2022-10-20T14:54:43Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação do Deslocamento Quadrático Médio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes quanto aos parâmetros, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Geração de Gráficos do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um &amp;quot;graficador&amp;quot; do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor de &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{x \to -0} Log_{10}x = - \infty&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9175</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9175"/>
		<updated>2022-10-20T14:54:12Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação do Deslocamento Quadrático Médio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes quanto aos parâmetros, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Geração de Gráficos do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um &amp;quot;graficador&amp;quot; do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor de &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; $\lim_{x \to -\infty} f(x)$ Log_{10}0 = - \infty&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9174</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9174"/>
		<updated>2022-10-20T14:52:57Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação da Geração de Gráfico do Momentum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes quanto aos parâmetros, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Geração de Gráficos do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um &amp;quot;graficador&amp;quot; do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9173</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9173"/>
		<updated>2022-10-20T14:52:47Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação da Graficação do Momentum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes quanto aos parâmetros, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Geração de Gráfico do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um &amp;quot;graficador&amp;quot; do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9172</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9172"/>
		<updated>2022-10-20T14:52:09Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação da Graficação do Momentum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes quanto aos parâmetros, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um &amp;quot;graficador&amp;quot; do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9171</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9171"/>
		<updated>2022-10-20T14:51:24Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Parâmetros das Simulações */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes quanto aos parâmetros, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9170</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9170"/>
		<updated>2022-10-20T14:48:41Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Parâmetros das Simulações */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9169</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9169"/>
		<updated>2022-10-20T14:47:48Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Parâmetros das Simulações */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas como exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas como exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9168</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9168"/>
		<updated>2022-10-20T14:47:17Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres em duas dimensões, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9167</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9167"/>
		<updated>2022-10-20T14:45:22Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Parâmetros das Simulações */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contém, além destes valores, os parâmetros utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9166</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9166"/>
		<updated>2022-10-20T14:43:42Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Parâmetros das Simulações */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os parâmetros restantes escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9165</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9165"/>
		<updated>2022-10-20T14:43:14Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação do Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9164</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9164"/>
		<updated>2022-10-20T14:43:06Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação do Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais, indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9163</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9163"/>
		<updated>2022-10-20T14:42:33Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação do Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força, sofrendo influência do ruído somente. Logo, os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9162</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9162"/>
		<updated>2022-10-20T14:41:43Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Implementação do Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por nenhuma força além do ruído, então os passos do método que envolvem &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9161</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9161"/>
		<updated>2022-10-20T14:40:47Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc), no entanto o único utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9160</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9160"/>
		<updated>2022-10-20T14:40:13Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9159</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9159"/>
		<updated>2022-10-20T14:39:38Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aqui, &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando a &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9158</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9158"/>
		<updated>2022-10-20T14:38:45Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata da eq. &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando a &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9157</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9157"/>
		<updated>2022-10-20T14:38:17Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata &amp;lt;math&amp;gt;(I)&amp;lt;/math&amp;gt; para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando a &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9156</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9156"/>
		<updated>2022-10-20T14:37:53Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Método BAOAB */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de movimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata (I) para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando a &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9155</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9155"/>
		<updated>2022-10-20T14:33:02Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Equação de Langevin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt, \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
onde &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; é a dimensão do sistema.&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de mvimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata (I) para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando a &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9154</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9154"/>
		<updated>2022-10-20T14:31:45Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Equação de Langevin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível obter analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de mvimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata (I) para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando a &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9153</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9153"/>
		<updated>2022-10-20T14:31:16Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Equação de Langevin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultaneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluido, sujeita à força de atrito excercida pelas partículas do fluido. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluido e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de mvimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata (I) para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando a &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9088</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9088"/>
		<updated>2022-10-19T20:05:06Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de mvimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata (I) para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando a &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9087</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9087"/>
		<updated>2022-10-19T20:04:40Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Códigos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver numélericamente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum linear.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t). \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (III)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, que pode ser encontrado no livro escrito por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações de mvimento.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata (I) para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo espacial, a &amp;quot;B&amp;quot; realiza meio passo para o momentum utilizando a &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, que seria uma a força aplicada à partícula, e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação de forma exata.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto e em 2D) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|none|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]][[Arquivo:printlangevin.jpg|thumb|none|500px|Captura do último frame da animação a cima.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420, que deve ser utilizada junto com as condições iniciais ,indicadas na imagem, no código disponibilizado para reproduzir o resultado apresentado.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (II) e da relação de Einstein em (III), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo val#código.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9006</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=9006"/>
		<updated>2022-10-19T04:07:07Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Análise do Momentum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann &amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura parece &amp;quot;estender&amp;quot; o limite da função, diminuindo seu pico. Em contrapartida, os diferentes valores de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; não afetam as funções independente da temperatura. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8986</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8986"/>
		<updated>2022-10-19T00:55:53Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Equação de Langevin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e desvio padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8913</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8913"/>
		<updated>2022-10-18T21:13:50Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, densidade de probabilidade de momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Dentro do Git podem ser encontrados 3 códigos:&lt;br /&gt;
&lt;br /&gt;
:- BAOABlangavin.py; é escrito orientado a objeto e realiza a dinâmica com ou sem um potencial e ao final gera um arquivo com informações e dados.&lt;br /&gt;
:- lan_anim.py e plotlangevin.py; geram respectivamente uma animação e gráfico de MSD, que para funcionar necessitam de informações do arquivo gerado anteriormente. &lt;br /&gt;
&lt;br /&gt;
Instruções mais precisas e dicas se encontram nos comentários dos códigos.:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8904</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8904"/>
		<updated>2022-10-18T21:01:11Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Códigos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, Momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
dfisads:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Referências ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Lmsd&amp;diff=8903</id>
		<title>Lmsd</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Lmsd&amp;diff=8903"/>
		<updated>2022-10-18T20:57:46Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: Criou página com &amp;#039;&amp;lt;source lang = python&amp;gt; import numpy as np import matplotlib.pyplot as plt import os  codigo = ( #DIGITE O CÓDIGO AQUI 813447 ) divisoes = int( #DIVISOES PRA FATIAR 1000 )  va...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
codigo = (&lt;br /&gt;
#DIGITE O CÓDIGO AQUI&lt;br /&gt;
813447&lt;br /&gt;
)&lt;br /&gt;
divisoes = int(&lt;br /&gt;
#DIVISOES PRA FATIAR&lt;br /&gt;
1000&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
valores = np.load(f&amp;quot;.\\#{codigo}\\val#{codigo}.npy&amp;quot;)&lt;br /&gt;
(&lt;br /&gt;
intervalo,      alfa,           beta,           gaminha,        temp,&lt;br /&gt;
dt,             tmax,           npar,           seedinicial&lt;br /&gt;
) = (&lt;br /&gt;
valores[0],     valores[1],     valores[2],     valores[3],     valores[4],&lt;br /&gt;
valores[5],     valores[6],     valores[7],     valores[8]&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
tmax = int(tmax)&lt;br /&gt;
&lt;br /&gt;
temp = int(temp)&lt;br /&gt;
&lt;br /&gt;
estadoaleatorio = tuple(np.load(f&amp;quot;.\\#{codigo}\\state#{codigo}.npy&amp;quot;, allow_pickle = True))&lt;br /&gt;
&lt;br /&gt;
xy = np.load(f&amp;quot;.\\#{codigo}\\xy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
pxy = np.load(f&amp;quot;.\\#{codigo}\\pxy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
npassos = int(np.round(tmax/dt))&lt;br /&gt;
&lt;br /&gt;
nsalvos = int((npassos/intervalo) + 1)&lt;br /&gt;
&lt;br /&gt;
tempos = np.linspace(0, tmax, nsalvos)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize = (6,6))&lt;br /&gt;
&lt;br /&gt;
novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
desviodividido = np.zeros(novotamanho)&lt;br /&gt;
indice = novotamanho - 1&lt;br /&gt;
xx = xy[:, 0]&lt;br /&gt;
yy = xy[:, 1]&lt;br /&gt;
for i in range(divisoes):&lt;br /&gt;
    xini = xx[i*indice]&lt;br /&gt;
    yini = yy[i*indice]&lt;br /&gt;
    dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
    dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
    desviodividido += dx**2 + dy**2&lt;br /&gt;
desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
eixox = np.log10(eixox)&lt;br /&gt;
desviodividido = np.log10(desviodividido)&lt;br /&gt;
balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
plt.text(2.15, -3, r&amp;quot;D&amp;quot; + f&amp;quot; analítico: {temp/gaminha}\n&amp;quot; + r&amp;quot;D&amp;quot; + f&amp;quot; calculado: {dezao:.3f}&amp;quot;, bbox=dict(boxstyle=&#039;square&#039;, ec=&#039;k&#039;, color=&#039;white&#039;))&lt;br /&gt;
plt.plot(eixox, reta1, color = &amp;quot;red&amp;quot;, label = f&amp;quot;Inclinação da reta: {bal[0]:.2f}&amp;quot;, alpha = 0.4)&lt;br /&gt;
plt.plot(eixox, reta2, color = &amp;quot;purple&amp;quot;, label = f&amp;quot;Inclinação da reta: {dif[0]:.2f}&amp;quot;, alpha = 0.4)&lt;br /&gt;
plt.axvline(-np.log10(gaminha) + 1, label = f&amp;quot;Início do regime\nnormalmente difusivo:\ntempo = {int(10/gaminha)}&amp;quot;, c = &amp;quot;orange&amp;quot;)&lt;br /&gt;
plt.grid()&lt;br /&gt;
#plt.scatter(eixox[:int(1000000000)], desviodividido[:int(1000000000)], s = 10)&lt;br /&gt;
plt.xlabel(r&#039;$log_{10}(t)$&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$log_{10}(\left|\vec{r}\right|^{2})$&#039;)&lt;br /&gt;
plt.ylim(-4, 5)&lt;br /&gt;
plt.xlim(-4, 5)&lt;br /&gt;
plt.legend(loc = 2)&lt;br /&gt;
plt.gca().set_aspect(&#039;equal&#039;, adjustable=&#039;box&#039;)&lt;br /&gt;
plt.title(f&#039;MSD de uma partícula livre:\n&#039;+&lt;br /&gt;
r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Fatias = {divisoes}&#039;)&lt;br /&gt;
&lt;br /&gt;
plt.savefig(f&amp;quot;.\\ANIMMSD\\{0}.png&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Lpdf&amp;diff=8902</id>
		<title>Lpdf</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Lpdf&amp;diff=8902"/>
		<updated>2022-10-18T20:57:27Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: Criou página com &amp;#039;&amp;lt;source lang = python&amp;gt; import numpy as np import matplotlib.pyplot as plt import os  codigo = ( #DIGITE O CÓDIGO AQUI 813447 )  valores = np.load(f&amp;quot;.\\#{codigo}\\val#{codigo}...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
codigo = (&lt;br /&gt;
#DIGITE O CÓDIGO AQUI&lt;br /&gt;
813447&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
valores = np.load(f&amp;quot;.\\#{codigo}\\val#{codigo}.npy&amp;quot;)&lt;br /&gt;
(&lt;br /&gt;
intervalo,      alfa,           beta,           gaminha,        temp,&lt;br /&gt;
dt,             tmax,           npar,           seedinicial&lt;br /&gt;
) = (&lt;br /&gt;
valores[0],     valores[1],     valores[2],     valores[3],     valores[4],&lt;br /&gt;
valores[5],     valores[6],     valores[7],     valores[8]&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
tmax = int(tmax)&lt;br /&gt;
&lt;br /&gt;
temp = int(temp)&lt;br /&gt;
&lt;br /&gt;
estadoaleatorio = tuple(np.load(f&amp;quot;.\\#{codigo}\\state#{codigo}.npy&amp;quot;, allow_pickle = True))&lt;br /&gt;
&lt;br /&gt;
xy = np.load(f&amp;quot;.\\#{codigo}\\xy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
pxy = np.load(f&amp;quot;.\\#{codigo}\\pxy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
npassos = int(np.round(tmax/dt))&lt;br /&gt;
&lt;br /&gt;
nsalvos = int((npassos/intervalo) + 1)&lt;br /&gt;
&lt;br /&gt;
tempos = np.linspace(0, tmax, nsalvos)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize = (6,6))&lt;br /&gt;
&lt;br /&gt;
p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
#MOMENTUM MAIS COMUM&lt;br /&gt;
n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
maior = np.argmax(n)&lt;br /&gt;
pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
#MOMENTUM MEDIO&lt;br /&gt;
pmed = np.mean(p)&lt;br /&gt;
plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
#MOMENTUM QUADRADO MEDIO&lt;br /&gt;
pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
plt.xlim(0, 7)&lt;br /&gt;
plt.ylim(0, 0.7)&lt;br /&gt;
plt.grid(alpha = 0.3)&lt;br /&gt;
plt.legend(loc = 1)&lt;br /&gt;
plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&lt;br /&gt;
plt.hist(p[:1000000001], 500, histtype = &amp;quot;step&amp;quot;,  density = True, color = &amp;quot;orange&amp;quot;, alpha = 0.5)&lt;br /&gt;
&lt;br /&gt;
plt.savefig(f&amp;quot;.\\ANIMPDF\\{1000000001}.png&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Lpos&amp;diff=8901</id>
		<title>Lpos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Lpos&amp;diff=8901"/>
		<updated>2022-10-18T20:57:09Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: Criou página com &amp;#039;&amp;lt;source lang = python&amp;gt; import numpy as np import matplotlib.pyplot as plt import os  codigo = ( #DIGITE O CÓDIGO AQUI 813447 ) divisoes = int( #DIVISOES PRA FATIAR 1000 )  va...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
codigo = (&lt;br /&gt;
#DIGITE O CÓDIGO AQUI&lt;br /&gt;
813447&lt;br /&gt;
)&lt;br /&gt;
divisoes = int(&lt;br /&gt;
#DIVISOES PRA FATIAR&lt;br /&gt;
1000&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
valores = np.load(f&amp;quot;.\\#{codigo}\\val#{codigo}.npy&amp;quot;)&lt;br /&gt;
(&lt;br /&gt;
intervalo,      alfa,           beta,           gaminha,        temp,&lt;br /&gt;
dt,             tmax,           npar,           seedinicial&lt;br /&gt;
) = (&lt;br /&gt;
valores[0],     valores[1],     valores[2],     valores[3],     valores[4],&lt;br /&gt;
valores[5],     valores[6],     valores[7],     valores[8]&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
tmax = int(tmax)&lt;br /&gt;
&lt;br /&gt;
temp = int(temp)&lt;br /&gt;
&lt;br /&gt;
estadoaleatorio = tuple(np.load(f&amp;quot;.\\#{codigo}\\state#{codigo}.npy&amp;quot;, allow_pickle = True))&lt;br /&gt;
&lt;br /&gt;
xy = np.load(f&amp;quot;.\\#{codigo}\\xy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
pxy = np.load(f&amp;quot;.\\#{codigo}\\pxy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
npassos = int(np.round(tmax/dt))&lt;br /&gt;
&lt;br /&gt;
nsalvos = int((npassos/intervalo) + 1)&lt;br /&gt;
&lt;br /&gt;
tempos = np.linspace(0, tmax, nsalvos)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize = (6,6))&lt;br /&gt;
&lt;br /&gt;
novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
indice = novotamanho - 1&lt;br /&gt;
print(indice)&lt;br /&gt;
xx = xy[:, 0]&lt;br /&gt;
yy = xy[:, 1]&lt;br /&gt;
for i in range(divisoes):&lt;br /&gt;
    xini = xx[i*indice]&lt;br /&gt;
    yini = yy[i*indice]&lt;br /&gt;
    #plt.scatter(xx[i*indice : 10001+(i)*indice] - xini, yy[i*indice : 10001+(i)*indice] - yini, alpha = 0.025, s = 0.5)&lt;br /&gt;
    plt.title(&amp;quot;Rastro das 1000 Partículas no Espaço\n&amp;quot; + r&amp;quot;Tempo efetivo: 500&amp;quot;)&lt;br /&gt;
    plt.xlabel(r&amp;quot;$x$&amp;quot;)&lt;br /&gt;
    plt.ylabel(r&amp;quot;$y$&amp;quot;)&lt;br /&gt;
    plt.scatter(xx[i*indice : 1+(i+1)*indice:10] - xini, yy[i*indice : 1+(i+1)*indice:10] - yini, alpha = 0.025, s = 0.5)&lt;br /&gt;
&lt;br /&gt;
plt.xlim(-150, 150)&lt;br /&gt;
&lt;br /&gt;
plt.ylim(-150, 150)&lt;br /&gt;
&lt;br /&gt;
plt.savefig(f&amp;quot;.\\ANIMPOS\\{6}.png&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#plt.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Lcontinue&amp;diff=8900</id>
		<title>Lcontinue</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Lcontinue&amp;diff=8900"/>
		<updated>2022-10-18T20:56:43Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: Criou página com &amp;#039;&amp;lt;source lang = python&amp;gt; import numpy as np import matplotlib.pyplot as plt #region funcoes def potencial(pos):     forca = np.zeros(2)     forca[0] = -4*alfa*(pos[0]**3) + 2*be...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
#region funcoes&lt;br /&gt;
def potencial(pos):&lt;br /&gt;
    forca = np.zeros(2)&lt;br /&gt;
    forca[0] = -4*alfa*(pos[0]**3) + 2*beta*pos[0]&lt;br /&gt;
    forca[1] = -4*alfa*(pos[1]**3) + 2*beta*pos[1]&lt;br /&gt;
    return forca&lt;br /&gt;
#endregion&lt;br /&gt;
&lt;br /&gt;
codigo = (&lt;br /&gt;
#DIGITE O CÓDIGO AQUI&lt;br /&gt;
201446&lt;br /&gt;
)&lt;br /&gt;
tnovo = (&lt;br /&gt;
500000&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
valores = np.load(f&amp;quot;.\\#{codigo}\\val#{codigo}.npy&amp;quot;)&lt;br /&gt;
(&lt;br /&gt;
intervalo,      alfa,           beta,           gaminha,        temp,&lt;br /&gt;
dt,             tmax,           npar,           seedinicial&lt;br /&gt;
) = (&lt;br /&gt;
valores[0],     valores[1],     valores[2],     valores[3],     valores[4],&lt;br /&gt;
valores[5],     valores[6],     valores[7],     valores[8]&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
estadoaleatorio = tuple(np.load(f&amp;quot;.\\#{codigo}\\state#{codigo}.npy&amp;quot;, allow_pickle = True))&lt;br /&gt;
&lt;br /&gt;
xy = np.load(f&amp;quot;.\\#{codigo}\\xy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
pxy = np.load(f&amp;quot;.\\#{codigo}\\pxy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
np.random.set_state(estadoaleatorio)&lt;br /&gt;
&lt;br /&gt;
npassos = int(np.round((tnovo - tmax)/dt))&lt;br /&gt;
&lt;br /&gt;
nsalvos = int((npassos/intervalo) + 1)&lt;br /&gt;
&lt;br /&gt;
c1 = np.exp(-gaminha*dt)&lt;br /&gt;
&lt;br /&gt;
c2  = (np.sqrt(1 - np.exp(-2*gaminha*dt)))*np.sqrt(temp)&lt;br /&gt;
&lt;br /&gt;
aleatorios = np.random.normal(0, 1, size = (npassos, 2)) * c2&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Tudo pronto, hora de começar!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xyatual = xy[-1]&lt;br /&gt;
&lt;br /&gt;
pxyatual = pxy[-1]&lt;br /&gt;
&lt;br /&gt;
xynovo = np.zeros((nsalvos, 2))&lt;br /&gt;
&lt;br /&gt;
pxynovo = np.zeros((nsalvos, 2))&lt;br /&gt;
&lt;br /&gt;
salvador = int(0)&lt;br /&gt;
&lt;br /&gt;
for i in range(0, npassos):&lt;br /&gt;
    #BAOAB 2D SEM PBC COM CAMPO&lt;br /&gt;
    #B&lt;br /&gt;
    pxytemp = pxyatual + dt * (potencial(xyatual))/2&lt;br /&gt;
    #A&lt;br /&gt;
    xytemp = xyatual + dt*pxytemp/2&lt;br /&gt;
    #O&lt;br /&gt;
    pxylinha = c1*pxytemp + aleatorios[i]&lt;br /&gt;
    #A&lt;br /&gt;
    xyatual = xytemp + dt*pxylinha/2&lt;br /&gt;
    #B&lt;br /&gt;
    pxyatual = pxylinha + dt * (potencial(xyatual))/2&lt;br /&gt;
    #FIM DO BAOAB, HORA DE SALVAR&lt;br /&gt;
    salvador+=1&lt;br /&gt;
    if salvador%intervalo == 0:&lt;br /&gt;
        xynovo[int(salvador/intervalo)] = xyatual&lt;br /&gt;
        pxynovo[int(salvador/intervalo)] = pxyatual&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Acabou, hora de salvar!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xy = np.append(xy, xynovo[1:], axis = 0)&lt;br /&gt;
&lt;br /&gt;
pxy = np.append(pxy, pxynovo[1:], axis = 0)&lt;br /&gt;
&lt;br /&gt;
estadoaleatorio = np.random.get_state()&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;O código será {codigo}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
tmax = tnovo&lt;br /&gt;
&lt;br /&gt;
informacoesleitura = (f&amp;quot;&amp;quot;&amp;quot;Infos do código {codigo}&lt;br /&gt;
intervalo = int(&lt;br /&gt;
#DE QUANTOS EM QUANTOS O PROGRAMA SALVA OS DADOS (EVITA ARQUIVOS EXCESSIVAMENTE PESADOS PRA TEMPOS LONGOS)&lt;br /&gt;
#OU DTS PEQUENOS, 1 PRA USAR TODOS&lt;br /&gt;
{intervalo}&lt;br /&gt;
)&lt;br /&gt;
#ALFA E BETA SÃO DO CAMPO POTENCIAL&lt;br /&gt;
alfa = (&lt;br /&gt;
{alfa}&lt;br /&gt;
)&lt;br /&gt;
beta = (&lt;br /&gt;
{beta}&lt;br /&gt;
)&lt;br /&gt;
gaminha = (&lt;br /&gt;
#RELATIVO AO RUIDO ESTOCASTICO&lt;br /&gt;
{gaminha}&lt;br /&gt;
)&lt;br /&gt;
temp = (&lt;br /&gt;
{temp}&lt;br /&gt;
)&lt;br /&gt;
dt = (&lt;br /&gt;
{dt}&lt;br /&gt;
)&lt;br /&gt;
t = (&lt;br /&gt;
{tmax}&lt;br /&gt;
)&lt;br /&gt;
seedinicial = (&lt;br /&gt;
#SÓ USE DE NOVO SE FOR PRA FAZER DO ZERO IGUAL&lt;br /&gt;
{seedinicial}&lt;br /&gt;
)&amp;quot;&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
valores = np.zeros(9)&lt;br /&gt;
(&lt;br /&gt;
valores[0],     valores[1],     valores[2],     valores[3],     valores[4],&lt;br /&gt;
valores[5],     valores[6],     valores[7],     valores[8]&lt;br /&gt;
) = (&lt;br /&gt;
intervalo,      alfa,           beta,           gaminha,        temp,&lt;br /&gt;
dt,             tmax,           npar,           seedinicial&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Hora de salvar os arquivos...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
np.save(f&amp;quot;.\\#{codigo}\\state#{codigo}.npy&amp;quot;, estadoaleatorio, allow_pickle = True)&lt;br /&gt;
&lt;br /&gt;
np.save(f&amp;quot;.\\#{codigo}\\val#{codigo}.npy&amp;quot;, valores)&lt;br /&gt;
&lt;br /&gt;
np.save(f&amp;quot;.\\#{codigo}\\xy#{codigo}.npy&amp;quot;, xy)&lt;br /&gt;
&lt;br /&gt;
np.save(f&amp;quot;.\\#{codigo}\\pxy#{codigo}.npy&amp;quot;, pxy)&lt;br /&gt;
&lt;br /&gt;
arquivo = open(f&amp;quot;.\\#{codigo}\\info#{codigo}.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
arquivo.write(f&amp;quot;{informacoesleitura}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
arquivo.close()&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;Tudo certo! Código {codigo}.&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Lleitor&amp;diff=8899</id>
		<title>Lleitor</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Lleitor&amp;diff=8899"/>
		<updated>2022-10-18T20:56:06Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
codigo = (&lt;br /&gt;
#DIGITE O CÓDIGO AQUI&lt;br /&gt;
54316&lt;br /&gt;
)&lt;br /&gt;
modo = (&lt;br /&gt;
#OPCOES: X, Y, PX, PY, P, POS, MSD, COEFDIF&lt;br /&gt;
&amp;quot;MSD&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
divisoes = int(&lt;br /&gt;
#DIVISOES PRA FATIAR&lt;br /&gt;
1000&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
valores = np.load(f&amp;quot;.\\#{codigo}\\val#{codigo}.npy&amp;quot;)&lt;br /&gt;
(&lt;br /&gt;
intervalo,      alfa,           beta,           gaminha,        temp,&lt;br /&gt;
dt,             tmax,           npar,           seedinicial&lt;br /&gt;
) = (&lt;br /&gt;
valores[0],     valores[1],     valores[2],     valores[3],     valores[4],&lt;br /&gt;
valores[5],     valores[6],     valores[7],     valores[8]&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
tmax = int(tmax)&lt;br /&gt;
&lt;br /&gt;
temp = int(temp)&lt;br /&gt;
&lt;br /&gt;
estadoaleatorio = tuple(np.load(f&amp;quot;.\\#{codigo}\\state#{codigo}.npy&amp;quot;, allow_pickle = True))&lt;br /&gt;
&lt;br /&gt;
xy = np.load(f&amp;quot;.\\#{codigo}\\xy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
pxy = np.load(f&amp;quot;.\\#{codigo}\\pxy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
npassos = int(np.round(tmax/dt))&lt;br /&gt;
&lt;br /&gt;
nsalvos = int((npassos/intervalo) + 1)&lt;br /&gt;
&lt;br /&gt;
tempos = np.linspace(0, tmax, nsalvos)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize = (6,6))&lt;br /&gt;
&lt;br /&gt;
if int((nsalvos - 1)) % divisoes != 0:&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;X&amp;quot;:&lt;br /&gt;
    plt.scatter(tempos, xy[:,0])&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;Y&amp;quot;:&lt;br /&gt;
    plt.scatter(tempos, xy[:,1])&lt;br /&gt;
        &lt;br /&gt;
if modo == &amp;quot;PX&amp;quot;:&lt;br /&gt;
    plt.hist(pxy[:,0], 50)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum x\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
        &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;PY&amp;quot;:&lt;br /&gt;
    plt.hist(pxy[:,1], 50)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum y\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;POS&amp;quot;:&lt;br /&gt;
    plt.scatter(xy[:,0], xy[:,1], color = &amp;quot;blue&amp;quot;, s = 0.1)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
    plt.text(2.15, -3, r&amp;quot;D&amp;quot; + f&amp;quot; analítico: {temp/gaminha}\n&amp;quot; + r&amp;quot;D&amp;quot; + f&amp;quot; calculado: {dezao:.3f}&amp;quot;, bbox=dict(boxstyle=&#039;square&#039;, ec=&#039;k&#039;, color=&#039;white&#039;))&lt;br /&gt;
    plt.plot(eixox, reta1, color = &amp;quot;red&amp;quot;, label = f&amp;quot;Inclinação da reta: {bal[0]:.2f}&amp;quot;, alpha = 0.4)&lt;br /&gt;
    plt.plot(eixox, reta2, color = &amp;quot;purple&amp;quot;, label = f&amp;quot;Inclinação da reta: {dif[0]:.2f}&amp;quot;, alpha = 0.4)&lt;br /&gt;
    plt.axvline(-np.log10(gaminha) + 1, label = f&amp;quot;Início do regime\nnormalmente difusivo:\ntempo = {int(10/gaminha)}&amp;quot;, c = &amp;quot;orange&amp;quot;)&lt;br /&gt;
    plt.grid()&lt;br /&gt;
    plt.scatter(eixox, desviodividido, s = 1)&lt;br /&gt;
    plt.xlabel(r&#039;$log_{10}(t)$&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$log_{10}(\left|\vec{r}\right|^{2})$&#039;)&lt;br /&gt;
    plt.ylim(-4, 5)&lt;br /&gt;
    plt.xlim(-4, 5)&lt;br /&gt;
    plt.legend(loc = 2)&lt;br /&gt;
    plt.gca().set_aspect(&#039;equal&#039;, adjustable=&#039;box&#039;)&lt;br /&gt;
    plt.title(f&#039;MSD de uma partícula livre:\n&#039;+&lt;br /&gt;
    r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Fatias = {divisoes}&#039;)&lt;br /&gt;
    &lt;br /&gt;
if modo == &amp;quot;COEFDIF&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)&lt;br /&gt;
    inicio = novotamanho - 1&lt;br /&gt;
    final = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*inicio]&lt;br /&gt;
        yini = yy[i*inicio]&lt;br /&gt;
        dx = xx[i*inicio : 1+(i+1)*final] - xini&lt;br /&gt;
        dy = yy[i*inicio : 1+(i+1)*final] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = desviodividido/divisoes&lt;br /&gt;
&lt;br /&gt;
    tempoinicial = 10/gaminha&lt;br /&gt;
    tempofinal = dt*len(desviodividido)&lt;br /&gt;
    desviodividido = desviodividido[int(tempoinicial/dt):]&lt;br /&gt;
    tempos = np.linspace(tempoinicial,tempofinal, len(desviodividido))&lt;br /&gt;
    dezao = np.mean(desviodividido/tempos)/4&lt;br /&gt;
    print(temp/gaminha, dezao)&lt;br /&gt;
    tempos = np.log10(tempos)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    plt.axvline(-np.log10(gaminha) + 1)&lt;br /&gt;
    plt.scatter(tempos, desviodividido, s = 1)&lt;br /&gt;
    &lt;br /&gt;
os.makedirs(f&amp;quot;.\\{modo}&amp;quot;, exist_ok = True)&lt;br /&gt;
plt.savefig(f&amp;quot;.\\{modo}\\{modo}#{codigo}.png&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Último código: {codigo}&amp;quot;)&lt;br /&gt;
#plt.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Lleitor&amp;diff=8898</id>
		<title>Lleitor</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Lleitor&amp;diff=8898"/>
		<updated>2022-10-18T20:55:49Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: Criou página com &amp;#039;import numpy as np import matplotlib.pyplot as plt import os  codigo = ( #DIGITE O CÓDIGO AQUI 54316 ) modo = ( #OPCOES: X, Y, PX, PY, P, POS, MSD, COEFDIF &amp;quot;MSD&amp;quot; ) divisoes =...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
codigo = (&lt;br /&gt;
#DIGITE O CÓDIGO AQUI&lt;br /&gt;
54316&lt;br /&gt;
)&lt;br /&gt;
modo = (&lt;br /&gt;
#OPCOES: X, Y, PX, PY, P, POS, MSD, COEFDIF&lt;br /&gt;
&amp;quot;MSD&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
divisoes = int(&lt;br /&gt;
#DIVISOES PRA FATIAR&lt;br /&gt;
1000&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
valores = np.load(f&amp;quot;.\\#{codigo}\\val#{codigo}.npy&amp;quot;)&lt;br /&gt;
(&lt;br /&gt;
intervalo,      alfa,           beta,           gaminha,        temp,&lt;br /&gt;
dt,             tmax,           npar,           seedinicial&lt;br /&gt;
) = (&lt;br /&gt;
valores[0],     valores[1],     valores[2],     valores[3],     valores[4],&lt;br /&gt;
valores[5],     valores[6],     valores[7],     valores[8]&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
tmax = int(tmax)&lt;br /&gt;
&lt;br /&gt;
temp = int(temp)&lt;br /&gt;
&lt;br /&gt;
estadoaleatorio = tuple(np.load(f&amp;quot;.\\#{codigo}\\state#{codigo}.npy&amp;quot;, allow_pickle = True))&lt;br /&gt;
&lt;br /&gt;
xy = np.load(f&amp;quot;.\\#{codigo}\\xy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
pxy = np.load(f&amp;quot;.\\#{codigo}\\pxy#{codigo}.npy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
npassos = int(np.round(tmax/dt))&lt;br /&gt;
&lt;br /&gt;
nsalvos = int((npassos/intervalo) + 1)&lt;br /&gt;
&lt;br /&gt;
tempos = np.linspace(0, tmax, nsalvos)&lt;br /&gt;
&lt;br /&gt;
plt.figure(figsize = (6,6))&lt;br /&gt;
&lt;br /&gt;
if int((nsalvos - 1)) % divisoes != 0:&lt;br /&gt;
    exit()&lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;X&amp;quot;:&lt;br /&gt;
    plt.scatter(tempos, xy[:,0])&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;Y&amp;quot;:&lt;br /&gt;
    plt.scatter(tempos, xy[:,1])&lt;br /&gt;
        &lt;br /&gt;
if modo == &amp;quot;PX&amp;quot;:&lt;br /&gt;
    plt.hist(pxy[:,0], 50)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum x\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
        &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;PY&amp;quot;:&lt;br /&gt;
    plt.hist(pxy[:,1], 50)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum y\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;POS&amp;quot;:&lt;br /&gt;
    plt.scatter(xy[:,0], xy[:,1], color = &amp;quot;blue&amp;quot;, s = 0.1)&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
    plt.text(2.15, -3, r&amp;quot;D&amp;quot; + f&amp;quot; analítico: {temp/gaminha}\n&amp;quot; + r&amp;quot;D&amp;quot; + f&amp;quot; calculado: {dezao:.3f}&amp;quot;, bbox=dict(boxstyle=&#039;square&#039;, ec=&#039;k&#039;, color=&#039;white&#039;))&lt;br /&gt;
    plt.plot(eixox, reta1, color = &amp;quot;red&amp;quot;, label = f&amp;quot;Inclinação da reta: {bal[0]:.2f}&amp;quot;, alpha = 0.4)&lt;br /&gt;
    plt.plot(eixox, reta2, color = &amp;quot;purple&amp;quot;, label = f&amp;quot;Inclinação da reta: {dif[0]:.2f}&amp;quot;, alpha = 0.4)&lt;br /&gt;
    plt.axvline(-np.log10(gaminha) + 1, label = f&amp;quot;Início do regime\nnormalmente difusivo:\ntempo = {int(10/gaminha)}&amp;quot;, c = &amp;quot;orange&amp;quot;)&lt;br /&gt;
    plt.grid()&lt;br /&gt;
    plt.scatter(eixox, desviodividido, s = 1)&lt;br /&gt;
    plt.xlabel(r&#039;$log_{10}(t)$&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$log_{10}(\left|\vec{r}\right|^{2})$&#039;)&lt;br /&gt;
    plt.ylim(-4, 5)&lt;br /&gt;
    plt.xlim(-4, 5)&lt;br /&gt;
    plt.legend(loc = 2)&lt;br /&gt;
    plt.gca().set_aspect(&#039;equal&#039;, adjustable=&#039;box&#039;)&lt;br /&gt;
    plt.title(f&#039;MSD de uma partícula livre:\n&#039;+&lt;br /&gt;
    r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Fatias = {divisoes}&#039;)&lt;br /&gt;
    &lt;br /&gt;
if modo == &amp;quot;COEFDIF&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)&lt;br /&gt;
    inicio = novotamanho - 1&lt;br /&gt;
    final = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*inicio]&lt;br /&gt;
        yini = yy[i*inicio]&lt;br /&gt;
        dx = xx[i*inicio : 1+(i+1)*final] - xini&lt;br /&gt;
        dy = yy[i*inicio : 1+(i+1)*final] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = desviodividido/divisoes&lt;br /&gt;
&lt;br /&gt;
    tempoinicial = 10/gaminha&lt;br /&gt;
    tempofinal = dt*len(desviodividido)&lt;br /&gt;
    desviodividido = desviodividido[int(tempoinicial/dt):]&lt;br /&gt;
    tempos = np.linspace(tempoinicial,tempofinal, len(desviodividido))&lt;br /&gt;
    dezao = np.mean(desviodividido/tempos)/4&lt;br /&gt;
    print(temp/gaminha, dezao)&lt;br /&gt;
    tempos = np.log10(tempos)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    plt.axvline(-np.log10(gaminha) + 1)&lt;br /&gt;
    plt.scatter(tempos, desviodividido, s = 1)&lt;br /&gt;
    &lt;br /&gt;
os.makedirs(f&amp;quot;.\\{modo}&amp;quot;, exist_ok = True)&lt;br /&gt;
plt.savefig(f&amp;quot;.\\{modo}\\{modo}#{codigo}.png&amp;quot;)&lt;br /&gt;
print(f&amp;quot;Último código: {codigo}&amp;quot;)&lt;br /&gt;
#plt.show()&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8897</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8897"/>
		<updated>2022-10-18T20:55:19Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Códigos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Evolução temporal da posição, Momentum e MSD de 1000 partículas regidas pela Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
dfisads:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo. A semente aleatória para gerar os valores utilizados nesse trabalho estão comentados no arquivo lstart.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Referências ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Lstart&amp;diff=8895</id>
		<title>Lstart</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Lstart&amp;diff=8895"/>
		<updated>2022-10-18T20:54:06Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: Criou página com &amp;#039;&amp;lt;source lang = python&amp;gt; import numpy as np import os  #baoab 1 par 2d unidades reduzidas com maior cuidado, salva em arquivos #region funcoes def potencial(pos):     forca = np...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
#baoab 1 par 2d unidades reduzidas com maior cuidado, salva em arquivos&lt;br /&gt;
#region funcoes&lt;br /&gt;
def potencial(pos):&lt;br /&gt;
    forca = np.zeros(2)&lt;br /&gt;
    forca[0] = -4*alfa*(pos[0]**3) + 2*beta*pos[0]&lt;br /&gt;
    forca[1] = -4*alfa*(pos[1]**3) + 2*beta*pos[1]&lt;br /&gt;
    return forca&lt;br /&gt;
#endregion&lt;br /&gt;
&lt;br /&gt;
#region variaveis alteraveis&lt;br /&gt;
intervalo = int(&lt;br /&gt;
#DE QUANTOS EM QUANTOS O PROGRAMA SALVA OS DADOS (EVITA ARQUIVOS EXCESSIVAMENTE PESADOS PRA TEMPOS LONGOS)&lt;br /&gt;
#OU DTS PEQUENOS, 1 PRA USAR TODOS&lt;br /&gt;
1&lt;br /&gt;
)&lt;br /&gt;
#ALFA E BETA SÃO DO CAMPO POTENCIAL&lt;br /&gt;
alfa = (&lt;br /&gt;
0&lt;br /&gt;
)&lt;br /&gt;
beta = (&lt;br /&gt;
0&lt;br /&gt;
)&lt;br /&gt;
gaminha = (&lt;br /&gt;
#RELATIVO AO RUIDO ESTOCASTICO&lt;br /&gt;
0.1&lt;br /&gt;
)&lt;br /&gt;
temp = (&lt;br /&gt;
#TEMPERATURA, 1 É EQ A 118K +-&lt;br /&gt;
3&lt;br /&gt;
)&lt;br /&gt;
dt = (&lt;br /&gt;
10**-2&lt;br /&gt;
)&lt;br /&gt;
tmax = (&lt;br /&gt;
500000&lt;br /&gt;
)&lt;br /&gt;
npar = (&lt;br /&gt;
#NUMERO DE PARTICULAS&lt;br /&gt;
1&lt;br /&gt;
)&lt;br /&gt;
seedinicial = (&lt;br /&gt;
468884114&lt;br /&gt;
)&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
SEEDS DA WIKI&lt;br /&gt;
2135489      DT -2 GAMINHA +1&lt;br /&gt;
87846354     DT -2 GAMINHA 0	&lt;br /&gt;
459618741    DT -2 GAMINHA -1&lt;br /&gt;
#TEMP = 2&lt;br /&gt;
54684135     DT -2 GAMINHA +1&lt;br /&gt;
84653987465  DT -2 GAMINHA 0&lt;br /&gt;
9776678878   DT -2 GAMINHA -1&lt;br /&gt;
#TEMP = 3&lt;br /&gt;
7984651 	 DT -2 GAMINHA +1&lt;br /&gt;
4646464      DT -2 GAMINHA 0&lt;br /&gt;
468884114    DT -2 GAMINHA -1&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
#endregion&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Indo calcular constantes...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
c1 = np.exp(-gaminha*dt)&lt;br /&gt;
&lt;br /&gt;
c2  = (np.sqrt(1 - np.exp(-2*gaminha*dt)))*np.sqrt(temp)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Constantes calculadas, hora de ver se tem npassos certos.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
npassos = int(np.round(tmax/dt))&lt;br /&gt;
&lt;br /&gt;
if int(npassos%intervalo) != 0:&lt;br /&gt;
    print(f&amp;quot;Combinação npassos com intervalo não funcional, cuidado pra que o intervalo seja um inteiro que divide npassos sem ter resto&amp;quot;)&lt;br /&gt;
    exit(0)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;Passos ok, passos que precisam ser calculados: {npassos}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
nsalvos = int((npassos/intervalo) + 1)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;{nsalvos} serão salvos (contando o primeiro).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
aleatorios = np.random.normal(0, 1, size = (npassos, 2)) * c2&lt;br /&gt;
&lt;br /&gt;
xy = np.zeros((nsalvos, 2))&lt;br /&gt;
&lt;br /&gt;
checar = 0&lt;br /&gt;
&lt;br /&gt;
pxy = np.zeros((nsalvos, 2))&lt;br /&gt;
&lt;br /&gt;
tempos = np.arange(0, tmax + dt, dt*intervalo)&lt;br /&gt;
&lt;br /&gt;
salvador = int(0)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Tudo pronto, hora de começar!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xyatual = xy[0]&lt;br /&gt;
&lt;br /&gt;
pxyatual = pxy[0]&lt;br /&gt;
&lt;br /&gt;
for i in range(0, npassos):&lt;br /&gt;
    #BAOAB 2D SEM PBC COM CAMPO&lt;br /&gt;
    #B&lt;br /&gt;
    pxytemp = pxyatual + dt * (potencial(xyatual))/2&lt;br /&gt;
    #A&lt;br /&gt;
    xytemp = xyatual + dt*pxytemp/2&lt;br /&gt;
    #O&lt;br /&gt;
    pxylinha = c1*pxytemp + aleatorios[i]&lt;br /&gt;
    #A&lt;br /&gt;
    xyatual = xytemp + dt*pxylinha/2&lt;br /&gt;
    #B&lt;br /&gt;
    pxyatual = pxylinha + dt * (potencial(xyatual))/2&lt;br /&gt;
    #FIM DO BAOAB, HORA DE SALVAR&lt;br /&gt;
    salvador+=1&lt;br /&gt;
    if salvador%intervalo == 0:&lt;br /&gt;
        xy[int(salvador/intervalo)] = xyatual&lt;br /&gt;
        pxy[int(salvador/intervalo)] = pxyatual&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Acabou, hora de salvar!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
estadoaleatorio = np.random.get_state()&lt;br /&gt;
&lt;br /&gt;
np.random.seed()&lt;br /&gt;
&lt;br /&gt;
codigo = int(np.random.rand(1)*10**6)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;O código será {codigo}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while os.path.isdir(f&amp;quot;{codigo}&amp;quot;) == True:&lt;br /&gt;
    print(&amp;quot;Deu igual! A chance disso é baixíssima, peço perdão por ter desperdiçado sua sorte!&amp;quot;)&lt;br /&gt;
    print(&amp;quot;O programa deve corrigir isso, se essa mensagem estiver sendo repitida, há um erro grave!&amp;quot;)&lt;br /&gt;
    codigo+=1&lt;br /&gt;
&lt;br /&gt;
os.makedirs(f&amp;quot;.\\#{codigo}&amp;quot;, exist_ok = True)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;Pasta única criada! Nome {codigo}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
informacoesleitura = (f&amp;quot;&amp;quot;&amp;quot;Infos do código {codigo}&lt;br /&gt;
intervalo = int(&lt;br /&gt;
#DE QUANTOS EM QUANTOS O PROGRAMA SALVA OS DADOS (EVITA ARQUIVOS EXCESSIVAMENTE PESADOS PRA TEMPOS LONGOS)&lt;br /&gt;
#OU DTS PEQUENOS, 1 PRA USAR TODOS&lt;br /&gt;
{intervalo}&lt;br /&gt;
)&lt;br /&gt;
#ALFA E BETA SÃO DO CAMPO POTENCIAL&lt;br /&gt;
alfa = (&lt;br /&gt;
{alfa}&lt;br /&gt;
)&lt;br /&gt;
beta = (&lt;br /&gt;
{beta}&lt;br /&gt;
)&lt;br /&gt;
gaminha = (&lt;br /&gt;
#RELATIVO AO RUIDO ESTOCASTICO&lt;br /&gt;
{gaminha}&lt;br /&gt;
)&lt;br /&gt;
temp = (&lt;br /&gt;
{temp}&lt;br /&gt;
)&lt;br /&gt;
dt = (&lt;br /&gt;
{dt}&lt;br /&gt;
)&lt;br /&gt;
t = (&lt;br /&gt;
{tmax}&lt;br /&gt;
)&lt;br /&gt;
seedinicial = (&lt;br /&gt;
#SÓ USE DE NOVO SE FOR PRA FAZER DO ZERO IGUAL&lt;br /&gt;
{seedinicial}&lt;br /&gt;
)&amp;quot;&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
valores = np.zeros(9)&lt;br /&gt;
(&lt;br /&gt;
valores[0],     valores[1],     valores[2],     valores[3],     valores[4],&lt;br /&gt;
valores[5],     valores[6],     valores[7],     valores[8]&lt;br /&gt;
) = (&lt;br /&gt;
intervalo,      alfa,           beta,           gaminha,        temp,&lt;br /&gt;
dt,             tmax,           npar,           seedinicial&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Hora de salvar os arquivos...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
np.save(f&amp;quot;.\\#{codigo}\\state#{codigo}.npy&amp;quot;, estadoaleatorio, allow_pickle = True)&lt;br /&gt;
&lt;br /&gt;
np.save(f&amp;quot;.\\#{codigo}\\val#{codigo}.npy&amp;quot;, valores)&lt;br /&gt;
&lt;br /&gt;
np.save(f&amp;quot;.\\#{codigo}\\xy#{codigo}.npy&amp;quot;, xy)&lt;br /&gt;
&lt;br /&gt;
np.save(f&amp;quot;.\\#{codigo}\\pxy#{codigo}.npy&amp;quot;, pxy)&lt;br /&gt;
&lt;br /&gt;
arquivo = open(f&amp;quot;.\\#{codigo}\\info#{codigo}.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
arquivo.write(f&amp;quot;{informacoesleitura}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
arquivo.close()&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;Tudo certo! Código {codigo}.&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8894</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8894"/>
		<updated>2022-10-18T20:53:01Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Códigos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Legenda]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
dfisads:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Referências ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8893</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8893"/>
		<updated>2022-10-18T20:52:49Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Códigos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:EvolucaoFF.gif|thumb|right|900px|Legenda]]&lt;br /&gt;
&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
dfisads:&lt;br /&gt;
&#039;&#039;&#039;https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Programa utilizado para gerar as imagens da função de densidade de probabilidade do momentum da partícula (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do MSD (imagens presentes no GIF). &#039;&#039;&#039;NÃO RECOMENDO O USO, ELE REQUER EDIÇÕES NAS LINHAS DE CÓDIGO PARA FUNCIONAR CORRETAMENTE.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Referências ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8891</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8891"/>
		<updated>2022-10-18T20:49:04Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Códigos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lstart]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo xy#código.npy principal, que consiste no array de posição.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo pxy#código.npy principal, que consiste no array de momentum.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo info#código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo state#código.txt, que contém o estado da semente aleatória.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;lleitor&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lcontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. Os arquivos com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo os arquivos antigos. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lleitor]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ela salvará as imagens em pastas com o nome do modo selecionado do programa, a fim de facilitar a comparação de diferentes simulações.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpos]]&#039;&#039;&#039; Programa utilizado para gerar as imagens do rastro da posição das partículas equivalentes fatiadas (imagens presentes no GIF). &lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lpdf]]&#039;&#039;&#039; Código utilizado para gerar o frame de comparação em uma dimensão. Não recomendo acessá-lo, por não possuir um resultado interessante, além de não estar otimizado nem comentado.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[lmsd]]&#039;&#039;&#039; Código utilizado para avaliar a diferença entre os métodos em escala logarítmica. Não recomendo acessá-lo, por não possuir um resultado interessante, além de não estar otimizado nem comentado.&lt;br /&gt;
&lt;br /&gt;
=== Referências ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8888</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8888"/>
		<updated>2022-10-18T20:43:35Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Códigos ==&lt;br /&gt;
Os códigos desenvolvidos pelo integrante Leonardo seguem abaixo&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2dfourier]]&#039;&#039;&#039; Programa utilizado para gerar valores sem partir de nenhum arquivo anterior. Os dados são identificados por um código numérico único, e serão salvos em uma pasta com nome de tal código, onde ali se encontrarão:&lt;br /&gt;
&lt;br /&gt;
:- O arquivo código.npy principal, que consiste nos arrays.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo valcódigo.npy, que consiste em um arquivo que é lido pelos outros programas contendo informações cruciais.&lt;br /&gt;
&lt;br /&gt;
:- O arquivo código.txt, que contém tais informações cruciais em um formato legível ao usuário.&lt;br /&gt;
&lt;br /&gt;
Utilizado em conjunto com os programas &amp;quot;framer&amp;quot; e &amp;quot;animador&amp;quot;, você pode gerar imagens como as vistas neste trabalho.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2dfouriercontinue]]&#039;&#039;&#039; Programa utilizado para gerar valores partindo de outros já antes calculados. O arquivo com os dados novos (concatenados aos antigos) se encontrará na pasta original, substituindo o arquivo antigo. Recomendado para gerar valores por tempos longos sem precisar deixar o programa executando por longas horas sem intervalo.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2dframer]]&#039;&#039;&#039; Programa utilizado para gerar as imagens estáticas vistas neste trabalho. Ele salvará os frames em uma pasta dentro da pasta com nome do código do arquivo, e serão numerados de acordo com qual frame da simulação ela se refere.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn2danimador]]&#039;&#039;&#039; Programa utilizado para gerar as animações vistas neste trabalho. Os gifs são salvos em uma pasta dentro da pasta com nome do código do arquivo, com o nome dele identificando algumas características dele. Atente que, para computadores sem placa de vídeo dedicada, a renderização dos gifs pode levar muito tempo, em casos como este recomendo gerar as animações em menor resolução ou com intervalos maiores entre as imagens.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn1dcompare]]&#039;&#039;&#039; Código utilizado para gerar o frame de comparação em uma dimensão. Não recomendo acessá-lo, por não possuir um resultado interessante, além de não estar otimizado nem comentado.&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;[[cahn1ddiflog]]&#039;&#039;&#039; Código utilizado para avaliar a diferença entre os métodos em escala logarítmica. Não recomendo acessá-lo, por não possuir um resultado interessante, além de não estar otimizado nem comentado.&lt;br /&gt;
&lt;br /&gt;
=== Referências ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8887</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8887"/>
		<updated>2022-10-18T20:22:39Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Análise do MSD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Referências ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8886</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8886"/>
		<updated>2022-10-18T20:22:23Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Análise do Momentum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Referências ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8885</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8885"/>
		<updated>2022-10-18T20:22:01Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Análise do MSD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma relação de proporção para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Referências ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8884</id>
		<title>Equação de Langevin</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Equa%C3%A7%C3%A3o_de_Langevin&amp;diff=8884"/>
		<updated>2022-10-18T20:20:43Z</updated>

		<summary type="html">&lt;p&gt;Leomigotto: /* Análise do Momentum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Artur Uhlik Fröhlich e Leonardo Dasso Migotto&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
O objetivo deste trabalho é resolver computacionalmente a equação de Langevin utilizando o método BAOAB. Serão explorados os casos de partículas individuais livres, estudando os efeitos da variação do coeficiente de atrito no deslocamento quadrático médio e no momentum.&lt;br /&gt;
== Equação de Langevin ==&lt;br /&gt;
Esta equação diferencial estocástica descreve a evolução de um sistema quando sujeito a forças do tipo determinísticas e estocásticas simultâneamente. A sua aplicação mais popular é relativa ao movimento Browniano, o movimento de uma partícula imersa em um fluído, sujeita à força de atrito excercida pelas partículas do fluído. Neste caso, a equação pode ser escrita como:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{d\vec{v}}{dt} = -\gamma  \vec{v} + \xi (t).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na equação acima, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; é o coeficiente de atrito e &amp;lt;math&amp;gt;\xi(t)&amp;lt;/math&amp;gt; é um ruído estocástico branco, que segue o Teorema Central do Limite com média 0 e deslocamento padrão relacionado à temperatura, a Constante de Boltzmann, &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e a massa da partícula. A partir desta expressão, é possível descobrir analiticamente a relação do coeficiente de difusão do fluído e os valores envolvidos na equação:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
D = \frac{2k_{B}T}{\gamma m}. \quad (I)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Onde &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; é o coeficiente de difusão do meio, &amp;lt;math&amp;gt;k_B&amp;lt;/math&amp;gt; é a constante de Boltzmann, &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; é a temperatura e &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; é a massa da partícula. Outra relação presente no livro do Frenkel &amp;lt;ref&amp;gt;Daan Frenkel and Berend Smit. 2001. Understanding Molecular Simulation (2nd. ed.). Academic Press, Inc., USA.&amp;lt;/ref&amp;gt;, que é uma das etapas do desenvolvimento da Relação de Einstein, é a do coeficiente de difusão e o deslocamento quadrático médio de uma partícula no meio:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\left \langle \left( r(t) - r_0(t) \right)^2 \right \rangle = 2dDt. \quad (II)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
O método numérico escolhido para realizar a integração da equação é conhecido como BAOAB, desenvolvido por Leimkuhler e Mattews &amp;lt;ref&amp;gt;&lt;br /&gt;
Leimkuhler, B., &amp;amp; Matthews, C. (2015). Molecular Dynamics: With Deterministic and Stochastic Numerical Methods. (Interdisciplinary Applied Mathematics; Vol. 39). Springer. https://doi.org/10.1007/978-3-319-16375-8&lt;br /&gt;
&amp;lt;/ref&amp;gt; utilizado para resolver equações diferenciais estocásticas.&lt;br /&gt;
&lt;br /&gt;
Ele é baseado na solução exata para o momentum,&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
   d\vec{p} = -\gamma \vec{p}dt + \sqrt{2\gamma mk_{B}T}d\vec{W} ,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e faz o uso de um método de separação das equações entre as denominadas A, B e O, respectivamente representadas:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (A)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (B)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} . \quad (O)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O &amp;lt;math&amp;gt;\vec{G}&amp;lt;/math&amp;gt; aqui representa um número aleatório Gaussiano que faz o papel do ruído estocástico. &lt;br /&gt;
&lt;br /&gt;
A equação &amp;quot;A&amp;quot; realiza meio passo no tempo da distância, a &amp;quot;B&amp;quot; realiza um meio passo para o momentum e o &amp;quot;O&amp;quot; contabiliza a contribuição estocástica da equação.&lt;br /&gt;
&lt;br /&gt;
Essas equações podem formar vários algoritmos diferentes de integração (ABAO, BABO, ABOBA, etc) mas o utilizado nesse trabalho será o BAOAB:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}\left(t + \frac{\Delta t}{2}\right) = \vec{p}(t) + \frac{\Delta t}{2}\vec{f}(t) , \quad (1)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}\left(t+\frac{\Delta t}{2}\right) = \vec{r}(t) +\frac{\Delta t}{2}\vec{p}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (2)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) = \exp(-\gamma \Delta t)\vec{p}\left(t + \frac{\Delta t}{2}\right) + \sqrt{1-\exp(-2\gamma \Delta t)}\sqrt{mk_{B}T}\vec{G} , \quad (3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{r}(t + \Delta t) = \vec{r}\left(t + \frac{\Delta t}{2}\right) +\frac{\Delta t}{2}\vec{p&#039;}\left ( t +\frac{\Delta t}{2}\right )\frac{1}{m} , \quad (4)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
    \vec{p}(t + \Delta t) = \vec{p&#039;}\left(t + \frac{\Delta t}{2}\right) + \frac{\Delta t}{2}\vec{f}(t) . \quad (5)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É importante lembrar que entre os dois últimos passos é necessário atualizar o termo &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt;, já que ele pode depender de termos já atualizados como &amp;lt;math&amp;gt;\vec{p}&amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt;\vec{r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Método BAOAB ==&lt;br /&gt;
&lt;br /&gt;
Um exemplo de implementação desse método feito foi para a partícula livre. Nota-se que nesse caso a partícula não é afetada por um campo potencial então os passos do método que envolvem a força &amp;lt;math&amp;gt;\vec{f}&amp;lt;/math&amp;gt; serão desconsiderados.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código (orientado a objeto) de autoria do integrante Artur e que pode ser acessado [https://github.com/Artur-UF/MetComp/blob/main/MetCompC/trabalho2/BAOABlangevin.py aqui]&amp;lt;ref&amp;gt;Os códigos orientado a objeto: [https://github.com/Artur-UF/MetComp/tree/main/MetCompC/trabalho2 GitHub do Artur]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    def baoab_livre(self, dt, exp, sqexp, sqt, G):&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        dt: discretização do tempo&lt;br /&gt;
        exp: termo referente a primeira exponencial da eq.3&lt;br /&gt;
        sqexp: termo da raiz quadrada com exponencial da eq.3&lt;br /&gt;
        sqt: termo da raiz quadrada com a Temperatura da eq.3&lt;br /&gt;
        G: o vetor G da eq.3&lt;br /&gt;
        &#039;&#039;&#039;&lt;br /&gt;
        # 1/2 passo da distância&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
        # Passo estocástico&lt;br /&gt;
        self.vel[0] = exp*self.vel[0] + sqexp*sqt*G[0]&lt;br /&gt;
        self.vel[1] = exp*self.vel[1] + sqexp*sqt*G[1]&lt;br /&gt;
        # Atualização final da posição&lt;br /&gt;
        self.pos[0] += self.vel[0]*(dt/2)&lt;br /&gt;
        self.pos[1] += self.vel[1]*(dt/2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essa função representa um passo do laço temporal utilizando o método BAOAB. Os atributos em forma de lista &amp;quot;.pos&amp;quot; e &amp;quot;.vel&amp;quot; representam as componentes x e y respectivamente da posição e velocidade do objeto partícula.&lt;br /&gt;
&lt;br /&gt;
Um exemplo de funcionamento do código é a animação a seguir:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Livre_g10T1_c.gif|thumb|center|500px|Simulação de uma partícula livre sob o efeito da Equação de Langevin.]]&lt;br /&gt;
&lt;br /&gt;
O código foi executado usando a semente de números aleatórios 420.&lt;br /&gt;
&lt;br /&gt;
== Parâmetros das Simulações ==&lt;br /&gt;
A fim de estudar a implementação do Método BAOAB para a Equação de Langevin para uma partícula livre, nove simulações foram executadas com parâmetros bem definidos. Utilizando unidades reduzidas, os parâmetros recebidos pelo computador foram:&lt;br /&gt;
: &amp;lt;math&amp;gt;m, k_{B} = 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\Delta t = 10^{-2}&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;t_{max} = 5 \cdot 10^5&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{r}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\vec{p}_{ini} = (0, 0)&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;\gamma = 10^{-1}, 10^0, 10^1&amp;lt;/math&amp;gt;, &lt;br /&gt;
: &amp;lt;math&amp;gt;T = 1, 2, 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
As nove simulações englobam, ao todo, todas combinações de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; para os valores escolhidos. Após todos os &amp;lt;math&amp;gt;50.000.001&amp;lt;/math&amp;gt; instantes da simulação serem calculados, o computador salva os valores de posição e momentum de cada um deles em arquivos numa pasta única, que contem, além destes valores, os valores utilizados na simulação. Assim, um programa diferente pode ser utilizado para continuar a execução da simulação ou também gerar gráficos dos valores salvos de posição e momentum. Isso permite uma análise facilitada dos dados, pois não requer a execução completa do programa para cada gráfico que se deseja criar.&lt;br /&gt;
&lt;br /&gt;
Como esta é uma simulação com uma variável estocástica, alguns cuidados são extremamente importantes para fazer a execução correta da simulação. Os seguintes fatos devem ser tidos em mente ao executar simulações desta natureza:&lt;br /&gt;
:- As simulações devem sempre possuir sementes aleatórias diferentes, com pouquíssimas exceções. Utilizando os nossos programas de exemplo: caso os valores de &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; fossem trocados, mas a semente aleatória não, estaríamos utilizando os mesmos valores aleatórios para calcular o termo estocástico da equação, não gerando simulações completamente independentes. Além do mais, a &amp;quot;grande sacada&amp;quot; dessas simulações é que elas &#039;&#039;&#039;devem&#039;&#039;&#039; conseguir ser analisadas independente das sementes aleatórias.&lt;br /&gt;
:- Simulações com &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; diferentes, porém todas outras variáveis iguais (incluindo a semente aleatória) não são equivalentes. Utilizando os nossos programas de exemplo: caso o &amp;lt;math&amp;gt;\Delta t&amp;lt;/math&amp;gt; mude, o número de números aleatórios a ser gerado será diferente, portanto ambas simulações, aparentemente equivalentes, terão ruídos aleatórios completamente diferentes e, portanto, não poderão ser comparadas tradicionalmente.&lt;br /&gt;
&lt;br /&gt;
== Implementação da Graficação do Momentum ==&lt;br /&gt;
Segue abaixo uma implementação de um graficador do histograma normalizado do momenta de uma partícula. A partir de um array de momenta de uma única partícula, o código faz os cálculos necessários, deixando o gráfico pronto para plotagem.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;P&amp;quot;:&lt;br /&gt;
    p = np.sqrt(pxy[:, 0]**2 + pxy[:, 1]**2)&lt;br /&gt;
    #MOMENTUM MAIS COMUM&lt;br /&gt;
    n, bins, patches = plt.hist(p, 500, histtype = &amp;quot;step&amp;quot;,  density = True)&lt;br /&gt;
    maior = np.argmax(n)&lt;br /&gt;
    pcomum = (bins[maior + 1] + bins[maior])/2&lt;br /&gt;
    plt.axvline(pcomum, color = &amp;quot;red&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum mais provável: {pcomum:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM MEDIO&lt;br /&gt;
    pmed = np.mean(p)&lt;br /&gt;
    plt.axvline(pmed, c = &amp;quot;green&amp;quot;, label = f&amp;quot;Momentum médio: {pmed:.3f}&amp;quot;)&lt;br /&gt;
    #MOMENTUM QUADRADO MEDIO&lt;br /&gt;
    pqmed = np.sqrt(np.mean(p**2))&lt;br /&gt;
    plt.axvline(pqmed, color = &amp;quot;purple&amp;quot;, alpha = 0.4, label = f&amp;quot;Momentum rms: {pqmed:.3f}\n&amp;quot; + r&amp;quot;$\frac{p_{rms}}{\sqrt{T}}$&amp;quot; + f&amp;quot;: {pqmed/np.sqrt(temp):.3f}&amp;quot;)&lt;br /&gt;
    plt.xlim(0, 7)&lt;br /&gt;
    plt.ylim(0, 0.7)&lt;br /&gt;
    plt.grid(alpha = 0.3)&lt;br /&gt;
    plt.legend(loc = 1)&lt;br /&gt;
    plt.title(f&amp;quot;Momentum em módulo\n&amp;quot; + r&amp;quot;$\gamma$ = &amp;quot; + f&amp;quot;{gaminha}, Temp. = {temp}, &amp;quot; + r&#039;$\Delta t$ = &#039;+f&#039;{dt}, Instantes = {nsalvos}&#039;)&lt;br /&gt;
    plt.ylabel(r&#039;$P(x)$&#039;)&lt;br /&gt;
    plt.xlabel(r&#039;$\left|\vec{p}(t)\right|$&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;pxy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para o momentum em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para o momentum em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. O programa calcula o módulo do momentum, além de outros três valores (decididos durante as plotagem de testes por conta dos aspectos iniciais dos gráficos): o momentum mais provável, o momentum médio e a média do momentum quadrático (além de um cálculo dele relacionado à temperatura). Um histograma normalizado dos momenta é feito simultâneo ao cálculo do momentum mais provável, além de ajustes de elementos gráficos do gráfico. Por ser um histograma normalizado, ele segue a seguinte relação (onde &amp;lt;math&amp;gt;p(x)&amp;lt;/math&amp;gt; é a função da curva do gráfico):&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\int_{0}^{+ \infty} P(x) dx = 1.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Análise do Momentum ==&lt;br /&gt;
Os gráficos abaixo, gerados pelo código acima, mostram a densidade de probabilidade de, escolhido um instante aleatório da simulação, qual momentum a partícula possui.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp1.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 1, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp2.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 2, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Ptemp3.png|thumb|none|1250px|&amp;lt;math&amp;gt;T = 3, \gamma = 0.1, 1.0, 10&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Uma observação rápida dos gráficos (mesmo que ignorando as retas destacadas na plotagem e as informações da legenda) torna evidente que a distribuição em questão é a Maxwell-Boltzmann&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution&amp;lt;/ref&amp;gt;. Esta distribuição descreve a densidade de probabilidade da velocidade das moléculas de um gás ideal em equilíbrio termodinâmico. Dado que, utilizando &amp;lt;math&amp;gt;m = 1&amp;lt;/math&amp;gt;, o valor de momentum e de velocidade são iguais em módulo, é coerente tratar essa distribuição exatamente como se trataria a de velocidade (mesmo que a massa tenha um peso nesta distribuição, este peso não a afeta neste caso). O gás o qual as distribuições estão descrevendo a probabilidade da velocidade é um gás ideal composto de átomos da partícula que está sendo simulada, de modo que, escolhendo uma partícula deste gás ideal hipotético, a função descreve a chance da partícula ter tal velocidade.&lt;br /&gt;
&lt;br /&gt;
Como é característico da distribuição de Maxwell-Boltzmann, a temperatura &amp;quot;estende&amp;quot; o limite da função, diminuindo seu pico. Para comprovar a relação da temperatura com a distribuição, podemos utilizar (como já foi feito nos gráficos) a fórmula da &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
V_{rms} = \sqrt{\frac{3RT}{M}}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como está em evidência nos gráficos anteriores, retirar a proporção da raiz da temperatura dos valores de &amp;lt;math&amp;gt;P_{rms}&amp;lt;/math&amp;gt; (que, como discutimos anteriormente, possui valor equivalente ao &amp;lt;math&amp;gt;V_{rms}&amp;lt;/math&amp;gt;) retorna sempre o mesmo valor.&lt;br /&gt;
&lt;br /&gt;
Estes resultados são especialmente interessantes pois, ao simultar uma partícula &amp;quot;isolada&amp;quot; que sofre interações com o meio via uma variável estocástica, estamos obtendo resultados que outrora poderiam ser encontrados ao realizar uma simulação de dinâmica molecular &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Din%C3%A2mica_Molecular&amp;lt;/ref&amp;gt; com potencial Lennard Jones &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Lennard_Jones&amp;lt;/ref&amp;gt;. Simulação esta, que requer acompanhar o movimento de muitas partículas e calcular as interações entre elas, sendo de maior complexidade de implementação.&lt;br /&gt;
&lt;br /&gt;
== Implementação do Deslocamento Quadrático Médio ==&lt;br /&gt;
Segue abaixo uma implementação do cálculo do deslocamento quadrático médio. A partir de um array de posições de uma única partícula, o código faz os cálculos necessários retornando um array com o MSD em cada instante de tempo, além de outras coisas.&lt;br /&gt;
&lt;br /&gt;
A função a seguir se encontra em um código de autoria do integrante Leonardo. Este código abre os dados gerados por outro programa, que salva todas informações em arquivos, e permite visualizar propriedades como o MSD, a distribuição do momentum, entre outras coisas.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
if modo == &amp;quot;MSD&amp;quot;:&lt;br /&gt;
    novotamanho = int(1 + ((nsalvos-1)/divisoes))&lt;br /&gt;
    desviodividido = np.zeros(novotamanho)&lt;br /&gt;
    indice = novotamanho - 1&lt;br /&gt;
    xx = xy[:, 0]&lt;br /&gt;
    yy = xy[:, 1]&lt;br /&gt;
    for i in range(divisoes):&lt;br /&gt;
        xini = xx[i*indice]&lt;br /&gt;
        yini = yy[i*indice]&lt;br /&gt;
        dx = xx[i*indice : 1+(i+1)*indice] - xini&lt;br /&gt;
        dy = yy[i*indice : 1+(i+1)*indice] - yini&lt;br /&gt;
        desviodividido += dx**2 + dy**2&lt;br /&gt;
    desviodividido = (desviodividido/divisoes)[1:]&lt;br /&gt;
    eixox = np.linspace(0, int(tmax/divisoes), int((nsalvos - 1)/divisoes) + 1)[1:]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    dezao = np.mean(difusivo/eixox[int(10/(dt*gaminha)):])/4&lt;br /&gt;
    eixox = np.log10(eixox)&lt;br /&gt;
    desviodividido = np.log10(desviodividido)&lt;br /&gt;
    balistico = desviodividido[:int(1/(dt*gaminha))]&lt;br /&gt;
    difusivo = desviodividido[int(10/(dt*gaminha)):]&lt;br /&gt;
    bal = np.polyfit(eixox[:int(1/(dt*gaminha))], balistico, 1)&lt;br /&gt;
    dif = np.polyfit(eixox[int(10/(dt*gaminha)):], difusivo, 1)&lt;br /&gt;
    reta1 = bal[0]*eixox + bal[1]&lt;br /&gt;
    reta2 = dif[0]*eixox + dif[1]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste código, &amp;quot;xy&amp;quot; é um array bidimensional, onde os índices da primeira dimensão representam o tempo, e a segunda dimensão possui dois índices: um para a posição em &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; e outro para a posição em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;. Para melhorar a precisão do MSD, o programa permite &amp;quot;fatiar&amp;quot; o array original de posições, considerando cada fatia das distâncias como uma execução do programa independente (o número de fatias é a variável &amp;quot;divisoes&amp;quot;, definida ao iniciar o programa). Um número maior de fatias resulta em um tempo reduzido percorrido pela partícula em cada fatia, porém retorna dados com maior precisão.&lt;br /&gt;
&lt;br /&gt;
Após definir a posição relativa de cada fatia dentro do array original, o programa itera sobre ele, calculando os valores de MSD para cada instante de cada fatia e somando-os a um array vazio. Por fim, é feito a média dos MSDs pelo número de partículas neste array. Dado o modo preferido de visualizar os dados posteriormente e a necessidade de outras análises numéricas, o array é transformado para escala logarítmica. É importante destacar que, antes de transformar os arrays de tempo e MSD para a escala logarítmica, ambos perdem o valor de índice 0: isso é importante pois, ao transformar os tempos para esta escala, o valor do &amp;lt;math&amp;gt;Log_{10}0 = - \infty&amp;lt;/math&amp;gt;, e este valor é impossível de ser calculado computacionalmente.&lt;br /&gt;
&lt;br /&gt;
Em seguida, dois arrays criados a partir do do MSD: um deles contém somente pontos do período de difusão balística, enquanto o outro possui pontos da difusão normal. É feita a regressão linear de cada um destes conjuntos de dados, a fim de encontrar a inclinação das retas ajustadas aos dados (e confirmar que estes períodos possuem, de fato, essas características difusivas, como veremos a seguir). Os intervalos para os períodos de difusão foram escolhidos após uma análise interna dos gráficos.&lt;br /&gt;
&lt;br /&gt;
Estas informações são posteriormente colocadas em um gráfico utilizando outras funções. Estes gráficos poderão ser vistos na próxima seção.&lt;br /&gt;
&lt;br /&gt;
== Análise do MSD ==&lt;br /&gt;
&lt;br /&gt;
Os resultados a serem analisados são originados do código (procedural) do integrante Leonardo.&lt;br /&gt;
&lt;br /&gt;
Foram executadas diferentes vezes a simulação para compararmos a influência do &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e da temperatura no deslocamento quadrático médio:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg0.1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 0.1, T = 1, 2, 3&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg1.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 1.0, T = 1, 2, 3&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:MSDg10.png|thumb|none|1250px|&amp;lt;math&amp;gt;\gamma = 10, T = 1, 2, 3&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
De início pode-se notar que o &amp;lt;math&amp;gt;\left|\vec{r}\right|^{2}&amp;lt;/math&amp;gt; escala de maneira proporcional a &amp;lt;math&amp;gt;t^{2}&amp;lt;/math&amp;gt; (balístico) no início do processo, e depois de um determinado tempo obtemos uma relação linear que é a parte normalmente difusiva do processo. Essas inclinações das retas nos regimes de difusão &amp;lt;ref&amp;gt;https://fiscomp.if.ufrgs.br/index.php/Medidas_din%C3%A2micas&amp;lt;/ref&amp;gt; balístico e difusivo são constantes em relação ao &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt; e à temperatura.&lt;br /&gt;
&lt;br /&gt;
Nota-se também que a temperatura não gera aparente diferença nos gráficos de MSD mas sim no valor do coeficiente de difusão (comentado posteriormente).&lt;br /&gt;
&lt;br /&gt;
Uma referência da literatura a respeito do MSD (mas no contexto de dinâmica molecular usando o potencial de Lennard-Jones) se encontra no livro do Frenkel, expressa por essa imagem:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:FrenkelMSD.png|thumb|center|500px|A partir da figura pode-se notar que a inclinação das retas representantes dos regimes balístico e difusivo são 2 e 1, valores esses encontrados pelas simulações realizadas.[1]]]&lt;br /&gt;
&lt;br /&gt;
Outro aspecto importante a se ressaltar é a concordância do cálculo do coeficiente de difusão através da equação (I) e da relação de Einstein em (II), obtida através dos pontos presentes na parte difusiva, que foram chamados respectivamente nas legendas dos gráficos de &amp;quot;D analítico&amp;quot; e &amp;quot;D calculado&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Uma relação interessante encontrada foi a maneira como escala a mudança de regimes, indicada pela reta perpendicular ao eixo do tempo. Podemos encontrar uma aproximação para o tempo em que o regime difusivo inicia na simulação a partir de uma relação dependente de &amp;lt;math&amp;gt;\gamma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Omega \propto \frac{1}{\gamma}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Referências ===&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Leomigotto</name></author>
	</entry>
</feed>