ロトカ=ヴォルテラ方程式

ロトカ=ヴォルテラ方程式

非線形微分方程式を考えましょう。

以下は、ロトカ=ヴォルテラ方程式と呼ばれる非線形微分方程式の例です。

これをPythonで解き、その解をグラフ化します。

$$
[ \frac{dx}{dt} = \alpha x - \beta xy ]
$$

$$
[ \frac{dy}{dt} = \delta xy - \gamma y ]
$$

ここで、$ (x) $と$ (y) $は時間$ (t) $の関数です。

この方程式は、捕食者被食者の関係をモデル化したもので、$ (x) $が被食者(例えばウサギ)、$ (y) $が捕食者(例えばキツネ)の個体数を表します。

それでは、この方程式を解いて結果をグラフ化するPythonコードを見てみましょう。

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
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

# ロトカ=ヴォルテラ方程式
def predator_prey_equations(xy, t, alpha, beta, delta, gamma):
x, y = xy
dxdt = alpha * x - beta * x * y
dydt = delta * x * y - gamma * y
return [dxdt, dydt]

# 初期条件とパラメータ
x0 = 10 # 初期被食者の個体数
y0 = 5 # 初期捕食者の個体数
alpha = 1.1
beta = 0.4
delta = 0.1
gamma = 0.4

# 時間
t = np.linspace(0, 30, 1000)

# 微分方程式を解く
solution = odeint(predator_prey_equations, [x0, y0], t, args=(alpha, beta, delta, gamma))
x, y = solution[:, 0], solution[:, 1]

# 結果をグラフ化
plt.figure(figsize=(8, 6))
plt.plot(t, x, label='被食者 (Prey)')
plt.plot(t, y, label='捕食者 (Predator)')
plt.xlabel('時間')
plt.ylabel('個体数')
plt.title('ロトカ=ヴォルテラ方程式の解')
plt.legend()
plt.grid(True)
plt.show()

このコードでは、Scipyのodeint関数を使用して微分方程式を数値的に解いています。

結果を時系列でグラフ化し、被食者捕食者個体数の変化を示しています。

ソースコード解説

このソースコードは、Pythonでロトカ=ヴォルテラ方程式(捕食者と被食者の間の相互作用をモデル化する非線形微分方程式)を解き、結果をグラフ化するものです。

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

ライブラリのインポート

1
2
3
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

この部分では、NumPy(数値計算用のライブラリ)Scipyodeint(常微分方程式を数値的に解くための関数)、Matplotlib(グラフ描画ライブラリ)をインポートしています。

ロトカ=ヴォルテラ方程式の定義

1
2
3
4
5
def predator_prey_equations(xy, t, alpha, beta, delta, gamma):
x, y = xy
dxdt = alpha * x - beta * x * y
dydt = delta * x * y - gamma * y
return [dxdt, dydt]

この部分では、ロトカ=ヴォルテラ方程式を関数predator_prey_equationsとして定義しています。

この方程式は被食者捕食者の個体数の時間変化を示します。

初期条件とパラメータの設定

1
2
3
4
5
6
x0 = 10  # 初期被食者の個体数
y0 = 5 # 初期捕食者の個体数
alpha = 1.1
beta = 0.4
delta = 0.1
gamma = 0.4

初期条件(被食者と捕食者の初期個体数)と方程式のパラメータ(alpha, beta, delta, gamma)を設定しています。

時間の設定

1
t = np.linspace(0, 30, 1000)

$0$から$30$までの時間を$1000分割$した配列を生成しています。

微分方程式の解を求める

1
2
solution = odeint(predator_prey_equations, [x0, y0], t, args=(alpha, beta, delta, gamma))
x, y = solution[:, 0], solution[:, 1]

odeint関数を使用して微分方程式を数値的に解き、被食者捕食者の個体数の時間変化を求めています。

結果のグラフ化

1
2
3
4
5
6
7
8
9
plt.figure(figsize=(8, 6))
plt.plot(t, x, label='被食者 (Prey)')
plt.plot(t, y, label='捕食者 (Predator)')
plt.xlabel('時間')
plt.ylabel('個体数')
plt.title('ロトカ=ヴォルテラ方程式の解')
plt.legend()
plt.grid(True)
plt.show()

Matplotlibを使って、被食者捕食者の個体数の時間変化をグラフ化しています。

横軸は時間、縦軸は個体数を表し、それぞれのラインは被食者と捕食者を表しています。

グラフは凡例付きで、グリッド線も表示されています。

グラフ解説

このグラフは、ロトカ=ヴォルテラ方程式に基づいてモデル化された捕食者被食者の個体数の時間変化を表しています。
この方程式は捕食者と被食者の相互作用を記述し、個体数の変動を表す非線形微分方程式です。

横軸は時間を示し、縦軸は被食者(Prey)と捕食者(Predator)の個体数を表します。
グラフでは、被食者(ウサギなど)の個体数が青色で、捕食者(キツネなど)の個体数がオレンジ色で表示されています。

初期条件では、被食者と捕食者の個体数がそれぞれ$ x0 $と$ y0 $で設定されています。
それぞれの個体数は時間の経過とともに変化し、捕食者は被食者に依存して増減します。
被食者が増えると捕食者も増えるが、その後被食者の減少により捕食者も減少します。
この相互作用が繰り返され、周期的な変動が生じます。

グラフの振動や変動は、捕食者被食者の間の相互作用とその影響を示しています。
このようなモデルは生態学や生物学などで捕食者被食者個体数の相互作用を理解するために利用されます。