He estado luchando bastante con la implementación de un código de autocorrelación en mi proyecto actual. La autocorrelación como es ahora, está aumentando exponencialmente de 1 en el inicio de mi ejecución MC, y golpeando 2 a mitad de camino a través de la simulación MC independientemente de cómo muchos barridos que hago a través de la red.
El sistema
Red cuadrada de 10x10 sin campo magnético externo y con acoplamiento ferromagnético. El motivo de 10x10 es la ejecución rápida del código para construirlo.
Esto es lo que he hecho hasta ahora:
- Dejar que el Monte Carlo de Metrópolis trabaje hasta que el sistema esté en equilibrio (comprobarlo ejecutando dos estados iniciales diferentes con semillas aleatorias distintas).
- Entonces empiezo a barrer a través de la red, actualizando las energías y la magnetización para cada intento de voltear un espín. Cuando he hecho un barrido por la red, el último valor de la energía y la magnetización se almacena. Luego se continúa con el siguiente barrido y se siguen actualizando los valores. Así, las energías y la magnetización sólo se almacenan una vez por barrido.
- Cuando he realizado, por ejemplo, 2000 barridos, calculo la autocorrelación del sistema según Newman & Barkema (Ec. 3.21 en http://itf.fys.kuleuven.be/~fpspXIII/material/Barkema_FPSPXIII.pdf ). La fórmula es la siguiente: $$\chi(t)=\frac{1}{t_{max}-t}\sum_{t'=0}^{t_{max}-t}m(t')m(t'+t)-\frac{1}{t_{max}-t}\sum_{t'=0}^{t_{max}-t}m(t')\times\frac{1}{t_{max}-t}\sum_{t'=0}^{t_{max}-t}m(t'+t)$$ donde t define el número de barridos de la red, es decir, el desplazamiento/lag desde algún valor.
Mi problema De mi simulación en $k_{b}T/J$ , donde $k_{b}$ se fija en 1, $J=1$ es el acoplamiento ferromagnético, y $T=1$ la función de autocorrelación crece. He intentado normalizarla dividiendo por el primer valor que da como resultado un inicio en 1, pero se comporta de forma extraña como se ha indicado. Así que me puse a calcular a mano tratando de ver si había codificado algo mal. He trabajado con un sistema en el que cada espín de la red tenía el espín 1 por cada $t\Rightarrow m(t')=m(t'+t)=\langle m \rangle=1$ . A continuación, corto la autocorrelación en $t$ =1000 cuando se realizan 2000 barridos. La fórmula se reduce entonces a $$\chi(t)=\frac{1}{2000-t}\sum_{t'=0}^{2000-t}1-\frac{1}{2000-t}\sum_{t'=0}^{2000-t}1\times\frac{1}{2000-t}\sum_{t'=0}^{2000-t}1$$ . Entonces, para algunos valores: $$\chi(0)=\frac{1}{2000}\sum_{t'=0}^{2000}1-\frac{1}{2000}\sum_{t'=0}^{2000}1\times\frac{1}{2000}\sum_{t'=0}^{2000}1$$ $$=\frac{2001}{2000}-\left(\frac{2001}{2000}\right)^{2}\approx-5\cdot10^{-4}$$ $$\chi(500)=\frac{1501}{1500}-\left(\frac{1501}{1500}\right)^{2}\approx-6.6\cdot10^{-4}$$ $$\chi(1000)=\frac{1001}{1000}-\left(\frac{1001}{1000}\right)^{2}\approx-1\cdot10^{-3}$$ Como vemos, el valor de la autocorrelación se ha duplicado al comprobar la mitad del número de barridos a través de la red.
Preguntas:
- Yo esperaría que la función de correlación se comportara como una función que decae exponencialmente como $e^{-t/\tau}$ donde $\tau$ es el tiempo de correlación, sino que los gráficos muestran un crecimiento exponencial con los valores calculados anteriormente.
- La expresión para la autocorrelación, tal y como se indica en este post, es una discretización de $$\chi(t)=\int dt'(m(t')-\langle m\rangle)(m(t'+t)-\langle m \rangle)$$ lo que implica que si todos los valores son 1, la integral debe dar alguna constante, no una función creciente. ¿Qué ha fallado?