ロジスティックマップ

ロジスティックマップ

非線形の関数としてロジスティックマップを例に挙げます。

ロジスティックマップは、次のような非線形差分方程式で定義されます:

$$
x[n+1] = r * x[n] * (1 - x[n])
$$

ここで、$ n $は離散時間、$ x[n] $は時刻nにおける値、$ r $は制御パラメータです。

この方程式は生物個体数などの成長モデルに用いられることがあります。

パラメータ$r$により、周期$ 2, 4, 8, …, caos $など様々なダイナミクスを見ることができます。

以下に、ロジスティックマップをPythonでグラフ化するコードを示します。

これは$r$を$0.5$から$4.0$まで$0.01$間隔で変化させ、$x$の時間発展をプロットするものです:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import matplotlib.pyplot as plt

def logistic(r, x):
return r * x * (1 - x)

x = np.linspace(0, 1)
fig, ax = plt.subplots(1, 1, figsize=(6, 10), dpi=80)
for r in np.linspace(0.5, 4.0, 400):
X = np.empty(1000)
X[0] = 0.1
for i in range(999):
X[i+1] = logistic(r, X[i])
ax.plot([r]*1000, X, ',k', alpha=0.2)

ax.set_xlim(0.4, 4)
ax.set_title("Bifurcation diagram")
plt.show()

これによりビフルケーション図が得られます。

点々とした部分がカオス性を示し、この隙間の生じるパターンはフラクタル性を示します。

また、一定範囲の$ r $での値の振動はピリオドダブリングと呼ばれ、カオスへと向かう典型的な挙動を表しています。

ソースコード解説

このPythonのコードは、ロジスティック写像の分岐図(Bifurcation diagram)を描画するものです。

それぞれの部分について詳しく説明します。

ライブラリのインポート

1
2
import numpy as np
import matplotlib.pyplot as plt
  • numpyは数値計算をサポートするPythonライブラリで、配列操作や数値計算を高速に行います。
  • matplotlib.pyplotはグラフ描画ライブラリです。

ロジスティック写像の関数

1
2
def logistic(r, x):
return r * x * (1 - x)
  • logistic関数はロジスティック写像の式を表しています。

分岐図の作成

1
2
3
4
5
6
7
8
x = np.linspace(0, 1)
fig, ax = plt.subplots(1, 1, figsize=(6, 10), dpi=80)
for r in np.linspace(0.5, 4.0, 400):
X = np.empty(1000)
X[0] = 0.1
for i in range(999):
X[i+1] = logistic(r, X[i])
ax.plot([r]*1000, X, ',k', alpha=0.2)
  • np.linspace(0, 1)で0から1までの間を等間隔に分割した配列xを作成します。
  • fig, ax = plt.subplots(1, 1, figsize=(6, 10), dpi=80)でグラフのサイズを設定します。
  • for r in np.linspace(0.5, 4.0, 400):でパラメータrの範囲を指定します。
    rは0.5から4.0の間を400ステップで変化します。
  • ロジスティック写像を使って、与えられたパラメータrにおける1000ステップの反復を計算し、それをプロットします。
  • ax.plot([r]*1000, X, ',k', alpha=0.2)で分岐図を描画します。
    [r]*1000rを1000回繰り返した配列を作成し、それとXをプロットします。

グラフの設定

1
2
3
ax.set_xlim(0.4, 4)
ax.set_title("Bifurcation diagram")
plt.show()
  • ax.set_xlim(0.4, 4)でx軸の範囲を設定します。
  • ax.set_title("Bifurcation diagram")でグラフのタイトルを設定します。
  • plt.show()でグラフを表示します。

このコードは、ロジスティック写像による分岐図を描画するためのもので、特定のパラメータ範囲での振る舞いを可視化します。