Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

02 離散ロジスティック成長モデル

指数増殖モデルでは個体数が制限なく増え続けるが,現実の個体群には様々な制約がある.

密度依存性 (density dependence)を取り入れた離散ロジスティック成長モデル (discrete logistic growth model)を実装し,平衡点 (equilibrium point)局所安定性 (local stability)を調べる.

離散ロジスティック成長モデル

離散ロジスティック成長モデルは以下で定義される:

Xt+1=Xt+r(1XtK)XtX_{t+1} = X_t + r \left(1 - \frac{X_t}{K}\right) X_t

ここで,

1Xt/K1 - X_t / K が密度依存性を表現し,XtKX_t \to K で増加率 0\to 0 となる.

実装

# 02-01. 離散ロジスティック成長モデル
import matplotlib.pyplot as plt
Solution to Exercise 1
r = 0.5
K = 100
x = 1
t = 0

t_list = [t]
x_list = [x]
for i in range(50):
    t = t + 1
    x = x + r * x * (1 - x / K)
    t_list.append(t)
    x_list.append(x)

plt.figure(dpi=200)
plt.plot(t_list, x_list, "-", t_list, x_list, "r.")
plt.title("Logistic growth", fontsize="xx-large")
plt.xlabel("Time (t)", fontsize="x-large")
plt.ylabel("Pop. size (x)", fontsize="x-large")
<Figure size 1280x960 with 1 Axes>

平衡点と局所安定性

平衡点 Xˉ\bar X とは Xt+1=XtX_{t+1} = X_t を満たす個体数で,f(X)=X+rX(1X/K)f(X) = X + r X(1 - X/K) とおくと Xˉ=f(Xˉ)\bar X = f(\bar X) の解として求まる.

離散ロジスティック成長モデルの平衡点は:

平衡点からの微小なずれ( ntn_t )が生じた際にどうなるか(局所安定性)を f(Xˉ)f'(\bar X) の絶対値で判定しよう(詳しくはスライド参照).

離散ロジスティック成長モデルの平衡点でどうなるか,場合分けしてみよう.

パラメータと動態の多様性

rr の値に応じて離散ロジスティックモデルは安定・周期振動・カオスなど多様な動態を示す.

まずは rr を変えて時間発展がどう変化するかを観察する.

Solution to Exercise 2
K = 100
x0 = 1
t_end = 100

for r in [0.5, 1.5, 2.0, 2.5, 2.9]:
    x = x0
    t_list = [0]
    x_list = [x]
    for i in range(t_end):
        x = x + r * x * (1 - x / K)
        t_list.append(i + 1)
        x_list.append(x)

    plt.figure(dpi=120)
    plt.plot(t_list, x_list, "-")
    plt.title(f"Discrete logistic, r = {r}")
    plt.xlabel("Time (t)")
    plt.ylabel("Pop. size (x)")
    plt.show()
<Figure size 768x576 with 1 Axes>
<Figure size 768x576 with 1 Axes>
<Figure size 768x576 with 1 Axes>
<Figure size 768x576 with 1 Axes>
<Figure size 768x576 with 1 Axes>

rr が小さいうちは KK への収束だが,rr が大きくなるにつれて振動が現れ,さらに不規則な動態(カオス)が現れる.

分岐図

時間発展を rr ごとに別々に描くことで動態の違いは分かる.

さらに,パラメータ全体での挙動を一望するには分岐図 (bifurcation diagram)が役に立つ.

素朴な作り方として,rr で十分長く回した最終数世代の XX をプロットする方法を試す.

# 02-02. 分岐図
Solution to Exercise 3
K = 100
r_list = []
x_list = []
for i in range(150, 300):
    r = i / 100
    x = 10
    for t in range(1900):
        x = x + r * x * (1 - x / K)

    for t in range(100):
        x = x + r * x * (1 - x / K)
        r_list.append(r)
        x_list.append(x)

plt.figure(dpi=200)
plt.plot(r_list, x_list, ".", markersize=1)
plt.title("Bifurcation diagram")
plt.xlabel("r")
plt.ylabel("x")
<Figure size 1280x960 with 1 Axes>

rr が小さい範囲では平衡点 Xˉ=K\bar X = K が見える. rr が大きくなるにつれ周期解やカオスに入る.