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.
您从未调用过standard_deviation
函数,因此在将它传递给plot
时stdofmag=[]
为空列表
Your stdofmag
variable is an empty list so you are plotting nothing. Your script as written isn't actually doing any work except creating a figure setting some labels and showing it. You need to actually call the functions you define in order for your lists to get filled. That being said I can see numerous other errors that will prevent these functions from working as you probably intend. Might be a good idea to take a step back and make sure each function is operating as you intend before trying to connect everything is one block.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.