カップルド・ロジスティック写像の拡張を考える

# はじめに
カップルド・ロジスティック写像は、2つ以上のロジスティック写像が相互に影響を与え合う非線形システムです。以下のような特徴を持っています。
- カオスと秩序の共存
- 同期現象
- 間欠的カオス

どゆこと？

# 写像のおさらい

https://qiita.com/ymgc3/items/3fe9608cc61dc835f9e9

## カップルド・ロジスティック写像の特徴

カップルド・ロジスティック写像は、2つ以上のロジスティック写像が相互に影響を与え合う非線形システムです。基本的な2次元の場合、以下の数式で表現されます：

$$
x_{n+1} = (1-ε)f(x_n) + εf(y_n)
$$
$$
y_{n+1} = (1-ε)f(y_n) + εf(x_n)
$$

**項目説明**
- $f(x)$ は単一のロジスティック写像： $f(x) = rx(1-x)$
- $ε$は結合強度（0から1の値）
- $r$ はシステムパラメータ（通常2.8から4.0の範囲）

## 特徴的な性質

1. **カオス的振る舞い**：$r$の値が3.57以上になると、システムはカオス状態に入ります。この状態では、わずかな初期値の違いが大きく異なる結果をもたらします。

2. **同期現象**：$ε$が特定の閾値を超えると、2つの系が完全に同期し始めます。

3. **分岐現象**：$r$を増加させていくと、周期倍分岐が発生し、最終的にカオスに至ります。

特に興味深い点として、$ε$の値が0.2付近で、部分的な同期（位相同期）が発生することが知られています。これは自然界で見られる多くの同期現象（ホタルの発光同期など）の理解に重要な示唆を与えています。

# 例

## カオスと秩序の共存

パラメータの値によっては、カオス的な振る舞いと規則的な振る舞いが同時に観察されることがあります。

```python

import numpy as np
import matplotlib.pyplot as plt

def coupled_logistic_map(r1, r2, eps, x0, y0, n):
    x = np.zeros(n)
    y = np.zeros(n)
    x[0], y[0] = x0, y0
    for i in range(1, n):
        x[i] = (1 - eps) * r1 * x[i-1] * (1 - x[i-1]) + eps * r1 * y[i-1] * (1 - y[i-1])
        y[i] = (1 - eps) * r2 * y[i-1] * (1 - y[i-1]) + eps * r2 * x[i-1] * (1 - x[i-1])
    return x, y

# シミュレーションのパラメータ
params = [
    (3.8, 3.5, 0.1, 0.1, 0.2),
    (3.6, 3.6, 0.2, 0.1, 0.2),
    (3.7, 3.4, 0.3, 0.1, 0.2),
    (3.9, 3.3, 0.4, 0.1, 0.2)
]
n = 10000

# 各パラメータセットでの計算とプロット
fig, axs = plt.subplots(2, 2, figsize=(12, 12))
fig.suptitle('Variation in Behavior with Different Parameters')

for ax, (r1, r2, eps, x0, y0) in zip(axs.flatten(), params):
    x, y = coupled_logistic_map(r1, r2, eps, x0, y0, n)
    ax.plot(x[5000:], y[5000:], '.', markersize=1)
    ax.set_title(f'r1={r1}, r2={r2}, eps={eps}')
    ax.set_xlabel('x')
    ax.set_ylabel('y')

plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/f88fc297-2c49-3f68-94f4-2347966d2815.png)




## 同期現象

結合が強い場合、2つの写像が同期して同じ振る舞いを示すことがあります。

このパラメータ設定では、2つの写像が完全に同期し、同じ振る舞いを示します。


```python

import numpy as np
import matplotlib.pyplot as plt

