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 имеет вид
# импорт всех атрибутов из scipy
#from scipy import *
from scipy.linalg import *
import numpy as np
A = np.array([[ 0, 0, .33],
[.18, 0, 0],
[0, .71, .94]])
print(A)
Записи в первой строке матрицы A описывают плодовитость популяции. Молодые и средние самки не производят потомство, у каждой взрослой самки в год рождается в среднем 33% самок. Остальные записи в матрице показывают выживание. В этой модели в год выживает 18% молодых самок (становятся средними), 71% средних (становятся взрослыми), и 94% взрослых. Обратите внимание, что показатели плодовитости и выживаемости остаются неизменными во времени.
Целью является определение долговременной динамики популяции: численность растет или уменьшается. Чтобы ответить на этот вопрос исследуем матрицу системы.
Найдем собственные значения матрицы A (λ1,λ2,λ3):
# вычислите собственные значения матрицы A
Обозначим собственные векторы матрицы A v1, v2 и v3. Разложение вектора xk по собственным векторам имеет вид: xk=c1(λ1)kv1+c2(λ2)kv2+c3(λ3)kv3
# найдите модуль каждого собственного числа
Поскольку каждое собственное значение имеет модуль меньше 1, то xk приближается к нулевому вектору при k→∞, это означает вымирание популяции.
# проверьте, что с ростом k вектор $x_k$ приближается к нуль-вектору
# сделайте вывод для k=10 и k=1000, округлите до 10 знаков с использованием метода round
Увеличим выживаемость молодых сов до 30%.
A[A==.18]=0.30
A
# найдите собственные числа, векторы и модули для собственных чисел для новой матрицы
При k→∞ второй (v2) и третий (v3) векторы стремятся к нулевому вектору, первый (v_1, соответствующий вещественному собственному числу) - нет. Таким образом, xk при k→∞ можно аппроксимировать вектором c1(1.01)kv1. Тогда популяция сов будет расти с экспоненциальной скоростью и популяция будет увеличиваться на 1% в год. Собственный вектор v1 дает долгосрочное распределение сов по стадиям жизни.
Можно считать, что v1 приблизительно равен вектору (10, 3, 31), поэтому для каждых 31 взрослых сов будет 10 молодых и 3 средних самки.
# убедитесь, что второй и третий векторы в сумме (соответствующие комплексным собственным числам) стремятся к нуль-вектору
# убедиться, что вектор v_1 = (10, 3, 11) приблизительно собственный
Вектор v1 можно перемасштабировать так, что его компоненты в сумме дают 1, а именно: (.227, .068, .705). Компоненты в этом векторе показывают долю популяции совы в каждом классе; например, 22,7% сов являются молодыми.
# проверьте, что вектор (.227, .068, .705) является приближенно собственным,
# и соответствует вещественному собственному числу