#function #numpy #mapping #montecarlo #map-function
Вопрос:
Я пытаюсь применить свою функцию CasinoTime к каждой позиции в моем массиве за развертку. В настоящее время функция выполняет это, но выбирает позицию случайным образом и может выполнять только одну позицию за развертку. Результат выглядит примерно так:
Starting Configuration: [[ 1 -1 1 1 -1 -1 1 1 1 -1]] 0: [[ 1 -1 1 1 -1 -1 1 1 1 -1]] Energy: [-2] Spin: 0.2 1: [[ 1 -1 1 1 1 -1 1 1 1 -1]] Energy: [[-10]] Spin: 0.4 2: [[ 1 -1 1 1 1 -1 1 1 1 -1]] Energy: [[-10]] Spin: 0.4 3: [[-1 -1 1 1 1 -1 1 1 1 -1]] Energy: [[-2]] Spin: 0.2
Как вы можете видеть, он изменяет только одну позицию за раз. В идеале моя функция будет проходить через каждую позицию в моем массиве (за развертку) и изменять значения, соответствующие критериям. Это моделирование алгоритма Монте-Карло/Метрополиса. Я попытался использовать функцию карты для применения моей функции к моему массиву, однако это, похоже, не работает. Любая помощь будет очень признательна, и я приложил свой код ниже!
import numpy as np N = 10 J = 1 H = 2 def calcEnergy(config, J, H): energy = 0 for i in range(config.size): spin = config[i] neighbour = config[(i 1) % N] energy = energy - J * (spin * neighbour) - H * neighbour return energy def ChangeInEnergy(J, H, spin, spinleft, spinright): dE = 2 * H * spin 2 * J * spin * (spinleft spinright) return dE def CasinoTime(sweeps, beta, J, H, debug=False): config = np.random.choice([-1, 1], (N, 1)) averagespins = [] if debug is True: print("Starting Configuration:", (np.transpose(config))) runningenergy = calcEnergy(config, J, H) for i in range(sweeps): spinlocation = np.random.randint(N) spin = config[spinlocation] spinright = config[(spin 1) % N] spinleft = config[(spin - 1) % N] dE = ChangeInEnergy(J, H, spin, spinleft, spinright) r = np.random.random() if r lt; min(1, np.exp(-beta * dE)): config[spinlocation] *= -1 runningenergy = runningenergy dE else: pass averagespin = config.mean() if debug and i % 1 == 0: print("%i: " % i, np.transpose(config), "Energy:", runningenergy, "Spin:", averagespin) return averagespins averagespins = CasinoTime(sweeps=20, beta=0.1, J=1, H=2, debug=True)