我想动画通过每个蒙特卡洛周期在我的代码去。然而,图像不更新,并保持相同的一个开始。
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
我们无法知道simulate
函数里面发生了什么,但似乎这就是问题的根源,因为其他的代码运行正常和动画,
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
def simulate(*args):
global ground_state
ground_state = np.random.randn(5,5)
simulate()
fig = plt.figure()
im = plt.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)
plt.show()