隨機游走是一個比較容易理解的過程(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如下。
demo.gif