Хищник-жертва: модель Лотки-Вольтерры
Две связанные популяции, которые вечно гонятся друг за другом по кругу.
Модель Лотки-Вольтерры — система двух ОДУ, описывающая динамику популяций жертв и хищников; её решения — незатухающие циклические колебания, а фазовый портрет — замкнутая кривая.
В 1920-х годах биолог Умберто Д'Анкона заметил странность: во время Первой мировой войны, когда рыбный промысел в Адриатике почти прекратился, доля хищных рыб в улове выросла. Меньше ловишь — больше хищников? Объяснение нашёл математик Вито Вольтерра (и независимо Альфред Лотка), записав простую систему уравнений. Она стала классикой математической биологии и эталонным примером системы ОДУ, у которой нет элементарной формулы решения, зато есть красивое периодическое поведение, которое мы увидим численно.
Уравнения и смысл каждого члена
Обозначим x — численность жертв (зайцев), y — численность хищников (лис). Модель:
x' = a*x - b*x*y (жертвы) y' = -c*y + d*x*y (хищники)
Разберём по членам — каждый имеет ясный биологический смысл:
- +a*x: жертвы размножаются. В отсутствие хищников зайцев бесконечный корм (трава), и они растут экспоненциально со скоростью a. Чем больше зайцев — тем быстрее прибавка.
- -b*x*y: жертв съедают. Число встреч зайца и лисы пропорционально произведению x*y (каждая лиса может встретить каждого зайца). Коэффициент b — успешность охоты. Этот член тормозит рост жертв.
- -c*y: хищники вымирают. Без еды лисы умирают от голода со скоростью c — экспоненциальное затухание.
- +d*x*y: хищники размножаются за счёт съеденного. Чем больше успешных встреч x*y, тем больше энергии у лис на потомство. d — эффективность превращения добычи в новых хищников.
Ключевой член — нелинейное произведение x*y, «закон действующих масс». Именно он сцепляет два уравнения и делает систему неразрешимой в элементарных функциях. Здесь численный метод незаменим.
Как работает под капотом
Подадим в наш универсальный rk4_system правую часть Лотки-Вольтерры. Возьмём классические коэффициенты a=1.0, b=0.5, c=0.75, d=0.25 и старт x=4 зайца, y=2 лисы (в условных единицах). Шаг h=0.1, интегрируем долго и печатаем каждый двадцатый шаг, чтобы увидеть полные колебания.
import math
def vadd(a, b):
return [ai + bi for ai, bi in zip(a, b)]
def smul(s, v):
return [s * vi for vi in v]
def rk4_system(F, t0, Y0, h, n):
t, Y = t0, Y0[:]
rows = [(t, Y[:])]
for _ in range(n):
k1 = F(t, Y)
k2 = F(t + h/2, vadd(Y, smul(h/2, k1)))
k3 = F(t + h/2, vadd(Y, smul(h/2, k2)))
k4 = F(t + h, vadd(Y, smul(h, k3)))
s = vadd(vadd(k1, smul(2, k2)), vadd(smul(2, k3), k4))
Y = vadd(Y, smul(h/6, s))
t = t + h
rows.append((t, Y[:]))
return rows
# Коэффициенты модели
a, b, c, d = 1.0, 0.5, 0.75, 0.25
def F(t, Y):
x, y = Y # x — жертвы, y — хищники
dx = a*x - b*x*y # рост минус съедение
dy = -c*y + d*x*y # голод плюс размножение
return [dx, dy]
rows = rk4_system(F, 0.0, [4.0, 2.0], 0.1, 200)
print(" t жертвы хищники")
for i in range(0, 201, 20):
t, Y = rows[i]
x, y = Y
print(f"{t:5.1f} {x:6.3f} {y:6.3f}")
Вывод:
t жертвы хищники 0.0 4.000 2.000 2.0 2.694 2.531 4.0 2.248 1.793 6.0 3.373 1.557 8.0 3.761 2.347 10.0 2.316 2.314 12.0 2.504 1.604 14.0 3.833 1.733 16.0 3.193 2.556 18.0 2.183 2.023 20.0 2.925 1.523
Числа танцуют. Проследим один цикл (примерно с t=6 до t=14): сначала зайцев становится много (3.37 → 3.76), потому что хищников пока мало. Сытость даёт лисам размножиться — хищники растут (1.56 → 2.35). Расплодившиеся лисы выедают зайцев — жертвы падают (3.76 → 2.32). Голод бьёт по лисам — хищники падают следом (2.35 → 1.60). Зайцев снова мало кто ест — они опять идут вверх (2.50 → 3.83). Круг замкнулся. Это и есть знаменитое запаздывание: пик хищников приходит после пика жертв, а не одновременно с ним.
Фазовый портрет — замкнутая петля
Если отложить по оси x жертв, по оси y хищников и провести траекторию, получится замкнутая кривая: система вечно ходит по одной и той же петле, не затухая и не разгоняясь. Это объясняет загадку Д'Анконы: умеренный промысел (он бьёт и по жертвам, и по хищникам) сдвигает среднее по циклу в пользу жертв, поэтому остановка лова парадоксально увеличила долю хищников.
У замкнутости петли есть глубокая причина: у системы существует сохраняющаяся величина (инвариант), которая остаётся постоянной вдоль всей траектории — аналог энергии в механике. Численно это удобный критерий качества: если посчитать инвариант на каждом шаге, у точного решения он не меняется, а медленный дрейф его значения сразу выдаёт накопленную ошибку метода. Именно постоянство инварианта геометрически и означает, что фазовая точка не может ни свалиться в центр, ни улететь на бесконечность — она обречена ходить по одной и той же линии уровня. Стоит чуть изменить начальные условия — и система переходит на соседнюю замкнутую кривую со своей амплитудой; вложенные друг в друга петли заполняют всю плоскость вокруг точки равновесия.
Стоит честно сказать и о пределах модели. Лотка-Вольтерра — сознательная идеализация: в ней нет насыщения хищника (одна лиса в модели способна съедать тем больше зайцев, чем их больше, без всякого предела сытости) и нет внутренней конкуренции жертв за ограниченный корм. Из-за этого и получаются вечные незатухающие колебания. В более реалистичных версиях добавляют логистический предел роста жертв (член вида минус доля от x в квадрате) и функциональный отклик хищника, выходящий на плато; тогда вечный цикл сменяется затухающими колебаниями, сходящимися к устойчивому равновесию. Понимать, что именно отброшено, — часть культуры моделирования: простая модель ценна не буквальной точностью, а тем, что обнажает сам механизм запаздывающей обратной связи между двумя популяциями.
хищники ^ | _____ | / \ | | o | <- замкнутая петля, | \ _____ / один и тот же цикл +---------------------> жертвы
Частые ошибки
- Перепутаны знаки членов. У жертв рост (+a*x) и убыль от хищников (-b*x*y); у хищников убыль от голода (-c*y) и рост от добычи (+d*x*y). Перепутаете знак — получите либо вымирание обоих, либо взрывной рост.
- Слишком крупный шаг h. Из-за нелинейности x*y явный RK4 при большом h медленно «раскручивает» амплитуду цикла (петля чуть растёт от витка к витку). Для аккуратной картины берите h поменьше.
- Отрицательные популяции. Если стартовать с экзотических коэффициентов или гигантского h, численность может уйти в минус — это артефакт метода, биологического смысла у него нет.
- Ожидание точного повторения чисел. Период колебаний не кратен целому числу шагов, поэтому строки таблицы не повторяются буквально — но качественно цикл один и тот же.
Итоги:
- Лотка-Вольтерра: x' = a*x - b*x*y (жертвы), y' = -c*y + d*x*y (хищники).
- Каждый член имеет биологический смысл; нелинейный x*y сцепляет уравнения и лишает их элементарного решения.
- Решения — незатухающие колебания с запаздыванием: пик хищников следует за пиком жертв.
- Фазовый портрет — замкнутая петля; это объясняет парадокс роста доли хищников при остановке промысла.
- Тот же rk4_system решает систему без изменений — поменялась только функция F.