ζ༼Ɵ͆ل͜Ɵ͆༽ᶘ

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

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

Зачем это нужно?

Познакомьтесь, это западный черный носорог. Его популяция вымерла относительно недавно – в 2013 году. Не очень-то хочется, чтобы вымер ещё кто-нибудь. Поэтому важно понимать, что влияет на популяции. Что заставляет их увеличиваться и уменьшаться, быстро изменяться и стабилизироваться. Это мы и будем исследовать с помощью Python.

Теория

Давайте подумаем, как меняется популяция. По сути, за каждый промежуток времени кто-то рождается, и кто-то умирает. А тогда изменение популяции равно разности между родившимися и умершими.

Теперь скажем, что количество особей сейчас – x. Количество рождённых составляет какой-то процент p1 от текущего количества. Есть и процент умерших – p2. Тогда популяция будет меняться так (минус перед p2 – потому, что популяция от смертей уменьшается):

ИЗМЕНЕНИЕ_ПОПУЛЯЦИИ_СЕЙЧАС = p1СКОЛЬКО_СЕЙЧАС-p2СКОЛЬКО_СЕЙЧАС

Но за какой промежуток времени это происходит? Получается, что очень маленький. А значит нам нужно что-то, что позволит определить СКОРОСТЬ, с которой некая величина меняется В ДАННЫЙ МОМЕНТ.

На помощь приходит математика. Скорость, с которой функция меняется, называется ПРОИЗВОДНОЙ этой функции. Численно она равна отношению изменения функции к очень маленькому изменению аргумента (того, от чего зависит функция). Может обозначаться штришком рядом с названием функции:

$ f'(t)= \frac{ \bigtriangleup d }{ \bigtriangleup t } $

В результате наше уравнение об изменении популяции запишется так (популяция зависит от времени):

\(\frac{\triangle x(t)}{\triangle t}= (p1-p2)x(t)\)

Умножим обе части на ∆t:

\({\triangle x(t)}= (p1-p2)x(t) * {\triangle t}\)

Дальше мы будем использовать это в коде.


Кодинг

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

x0 = 100  # начальное число особей
X = [x0]  # массив для хранения количества особей в каждый момент времени
p1 = 0.5
p2 = 0.2

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

x = x0
for t in periods:
    x += (p1 - p2) * x * dt  # меняем популяцию согласно найденной формуле
    X.append(x)  # добавляем текущую популяцию в массив
plt.plot(periods, X[:len(X) - 1])  # рисуем функцию
plt.xlabel("ВРЕМЯ")
plt.ylabel("ПОПУЛЯЦИЯ")
plt.show()

Получается следующее:

То есть, наша популяция неограниченно растёт.

В части 2 мы ограничим её в ресурсах и посмотрим, что из этого выйдет.

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