$\alpha > 1$のとき個体数は等比級数的に無限大に発散し,$\alpha < 1$のときは0に収束する
$\Rightarrow$このモデルは現象を適切に表したモデルとは言えない.
そこで次に個体数が増加するにつれて成長率が線形に減少する場合
$$ P_{n+1} = P_{n}(a - bP_{n}) $$を考える.
このときこの式は$P_{n}$の2乗を含んでいるので,非線形の方程式となる
$x_{n} > 1$の時$x_{n}$は負になるので,以降では$0 \le x_{n} \le 1$とする.
この漸化式を,パラメータ$r\in (0, 1)$を様々に変えながらプロットし,その時間発展を見る.
(実際の現象との対応: 繁殖率と,個体数が増えることによる繁殖率の低下率との兼ね合いで,将来その種がどのような個体数変動をするかを予測する)
In [1]:
%matplotlib inline
import matplotlib.pylab as plt
plt.rcParams['figure.figsize'] = (10, 6)
from ipywidgets import interact
def mapping(x0=0.6, r=0.745, nmax=100):
x = [x0]
for i in range(nmax):
t = 4.0 * r * x[i] * (1 - x[i])
x.append(t)
n = range(nmax + 1)
plt.plot(n, x, label='$x_{0}\ =' + str(x0) + ' : '
+ 'r\ =' + str(r) + ' : '
+ 'n_{\mathrm{max}}\ =' + str(nmax) + '$')
if r > 0.25 and r < 0.75:
xfi = 1. - 1. / (4. * r)
plt.plot([0, nmax], [xfi] * 2,
label=r'$x = 1 - 1 / 4r = ' + str(xfi) + '$'
)
plt.gca().set_xlim(0, nmax)
plt.gca().set_ylim(-0.05, 1.0)
plt.xlabel('$n$')
plt.ylabel('$x$')
plt.title('Iterate map')
plt.legend(loc="best")
plt.show()
In [2]:
interact(mapping, x0=(0., 1., 0.05), r=(0. , 1., 0.001), nmax=(50, 500, 50));
パラメータ | 値 |
---|---|
$r$ | $r \in [0.7, 1.0]$ ($0.0005$刻み) |
初期条件 | $x_{0} = 0.3$ |
プロットまでに無視する世代数 | $1000$ |
各$r$でプロットする点の数 | $50$ |
In [3]:
import numpy as np
def bifurcate(x0, ntransient, nplot, r0, rmax, dr):
global x
count = int((rmax - r0) / dr)
fig = [_Plot(r0 + dr * n, x0, ntransient, nplot) for n in range(count + 1)]
plt.gca().set_xlim(r0, rmax)
plt.gca().set_ylim(np.min(x), np.max(x))
plt.xlabel('$r$')
plt.ylabel('$x$')
plt.title('Bifurcation Diagram')
plt.show()
def _Plot(r, x0, ntransient, nplot):
global x
def logistic(x_i, r):
return 4.0 * r * x_i * (1.0 - x_i)
n = ntransient + nplot * 2
x = [x0]
for i in np.arange(n):
x.append(logistic(x[i], r))
x = np.array(x)
plt.scatter([r] * nplot, x[ntransient + 1:ntransient + nplot + 1],
color='r', s=0.1, marker='.'
)
plt.scatter([r] * nplot, x[ntransient + nplot + 1:n + 1],
color='b', s=0.1, marker='.'
)
In [4]:
parameters = {'x0': 0.3,
'ntransient': 1000,
'nplot': 50,
'r0': 0.7,
'rmax': 1.,
'dr': 0.0005}
bifurcate(**parameters)