2维随机游走(random walk)

随机游走是一个比较容易理解的过程(https://en.wikipedia.org/wiki/Random_walk)。在物理学中多用于无规则的扩散与光子在大气中的散射(假定每一次散射为一次行走的话,步幅就对应着光子的平均自由程)。


程序上的实现还是比较简单的。

matplotlib.lines.Line2D对象的.get_xdata().get_ydata()方法可以获得点的当前坐标。那么只要在matplotlib.animation.FuncAnimation的更新函数中,利用numpy.random.uniform随机地生成各个方向的步幅便可。

二维的情况下,只有XY方向,假设每次行走在XY方向的位移分别为dxdy,满足

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如下。

demo.gif

你可能感兴趣的:(2维随机游走(random walk))