У меня возникла проблема с реализацией Python этого уравнения статистической ошибки, которое я нашел в «Моделировании Монте-Карло в статистической физике» Биндера (стр. 94, 2014). Прежде всего, основная часть кода для моего алгоритма выглядит следующим образом:
SCALE_11 = DISCARDED_SAMPS/(MC_STEPS*L*L)
SCALE_22 = DISCARDED_SAMPS*DISCARDED_SAMPS*SCALE_1/MC_STEPS
for k in range(NT):
E1 = E2 = M1 = M2 = np.float_(0.0)
inv_T = 1.0 / T[k] # beta = 1/k_B*Temperature, set k_B = 1
prob = np.exp(-4*inv_T*np.array([0,1,2], dtype=np.uint8))
p_i = []
lattice = 2*np.random.randint(2, size=(L, L), dtype=np.int16)-1
for i in range(EQ_STEPS): # equilibrate
sweep(lattice, prob)# 1 sweep = L**2 Monte Carlo moves per EQ_STEP
for i in range(MC_STEPS):
sweep(lattice, prob)
for i in range(MC_STEPS)
sweep(lattice, prob)
if i % DISCARDED_SAMPS == 0: # the remainder
energy = hamiltonian(lattice) # calculate the energy
mag = abs(np.sum(lattice)) # calculate the magnetisation
E1 += energy # the estimator
M1 += mag # the estimator
E2 += energy*energy # the estimator
M2 += mag*mag # the estimator
E[k] = SCALE_11*E1
M[k] = SCALE_11*M1
C[k] = (SCALE_11*E2 - SCALE_22*E1*E1)*inv_T*inv_T
X[k] = (SCALE_11*M2 - SCALE_22*M1*M1)*inv_T
По сути, в моем алгоритме я выполняю итерацию в диапазоне различных температур и выполняю симуляцию по методу Монте-Карло. При каждой температуре мой первый l oop уравновешивает систему, а мой второй l oop еще раз подметает ее и проводит наблюдения на каждом DISCARDED_SAMPS
(DS
) шагах, поскольку образцы коррелируют.
E, M, C, X
- энергия, намагниченность, удельная c теплота и восприимчивость (все на спин) соответственно. Специфические c уравнения теплопроводности и восприимчивости имеют вид ![enter image description here](https://i.stack.imgur.com/Yxbeu.png)
Теперь в моем алгоритме <E^2>
и <E>
сделаны на коде, по сути, я просто выполняя ![enter image description here](https://i.stack.imgur.com/JWOCm.png)
, что было довольно просто. Но теперь я собираюсь реализовать статистическое уравнение ошибки из вышеупомянутого учебника, где оно имеет вид: ![enter image description here](https://i.stack.imgur.com/SpTn5.png)
Где A
- это наблюдаемая величина, которая может быть E, M
et c. У меня возникли проблемы с реализацией этого уравнения, если мы берем n
как число раз, когда i % DISCARDED_SAMPS == 0
произошло, и A^2
, A
теперь являются средними по MC_STEPS
, а A_0
- это наблюдаемое перед первым i % DISCARDED_SAMPS == 0
получилось. Как можно реализовать это на Python?