[matplotlib 3D] 8.ローレンツアトラクタ

matplotlib 3D

ローレンツアトラクタ

matplotlibのmplot3dにより、ローレンツアトラクタを3Dグラフ上に表示する。

コード

コードをダウンロード(.pyファイル)コードをダウンロード(.ipynbファイル)

解説

ローレンツ・アトラクタとは

ローレンツ方程式は、カオス的挙動を示す非線型方程式であり、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は線の太さの設定である。

ローレンツアトラクタをアニメーション表示

データポイント数を少なくしたローレンツアトラクタでアニメーションを表示する。

アニメーション

参考

ローレンツ方程式 - Wikipedia
Lorenz Attractor — Matplotlib 3.3.3 documentation

コメント