In [1]:
import numpy as np
import numpy.random as npr
import matplotlib.pyplot as plt
In [2]:
N = 100    # taille de la grille (on suppose N pair pour simplifier les interactions au bord)
betaCritique = np.log(1+np.sqrt(2))/2
In [3]:
def Proba(i,j,M,beta): # proba que le site (i,j) = 1 sachant les voisins 
    D = M[i-1,j] + M[(i+1)%N,j] + M[i,(j+1)%N] + M[i,j-1]
    return 1/(1+np.exp(-2*beta*D))

def EtapeBlanche(M,beta):
    for i in range(N):
        for j in range(N):
            if (i-j)%2 == 0:
                if npr.random() < Proba(i,j,M,beta):
                    M[i,j] = 1
                else:
                    M[i,j] = -1
    return(M)

            
def EtapeNoire(M,beta):
    for i in range(N):
        for j in range(N):
            if (i-j)%2 == 1:
                if npr.random() < Proba(i,j,M,beta):
                    M[i,j] = 1
                else:
                    M[i,j] = -1
    return(M)


def Gibbs(Nstep,M0,beta):
    M = M0
    for i in range(Nstep):
        if i%2 == 0: 
            M = EtapeBlanche(M,beta)
        else:
            M = EtapeNoire(M,beta)
    return(M)
In [4]:
# Conditions initiales 

def M0rand(N): return(2*np.random.randint(2,size=(N,N))-1) # aléatoire
def M0align(N): return(np.ones((N,N))) # aligné
In [6]:
# Illustration 

Nstep = 500
M0 = M0align(N)
beta = betaCritique-0.1

IsingGibbs = Gibbs(Nstep,M0,beta)

plt.imshow(IsingGibbs)
plt.show()
In [ ]:
 
In [ ]: