Skip to content
Snippets Groups Projects
metropolis.py 1.03 KiB
import numpy as np

def pi_0(N):
    """Genera un arreglo NxN de numpy con valores 1 o -1 escogidos aleatoriamente.
    
    Argumentos:

    N -- int
        tamaño de la red
    """
    Pi_0 = 2*np.random.randint(2 , size = (N,N)) - 1
    return Pi_0

def MC_metropolis(arreglo, beta, N):
    """Ejecuta un paso de monte carlo sobre una configuración de espines
    
    Argumentos:

    arreglo --  arreglo NxN de numpy
        valores del espin en cada sitio
    beta -- flotante
        inverso de la temperatura en unidades donde kb = J = 1
    N -- int
    """
    for i in range(0, 2 * N**2):
        a, b = np.random.randint(0,N), np.random.randint(0,N)
        rand_spin = arreglo[a, b]
        vecinos = arreglo[(a+1)%N, b] + arreglo[a, (b+1)%N] + \
                    arreglo[(a-1)%N, b] + arreglo[a, (b-1)%N]
        delta_energia = 2 * rand_spin * vecinos
        if delta_energia < 0:
            arreglo[a,b] *= -1
        elif np.random.uniform(0,1) < np.exp(-delta_energia*beta):
            arreglo[a,b] *= -1
    return arreglo