In [22]:
%matplotlib inline
import random
import matplotlib
import matplotlib.pyplot as plt
from math import sqrt
import simulation.Networks as Network
import simulation.Contagion as Contagion
import simulation.System as System
import simulation.MCMC as MCMC
random.seed(int("54e22d", 16))
steps = 100000
side = 16
spins = side * side
In [23]:
def observables(system, observations):
E = 0.0
M = 0.0
S = system.wolffIsing.network.nodes
for k in range(system.wolffIsing.network.numNodes):
M += S[k]['spin']
E -= S[k]['spin'] * sum([S[neighbor]['spin'] for neighbor in system.wolffIsing.network.edges[k]])
observations['absMeanEnergy'] += abs(0.5 * E) / (spins * steps)
observations['absMeanMagnetization'] += abs(M) / (spins * steps)
def randomSpin(x, y):
return {'spin': random.sample([-1, 1], 1)[0] }
In [24]:
def experiment(temperature):
network = Network.Lattice2DNP(side, side, {}, {})
network.build(randomSpin)
contagion = Contagion.WolffIsing(network, 1/float(temperature), random.random)
system = System.WolffIsing(contagion, random.randint)
montecarlo = MCMC.MCMC(system, random.random)
observations = {'absMeanEnergy': 0, 'absMeanMagnetization': 0}
montecarlo.simulate(observables, observations, steps)
return (observations['absMeanEnergy'], observations['absMeanMagnetization'])
In [25]:
temperatures = [float(x)/5 for x in range(1, 25)]
results = [x for x in map(experiment, temperatures)]
In [26]:
mags = [x[1] for x in results]
energies = [x[0] for x in results]
In [27]:
plt.plot(temperatures, list(mags), marker="o", linestyle='None')
Out[27]:
In [28]:
plt.plot(temperatures, list(energies), marker="o", linestyle='None')
Out[28]: