随机游走是一个比较容易理解的过程(https://en.wikipedia.org/wiki/Random_walk)。在物理学中多用于无规则的扩散与光子在大气中的散射(假定每一次散射为一次行走的话,步幅就对应着光子的平均自由程)。
程序上的实现还是比较简单的。
用matplotlib.lines.Line2D
对象的.get_xdata()
和.get_ydata()
方法可以获得点的当前坐标。那么只要在matplotlib.animation.FuncAnimation
的更新函数中,利用numpy.random.uniform
随机地生成各个方向的步幅便可。
二维的情况下,只有X
和Y
方向,假设每次行走在X
和Y
方向的位移分别为dx
和dy
,满足
dx^2 + dy^2 = 1
将点的起始位置初始化在坐标(0,0)
:
fig, ax = plt.subplots(1,1,figsize=(5,5), dpi=150)
point, = ax.plot([0],[0], 'or', markersize=6)
之后,则可以利用以下的方法更新点的坐标:
def update(i):
dx = np.random.uniform(low=-1,high=1,size=1)[0]
dy0 = np.sqrt(1-dx**2)
dy = np.random.choice((dy0,-dy0))
x = point.get_xdata() + dx
y = point.get_ydata() + dy
point.set_xdata(x)
point.set_ydata(y)
#省略
return point,
最后就是将其制作成gif:
ani = animation.FuncAnimation(fig, update, np.arange(1,301),interval=40, blit=False, init_func=None, repeat=False)
-
np.arange(1,301)
:总共有300帧,也就是300步。 -
interval=40
:相邻两帧的时间间隔为40毫秒,这样总共就是12秒。这个参数并没有啥实际意义,只是为了让gif播放地更快一些。 -
blit=False
:由于有更新坐标系的需求,所以将blit
设为False
。
上述代码只是大概的思路,不包含行走轨迹以及一些细节的可视化。
生成的gif如下。