ζ༼Ɵ͆ل͜Ɵ͆༽ᶘ

Симуляция популяции на Python (ч.3)

0 комментов
02.09.2020
2 мин чтения

Хищники и травоядные

Теперь мы попробуем сэмулировать поведение двух взаимодействующих популяций. Количество травоядных зависит от того, сколько из них НЕ съели минус сколько съели. А сколько съели прямо зависит от числа хищников:

\(\frac{\triangle x}{\triangle t} = p_{1}*x - p_{2}*x*y\)

Количество хищников зависит от того, сколько было съедено травоядных минус сколько хищников умерло:

\(\frac{\triangle y}{\triangle t} = p_{3}*x *y - p_{4}*y\)

Предположим, что травоядных в начале x0, а хищников y0. Давайте узнаем, когда же наша система стабильна. А что же значит «стабильна»? Это означает, что количества особей не меняются, или:

\(\frac{\triangle x}{\triangle t} = \frac{\triangle y}{\triangle t} = 0\)

Подставим значения в уравнения:

\(0 = p_{1}*x_{0} - p_{2}*x_{0}*y_{0}\)

\(0 = p_{3}*x_{0}*y_{0} - p_{4}*y_{0}\)

Решения, в которых

\(x_{0}=0\)

Или

\(y_{0}=0\)

Нам не подходят. Ведь это значит, что популяции нет вообще. Поэтому за основу возьмём решение:

\(x_{0}=\frac{p_{4}}{p_{3}}\)

\(y_{0}=\frac{p_{1}}{p_{2}}\)

Но в реальности популяции же меняются. Поэтому прибавим к начальным значениям маленькие константы c1 и c2:

\(x_{нач}=\frac{p_{4}}{p_{3}} + c_{1}\)

\(y_{нач}=\frac{p_{1}}{p_{2}} + c_{2}\)

Так мы столкнём их из точки равновесия. Увидев, графическое представление, вы поймёте, что имелось в виду.


Код, код, код!

import matplotlib.pyplot as plt  # для рисования графика
import numpy as np  # для вычислений

# маленькие константы
c1 = 5
c2 = 3
# коэффициенты
p1 = 0.8
p2 = 0.05
p3 = 0.01
p4 = 0.4
# согласно полученным формулам (число особей выражается целым числом)
x_start = int(p4 / p3) + c2
y_start = int(p1 / p2) + c1

X = [x_start]  # массив для хранения количества травоядных в каждый момент времени
Y = [y_start]  # массив для хранения количества хищников в каждый момент времени
dt = 0.01  # очень маленький промежуток времени
Tfin = 20  # время, до которого мы смотрим за популяцией
periods = np.arange(0, Tfin, dt)  # массив точек, отстоящих друг от друга на промежуток dt

x = x_start
y = y_start
for t in periods:
    x += (p1 * x - p2 * x * y) * dt  # меняем популяцию согласно найденным формулам
    y += (p3 * x * y - p4 * y) * dt
    X.append(x)  # добавляем текущее количество травоядных в массив
    Y.append(y)  # добавляем текущее количество хищников в массив
plt.figure(figsize=(12, 5), num='Популяция')
plt.subplot(131)  # Необходимо для 3-х графиков в одном окне
plt.plot(periods, X[:len(X) - 1], color='y')  # рисуем функцию травоядных
plt.xlabel("ВРЕМЯ")
plt.ylabel("ТРАВОЯДНЫЕ")

plt.subplot(132)
plt.plot(periods, Y[:len(Y) - 1], color='g')  # рисуем функцию хищников
plt.xlabel("ВРЕМЯ")
plt.ylabel("ХИЩНИКИ")

plt.subplot(133)
plt.plot(X[:len(X) - 1], Y[:len(X) - 1], color='b')  # А это - взаимоотношение популяций
plt.xlabel('ТРАВОЯДНЫЕ')
plt.ylabel('ХИЩНИКИ')
plt.show()

Что же получилось?

Ничего себе, да это же колебания! То есть популяции колеблются с постоянной частотой! Правый крайний рисунок наглядно иллюстрирует взаимоотношение популяций. Каждую точку этой замкнутой кривой можно соотнести с положением «шарика», который скатывается в неровную «воронку». Где отверстие «воронки»? А как раз в найденной точке с координатами x0 и y0.

Заключение

Оказалось, что популяции не ведут себя случайно. Они зависят друг от друга. Они изменяются и подстраиваются под предоставленные условия. Вовсе это не хаос, а чётко определённый порядок.

2
Сегодня
День улёта