def coupled_logistic_map(r1, r2, eps, x0, y0, n):
    x = np.zeros(n)
    y = np.zeros(n)
    x[0], y[0] = x0, y0
    for i in range(1, n):
        x[i] = (1 - eps) * r1 * x[i-1] * (1 - x[i-1]) + eps * r1 * y[i-1] * (1 - y[i-1])
        y[i] = (1 - eps) * r2 * y[i-1] * (1 - y[i-1]) + eps * r2 * x[i-1] * (1 - x[i-1])
    return x, y

# パラメータの設定
r1, r2 = 3.8, 3.8  # 同じ成長率を使用
eps_values = [0.1, 0.5, 0.9]  # 結合係数
n = 10000
x0, y0 = 0.1, 0.2

# 各結合係数での計算とプロット
fig, axs = plt.subplots(3, 2, figsize=(12, 15), gridspec_kw={'width_ratios': [3, 1]})
fig.suptitle('Dynamics and Final States of Coupled Logistic Maps at Different Coupling Strengths')

for i, eps in enumerate(eps_values):
    x, y = coupled_logistic_map(r1, r2, eps, x0, y0, n)
    # 全体的なダイナミクスのプロット
    axs[i, 0].plot(x, label='x', color='blue')
    axs[i, 0].plot(y, label='y', color='red')
    axs[i, 0].set_title(f'eps={eps} - Time Series')
    axs[i, 0].legend()
    # 最終状態の拡大プロット
    axs[i, 1].plot(x[-500:], y[-500:], '.', markersize=2)
    axs[i, 1].set_title('Phase Space last 500 Points')

plt.tight_layout()
plt.show()


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/3662f1b8-3cc2-72d0-96c7-2593bf34bee9.png)



## 間欠的カオス

カオス的な振る舞いと規則的な振る舞いが間欠的に切り替わる現象が観察されることがあります。

このパラメータ設定では、カオス的な振る舞いと規則的な振る舞いが間欠的に切り替わる様子が観察されます。

```python

import numpy as np
import matplotlib.pyplot as plt

def coupled_logistic_map(r1, r2, eps, x0, y0, n):
    x = np.zeros(n)
    y = np.zeros(n)
    x[0], y[0] = x0, y0
    for i in range(1, n):
        x[i] = (1 - eps) * r1 * x[i-1] * (1 - x[i-1]) + eps * r1 * y[i-1] * (1 - y[i-1])
        y[i] = (1 - eps) * r2 * y[i-1] * (1 - y[i-1]) + eps * r2 * x[i-1] * (1 - x[i-1])
    return x, y

# パラメータの設定
r1, r2 = 3.828, 3.828  # r1とr2を微調整して間欠的な振る舞いを引き起こす
eps = 0.3  # 結合係数
n = 10000
x0, y0 = 0.1, 0.2

# シミュレーションの実行
x, y = coupled_logistic_map(r1, r2, eps, x0, y0, n)

# 結果のプロット
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(x, label='x', color='blue')
plt.plot(y, label='y', color='red')
plt.title('Time Series of x and y')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(x[-500:], y[-500:], '.', markersize=2)
plt.title('Phase Space of the last 500 Points')
plt.tight_layout()
plt.show()



```


## まとめ

パラメータの値を変化させることで、これらの特徴的な振る舞いが現れたり、消失したりします。

# まとめ

カップルド・ロジスティック写像から、以下の興味深いインサイトが得られます。

**秩序はカオスから生まれる**
- カオス的な振る舞いと規則的な振る舞いが共存することで、より高次の秩序が生まれる
- パラメータが3.57以上でカオスが発生、このカオスが同期現象の基盤となっている

**結合が自由度を減少させる**
- 要素間の結合（ε）を強めると、個々の要素の自由度は減少し、全体として同期した振る舞いが現れる
- より多くの制約が、より単純な振る舞いを生み出すという逆説

**生命システムへの示唆**
- 脳のニューロンや生態系など、自然界の複雑なシステムは「カオスの縁」で機能している可能性
- 完全な秩序でも完全なカオスでもない、中間的な状態が情報処理に最適である可能性の示唆

**制御可能性のパラドックス**
- ノイズを加えることで、かえってシステムの安定性が増す場合がある
- 不確実性の導入が、システムの頑健性を高める可能性を示している

## 対偶的に言い換えると...

**不安定性と安定性**
- システムが安定であるためには、ある程度の不安定性が必要である
- 完全な予測可能性を求めることは、システムの崩壊を招く可能性がある

**個と全体の関係**
- 個々の要素の自由度を制限することで、全体としての自由度が増大する
- 局所的なカオスが、大域的な秩序を生み出している

これらの知見は、複雑系科学全般に適用可能な普遍的な原理を示唆しています。特に興味深いのは、制御と自由、安定と不安定、個と全体といった二項対立を超えた新しい視点を提供している点です。

# カップルド・ロジスティック写像の拡張を考える

実際のシステムでは、これらの特徴が複雑に組み合わさって現れることがあります。例えば、脳内の情報処理では、ニューロンの同期現象とカオス的な振る舞いが共存し、情報の統合と分散を実現していると考えられています。また、生態系では、種間の相互作用によってカオスと秩序のバランスが保たれ、多様性が維持されていると考えられています。



## 多数の要素の結合

2つの写像の結合から、多数の写像が相互作用する系へと拡張することができます。
例えば、$N$個の写像が結合された系は以下のように表されます。

$$x_i(t+1) = r_i x_i(t) (1 - x_i(t)) + \frac{\epsilon}{N-1} \sum_{j=1, j \neq i}^N (x_j(t) - x_i(t))$$

ここで、$i = 1, 2, ..., N$は写像の番号を表します。この拡張により、多数の要素が相互作用するシステムの振る舞いを解析することができます。

```mermaid
graph TD

    subgraph "写像1"
        x1[x_1] --> |r_1| x1_new["x_1(t+1)"]
        x1 -.-> |1-x_1| x1_new
        x2 -.-> |ε| x1_new
        x3 -.-> |ε| x1_new
        x4 -.-> |ε| x1_new
        xN -.-> |ε| x1_new
    end

    subgraph "写像2"
        x2[x_2] --> |r_2| x2_new["x_2(t+1)"]
        x2 -.-> |1-x_2| x2_new
        x1 -.-> |ε| x2_new
        x3 -.-> |ε| x2_new
        x4 -.-> |ε| x2_new
        xN -.-> |ε| x2_new
    end

    subgraph "写像3"
        x3[x_3] --> |r_3| x3_new["x_3(t+1)"]
        x3 -.-> |1-x_3| x3_new
        x1 -.-> |ε| x3_new
        x2 -.-> |ε| x3_new
        x4 -.-> |ε| x3_new
        xN -.-> |ε| x3_new
    end

    subgraph "写像4"
        x4[x_4] --> |r_4| x4_new["x_4(t+1)"]
        x4 -.-> |1-x_4| x4_new
        x1 -.-> |ε| x4_new
        x2 -.-> |ε| x4_new
        x3 -.-> |ε| x4_new
        xN -.-> |ε| x4_new
    end

    subgraph "写像N"
        xN[x_N] --> |r_N| xN_new["x_N(t+1)"]
        xN -.-> |1-x_N| xN_new
        x1 -.-> |ε| xN_new
        x2 -.-> |ε| xN_new
        x3 -.-> |ε| xN_new
        x4 -.-> |ε| xN_new
    end

```

## ネットワーク構造の導入

要素間の結合を、単純な全結合ではなく、複雑なネットワーク構造で表現することができます。例えば、スケールフリーネットワークやスモールワールドネットワークなどの構造を導入することで、現実のシステムにおける相互作用の特徴を反映したモデルを構築することができます。


## 結合関数の変更
要素間の結合を表す関数を、線形結合以外の関数に変更することができます。例えば、シナプス結合の特性を反映した非線形関数を導入することで、より現実的なニューラルネットワークのモデルを構築することができます。

