I need some quick help with plotting the answers I get for a code. I'm pretty new to this, nonetheless, I'm trying to compute the standard deviation of the answers of the calculation, after which I need to plot the new answers of the standard deviation calculation just performed into a graph. The problem is the plot appears before the calculation is performed just giving an empty plot, and then allowing for the running of the code. Any help would be greatly appreciated.
from numpy import zeros
from random import choice, random
import math
def create_lattice(nx,ny):
possibleSpins = (-1,1)
lattice = zeros((nx,ny))
for i in range(nx):
for j in range(ny):
lattice[i][j] = choice(possibleSpins)
return lattice
def magnetization(nx, ny, lattice):
magnet = 0.0
for i in range(nx):
for j in range(ny):
magnet += (lattice[i][j]/(nx*ny))
return magnet
def ising_model(nsweeps, nx, ny, Js):
magnet = 0.0
s_energy = 0.0
e_energy = 0.0
d_energy = 0.0
spin = 0.0
rand = 0.0
good = 0.0
bad = 0.0
nostep = 0.0
lattice = create_lattice(nx, ny)
magnet = magnetization(nx, ny, lattice)
energies = zeros((nx,ny))
print(lattice)
# Each sweep is a complete look at the lattice
for sweeps in range(nsweeps):
for i in range(nx):
for j in range(ny):
spin = lattice[i][j]
s_energy = -1 * Js * spin * (lattice[(i-1)][j] + lattice[i][(j-1)] + lattice[i][(j+1)%ny] + lattice[(i+1)%nx][j])
lattice[i][j] = -1 * spin
e_energy = -1 * Js * lattice[i][j] * (lattice[(i-1)][j] + lattice[i][(j-1)] + lattice[i][(j+1)%ny] + lattice[(i+1)%nx][j])
d_energy = e_energy - s_energy
rand = random()
if d_energy <= 0 :
good = good + 1
magnet += ((-2*spin)/(nx*ny))
answers.append(magnet)
elif d_energy > 0 and rand <= math.exp(-1 * d_energy):
bad = bad + 1
magnet += ((-2*spin)/(nx*ny))
answers.append(magnet)
else:
lattice[i][j] = spin
nostep = nostep + 1
print(magnet)
print(lattice)
print(good)
print(bad)
print(nostep)
# energies array is
return energies
answers = []
stdofmag = []
def standard_deviation():
stdmag = statistics.stdev(answers)
print(stdmag)
stdofmag.append(stdmag)
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(stdofmag, 'r-', label = "Std of Magnetization")
title_temp = "Magnetization"
plt.title(title_temp, fontsize=12, fontweight='bold', color='green')
ax.legend(loc='best', ncol=1, fancybox=True, shadow=True)
plt.xlabel('Number of Iterations')
plt.ylabel('Answer')
ax.grid(True)
plt.show(block=True)
Disregard the x and y labels they're dummy variables.