我想为代码中的每个蒙特卡洛循环做动画。但是,该映像不会更新,并且与开始时的映像相同。
ground_state是一个2D数组,在每次调用模拟后都会更改。我已经检查过它确实在更新中被更改了
fig = pyplot.figure()
im = pyplot.imshow(ground_state, animated = True)
def update_fig(*args):
global ground_state
simulate(ground_state, 100000, 2.4)
im.set_data(ground_state)
return im
ani = animation.FuncAnimation(fig, update_fig, interval = 50)
pyplot.show()
这是模拟功能:-
def simulate(state, n, T):
"""
Simulates at temperature T for N iterations.
"""
def acceptance_ratio(del_E):
"""
Calculates the acceptance ratio.
"""
# value of beta = 1 / (boltzmann constant * T)
beta = 1 / T
if (del_E) < 0:
return 1
else:
return e ** (-beta * (del_E))
step = 0
cycle = 0
# Single flipping
for dummy in range(n):
switch = (random.choice(range(len(state))),
random.choice(range(len(state))))
neighbours = nearest_neighbours(switch[0], switch[1], len(state))
change_E = 0
for pos in neighbours:
change_E += 2 * J * state[pos[0]][pos[1]] * state[switch[0][switch[1]]
p = acceptance_ratio(change_E)
step += 1
if step == 100 * 100:
cycle += 1
rand_num = random.random()
if rand_num <= p:
state[switch[0]][switch[1]] *= -1
return state