```mermaid

graph TD
    subgraph 写像1
        x1[x_1] --> |r_1| x1_new["x_1(t+1)"]
        x1 -.-> |1-x_1| x1_new
        f12[f_12] -.-> x1_new
        f13[f_13] -.-> x1_new
        f1N[f_1N] -.-> x1_new
    end

    subgraph 写像2
        x2[x_2] --> |r_2| x2_new["x_2(t+1)"]
        x2 -.-> |1-x_2| x2_new
        f21[f_21] -.-> x2_new
        f23[f_23] -.-> x2_new
        f2N[f_2N] -.-> x2_new
    end

    subgraph 写像3
        x3[x_3] --> |r_3| x3_new["x_3(t+1)"]
        x3 -.-> |1-x_3| x3_new
        f31[f_31] -.-> x3_new
        f32[f_32] -.-> x3_new
        f3N[f_3N] -.-> x3_new
    end

    subgraph 写像N
        xN[x_N] --> |r_N| xN_new["x_N(t+1)"]
        xN -.-> |1-x_N| xN_new
        fN1[f_N1] -.-> xN_new
        fN2[f_N2] -.-> xN_new
        fN3[f_N3] -.-> xN_new
    end

    x2 --> f12
    x3 --> f13
    xN --> f1N
    x1 --> f21
    x3 --> f23
    xN --> f2N
    x1 --> f31
    x2 --> f32
    xN --> f3N
    x1 --> fN1
    x2 --> fN2
    x3 --> fN3

    classDef green fill:#9f6,stroke:#333,stroke-width:2px;
    classDef orange fill:#f96,stroke:#333,stroke-width:2px;
    classDef blue fill:#69f,stroke:#333,stroke-width:2px;
    classDef red fill:#f66,stroke:#333,stroke-width:2px;
    classDef purple fill:#c6f,stroke:#333,stroke-width:2px;

    class x1,x1_new green
    class x2,x2_new orange
    class x3,x3_new blue
    class xN,xN_new red
    class f12,f13,f1N,f21,f23,f2N,f31,f32,f3N,fN1,fN2,fN3 purple
    
```


## ノイズの導入
各写像の更新式にノイズ項を追加することで、確率的な効果を取り入れることができます。例えば、以下のようにノイズ項 $\xi_i(t)$ を導入します。

$$x_i(t+1) = r_i x_i(t) (1 - x_i(t)) + \frac{\epsilon}{N-1} \sum_{j=1, j \neq i}^N (x_j(t) - x_i(t)) + \xi_i(t)$$

ここで、$\xi_i(t)$ は平均0、分散 $\sigma^2$ のガウス分布に従う確率変数とします。ノイズの導入により、システムのロバスト性や、確率的な現象の解析が可能になります。

```mermaid

graph TD
    subgraph 写像1
        x1[x_1] --> |r_1| x1_new["x_1(t+1)"]
        x1 -.-> |1-x_1| x1_new
        x2 -.-> |ε| x1_new
        x3 -.-> |ε| x1_new
        xN -.-> |ε| x1_new
        noise1[ξ_1] -.-> x1_new
    end

    subgraph 写像2
        x2[x_2] --> |r_2| x2_new["x_2(t+1)"]
        x2 -.-> |1-x_2| x2_new
        x1 -.-> |ε| x2_new
        x3 -.-> |ε| x2_new
        xN -.-> |ε| x2_new
        noise2[ξ_2] -.-> x2_new
    end

    subgraph 写像3
        x3[x_3] --> |r_3| x3_new["x_3(t+1)"]
        x3 -.-> |1-x_3| x3_new
        x1 -.-> |ε| x3_new
        x2 -.-> |ε| x3_new
        xN -.-> |ε| x3_new
        noise3[ξ_3] -.-> x3_new
    end

    subgraph 写像N
        xN[x_N] --> |r_N| xN_new["x_N(t+1)"]
        xN -.-> |1-x_N| xN_new
        x1 -.-> |ε| xN_new
        x2 -.-> |ε| xN_new
        x3 -.-> |ε| xN_new
        noiseN[ξ_N] -.-> xN_new
    end

    classDef green fill:#9f6,stroke:#333,stroke-width:2px;
    classDef orange fill:#f96,stroke:#333,stroke-width:2px;
    classDef blue fill:#69f,stroke:#333,stroke-width:2px;
    classDef red fill:#f66,stroke:#333,stroke-width:2px;
    classDef purple fill:#c6f,stroke:#333,stroke-width:2px;

    class x1,x1_new green
    class x2,x2_new orange
    class x3,x3_new blue
    class xN,xN_new red
    class noise1,noise2,noise3,noiseN purple
    
```


