Equação de Fokker-Planck: mudanças entre as edições
Sem resumo de edição |
|||
(17 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
'''Grupo: Álison Soares, Rodrigo Avancini Lara e Samuel Huff Dieterich''' | '''Grupo: Álison Soares, Rodrigo Avancini Lara e Samuel Huff Dieterich''' | ||
A equação de Fokker-Planck foi aplicada em primeiro modo em problemas relacionados ao movimento Browniano, como veremos à seguir. Nesse caso, lidando com flutuações originadas de vários pequenos distúrbios, as partículas de interesse se chocavam com as moléculas do meio, provocando uma trajetória | A equação de Fokker-Planck foi aplicada em primeiro modo em problemas relacionados ao movimento Browniano, como veremos à seguir. Nesse caso, lidando com flutuações originadas de vários pequenos distúrbios, as partículas de interesse se chocavam com as moléculas do meio, provocando uma trajetória probabilística - isto é - não é possível descrever a evolução da partícula sem a observação. Porém, é possível determinar a probabilidade de encontrá-las em determinada região do espaço. | ||
Esta equação pode ser obtida a partir da equação de Langevin e fornece a probabilidade de encontrar determinada partícula em uma posição | Esta equação pode ser obtida a partir da equação de Langevin <ref>From Langevin to Fokker-Planck equation. URL: http://cgl.elte.hu/~racz/Stoch-diff-eq.pdf.</ref> e fornece a probabilidade de encontrar determinada partícula em uma posição (varia conforme a dimensionalidade do problema) em um certo instante <math>t</math>. Além disso, no presente trabalho temos como objetivo estudar a solução numérica da equação para um dado exemplo com duas variáveis para o espaço de fase mais o tempo, através do método FTCS explícito. <ref>M.P. Zorzano, H. Mais, L. Vazquez, Numerical solution of two dimensional Fokker—Planck equations, Applied Mathematics and Computation, 1999, https://doi.org/10.1016/S0096-3003(97)10161-8.</ref> | ||
== Introdução == | == Introdução == | ||
Linha 16: | Linha 16: | ||
Inicialmente, ele considerou o incremento da posição da partícula num espaço unidimensional (<math>x</math>), num determinado intervalo de tempo (<math>\tau</math>). Considerando que existe uma probabilidade aleatória da partícula se mover dentro do intervalo <math>\tau</math>, ele definiu uma função para a densidade de probabilidade (<math>\varphi(\Delta x)</math>). Sabendo que o número de partículas é constante dentro do meio, ele expandiu a densidade (<math>\rho</math>) deste em uma série de Taylor: | Inicialmente, ele considerou o incremento da posição da partícula num espaço unidimensional (<math>x</math>), num determinado intervalo de tempo (<math>\tau</math>). Considerando que existe uma probabilidade aleatória da partícula se mover dentro do intervalo <math>\tau</math>, ele definiu uma função para a densidade de probabilidade (<math>\varphi(\Delta x)</math>). Sabendo que o número de partículas é constante dentro do meio, ele expandiu a densidade (<math>\rho</math>) deste em uma série de Taylor: | ||
:<math> | :<math> | ||
Linha 24: | Linha 25: | ||
que é, por definição, <math>\varphi</math>. Continuando, | que é, por definição, <math>\varphi</math>. Continuando, | ||
:<math> | :<math> | ||
Linha 31: | Linha 33: | ||
Pela definição da probabilidade, | Pela definição da probabilidade, | ||
:<math> | :<math> | ||
Linha 53: | Linha 56: | ||
Esta equação nos leva à igualdade | Esta equação nos leva à igualdade | ||
:<math> | :<math> | ||
Linha 60: | Linha 64: | ||
Podemos interpretar a integral como o coeficiente de difusão <math>D</math>: | Podemos interpretar a integral como o coeficiente de difusão <math>D</math>: | ||
:<math> | :<math> | ||
Linha 67: | Linha 72: | ||
O que nos dá a equação da difusão | O que nos dá a equação da difusão | ||
:<math> | :<math> | ||
Linha 80: | Linha 86: | ||
1. Arrasto pela viscosidade. | 1. Arrasto pela viscosidade. | ||
2. Força de flutuação. | 2. Força de flutuação. | ||
Considerando que a partícula é relativamente grande em comparação com as distâncias médias entre as moléculas do líquido e esta se movimento nesse meio com velocidade <math>v</math>, experimenta uma resistência pela viscosidade. Essa força é descrita pela Lei de Stokes que, para uma partícula esférica com diâmetro <math>a</math>, corresponde a <math>-6\pi\eta a \ dx/dt</math>. | Considerando que a partícula é relativamente grande em comparação com as distâncias médias entre as moléculas do líquido e esta se movimento nesse meio com velocidade <math>v</math>, experimenta uma resistência pela viscosidade. Essa força é descrita pela Lei de Stokes que, para uma partícula esférica com diâmetro <math>a</math>, corresponde a <math>-6\pi\eta a \ dx/dt</math>. | ||
A segunda força foi proposta por Langevin para descrever o efeito de constantes impactos das moléculas do líquido sobre as partículas de estudo. Assim, como | A segunda força foi proposta por Langevin para descrever o efeito de constantes impactos das moléculas do líquido sobre as partículas de estudo. Assim, como esta força (<math>R(t)</math>) possui uma origem aleatória, essa deveria ser positiva ou negativa de maneira equiprovável e cuja magnitude fosse suficiente para manter a agitação da partícula. Caso contrário, a viscosidade iria parar o movimento dessa partícula. | ||
Com isso, a equação que descreve o movimento a partir da posição da partícula - em 1D na direção <math>x</math> - é dado pela Lei de Newton como: | Com isso, a equação que descreve o movimento a partir da posição da partícula - em 1D na direção <math>x</math> - é dado pela Lei de Newton como: | ||
:<math> | :<math> | ||
Linha 92: | Linha 100: | ||
</math> | </math> | ||
onde <math>m</math> é a massa da partícula, <math>\gamma>0</math> é o coeficiente de fricção devido a viscosidade do líquido e <math>R</math> é postulado a força de Langevin representando | onde <math>m</math> é a massa da partícula, <math>\gamma>0</math> é o coeficiente de fricção devido a viscosidade do líquido e <math>R</math> é postulado a força de Langevin representando o efeito das colisões das moléculas do fluído. <ref>Langevin equation. Encyclopedia of Mathematics. URL: http://encyclopediaofmath.org/index.php?title=Langevin_equation&oldid=47575.</ref><ref>Wikipédia: Langevin equation. URL: https://en.wikipedia.org/wiki/Langevin_equation.</ref> | ||
Essa equação é conhecida como a equação de Langevin e foi o primeiro exemplo de equação diferencial estocástica, isto é, uma equação diferencial com um termo, <math>R(t)</math> nesse caso, cuja solução em algum sentido também é uma função aleatória <ref name=Gardiner>Gardiner, C.W. (1985). Handbook of stochastic methods - for physics, chemistry and the natural sciences, Second Edition. ''Springer series in synergetics''.</ref>. Essa função foi desenvolvida para possuir as seguintes propriedades: | |||
:<math> | :<math> | ||
\langle R(t) \rangle = 0 | \langle R(t) \rangle = 0 | ||
\qquad | \qquad | ||
\langle R(t) R(t') \rangle = D \cdot \delta(t-t') | \langle R(t) R(t') \rangle = D \cdot \delta(t-t'), | ||
</math> | </math> | ||
Linha 115: | Linha 124: | ||
A descrição do movimento browniano foi anteriormente tratada em termos da equação | A descrição do movimento browniano foi anteriormente tratada em termos da equação | ||
:<math> | :<math> | ||
Linha 124: | Linha 134: | ||
Para o nosso propósito, realizaremos uma abordagem mais direta e geral, assumindo a equação de Langevin através de um potencial <math>U(x)</math>, nos deixando com a seguinte expressão: | Para o nosso propósito, realizaremos uma abordagem mais direta e geral, assumindo a equação de Langevin através de um potencial <math>U(x)</math>, nos deixando com a seguinte expressão: | ||
:<math> | :<math> | ||
Linha 133: | Linha 144: | ||
Contudo, para entender as equações diferenciais estocásticas, precisamos discretizar as equações para posteriormente aplicar os métodos numéricos. Temos que o sistema de discretização mais simples possível nos leva ao valor de <math>x</math> no tempo <math>t + \varepsilon</math> a partir da interação | Contudo, para entender as equações diferenciais estocásticas, precisamos discretizar as equações para posteriormente aplicar os métodos numéricos. Temos que o sistema de discretização mais simples possível nos leva ao valor de <math>x</math> no tempo <math>t + \varepsilon</math> a partir da interação | ||
:<math> | :<math> | ||
Linha 141: | Linha 153: | ||
A tarefa é compreender como o agora ruído gaussiano <math>\eta_{\varepsilon}(t)</math> afeta esse sistema discretizado. Para isso, escreveremos a evolução temporal da distribuição de probabilidade <math>\rho(x,t)</math> definida como a probabilidade da partícula estar em <math>x</math> no tempo <math>t</math>. Então, deve-se olhar para o limite <math>t \rightarrow \infty</math> de <math>\rho(x,t)</math>. | A tarefa é compreender como o agora ruído gaussiano <math>\eta_{\varepsilon}(t)</math> afeta esse sistema discretizado. Para isso, escreveremos a evolução temporal da distribuição de probabilidade <math>\rho(x,t)</math> definida como a probabilidade da partícula estar em <math>x</math> no tempo <math>t</math>. Então, deve-se olhar para o limite <math>t \rightarrow \infty</math> de <math>\rho(x,t)</math>. | ||
Vamos realizar a tarefa com a equação discretizada de Langevin comentada acima. Por razões de simplificação, discutiremos essa abordagem com a forma | Vamos realizar a tarefa com a equação discretizada de Langevin comentada acima. Por razões de simplificação, discutiremos essa abordagem com a forma | ||
:<math> | :<math> | ||
Linha 150: | Linha 163: | ||
A equação da probabilidade <math>\rho(x,t)</math> pode ser derivada usando a equação de Chapman-Kolmogorov, a qual também iremos escrever em uma forma discretizada no tempo, da forma | A equação da probabilidade <math>\rho(x,t)</math> pode ser derivada usando a equação de Chapman-Kolmogorov, a qual também iremos escrever em uma forma discretizada no tempo, da forma | ||
:<math> | :<math> | ||
Linha 159: | Linha 173: | ||
Lembrando que: para que a condição acima mova a partícula de <math>y</math> a <math>x</math> no tempo <math>\varepsilon</math>, o termo de ruído deve ter apenas o valor correspondente que satisfaz a equação | Lembrando que: para que a condição acima mova a partícula de <math>y</math> a <math>x</math> no tempo <math>\varepsilon</math>, o termo de ruído deve ter apenas o valor correspondente que satisfaz a equação | ||
:<math> | :<math> | ||
Linha 174: | Linha 189: | ||
Assim <math>W(x,y; \varepsilon)</math> é obtido como | Assim <math>W(x,y; \varepsilon)</math> é obtido como | ||
:<math> | :<math> | ||
Linha 184: | Linha 200: | ||
Substituindo o <math>W(x,y; \varepsilon)</math> acima na equação de Chapman-Kolmogorov discretizada e expandindo o lado esquerdo para <math>\varepsilon</math>, temos | Substituindo o <math>W(x,y; \varepsilon)</math> acima na equação de Chapman-Kolmogorov discretizada e expandindo o lado esquerdo para <math>\varepsilon</math>, temos | ||
:<math> | :<math> | ||
Linha 191: | Linha 208: | ||
Como último passo agora, vamos expandir a integral do lado direito para ordenar <math>\varepsilon</math>. Notamos que quando <math>\varepsilon \rightarrow 0</math>, a Gaussiana vai para uma função delta e a integral resulta em <math>\rho(x,t)</math> que irá se cancelar com <math>\rho(x,t)</math> no lado esquerdo. Ao final, quando reorganizamos os termos, temos a seguinte equação denominada de Equação de Fokker-Planck | Como último passo agora, vamos expandir a integral do lado direito para ordenar <math>\varepsilon</math>. Notamos que quando <math>\varepsilon \rightarrow 0</math>, a Gaussiana vai para uma função delta e a integral resulta em <math>\rho(x,t)</math> que irá se cancelar com <math>\rho(x,t)</math> no lado esquerdo. Ao final, quando reorganizamos os termos, temos a seguinte equação denominada de Equação de Fokker-Planck | ||
:<math> | :<math> | ||
Linha 197: | Linha 215: | ||
ou, se substituirmos <math>v(x)</math> pelo potencial <math>v(x) = −\mu \partial U(x)/\partial x</math>, temos que | ou, se substituirmos <math>v(x)</math> pelo potencial <math>v(x) = −\mu \partial U(x)/\partial x</math>, temos que | ||
:<math> | :<math> | ||
Linha 206: | Linha 225: | ||
Esta distribuição pode ainda depender de um conjunto de <math>N</math> macrovariáveis <math>x_i</math>, de tal maneira que o movimento browniano em questão pode ser representado por uma equação de Fokker-Planck da forma <ref>Wikipédia: Fokker-Planck Equation. URL: https://en.wikipedia.org/wiki/Fokker-Planck_equation.</ref>: | Esta distribuição pode ainda depender de um conjunto de <math>N</math> macrovariáveis <math>x_i</math>, de tal maneira que o movimento browniano em questão pode ser representado por uma equação de Fokker-Planck da forma <ref>Wikipédia: Fokker-Planck Equation. URL: https://en.wikipedia.org/wiki/Fokker-Planck_equation.</ref>: | ||
:<math> | :<math> | ||
Linha 228: | Linha 248: | ||
As equações diferenciais típicas encontradas na física do acelerador de partícula são | As equações diferenciais típicas encontradas na física do acelerador de partícula são | ||
:<math> | :<math> | ||
Linha 241: | Linha 262: | ||
Para o caso do oscilador harmônico amortecido e com ruído, temos | Para o caso do oscilador harmônico amortecido e com ruído, temos | ||
:<math> | :<math> | ||
Linha 254: | Linha 276: | ||
Já para o oscilador estocástico de Duffing, não-linear, com amortecimento, ruído multiplicativo e aditivo temos | Já para o oscilador estocástico de Duffing, não-linear, com amortecimento, ruído multiplicativo e aditivo temos | ||
:<math> | :<math> | ||
Linha 267: | Linha 290: | ||
Escrevendo esses exemplos em termos da equação de Fokker-Planck obtemos | Escrevendo esses exemplos em termos da equação de Fokker-Planck obtemos | ||
:<math> | :<math> | ||
Linha 273: | Linha 297: | ||
para o primeiro caso e | para o primeiro caso e | ||
:<math> | :<math> | ||
Linha 286: | Linha 311: | ||
=== Método FTCS explícito === | === Método FTCS explícito === | ||
Para os fins de estudo desses casos, o método numérico mais simples para descrever a função <math>\rho</math> é a partir do FTCS (''Foward Time Central Space'') explícito. Como ficará mais claro a partir da discretização das equações, o método FTCS calcula o resultado de uma função no tempo seguinte em um dado ponto a partir dos valores dos "vizinhos" desse ponto. Para a técnica explícita, podemos calcular valor da função no tempo <math>n+1</math> a partir apenas de valores já conhecidos no tempo atual <math>n</math>. Assim, a aplicação do método se torna bem simples, contudo, perdemos precisão/estabilidade em comparação com métodos mais sofisticados. | Para os fins de estudo desses casos, o método numérico mais simples para descrever a função <math>\rho</math> é a partir do FTCS (''Foward Time Central Space'') explícito <ref>Pichler L., Masud A., Bergman L.A. (2013) Numerical Solution of the Fokker–Planck Equation by Finite Difference and Finite Element Methods—A Comparative Study. In: Papadrakakis M., Stefanou G., Papadopoulos V. (eds) Computational Methods in Stochastic Dynamics. Computational Methods in Applied Sciences, vol 26. Springer, Dordrecht. https://doi.org/10.1007/978-94-007-5134-7_5.</ref>. Como ficará mais claro a partir da discretização das equações, o método FTCS calcula o resultado de uma função no tempo seguinte em um dado ponto a partir dos valores dos "vizinhos" desse ponto. Para a técnica explícita, podemos calcular valor da função no tempo <math>n+1</math> a partir apenas de valores já conhecidos no tempo atual <math>n</math>. Assim, a aplicação do método se torna bem simples, contudo, perdemos precisão/estabilidade em comparação com métodos mais sofisticados. | ||
O primeiro passo para o método é discretizar os termos da função de interesse <math>\rho(x,v,t)</math> nas derivadas parciais necessárias: <math>\partial/\partial x</math>, <math>\partial/\partial v</math>, <math>\partial^2/\partial v^2</math>. Para isso, usamos a expansão da série de Taylor e, para melhor precisão, a derivada centrada (excluindo a derivada no tempo). Ademais, usaremos a notação dos índices para indicar os valores de <math>x</math>, <math>v</math> e <math>t</math> por <math>i</math>, <math>j</math> e <math>n</math>, respectivamente. | O primeiro passo para o método é discretizar os termos da função de interesse <math>\rho(x,v,t)</math> nas derivadas parciais necessárias: <math>\partial/\partial x</math>, <math>\partial/\partial v</math>, <math>\partial^2/\partial v^2</math>. Para isso, usamos a expansão da série de Taylor e, para melhor precisão, a derivada centrada (excluindo a derivada no tempo). Ademais, usaremos a notação dos índices para indicar os valores de <math>x</math>, <math>v</math> e <math>t</math> por <math>i</math>, <math>j</math> e <math>n</math>, respectivamente. | ||
:<math> | :<math> | ||
Linha 420: | Linha 446: | ||
Dado essas equações, escrevemos um programa em C para gerar os dados e o gnuplot para criar o gráfico/animação. Os códigos desenvolvidos estarão disponíveis na próxima seção " | Por fim, é necessário definir uma condição inicial e uma condição de contorno. Uma vez que a função descreve uma densidade de probabilidade, a literatura sugere, até para comparar com a solução analítica quando disponível, uma delta de Kronecker <math>\delta(x-x_0,v-v_0)</math>. Assim, em uma dada coordenada <math>(x,v)</math> no tempo <math>t_0</math> teremos uma probabilidade 1 de encontrar a partícula. Como condição de contorno, dado que a função em um dado ponto precisa dos pontos vizinhos, indicamos que a "borda" da matriz será sempre igual a zero. | ||
Dado essas equações, escrevemos um programa em C para gerar os dados e o gnuplot para criar o gráfico/animação. Os códigos desenvolvidos estarão disponíveis na próxima seção "Código desenvolvido". | |||
<center> | |||
<li style="display: inline-block;">[[Arquivo:caso1.gif|800px|thumb|middle|Animação da evolução da probabilidade de encontrar uma partícula com dada posição <math>x</math> e <math>v</math> a partir da equação de um oscilador harmônico amortecido. Valores da animação: <math>\Delta x = 1\times 10^{-3}</math>, <math>\Delta v = 1\times 10^{-3}</math>, <math>\Delta t = 1\times 10^{-6}</math>, <math>x_0=1</math>, <math>v=2</math>, <math>k=0.5</math>, <math>\gamma=0.5</math>, <math>\sigma=0.5</math>.]]</li> | |||
</center> | |||
A partir da referência estudada e da física do problema, é evidente que a animação apresentada está aquém do esperado. Pelos testes pelo grupo responsável por esse documento, o programa desenvolvido se mostrou muito instável e impreciso: alterações mínimas de alguns parâmetros alteravam consideravelmente o resultado observado. Esse comportamento "imprevisível" se tornou ainda evidente ao alterar o tamanho dos passos (''dt'', ''dx'', ''dv'') de forma que tanto aumentando quanto diminuindo uma ordem de grandeza a função "explodia" - isto é - crescia exponencialmente. Assim, não foi possível aumentar a resolução da "simulação". | |||
Além disso, em alguns casos, a função retornava valores negativos, o que é inadequado para uma densidade de probabilidade. Ademais, a ordem de grandeza para o tempo usada na simulação desse trabalho está muito abaixo da utilizada na referência base para esse problema, mostrando que a evolução temporal pode ter algum problema. No entanto, o problema que destacamos é a falta de "suavidade" na curva gerada, tanto é que em alguns quadros é possível ver mudanças bruscas no formato da função. | |||
Dessa forma, apesar dos esforços da equipe, não fomos capazes - até o momento dessa edição - de encontrar a causa desses problemas. No entanto, segue algumas hipóteses que podem ser avaliadas para futuras revisões deste material: | |||
- Verificar as equações utilizadas para descrever os problemas e a passagem para a equação de Fokker-Planck. A literatura encontrada não apresenta os passos usados para esse cálculo e nem a referência específica para cada etapa. Assim, o grupo precisou confiar que esse artigo estava correto. | |||
- Verificar a discretização da função para o método FTCS explícito. | |||
- Verificar a estabilidade do método, pois, apesar de não ter ser comentado no material de referência, é possível que o método explícito não seja adequado para os casos estudados. | |||
- Verificar possíveis problemas no código, tanto o código para os dados quanto para a visualização. | |||
- Verificar problemas de truncamento ou erro numérico ou ainda valores inadequados para as constantes utilizadas. | |||
==== Caso 2: problema de Duffing ==== | |||
Assim como no caso anterior, reescrevemos a equação para uma forma conveniente. | |||
<math> | |||
\frac{\partial \rho}{\partial t} = -\frac{\partial v}{\partial x}\rho + \frac{\partial}{\partial v} [(a_1(x) + a_2(x,v))\rho] + \frac{1}{2}\frac{\partial^2}{\partial v^2}(2D\rho) | |||
</math> | |||
<math> | |||
a_1(x) =\omega^2x(\alpha+\epsilon x^2), \quad a_2(x,v) = 2\tau\omega v, \quad D=D_{11}\omega^4x^2+D_{22} | |||
</math> | |||
<math> | |||
\begin{alignat}{2} | |||
\frac{\partial \rho}{\partial t} | |||
& = | |||
- \frac{\partial v}{\partial x}\rho | |||
+ \frac{\partial}{\partial v} [\omega^2x(\alpha+\epsilon x^2) + 2\tau\omega v]\rho | |||
+ \frac{\partial^2}{\partial v^2}(D_{11}\omega^4x^2+D_{22})\rho | |||
\\[1em] | |||
& = | |||
- v\frac{\partial}{\partial x}\rho | |||
+ [\omega^2x(\alpha+\epsilon x^2)+2\tau\omega v]\frac{\partial}{\partial v}\rho | |||
+ 2\tau\omega\rho | |||
+ (D_{11}\omega^4x^2+D_{22})\frac{\partial^2}{\partial v^2}\rho | |||
\end{alignat} | |||
</math> | |||
Novamente, substituímos os termos necessários pela forma discretizada. | |||
<math> | |||
\frac{\rho_{i,j}^{n+1}-\rho_{i,j}^n}{\Delta t} | |||
= | |||
- v \left( \frac{\rho_{i+1,j}^n-\rho_{i-1,j}^n}{2\Delta x} \right) | |||
+ [\omega^2{x^n}(\alpha+\epsilon {x^n}^2)+2\tau\omega v] | |||
\frac{\rho_{i,j+1}^n + \rho_{i,j-1}^n}{2\Delta v} | |||
+ 2\tau\omega \rho_{i,j}^n | |||
+ (D_{11}\omega^4{x^n}^2+D_{22}) | |||
\frac{\rho_{i,j+1}^n-2\rho_{i,j}^n+\rho_{i,j-1}^n}{(\Delta v)^2} | |||
</math> | |||
<math> | |||
\rho_{i,j}^{n+1} | |||
= | |||
\rho_{i,j}^n | |||
+ | |||
\Delta t | |||
\left\{ | |||
- v \left( \frac{\rho_{i+1,j}^n-\rho_{i-1,j}^n}{2\Delta x} \right) | |||
+ [\omega^2{x^n}(\alpha+\epsilon {x^n}^2)+2\tau\omega v] | |||
\frac{\rho_{i,j+1}^n + \rho_{i,j-1}^n}{2\Delta v} | |||
+ 2\tau\omega \rho_{i,j}^n | |||
+ (D_{11}\omega^4{x^n}^2+D_{22}) | |||
\frac{\rho_{i,j+1}^n-2\rho_{i,j}^n+\rho_{i,j-1}^n}{(\Delta v)^2} | |||
\right\} | |||
</math> | |||
Considerando mais uma vez que a velocidade da partícula será constante,podemos atualizar o valor de <math>x</math> pela expressão: <math>x^{n+1}=x^n+v\Delta t</math>. | |||
Para condições iniciais e condições de contorno, usamos o mesmo princípio definido no caso anterior: condição inicial dada por <math>\delta(x-x_0,v-v_0)</math> e condição de contorno definindo as "paredes" com valor zero para qualquer tempo <math>t</math>. | |||
Uma vez que o grupo não foi capaz de encontrar bons resultados para o caso anterior (mais simples), não foi desenvolvido nenhum código para esse exemplo até que o problema anterior fosse resolvido. Esperamos que em uma futura edição esse material possa trazer alguma visualização para o caso com ruído aditivo e multiplicativo descrito pelo problema de Duffing. | |||
== Código desenvolvido == | == Código desenvolvido == | ||
Função auxiliar utilizada do arquivo de cabeçalho ''pointers.h'': | |||
<source lang='c'> | |||
double ***create_3d_double_pointer(int x, int y, int z){ | |||
double ***pointer; | |||
int i, j; | |||
assert((x > 0) && (y > 0) && (z > 0)); | |||
pointer = (double ***)malloc(x * y * z * sizeof(double **)); | |||
if (pointer == NULL){ | |||
fprintf(stderr, "Error in routine create_3d_double_pointer\n"); | |||
exit(8); | |||
} | |||
else { | |||
for (i = 0; i < x; i++){ | |||
pointer[i] = (double **)malloc(y * z * sizeof(double *)); | |||
if (pointer[i] == NULL){ | |||
fprintf(stderr, "Error in routine create_3d_double_pointer\n"); | |||
exit(8); | |||
} | |||
} | |||
for (i = 0; i < x; i++){ | |||
for (j = 0; j < y; j++){ | |||
pointer[i][j] = (double *)malloc(z * sizeof(double)); | |||
if (pointer[i][j] == NULL){ | |||
fprintf(stderr, "Error in routine create_3d_double_pointer\n"); | |||
exit(8); | |||
} | |||
} | |||
} | |||
} | |||
return (pointer); | |||
} | |||
</source> | |||
Código utilizado para gerar os dados para o "caso 1". | |||
<source lang='c'> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <math.h> | |||
#include "pointers.h" | |||
int main(){ | |||
// Declara as variáveis | |||
FILE *fp; | |||
char output[50]; | |||
double ***f; | |||
int i, j, k, c, Lx, Lv; | |||
double time, tmax, dt, dx, dv, v, x, K, gamma, sigma, epsilon; | |||
// Configura os valores iniciais | |||
time = 0.0; // Tempo | |||
tmax = 0.0001; // Tempo máximo | |||
Lx = 50; // Quantidade de pontos em x | |||
Lv = 100; // Quantidade de pontos em v | |||
dt = 0.000001; // Passo em t | |||
dx = 0.001; // Passo em x | |||
dv = 0.001; // Passo em v | |||
x = 1; // Posição inicial | |||
v = 2; // Velocidade | |||
K = 0.5; // Constante | |||
gamma = 0.5; // Constante | |||
sigma = 0.5; // Constante | |||
epsilon = 10E-4; // Valor para comparação | |||
// Inicializa a matriz 3D | |||
f = create_3d_double_pointer(Lx, Lv, 2); | |||
// Todos os pontos com valores zero | |||
for (i=0; i<Lx; i++){ | |||
for (j=0; j<Lv; j++){ | |||
for (k=0; k<2; k++){ | |||
f[i][j][k] = 0.0; | |||
} | |||
} | |||
} | |||
// Condição inicial | |||
f[Lx/2][Lv/2][0] = 1.0; | |||
// Arquivo para output | |||
sprintf(output, "caso1.dat"); | |||
fp = fopen(output, "w"); | |||
c = 0; | |||
// Loop da "simulação" | |||
while (time<tmax){ | |||
for (i=1; i<(Lx-1); i++){ | |||
for (j=1; j<(Lv-1); j++){ | |||
// Atualiza a probabilidade | |||
f[i][j][1-c] = f[i][j][c]+dt*(-v*(f[i+1][j][c]-f[i-1][j][c])/(2*dx)+gamma*f[i][j][c]+(gamma*v+K*x)*(f[i][j+1][c]-f[i][j-1][c])/(2*dv)+sigma*(f[i][j+1][c]-2*f[i][j][c]+f[i][j-1][c])/(dv*dv)); | |||
// Salva o resultado em arquivo | |||
if (fabs(f[i][j][1-c]) > epsilon){ | |||
fprintf(fp, "%f %f %f\n", (double)(i-Lx/2)*dx+x, (double)(j-Lv/2)*dv+v, f[i][j][1-c]); | |||
} | |||
} | |||
// Adiciona linha em branco (arquivo XYZ - gnuplot) | |||
if (fabs(f[i][j][1-c]) > epsilon){ | |||
fprintf(fp, "\n"); | |||
} | |||
} | |||
// Atualiza a posição | |||
x = x + v*dt; | |||
c = 1 - c; | |||
// Adiciona duas linhas em branco (animação - gnuplot) | |||
fprintf(fp, "\n\n"); | |||
time += dt; | |||
} | |||
fclose(fp); // Fecha arquivo | |||
free(f); // Libera ponteiro | |||
return 0; | |||
} | |||
</source> | |||
Código utilizado no gnuplot para gerar a animação. | |||
<source lang='gnuplot'> | |||
# Limpa configurações anteriores | |||
unset xrange | |||
unset yrange | |||
unset zrange | |||
# Gera estatísticas dos dados | |||
stats "caso1.dat" name "A" | |||
# Estilo para gráfico | |||
set dgrid3d | |||
# Ponto de vista | |||
set view 60, 30, 1, 1 | |||
# Configura o range do plot | |||
set xrange [A_min_x:A_max_x] | |||
set yrange [A_min_y:A_max_y] | |||
set zrange [0:1] | |||
# Formato de saída | |||
set term gif animate delay 25 background "#212121" enhanced font "Arial,10" fontscale 1.0 size 800, 550 | |||
set title "Partícula em acelerador:\noscilador harmônico amortecido" offset character 0, -3 font "Oswald,28" tc rgb "white" | |||
set xlabel "Posição (x)" offset character -2, -2 font ",18" tc rgb "white" rotate by -9 | |||
set ylabel "Velocidade (v)" offset character -3, -3 font ",18" tc rgb "white" rotate parallel | |||
set zlabel "Densidade de probabilidade" offset character -1.5, -1.5 font ",18" tc rgb "white" rotate parallel | |||
set tics tc rgb "white" offset character -1, -1 | |||
set border lc rgb "white" | |||
set output "caso1.gif" | |||
do for [i=0:int(A_blocks-1)] { | |||
splot 'caso1.dat' index i with pm3d notitle | |||
} | |||
</source> | |||
== Referências == | == Referências == | ||
<references/> | <references/> |
Edição atual tal como às 08h03min de 29 de março de 2022
Grupo: Álison Soares, Rodrigo Avancini Lara e Samuel Huff Dieterich
A equação de Fokker-Planck foi aplicada em primeiro modo em problemas relacionados ao movimento Browniano, como veremos à seguir. Nesse caso, lidando com flutuações originadas de vários pequenos distúrbios, as partículas de interesse se chocavam com as moléculas do meio, provocando uma trajetória probabilística - isto é - não é possível descrever a evolução da partícula sem a observação. Porém, é possível determinar a probabilidade de encontrá-las em determinada região do espaço.
Esta equação pode ser obtida a partir da equação de Langevin [1] e fornece a probabilidade de encontrar determinada partícula em uma posição (varia conforme a dimensionalidade do problema) em um certo instante . Além disso, no presente trabalho temos como objetivo estudar a solução numérica da equação para um dado exemplo com duas variáveis para o espaço de fase mais o tempo, através do método FTCS explícito. [2]
Introdução
Movimento browniano
O movimento browniano foi descoberto pelo botanista Robert Brown, em 1827. Durante seu estudo sobre vida microscópica, ele percebeu pequenas partículas de pólen de plantas se movendo de maneira aleatória no líquido que ele estava estudando e, notando que se tratava de partículas de sujeira, e não seres vivos, chegou a conclusão que era um fenômeno físico, e não biológico, que causava este movimento. [3]
Posteriormente, foi provado que este fenômeno se dava pelos efeitos do movimento molecular. Em um meio com uma temperatura qualquer , há vibração e movimento molecular. Embora haja conservacão de energia, quando a partícula interage com as moléculas do meio, a energia cinética desta partícula se altera (assim como a das moléculas). Contudo, a soma destas energias é a energia interna do fluido, como descreve o Teorema da Equiparação. [4]
Em 1905, Albert Einstein propôs uma teoria para descrever tal movimento matematicamente. Primeiramente, ele se propôs a descrever o quão longe uma partícula browniana se desloca em um determinado intervalo de tempo. Como a partícula está sujeita a colisões por segundo (provindas das moléculas do meio), a mecânica clássica é incapaz de resolver este sistema [3][5]. Para resolver este problema, ele abordou o problema pela ótica da mecânica estatística.
Inicialmente, ele considerou o incremento da posição da partícula num espaço unidimensional (), num determinado intervalo de tempo (). Considerando que existe uma probabilidade aleatória da partícula se mover dentro do intervalo , ele definiu uma função para a densidade de probabilidade (). Sabendo que o número de partículas é constante dentro do meio, ele expandiu a densidade () deste em uma série de Taylor:
que é, por definição, . Continuando,
Pela definição da probabilidade,
e as integrais dos termos pares da série são nulos devido à simetria do espaço.
Temos então,
Esta equação nos leva à igualdade
Podemos interpretar a integral como o coeficiente de difusão :
O que nos dá a equação da difusão
Equação de Langevin
Em 1908, 3 anos após os estudos de Albert Einstein em processos aleatórios e movimento aleatório, Paul Langevin (1872-1946) apresentou um novo método para o movimento browniano que - segundo Langevin - era "infinitamente mais simples" que a solução proposta por Einstein. [6][7] Para interpretar o movimento browniano, Einstein derivou e resolveu uma equação diferencial parcial descrevendo a evolução temporal da densidade de probabilidade para a partícula. Já Langevin aplicou a segunda lei de Newton na forma diferencial para essa partícula.
Para uma partícula browniana de massa em um líquido com viscosidade , existem duas forças que agem sobre o seu movimento[7]:
1. Arrasto pela viscosidade.
2. Força de flutuação.
Considerando que a partícula é relativamente grande em comparação com as distâncias médias entre as moléculas do líquido e esta se movimento nesse meio com velocidade , experimenta uma resistência pela viscosidade. Essa força é descrita pela Lei de Stokes que, para uma partícula esférica com diâmetro , corresponde a .
A segunda força foi proposta por Langevin para descrever o efeito de constantes impactos das moléculas do líquido sobre as partículas de estudo. Assim, como esta força () possui uma origem aleatória, essa deveria ser positiva ou negativa de maneira equiprovável e cuja magnitude fosse suficiente para manter a agitação da partícula. Caso contrário, a viscosidade iria parar o movimento dessa partícula.
Com isso, a equação que descreve o movimento a partir da posição da partícula - em 1D na direção - é dado pela Lei de Newton como:
onde é a massa da partícula, é o coeficiente de fricção devido a viscosidade do líquido e é postulado a força de Langevin representando o efeito das colisões das moléculas do fluído. [8][9]
Essa equação é conhecida como a equação de Langevin e foi o primeiro exemplo de equação diferencial estocástica, isto é, uma equação diferencial com um termo, nesse caso, cuja solução em algum sentido também é uma função aleatória [7]. Essa função foi desenvolvida para possuir as seguintes propriedades:
onde descreve o valor médio ou esperado de uma função , é o coeficiente de difusão e é a função delta.
A primeira propriedade afirma que o movimento é aleatório de forma que não existe nenhuma tendência de sentido para a partícula se locomover. Assim, é dito que se trata de um ruído branco gaussiano. Já a segunda propriedade mostra que a força em um dado tempo é descorrelacionada de uma força para qualquer outro tempo (propriedade de Markov). [10]
Dedução da equação de Fokker-Planck
Para a dedução foi utilizado a seguinte referência como base: From Langevin to Fokker-Planck equation.[11]
Como vimos anteriormente, o movimento browniano pode ser descrito pela equação de Langevin, a qual podemos resolver sem nenhum problema. Contudo, alternativamente, podemos fazer uso da equação de Fokker-Planck e considerar uma densidade de probabilidade em relação a posição e o tempo, levando em conta diferentes perturbações estocásticas. Para isso, iremos agora deduzir essa equação, a partir da analise de Langevin.
A descrição do movimento browniano foi anteriormente tratada em termos da equação
onde é a massa da partícula, é o coeficiente de fricção devido a viscosidade do líquido e é postulado a força de Langevin.
Para o nosso propósito, realizaremos uma abordagem mais direta e geral, assumindo a equação de Langevin através de um potencial , nos deixando com a seguinte expressão:
onde e .
Contudo, para entender as equações diferenciais estocásticas, precisamos discretizar as equações para posteriormente aplicar os métodos numéricos. Temos que o sistema de discretização mais simples possível nos leva ao valor de no tempo a partir da interação
A tarefa é compreender como o agora ruído gaussiano afeta esse sistema discretizado. Para isso, escreveremos a evolução temporal da distribuição de probabilidade definida como a probabilidade da partícula estar em no tempo . Então, deve-se olhar para o limite de .
Vamos realizar a tarefa com a equação discretizada de Langevin comentada acima. Por razões de simplificação, discutiremos essa abordagem com a forma
onde Falhou ao verificar gramática (erro de sintaxe): {\displaystyle v(x) \equiv −\mu \frac{dU}{dx}} .
A equação da probabilidade pode ser derivada usando a equação de Chapman-Kolmogorov, a qual também iremos escrever em uma forma discretizada no tempo, da forma
onde é a probabilidade de que a partícula se mova para no instante , desde que tenha começado em no instante .
Lembrando que: para que a condição acima mova a partícula de a no tempo , o termo de ruído deve ter apenas o valor correspondente que satisfaz a equação
A probabilidade de acima é dada a partir da distribuição de probabilidade do incremento estocástico
Assim é obtido como
- Falhou ao verificar gramática (função desconhecida '\begin{alignat}'): {\displaystyle \begin{alignat}{2} W(x,y; \varepsilon) & = \rho_{G} (\eta_{\varepsilon} = x − y − v(y)\varepsilon) \\ & = \frac{1}{\sqrt{4\pi D\varepsilon}} \exp\left({\frac{−[x−y−v(y)\varepsilon]^2}{4Dε}}\right). \end{alignat} }
Substituindo o acima na equação de Chapman-Kolmogorov discretizada e expandindo o lado esquerdo para , temos
Como último passo agora, vamos expandir a integral do lado direito para ordenar . Notamos que quando , a Gaussiana vai para uma função delta e a integral resulta em que irá se cancelar com no lado esquerdo. Ao final, quando reorganizamos os termos, temos a seguinte equação denominada de Equação de Fokker-Planck
ou, se substituirmos pelo potencial Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle v(x) = −\mu \partial U(x)/\partial x} , temos que
onde, em ambos os casos, é o coeficiente de difusão no movimento browniano, com valor , cujas variáveis foram discutidas anteriormente na equação de Langevin.
Esta distribuição pode ainda depender de um conjunto de macrovariáveis , de tal maneira que o movimento browniano em questão pode ser representado por uma equação de Fokker-Planck da forma [12]:
onde é o termo que é dado por um vetor e é o termo de difusão, dado por uma matriz.
Exemplos: acelerador de partículas
O exemplo e explicações trazidas nessa seção foram retirados do artigo: Numerical solution of two dimensional Fokker-Planck equations [13].
Uma aplicação amplamente utilizada para a equação de Fokker-Planck como uma Equação Diferencial Estocástica (Stochastic Differential Equations, SDE) é para a modelagem da dinâmica de partículas únicas em aceleradores sob influência de ruído. As fontes de ruído são, por exemplo, campos aleatórios, movimento aleatório do solo ou flutuações quânticas da radiação.
A partir do cálculo de probabilidade fornecido pela equação de Fokker-Planck, algumas propriedades físicas de interesse são: qual é o comportamento de longo prazo da dinâmica; qual a probabilidade da partícula colidir com a câmara de vácuo e então ser perdida; quais são as flutuações médias da partícula em torno da trajetória do acelerador; e qual é a evolução temporal da densidade de probabilidade?
Para responder essas perguntas, apenas alguns casos mais específicos possuem soluções analíticas, especialmente em problemas com maior dimensionalidade. Por esse motivo, é interessante e prático estudar a equação de Fokker-Planck e os problemas relacionados a partir de métodos numéricos.
Para esse fim, serão abordados dois exemplos: o oscilador harmônico amortecido, o qual possuí solução analítica e poderá ser usado como comparação para verificar a acurácia do método; e o problema de Duffing, oscilador não linear, com amortecimento e ruído multiplicativo e aditivo, que não apresenta solução exata.
Equações
As equações diferenciais típicas encontradas na física do acelerador de partícula são
onde é o ruído branco gaussiano e é uma constante.
Para o caso do oscilador harmônico amortecido e com ruído, temos
onde e também são constantes.
Já para o oscilador estocástico de Duffing, não-linear, com amortecimento, ruído multiplicativo e aditivo temos
onde , , , , e são constantes dadas.
Escrevendo esses exemplos em termos da equação de Fokker-Planck obtemos
para o primeiro caso e
para o segundo exemplo.
Método FTCS explícito
Para os fins de estudo desses casos, o método numérico mais simples para descrever a função é a partir do FTCS (Foward Time Central Space) explícito [14]. Como ficará mais claro a partir da discretização das equações, o método FTCS calcula o resultado de uma função no tempo seguinte em um dado ponto a partir dos valores dos "vizinhos" desse ponto. Para a técnica explícita, podemos calcular valor da função no tempo a partir apenas de valores já conhecidos no tempo atual . Assim, a aplicação do método se torna bem simples, contudo, perdemos precisão/estabilidade em comparação com métodos mais sofisticados.
O primeiro passo para o método é discretizar os termos da função de interesse nas derivadas parciais necessárias: , , . Para isso, usamos a expansão da série de Taylor e, para melhor precisão, a derivada centrada (excluindo a derivada no tempo). Ademais, usaremos a notação dos índices para indicar os valores de , e por , e , respectivamente.
Aplicação
Com as derivadas parciais discretizadas, podemos agora reescrever as funções de Fokker-Planck para cada caso de estudo em busca do valor de , isto é, o valor de cada ponto no espaço para o tempo .
Caso 1: oscilador harmônico amortecido
Primeiramente, reescrevemos a função original expandindo os termos e aplicando a regra da cadeia onde for necessário.
Agora, reescrevemos a mesma função substituindo as derivadas parciais e demais variáveis necessárias () pelas versões discretizadas.
Para exercício, usaremos um constante de forma que apenas será necessário atualizar a variável para cada passo de tempo.
Por fim, é necessário definir uma condição inicial e uma condição de contorno. Uma vez que a função descreve uma densidade de probabilidade, a literatura sugere, até para comparar com a solução analítica quando disponível, uma delta de Kronecker . Assim, em uma dada coordenada no tempo teremos uma probabilidade 1 de encontrar a partícula. Como condição de contorno, dado que a função em um dado ponto precisa dos pontos vizinhos, indicamos que a "borda" da matriz será sempre igual a zero.
Dado essas equações, escrevemos um programa em C para gerar os dados e o gnuplot para criar o gráfico/animação. Os códigos desenvolvidos estarão disponíveis na próxima seção "Código desenvolvido".
A partir da referência estudada e da física do problema, é evidente que a animação apresentada está aquém do esperado. Pelos testes pelo grupo responsável por esse documento, o programa desenvolvido se mostrou muito instável e impreciso: alterações mínimas de alguns parâmetros alteravam consideravelmente o resultado observado. Esse comportamento "imprevisível" se tornou ainda evidente ao alterar o tamanho dos passos (dt, dx, dv) de forma que tanto aumentando quanto diminuindo uma ordem de grandeza a função "explodia" - isto é - crescia exponencialmente. Assim, não foi possível aumentar a resolução da "simulação".
Além disso, em alguns casos, a função retornava valores negativos, o que é inadequado para uma densidade de probabilidade. Ademais, a ordem de grandeza para o tempo usada na simulação desse trabalho está muito abaixo da utilizada na referência base para esse problema, mostrando que a evolução temporal pode ter algum problema. No entanto, o problema que destacamos é a falta de "suavidade" na curva gerada, tanto é que em alguns quadros é possível ver mudanças bruscas no formato da função.
Dessa forma, apesar dos esforços da equipe, não fomos capazes - até o momento dessa edição - de encontrar a causa desses problemas. No entanto, segue algumas hipóteses que podem ser avaliadas para futuras revisões deste material:
- Verificar as equações utilizadas para descrever os problemas e a passagem para a equação de Fokker-Planck. A literatura encontrada não apresenta os passos usados para esse cálculo e nem a referência específica para cada etapa. Assim, o grupo precisou confiar que esse artigo estava correto.
- Verificar a discretização da função para o método FTCS explícito.
- Verificar a estabilidade do método, pois, apesar de não ter ser comentado no material de referência, é possível que o método explícito não seja adequado para os casos estudados.
- Verificar possíveis problemas no código, tanto o código para os dados quanto para a visualização.
- Verificar problemas de truncamento ou erro numérico ou ainda valores inadequados para as constantes utilizadas.
Caso 2: problema de Duffing
Assim como no caso anterior, reescrevemos a equação para uma forma conveniente.
Novamente, substituímos os termos necessários pela forma discretizada.
Considerando mais uma vez que a velocidade da partícula será constante,podemos atualizar o valor de pela expressão: .
Para condições iniciais e condições de contorno, usamos o mesmo princípio definido no caso anterior: condição inicial dada por e condição de contorno definindo as "paredes" com valor zero para qualquer tempo .
Uma vez que o grupo não foi capaz de encontrar bons resultados para o caso anterior (mais simples), não foi desenvolvido nenhum código para esse exemplo até que o problema anterior fosse resolvido. Esperamos que em uma futura edição esse material possa trazer alguma visualização para o caso com ruído aditivo e multiplicativo descrito pelo problema de Duffing.
Código desenvolvido
Função auxiliar utilizada do arquivo de cabeçalho pointers.h:
double ***create_3d_double_pointer(int x, int y, int z){
double ***pointer;
int i, j;
assert((x > 0) && (y > 0) && (z > 0));
pointer = (double ***)malloc(x * y * z * sizeof(double **));
if (pointer == NULL){
fprintf(stderr, "Error in routine create_3d_double_pointer\n");
exit(8);
}
else {
for (i = 0; i < x; i++){
pointer[i] = (double **)malloc(y * z * sizeof(double *));
if (pointer[i] == NULL){
fprintf(stderr, "Error in routine create_3d_double_pointer\n");
exit(8);
}
}
for (i = 0; i < x; i++){
for (j = 0; j < y; j++){
pointer[i][j] = (double *)malloc(z * sizeof(double));
if (pointer[i][j] == NULL){
fprintf(stderr, "Error in routine create_3d_double_pointer\n");
exit(8);
}
}
}
}
return (pointer);
}
Código utilizado para gerar os dados para o "caso 1".
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "pointers.h"
int main(){
// Declara as variáveis
FILE *fp;
char output[50];
double ***f;
int i, j, k, c, Lx, Lv;
double time, tmax, dt, dx, dv, v, x, K, gamma, sigma, epsilon;
// Configura os valores iniciais
time = 0.0; // Tempo
tmax = 0.0001; // Tempo máximo
Lx = 50; // Quantidade de pontos em x
Lv = 100; // Quantidade de pontos em v
dt = 0.000001; // Passo em t
dx = 0.001; // Passo em x
dv = 0.001; // Passo em v
x = 1; // Posição inicial
v = 2; // Velocidade
K = 0.5; // Constante
gamma = 0.5; // Constante
sigma = 0.5; // Constante
epsilon = 10E-4; // Valor para comparação
// Inicializa a matriz 3D
f = create_3d_double_pointer(Lx, Lv, 2);
// Todos os pontos com valores zero
for (i=0; i<Lx; i++){
for (j=0; j<Lv; j++){
for (k=0; k<2; k++){
f[i][j][k] = 0.0;
}
}
}
// Condição inicial
f[Lx/2][Lv/2][0] = 1.0;
// Arquivo para output
sprintf(output, "caso1.dat");
fp = fopen(output, "w");
c = 0;
// Loop da "simulação"
while (time<tmax){
for (i=1; i<(Lx-1); i++){
for (j=1; j<(Lv-1); j++){
// Atualiza a probabilidade
f[i][j][1-c] = f[i][j][c]+dt*(-v*(f[i+1][j][c]-f[i-1][j][c])/(2*dx)+gamma*f[i][j][c]+(gamma*v+K*x)*(f[i][j+1][c]-f[i][j-1][c])/(2*dv)+sigma*(f[i][j+1][c]-2*f[i][j][c]+f[i][j-1][c])/(dv*dv));
// Salva o resultado em arquivo
if (fabs(f[i][j][1-c]) > epsilon){
fprintf(fp, "%f %f %f\n", (double)(i-Lx/2)*dx+x, (double)(j-Lv/2)*dv+v, f[i][j][1-c]);
}
}
// Adiciona linha em branco (arquivo XYZ - gnuplot)
if (fabs(f[i][j][1-c]) > epsilon){
fprintf(fp, "\n");
}
}
// Atualiza a posição
x = x + v*dt;
c = 1 - c;
// Adiciona duas linhas em branco (animação - gnuplot)
fprintf(fp, "\n\n");
time += dt;
}
fclose(fp); // Fecha arquivo
free(f); // Libera ponteiro
return 0;
}
Código utilizado no gnuplot para gerar a animação.
# Limpa configurações anteriores
unset xrange
unset yrange
unset zrange
# Gera estatísticas dos dados
stats "caso1.dat" name "A"
# Estilo para gráfico
set dgrid3d
# Ponto de vista
set view 60, 30, 1, 1
# Configura o range do plot
set xrange [A_min_x:A_max_x]
set yrange [A_min_y:A_max_y]
set zrange [0:1]
# Formato de saída
set term gif animate delay 25 background "#212121" enhanced font "Arial,10" fontscale 1.0 size 800, 550
set title "Partícula em acelerador:\noscilador harmônico amortecido" offset character 0, -3 font "Oswald,28" tc rgb "white"
set xlabel "Posição (x)" offset character -2, -2 font ",18" tc rgb "white" rotate by -9
set ylabel "Velocidade (v)" offset character -3, -3 font ",18" tc rgb "white" rotate parallel
set zlabel "Densidade de probabilidade" offset character -1.5, -1.5 font ",18" tc rgb "white" rotate parallel
set tics tc rgb "white" offset character -1, -1
set border lc rgb "white"
set output "caso1.gif"
do for [i=0:int(A_blocks-1)] {
splot 'caso1.dat' index i with pm3d notitle
}
Referências
- ↑ From Langevin to Fokker-Planck equation. URL: http://cgl.elte.hu/~racz/Stoch-diff-eq.pdf.
- ↑ M.P. Zorzano, H. Mais, L. Vazquez, Numerical solution of two dimensional Fokker—Planck equations, Applied Mathematics and Computation, 1999, https://doi.org/10.1016/S0096-3003(97)10161-8.
- ↑ 3,0 3,1 The Brownian Movement, The Feynman Lectures on Physics. URL: https://www.feynmanlectures.caltech.edu/I_41.html.
- ↑ The Equipartition Theorem, University of Oxford. URL: http://vallance.chem.ox.ac.uk/pdfs/Equipartition.pdf.
- ↑ Stachel, J., et al.; The Collected Papers of Albert Einstein, 1989, Princeton University Press. URL: http://users.physik.fu-berlin.de/~kleinert/files/eins_brownian.pdf.
- ↑ P. Langevin, "Sur la théorie de mouvement Brownien" C.R. Acad. Sci. Paris , 146 (1908) pp. 530–533, https://www.physik.uni-augsburg.de/theo1/hanggi/History/Langevin1908.pdf.
- ↑ 7,0 7,1 7,2 Gardiner, C.W. (1985). Handbook of stochastic methods - for physics, chemistry and the natural sciences, Second Edition. Springer series in synergetics.
- ↑ Langevin equation. Encyclopedia of Mathematics. URL: http://encyclopediaofmath.org/index.php?title=Langevin_equation&oldid=47575.
- ↑ Wikipédia: Langevin equation. URL: https://en.wikipedia.org/wiki/Langevin_equation.
- ↑ Wikipédia: Langevin equation. URL: https://en.wikipedia.org/wiki/Langevin_equation.
- ↑ From Langevin to Fokker-Planck equation. URL: http://cgl.elte.hu/~racz/Stoch-diff-eq.pdf.
- ↑ Wikipédia: Fokker-Planck Equation. URL: https://en.wikipedia.org/wiki/Fokker-Planck_equation.
- ↑ M.P. Zorzano, H. Mais, L. Vazquez, Numerical solution of two dimensional Fokker—Planck equations, Applied Mathematics and Computation, 1999, https://doi.org/10.1016/S0096-3003(97)10161-8.
- ↑ Pichler L., Masud A., Bergman L.A. (2013) Numerical Solution of the Fokker–Planck Equation by Finite Difference and Finite Element Methods—A Comparative Study. In: Papadrakakis M., Stefanou G., Papadopoulos V. (eds) Computational Methods in Stochastic Dynamics. Computational Methods in Applied Sciences, vol 26. Springer, Dordrecht. https://doi.org/10.1007/978-94-007-5134-7_5.