ローレンツアトラクタ
matplotlibのmplot3dにより、ローレンツアトラクタを3Dグラフ上に表示する。
コード
解説
ローレンツ・アトラクタとは
ローレンツ方程式は、カオス的挙動を示す非線型方程式であり、3つの定数(s, r, b)が所定の値のときのローレンツ・アトラクタとなる。[1]
データの生成
def lorenz(x, y, z, s=10, r=28, b=2.667):
x_dot = s*(y - x)
y_dot = r*x - y - x*z
z_dot = x*y - b*z
return x_dot, y_dot, z_dot
ローレンツアトラクタの関数で、あるx, y, zのときのx_dot, y_dot, z_dotを返してくれる。
xs = np.empty((num_steps + 1,))
np.emptyは値が初期化されていない配列を生成する。num_stepsが10000なので(10001,)の配列を生成する。np.emptyは他の配列生成関数と比較して、実行速度が早いことが特徴となっている。
xs[0], ys[0], zs[0] = (0., 1., 1.05)
各配列の0番目(1番最初)をそれぞれ設定する。
for i in range(num_steps):
x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i])
xs[i + 1] = xs[i] + (x_dot * dt)
ys[i + 1] = ys[i] + (y_dot * dt)
zs[i + 1] = zs[i] + (z_dot * dt)
まず、i=0のときだけで考えると、初期値(xs[0],ys[0], zs[0])のときのxdotをlorenz関数で求める。次のxs[1]の値は、xs[0]+求めたx_dot×dt(=0.01)とした値となる。この繰り返しをnum_stepsの数(10000回)だけ繰り返して、10000個のxs, ys, zsを求める。
ローレンツ・アトラクタの表示
ax.plot(xs, ys, zs, lw=0.5)
lwは線の太さの設定である。
ローレンツアトラクタをアニメーション表示
データポイント数を少なくしたローレンツアトラクタでアニメーションを表示する。
アニメーション
コードをダウンロード(.pyファイル)
コードをダウンロード(.ipynbファイル)
参考
ローレンツ方程式 - Wikipedia
Lorenz attractor — Matplotlib 3.9.3 documentation
コメント