Medidas estáticas: mudanças entre as edições
(23 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 35: | Linha 35: | ||
= Psi 6= | = Psi 6 (<math> \psi_6 </math>)= | ||
No estudo do agrupamento de pontos equidistantes em um espaço 2D, é possível provar matematicamente que o formato formado pelos pontos que maximiza a utilização do espaço é o '''padrão hexagonal'''. Para dinâmicas moleculares com potenciais de Lennard-Jones com densidade suficientemente alta (rho ~) é possível observar que o padrão formado após o relaxamento (tempo suficiente para a rede se estabilizar) é de fato o padrão hexagonal. | No estudo do agrupamento de pontos equidistantes em um espaço 2D, é possível provar matematicamente que o formato formado pelos pontos que maximiza a utilização do espaço é o '''padrão hexagonal'''. Para dinâmicas moleculares com potenciais de Lennard-Jones com densidade suficientemente alta (rho ~0.8) é possível observar que o padrão formado após o relaxamento (tempo suficiente para a rede se estabilizar) é de fato o padrão hexagonal. | ||
O psi 6 é uma análise de o quão hexagonal um padrão de posições está em um certo tempo da simulação. É possível associar a cada partícula um valor que varia entre -1 e 1 da hexagonalidade do padrão de posições formado por ele e seus primeiros vizinhos (conjunto de partículas mais próximas). Com essa medida é possível quantificar diferentes regiões da "caixa" em que as partículas estão localizadas e então localizar possíveis "defeitos" no padrão hexagonal. | O psi 6 é uma análise de o quão hexagonal um padrão de posições está em um certo tempo da simulação. É possível associar a cada partícula um valor que varia entre -1 e 1 da hexagonalidade do padrão de posições formado por ele e seus primeiros vizinhos (conjunto de partículas mais próximas). Com essa medida é possível quantificar diferentes regiões da "caixa" em que as partículas estão localizadas e então localizar possíveis "defeitos" no padrão hexagonal. | ||
Linha 57: | Linha 57: | ||
=== Encontrando vizinhos === | === Encontrando vizinhos === | ||
Por definição, os primeiros vizinhos de uma partícula são aquelas partículas que estão presentes em um anel mais próximo dela, como mostra a | Por definição, os primeiros vizinhos de uma partícula são aquelas partículas que estão presentes em um anel mais próximo dela, como mostra a figura ao lado. | ||
O problema de encontrar primeiros vizinhos é um problema bastante discutido em teoria da computação e diversos métodos foram desenvolvidos para efetuar esta tarefa. Desta forma a maioria dos métodos otimizados são de difícil implementação e então não serão tratados nesse verbete. | O problema de encontrar primeiros vizinhos é um problema bastante discutido em teoria da computação e diversos métodos foram desenvolvidos para efetuar esta tarefa. Desta forma a maioria dos métodos otimizados são de difícil implementação e então não serão tratados nesse verbete. | ||
O método aqui citado é pouco otimizado, pois utiliza-se um for em <math>N^2</math>, porém de implementação razoavelmente simples. O método consiste em encontrar as partículas mais próximas da partícula-teste (partícula em que busca-se calcular o valor de <math>\psi_6</math> | O método aqui citado é pouco otimizado, pois utiliza-se um for em <math>N^2</math>, porém de implementação razoavelmente simples. O método consiste em encontrar as partículas mais próximas da partícula-teste (partícula em que busca-se calcular o valor de <math>\psi_6</math> baseando-se em outro valor já calculado, a medida do g(r), desta forma o valor de <math>\psi_6</math> resultará em um valor razoável ( >0.8 ) se os vizinhos dentro do raio medido no g(r) são de fato 6 e estão localizados em um padrão quase-hexagonal em torno da partícula-teste. | ||
Para encontrar os primeiros vizinhos baseando-se no g(r), precisa-se observar qual a medida do primeiro pico no gráfico do g(r) e então definir este como uma distância de corte para a partícular ser ou não vizinha (isto é, um circulo com o raio da distância de corte ao redor da partícula-teste de forma que outras partículas dentro deste círculo são suas vizinhas). Neste caso, definem-se três vetores: "neighborsX" (que guarda a posição X do vizinho), "neighborsY"(que guarda a posição Y do vizinho) e "dNeighbors"(que guarda a distância do vizinho) e então faz-se o for em <math>N^2</math> buscando-se as distância menores que o raio de corte: | Para encontrar os primeiros vizinhos baseando-se no g(r), precisa-se observar qual a medida do primeiro pico no gráfico do g(r) e então definir este como uma distância de corte para a partícular ser ou não vizinha (isto é, um circulo com o raio da distância de corte ao redor da partícula-teste de forma que outras partículas dentro deste círculo são suas vizinhas). Neste caso, definem-se três vetores: "neighborsX" (que guarda a posição X do vizinho), "neighborsY"(que guarda a posição Y do vizinho) e "dNeighbors"(que guarda a distância do vizinho)[É recomendado definir estes vetores com tamanho pelo menos de 10, pois é possível que sejam encontrados mais de 6 vizinhos, para isso existe a variável de controle "k" que guarda quantos vizinhos cada partícula tem] e então faz-se o for em <math>N^2</math> buscando-se as distância menores que o raio de corte: | ||
<pre> | <pre> | ||
for(i=0;i<NP;i++){ | for(i=0;i<NP;i++){ | ||
k=0; | |||
xOrg=xx[i]; | |||
yOrg=yy[i]; | yOrg=yy[i]; | ||
for(j=0;j<NP;j++){ | for(j=0;j<NP;j++){ | ||
Linha 74: | Linha 75: | ||
y2=yy[j]; | y2=yy[j]; | ||
if(i!=j){ | if(i!=j){ | ||
deltaX=fabs(x2-x1); | |||
deltaY=fabs(y2-y1); | |||
//Condições de contorno | |||
deltaX=deltaX-rint(deltaX/Lx)*Lx; | |||
deltaY=deltaY-rint(deltaY/Ly)*Ly; | |||
// --- // | |||
d=sqrt((deltaX*deltaX)+(deltaY*deltaY)); | |||
if(d<radiusLimit) | |||
{ | { | ||
neighborsX[k]=x2; | neighborsX[k]=x2; | ||
neighborsY[k]=y2; | neighborsY[k]=y2; | ||
dNeighbors[k]= | dNeighbors[k]=d; | ||
k+=1; | k+=1; | ||
} | } | ||
} | } | ||
} | |||
</pre> | </pre> | ||
Linha 126: | Linha 134: | ||
angle[j]=cos(6.*(angle[j+1]-angle[j])); | angle[j]=cos(6.*(angle[j+1]-angle[j])); | ||
} | } | ||
angle[k-1]=cos(6.*(firstAngle+2* | angle[k-1]=cos(6.*(firstAngle+2*3.1415-angle[k-1])); | ||
for(j=0;j<k;j++){ | for(j=0;j<k;j++){ | ||
psix[i]+=angle[j]/ | psix[i]+=angle[j]/6.; | ||
} | } | ||
} | } | ||
Linha 137: | Linha 145: | ||
=== Exemplos === | === Exemplos === | ||
Para o caso de um potencial de Lennard-Jones, é possível observar resultados de mapas de <math> \psi_6 </math>, isto é, um mapa que mostra para cada partícula o seu valor da medida, da seguinte forma para cada valor de rho: | |||
[[Image:Psix_1.png|thumb|400px|right|Resultados do valor de <math>\psi_6</math> (em cores) para o caso de um potencial de Lennard Jones para <math> \rho=1.000 </math>]] | |||
[[Image:Psix_0360.png|thumb|400px|left|Resultados do valor de <math>\psi_6</math> (em cores) para o caso de um potencial de Lennard Jones para <math> \rho=0.360 </math>.]] | |||
[[Image:Psix_0640.png|thumb|400px|center|Resultados do valor de <math>\psi_6</math> (em cores) para o caso de um potencial de Lennard Jones para <math> \rho=0.640 </math>]] | |||
== Aplicações em outras áreas == | |||
[[Image:Celulasdegrade.png|thumb|300px|right|Mapa neural de células de grade em que o valor de <math> \psi_6 </math> equivale 0,99.]] | |||
No estudo de como animais processam a sua posição em seu cerébro, são observadas as chamadas "Células de grade", neurônios que disparam em certos locais específicos do espaço e tendem a formar padrões de grade (hexagonal). Em posse das posições de disparo desses neurônios é possível utilizar a medida do <math> \psi_6 </math> para determinar a "hexagonalidade" dos disparos, podendo-se realizar estudos da influência desse formato na interpretação geoespacial do animal. |
Edição atual tal como às 18h17min de 1 de agosto de 2016
Em dinâmica molecular, medidas estáticas são medidas realizadas em um passo específico de tempo da simulação.
Pair Distribution Function
A Pair Distribution Function , ou "", é uma função que estima o quão provável é encontrar duas partículas a uma distância dentro de um sistema de várias partículas.
Em um sistema de partículas, o é definido como a média do número de partículas a uma distância :
Numéricamente pode ser interpretado como a média do número de pares de partículas a uma distância entre e pesado pelo volume/área desta região.
Onde é o/a volume/área total e é a função retangular.
Em resumo, o é a média dos histogramas do número de partículas em um bin de largura a uma feitos para cada partícula no sistema pesado pelo volume/área deste bin.
Construção do Código
Resultados
Referências
- Frenkel, Daan and Smit, Berend (2001). Understanding Molecular Simulation. Academic Press.
Psi 6 ()
No estudo do agrupamento de pontos equidistantes em um espaço 2D, é possível provar matematicamente que o formato formado pelos pontos que maximiza a utilização do espaço é o padrão hexagonal. Para dinâmicas moleculares com potenciais de Lennard-Jones com densidade suficientemente alta (rho ~0.8) é possível observar que o padrão formado após o relaxamento (tempo suficiente para a rede se estabilizar) é de fato o padrão hexagonal.
O psi 6 é uma análise de o quão hexagonal um padrão de posições está em um certo tempo da simulação. É possível associar a cada partícula um valor que varia entre -1 e 1 da hexagonalidade do padrão de posições formado por ele e seus primeiros vizinhos (conjunto de partículas mais próximas). Com essa medida é possível quantificar diferentes regiões da "caixa" em que as partículas estão localizadas e então localizar possíveis "defeitos" no padrão hexagonal.
Para um padrão hexagonal perfeito, cada partícula apresenta 6 primeiros vizinhos, cada qual posicionado simetricamente em torno dessa. Analisando a simetria, cada vizinho consecutivo deve apresentar um ângulo de . Buscando uma relação em que esta situação seja a situação de , é possível definir que o vale:
Onde i é o índice do i-ésimo vizinho e n é o número de primeiros vizinhos. Esta relação deixa específico que o caso de 6 primeiros vizinhos e resulte em um valor de .
Implementação Computacional
Pode-se separar a implementação computacional em dois procedimentos necesssários: Encontrar os primeiros vizinhos para cada partícula e então calcular, de fato, o valor de .
Encontrando vizinhos
Por definição, os primeiros vizinhos de uma partícula são aquelas partículas que estão presentes em um anel mais próximo dela, como mostra a figura ao lado.
O problema de encontrar primeiros vizinhos é um problema bastante discutido em teoria da computação e diversos métodos foram desenvolvidos para efetuar esta tarefa. Desta forma a maioria dos métodos otimizados são de difícil implementação e então não serão tratados nesse verbete.
O método aqui citado é pouco otimizado, pois utiliza-se um for em , porém de implementação razoavelmente simples. O método consiste em encontrar as partículas mais próximas da partícula-teste (partícula em que busca-se calcular o valor de baseando-se em outro valor já calculado, a medida do g(r), desta forma o valor de resultará em um valor razoável ( >0.8 ) se os vizinhos dentro do raio medido no g(r) são de fato 6 e estão localizados em um padrão quase-hexagonal em torno da partícula-teste.
Para encontrar os primeiros vizinhos baseando-se no g(r), precisa-se observar qual a medida do primeiro pico no gráfico do g(r) e então definir este como uma distância de corte para a partícular ser ou não vizinha (isto é, um circulo com o raio da distância de corte ao redor da partícula-teste de forma que outras partículas dentro deste círculo são suas vizinhas). Neste caso, definem-se três vetores: "neighborsX" (que guarda a posição X do vizinho), "neighborsY"(que guarda a posição Y do vizinho) e "dNeighbors"(que guarda a distância do vizinho)[É recomendado definir estes vetores com tamanho pelo menos de 10, pois é possível que sejam encontrados mais de 6 vizinhos, para isso existe a variável de controle "k" que guarda quantos vizinhos cada partícula tem] e então faz-se o for em buscando-se as distância menores que o raio de corte:
for(i=0;i<NP;i++){ k=0; xOrg=xx[i]; yOrg=yy[i]; for(j=0;j<NP;j++){ x2=xx[j]; y2=yy[j]; if(i!=j){ deltaX=fabs(x2-x1); deltaY=fabs(y2-y1); //Condições de contorno deltaX=deltaX-rint(deltaX/Lx)*Lx; deltaY=deltaY-rint(deltaY/Ly)*Ly; // --- // d=sqrt((deltaX*deltaX)+(deltaY*deltaY)); if(d<radiusLimit) { neighborsX[k]=x2; neighborsY[k]=y2; dNeighbors[k]=d; k+=1; } } }
Portanto após esse algoritmo, temos guardadas as posições das partículas mais próximas. É importante ressaltar que o "for" em partícula-teste ainda não foi fechado, e ainda dentro deste mesmo loop serão calculados os valores de .
Calculando o Psi 6
Tendo os valores de X e Y dos vizinhos da partícula-teste, podemos proceder para o cálculo do . Para este cálculo, precisamos dos ângulos que cada vizinho tem em relação a partícula-teste, isto é, setamos um referencial X-Y com a origem na partícula-teste e calculamos o ângulo que cada vizinho tem com o eixo X, este ângulo será chamado de e será dado pela seguinte relação:
Na implementação em código fica:
for(j=0;j<k;j++){ delX=neighborsX[j]-xx[i]; delY=neighborsY[j]-yy[i]; //Condições de contorno periódicas delX=delX-rint(delX/Lx)*Lx; delY=delY-rint(delY/Ly)*Ly; // --- // angle[j]=atan2(delY,delX); if (angle[j]<0) angle[j]=2*PI+angle[j]; psix[i]=0;
Agora somente precisa-se realizar um algoritmo que ordene o vetor "angle" do menor para o maior ângulo, utilizando algoritmos de ordenamento (bubblesort, quicksort, etc) desta forma é possível calcular os .
Feito o ordenamento do vetor, basta calcular a média do valor do de cada vizinho. Para isto, precisamos calcular os valores de em função dos , basta realizar a subtração do próximo vizinho no vetor pelo valor do ângulo do vizinho atual, dessa forma: com exceção do último vizinho, que será o ângulo dele menos o do primeiro, desta forma a implementação fica:
firstAngle=angle[0]; for(j=0;j<k-1;j++){ angle[j]=cos(6.*(angle[j+1]-angle[j])); } angle[k-1]=cos(6.*(firstAngle+2*3.1415-angle[k-1])); for(j=0;j<k;j++){ psix[i]+=angle[j]/6.; } } }
E então está calculado o valor de , para facilitar a implementação é recomendado que este algoritmo seja uma função dentro de seu código e desta forma retorne o vetor "psix".
Exemplos
Para o caso de um potencial de Lennard-Jones, é possível observar resultados de mapas de , isto é, um mapa que mostra para cada partícula o seu valor da medida, da seguinte forma para cada valor de rho:
Aplicações em outras áreas
No estudo de como animais processam a sua posição em seu cerébro, são observadas as chamadas "Células de grade", neurônios que disparam em certos locais específicos do espaço e tendem a formar padrões de grade (hexagonal). Em posse das posições de disparo desses neurônios é possível utilizar a medida do para determinar a "hexagonalidade" dos disparos, podendo-se realizar estudos da influência desse formato na interpretação geoespacial do animal.