简体   繁体   中英

Standard Deviation Python Plotting

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函数,因此在将它传递给plotstdofmag=[]为空列表

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM