ローレンツアトラクター Plotly

ローレンツアトラクター

複雑な3Dグラフの例として、カオス的なアトラクターを示すことができます。

ローレンツアトラクターはカオス的な挙動をするダイナミカルシステムの一つです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import numpy as np
import plotly.graph_objects as go

# ローレンツ方程式
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

# 初期条件
x0, y0, z0 = (0., 1., 1.05)

# 軌道を計算
xs = []
ys = []
zs = []

for i in range(10000):
x_dot, y_dot, z_dot = lorenz(x0, y0, z0)
x0 += x_dot * 0.01
y0 += y_dot * 0.01
z0 += z_dot * 0.01

xs.append(x0)
ys.append(y0)
zs.append(z0)

# 3Dプロット
fig = go.Figure(data=[go.Scatter3d(
x=xs, y=ys, z=zs,
mode='markers')])

fig.update_layout(
title='Lorenz Attractor',
width=700, height=700
)
fig.show()

ローレンツ方程式を数値的に解き、カオス的な軌道を3Dプロットします。

Plotlyを使えばこうした複雑系のシミュレーション結果も視覚的に確認できます。

ソースコード解説

以下はソースコードの詳細な説明です。

  1. import numpy as npimport plotly.graph_objects as go は、NumPyとPlotlyの必要なライブラリをインポートしています。

  2. def lorenz(x, y, z, s=10, r=28, b=2.667): は、ローレンツ方程式を定義する関数です。
    この方程式は、3つの微分方程式からなり、カオス的な挙動を示す非線形のダイナミカルシステムをモデル化しています。

  3. x0, y0, z0 = (0., 1., 1.05) は、初期条件を指定しています。
    これらの初期条件からローレンツアトラクターの軌道が計算されます。

  4. xs, ys, zs は、計算された軌道の x、y、z 座標を保存するための空のリストです。

  5. ループ for i in range(10000): は、指定された回数の時間ステップにわたり、ローレンツ方程式に基づいて新しい座標を計算し、それを xs, ys, zs リストに追加します。
    このループは、ローレンツアトラクターの軌道を生成します。

  6. fig は、3Dプロットを作成するためのFigureオブジェクトです。
    go.Scatter3d を使用して、計算された座標を散布図としてプロットします。

  7. fig.update_layout() は、プロットの外観やレイアウトを設定します。
    タイトルとプロットのサイズを指定しています。

  8. 最後の行で fig.show() を呼び出すことで、ローレンツアトラクター3Dプロットが表示されます。

このコードはローレンツアトラクターを計算し、その軌道を3Dプロットとして可視化するためのシンプルな例です。

ローレンツアトラクターはカオス理論の一部であり、非線形ダイナミクスの重要な例です。

このプロットを実行すると、非常に複雑な3Dの軌道が表示され、カオス的な振る舞いが視覚化されます。