## 例
以下は、多数の要素が結合されたカップルド・ロジスティック写像のPythonによる実装例です。

```python
import numpy as np
import matplotlib.pyplot as plt

# カップルド・ロジスティック写像ネットワークの関数を定義
def coupled_logistic_map_network(r, eps, x0, n, adjacency_matrix, coupling_function, noise_std):
    # 要素の数を取得
    num_elements = len(r)
    # 状態の初期化：要素数 x ステップ数 の配列
    x = np.zeros((num_elements, n))
    # 全要素の初期状態を設定
    x[:, 0] = x0

    # 時間ステップごとにシステムを更新
    for t in range(1, n):
        for i in range(num_elements):
            # 結合項の計算：隣接行列と結合関数を用いて相互作用をモデル化
            coupling_term = np.sum(adjacency_matrix[i, :] * coupling_function(x[:, t-1] - x[i, t-1]))
            # ノイズの追加：正規分布に基づくランダムなノイズ
            noise = np.random.normal(0, noise_std)
            # ロジスティック写像の更新式に結合項とノイズを加える
            x[i, t] = r[i] * x[i, t-1] * (1 - x[i, t-1]) + eps * coupling_term + noise

    return x

# パラメータの設定
num_elements = 100  # 要素（ノード）の数
r = 3.8 * np.ones(num_elements)  # 各要素の成長率
eps = 0.1  # 結合強度
x0 = np.random.rand(num_elements)  # 初期状態（ランダム）
n = 1000  # 時間ステップ数
noise_std = 0.01  # ノイズの標準偏差

# ネットワーク構造の設定（ランダムグラフ）
# 隣接行列をランダムに生成（接続確率10%）
adjacency_matrix = np.random.choice([0, 1], size=(num_elements, num_elements), p=[0.9, 0.1])
# 対角成分（自己ループ）を0に設定
np.fill_diagonal(adjacency_matrix, 0)

# 結合関数の設定（シグモイド関数）
def coupling_function(x):
    return 1 / (1 + np.exp(-10 * x))

# シミュレーションの実行
x = coupled_logistic_map_network(r, eps, x0, n, adjacency_matrix, coupling_function, noise_std)

# 結果の可視化
plt.figure(figsize=(12, 8))
plt.imshow(x, cmap='viridis', aspect='auto')  # 状態の変化を画像として表示
plt.colorbar(label='State')  # カラーバー（状態の値を示す）
plt.xlabel('Time')  # 横軸のラベル
plt.ylabel('Element')  # 縦軸のラベル
plt.title('Coupled Logistic Map Network with Noise')  # グラフのタイトル
plt.show()  # グラフを表示

```

# おわりに

カオスと秩序は対立するものではなく、むしろ相補的な関係にあります。システムがもっとも豊かな振る舞いを示すのは、完全な秩序でも完全なカオスでもない、その中間的な状態においてです。これは脳の神経活動や生態系の種間相互作用など、自然界の多くの複雑なシステムに共通して見られる特徴であり、システムの本質的な性質です。

ノイズを扱うことができるシステムエンジニアに私はなりたいです。