Source code for MonteCarloAlgorithm.metropolis

import numpy as np

[docs]class Metropolis: """ runs the monte carlo alg to find average energy levels of a hamiltonian """
[docs] @staticmethod def metropolis_montecarlo(hamiltonian, config, temperature=1, calc_sweep=1000, pre_calc_sweep=100): """ runs a full metropolis sweep on a hamiltonian Parameters ---------- config bit string temperature temperature calc_sweep how many iterations it should run for pre_calc_sweep how many iterations it should run before calculations begin Returns ------- aproximate energy, magnetization, energy squared, magnetization squared values """ for x in range(pre_calc_sweep): config = hamiltonian.metropolis_sweep(config, temperature) energy_samples = np.zeros(calc_sweep) energy_samples[0] = np.array([hamiltonian.energy(config)]) magnetization_samples = np.zeros(calc_sweep) magnetization_samples[0] = np.array([np.sum(2*config.string - 1)]) for x in range(1, calc_sweep): config = hamiltonian.metropolis_sweep(config, temperature) energy_samples[x] = hamiltonian.energy(config) magnetization_samples[x] = np.sum(2*config.string - 1) energy_samples_squared = np.square(energy_samples) magnetization_samples_squared = np.square(magnetization_samples) average_energy_samples = np.zeros(len(energy_samples)) average_energy_samples_squared = np.zeros(len(energy_samples)) average_magnetization_samples = np.zeros(len(energy_samples)) average_magnetization_samples_squared = np.zeros(len(energy_samples)) for x in range(1, len(energy_samples)): average_energy_samples[x] = np.average(energy_samples[0:x]) average_energy_samples_squared[x] = np.average(energy_samples_squared[0:x]) average_magnetization_samples[x] = np.average(magnetization_samples[0:x]) average_magnetization_samples_squared[x] = np.average(magnetization_samples_squared[0:x]) return average_energy_samples, average_energy_samples_squared, \ average_magnetization_samples, average_magnetization_samples_squared
[docs] @staticmethod def metropolis_to_end_values(average_energy_samples, average_energy_samples_squared, \ average_magnetization_samples, average_magnetization_samples_squared, temperature=1.0): """ converts full metropolis sweep results into useful values Parameters ---------- average_energy_samples average energy array average_energy_samples_squared average energy squared array average_magnetization_samples average magnetization array average_magnetization_samples_squared average magnetization squared array temperature temperature of system Returns ------- aproximate energy, magnitization, heat capacity, and magnetic suceptibility values """ hc = (average_energy_samples_squared[-1] - average_energy_samples[-1]**2) / (temperature**2) ms = (average_magnetization_samples_squared[-1] - average_magnetization_samples[-1]**2) / (temperature) return average_energy_samples[-1], average_magnetization_samples[-1], hc, ms