Processing math: 100%

Динамика популяции пятнистых сов

Цель работы: с использованием средств библиотеки numpy и scipy (linalg) научиться решать стандартные задачи линейной алгебры (поиск собственных значений и векторов, решение СЛАУ), выполнять стандартные операции над матрицами.

https://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html

Проведите исследование динамики популяции пятнистых сов по предложенному ниже алгоритму.

Население пятнистых совов делится на три возрастных класса: молодые (до 1 года), средние (от 1 до 2 лет) и взрослых (старше 2 лет). Наблюдения проводятся с ежегодно. Поскольку предполагается, что количество мужских и женских сов одинаково, в анализе учитываются только самки.

Обозначим количество самок совы за k-ый год: jk - молодые самки (juvenile), sk - средние самки (subadult), ak - взрослые самки (adult). В работе Lamberson, R. H. et al. "A Dynamic Analysis of the Viability of the Northern Spotted Owl in a Fragmented Forest Environment." Conservation Biology 6(1992), 505-512. показано, что популяцию сов можно моделировать с помощью системы разностных уравнений. xk+1=Axk, где вектор xk=(jk,sk,ak), а матрица A имеет вид

In [1]:
# импорт всех атрибутов из scipy
#from scipy import *
from scipy.linalg import * 
import numpy as np
In [2]:
A = np.array([[ 0, 0, .33], 
              [.18, 0, 0],
              [0, .71, .94]])
print(A)
[[ 0.    0.    0.33]
 [ 0.18  0.    0.  ]
 [ 0.    0.71  0.94]]

Записи в первой строке матрицы A описывают плодовитость популяции. Молодые и средние самки не производят потомство, у каждой взрослой самки в год рождается в среднем 33% самок. Остальные записи в матрице показывают выживание. В этой модели в год выживает 18% молодых самок (становятся средними), 71% средних (становятся взрослыми), и 94% взрослых. Обратите внимание, что показатели плодовитости и выживаемости остаются неизменными во времени.

Целью является определение долговременной динамики популяции: численность растет или уменьшается. Чтобы ответить на этот вопрос исследуем матрицу системы.

Найдем собственные значения матрицы A (λ1,λ2,λ3):

In [88]:
# вычислите собственные значения матрицы A
In [4]:
 
In [ ]:
 
In [ ]:
 

Обозначим собственные векторы матрицы A v1, v2 и v3. Разложение вектора xk по собственным векторам имеет вид: xk=c1(λ1)kv1+c2(λ2)kv2+c3(λ3)kv3

In [ ]:
# найдите модуль каждого собственного числа 
In [ ]:
 

Поскольку каждое собственное значение имеет модуль меньше 1, то xk приближается к нулевому вектору при k, это означает вымирание популяции.

In [89]:
# проверьте, что с ростом k вектор $x_k$ приближается к нуль-вектору
# сделайте вывод для k=10 и k=1000, округлите до 10 знаков с использованием метода round 

Увеличим выживаемость молодых сов до 30%.

In [90]:
A[A==.18]=0.30
In [91]:
A
Out[91]:
array([[ 0.  ,  0.  ,  0.33],
       [ 0.3 ,  0.  ,  0.  ],
       [ 0.  ,  0.71,  0.94]])
In [92]:
# найдите собственные числа, векторы и модули для собственных чисел для новой матрицы

При k второй (v2) и третий (v3) векторы стремятся к нулевому вектору, первый (v_1, соответствующий вещественному собственному числу) - нет. Таким образом, xk при k можно аппроксимировать вектором c1(1.01)kv1. Тогда популяция сов будет расти с экспоненциальной скоростью и популяция будет увеличиваться на 1% в год. Собственный вектор v1 дает долгосрочное распределение сов по стадиям жизни.

Можно считать, что v1 приблизительно равен вектору (10, 3, 31), поэтому для каждых 31 взрослых сов будет 10 молодых и 3 средних самки.

In [78]:
# убедитесь, что второй и третий векторы в сумме (соответствующие комплексным собственным числам) стремятся к нуль-вектору
In [93]:
# убедиться, что вектор v_1 = (10, 3, 11) приблизительно собственный 
In [ ]:
 

Вектор v1 можно перемасштабировать так, что его компоненты в сумме дают 1, а именно: (.227, .068, .705). Компоненты в этом векторе показывают долю популяции совы в каждом классе; например, 22,7% сов являются молодыми.

In [94]:
# проверьте, что вектор  (.227, .068, .705) является приближенно собственным,
# и соответствует вещественному собственному числу  
In [ ]: