EcoSimulation — 04. Логистический рост

 

Д.А. Шабанов
Конспект курса
"
Имитационное моделирование сложных биосистем
(с использованием Microsoft Excel)
"

Экспоненциальный рост Логистический рост Модель с перекрывающимися поколениями
Имитационное моделирование биосистем-03  Имитационное моделирование биосистем-04 Имитационное моделирование биосистем-05

 

На прошлом этапе мы сделали модель, описывающую экспоненциальный рост популяции. Как вы помните из курса экологии, усложнением экспоненциальной модели является логистическая (рис. 4.1). Бельгийский математик Пьер Ферхюльст (1804–1849) ввел в уравнение Мальтуса компонент, который обеспечивает торможение популяционного роста по мере приближения к величине K — емкости среды. 

Рис. 4.1. Логистический рост (Шабанов, Кравченко, 2009)

Когда мало, выражение в скобках практически равно единице, и рост мало отличается от экспоненциального; когда N достигает величины K, прирост останавливается, и численность популяции становится стабильной, соответствующей K.

Внесем в модель, созданную на предыдущем этапе, еще один столбец, соответствующий логистическому росту. Здесь, в этом конспекте, покажем изменения не на примере "красивого" файла Excel, а на примере упрощенной таблицы, как в прошлой странице.

Таблица 4.1. Добавление к модели экспоненциального роста ячеек, имитирующих логистической рост

  A B C D
1 N0= 1000    
2 r= 0,5    
3 К= 10000    
4 t N (экспоненциальный) N (логистический)  
5 0 1000 {=B1} 1000 {=B1}  
6 1 1500 {=B5+B5*B$2} 1450 {=C5+C5*B$2*(B$3-C5)/B$3}  
7 2 2250 {=B6+B6*B$2}    
8 3 3375 {=B7+B7*B$2}    

 

Вводя формулу в ячейку C6 (именно ее потом надо будет "растянуть" на весь столбец), учтите, что ссылка на предыдущую ячейку (C5) должна быть относительной, а на ячейки для ввода параметров (B2 и B3) — абсолютной, по крайней мере, в отношении строки (B$2 и B$3 — этого достаточно, если формула будет "растягиваться" внутри столбца).

Теперь можно заполнить формулами весь столбец, описывающий логистический рост и вставить в файл еще один график (рис. 4.2). Можно ли было совместить на одном графике две кривые — экспоненциального и логистического роста? Можно было, но при этом размерность шкалы определит стремительно поднимающаяся экспонента, и динамика логистического роста будет незаметной.

Рис. 4.2. Два графика рядом; обратите внимание: ячейка C9 выделена, курсор на строке формул, упомянутые в ней ячейки выделены цветовыми рамочками (при необходимости модель можно скачать с сайта)

 

Учет смертности в определенном возрасте

Настало время задуматься, насколько реалистична наша модель. Она является имитационным отражением двух аналитических моделей. Увы, пока что при их создании мы не очень-то задумывались над тем, насколько описываемые такой моделью процессы отражают действительные события. Эта модель имеет несколько очень серьезных отличий от биологической действительности, которую мы вроде бы имитировали. Мы будем приближаться к действительности в несколько шагов, и их порядок будет определяться не столько важностью, сколько соображениями усвоения приемов моделирования.

В действительном мире особи не только рождаются, но и гибнут (существует миф о "бессмертии" бактерий и простейших, но это, в общем, скорее миф, чем факт). Как его учесть?

В экспоненциальной модели учет смертности будет не столь обоснован, как в логистической. Экспоненциальная модель построена на утверждении dN/dt=rN. Мы можем отдельно рассмотреть рождаемость и смертность и учесть, что рождаемость увеличивает численность популяции, а смертность — снижает. Мы можем рассматривать r как разницу между рождаемостью и смертностью.

В логистической модели мы принимаем наличие рождаемости, зависящей и от численности потенциальных родителей, и от количества доступного ресурса. На самом деле, смертность тоже должна зависеть от наличествующего ресурса. Кроме того, у разных видов вероятность смерти в течение онтогенеза изменяется по-своему, отражая особенности жизненного цикла (вспомните о кривых смертности Р. Перля). Фактически, логистическую зависимость можно получить, приняв предположение о рождаемости, которая зависит только от численности потенциальных родителей, и о смертности, которая зависит от доступного ресурса. Но тем не менее мы рассмотрим несложный и достаточно условный вариант.

Предположим, потенциальный рост популяции соответствует логистической модели, но на каждом шаге в популяции гибнут особи, родившееся определенное время назад (например, три шага назад). Кроме того, примем, что на начальном шаге появляются новорожденные особи, которые будут умирать только на четвертом шаге (табл. 4.2).

Таблица 4.2. Сравнение логистического роста без учета смертности особей и с ее учетом

  A B C D
1 N0= 1000    
2 r= 0,5    
3 К= 10000    
4 t N (логистический) N (логистический со смертью на 4-м шаге)  
5 0 1000 {=B1} 1000 {=B1}  
6 1 1450 {=B5+B5*B$2*(B$3-B5)/B$3} 1450 {=C5+C5*B$2*(B$3-C5)/B$3}  
7 2 2069,9 {=B6+B6*B$2*(B$3-B6)/B$3} 2069,9 {=C6+C6*B$2*(B$3-C6)/B$3}  
8 3 2890,6 {=B7+B7*B$2*(B$3-B7)/B$3} 1890,6 {=C7+C7*B$2*(B$3-C7)/B$3-C5}  
9 4 3918,1 {=B8+B8*B$2*(B$3-B8)/B$3} 2207,2 {=C8+C8*B$2*(B$3-C8)/B$3-C5*B$2*(B$3-C5)/B$3}  

 

В таблице 4.2 расчеты, соответствующие логистическому росту, перенесены в столбец B (в Excel, как вы помните, достаточно выделить столбец и перетащить его). В столбце C построим новую зависимость. 

В ячейках, соответствующих 5-й строке, всюду стоят одни и те же значения. Если бы адресация в ячейке B5 была абсолютной, формулу в ней можно было бы просто "растянуть" на ячейку C5. А поскольку адресация в этой ячейке относительная, формулу в ней можно скопировать. Однако, обратите внимание, что если вы просто скопируете ячейку B5 и вставите ее в C5, Excel перепишет содержащуюся в ней формулу (она будет указывать на ячейку C3). Действовать надо иначе: выделить ячейку B5, войти в строку формул, выделить формулу, скопировать ее в буфер (Cntr+C), выйти из режима редактирования формулы с помощью клавиш Enter или Esc, войти в ячейку C5, перейти в строку формул, вставить нужную формулу (Cntr+V) и выйти с помощью клавиши Enter.

Теперь построим нужную зависимость. Формулы в ячейках C6 и C7 аналогичны таковым в B6 и B7. Их нужно не копировать, а растягивать (ссылки на входные данные в этих ячейках носят абсолютный характер, а обращения к предыдущим шагам времени должны адресоваться к ячейкам в столбце C, а не B). В ячейке C8 нужно учесть гибель особей, появившихся в ячейке C5. Начиная с ячейки C9, из формул надо вычитать прирост, который добавлялся три шага назад. Так, из численности особей в ячейке C9 надо вычесть C5*B$2*(B$3-C5)/B$3, то есть прирост в ячейке C6. Затем формулу, которая получилась в ячейке C9, можно растянуть на весь столбец.

Исследуйте получившуюся зависимость. Вы можете убедиться, что если r достаточно велико (например, r=0,5) численность стабилизируется на уровне, более низком, чем K. Если r невелико (например, r=0,2), численность популяции вначале возрастает, а потом, с появлением смертности, снижается.

Адекватно ли такое поведение модели? Вероятно, не полностью. Как уже сказано, сам логистический рост строится на предположении о смертности, зависимой от доступности ресурса. "Навесив" на популяцию еще один мощный фактор, приводящий к смертности, мы ее с большой вероятностью губим.

 

Численность популяции не может быть отрицательной

Используем только что полученную модель еще для одного эксперимента (не вполне корректного с точки зрения биологии). Что будет, если r примет отрицательное значение (например, r=–0,1)? Биологического смысла тут немного, так как отрицательное значение r может принимать в том случае, если в нем уже учитывается смертность, которую в рассматриваемой модели мы и так уже предусмотрели. Тем не менее рассмотрим и такой случай. График получающейся зависимости показан на рисунке 4.3. 

Рис. 4.3. Может ли численность популяции быть отрицательной?

Обратите внимание: на определенном этапе (например, на 9-м шаге) численность популяции становится отрицательной! Имеет это какой-либо биологический смысл? Вероятно, нет (в каком-то случае мы можем вложить в отрицательную численность какой-то смысл, но, вероятно, это не тот случай). Вероятно, нужно сделать так, чтобы численность популяции в нашей модели не могла принимать отрицательные значения.

Для решения этой проблемы используем одну из функций Excel. До сих пор в формулах мы использовали действия. Кроме того, мы можем вводить в формулы функции, выбирая их из достаточно большого набора. Формулы имеют названия, которые набираются прописными буквами, а после названий в них всегда находятся круглые скобки, в которых могут стоять необходимые данные. Сейчас мы используем, возможно, самую полезную функцию, которая имеет намного более широкое применение, чем "борьба" с отрицательными числами — функцию ЕСЛИ (в английском наборе команд — IF). Ее формат таков: ЕСЛИ(условие;результат_если_условие_истинно;результат_если_условие_ложно). Условием может быть любое равенство или неравенство, использующее знаки =, >, <, >= (больше или равно; не меньше), <= (меньше или равно; не больше). После первой точки с запятой следует указать, что функция вставит в ячейку в случае если равенство или неравенство справедливо, после второй — что должно стоять в ячейке, если равенство или неравенство неверно.

Предположим, в ячейке стоит {=C5+C5*B$2*(B$3-C5)/B$3}. Напишем там {=ЕСЛИ((C5+C5*B$2*(B$3-C5)/B$3)<0;0;C5+C5*B$2*(B$3-C5)/B$3)}. Если результат вычисления для численности популяции окажется отрицательным, эта функция подставит вместо него 0; в противном случае результат останется без изменений.

Снабжаем подобным усложнением все строки в расчетах, — и результат вычислений никогда не окажется отрицательным.

 

Округление до целых

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

Во-первых, десятичные дроби можно просто не показывать. Это можно сделать, например, с помощью кнопки "Уменьшить разрядность" ("Главное"/"Число"). Можно также использовать диалог "Формат ячеек", предоставляющий значительно более широкие возможности ("Главное"/"Ячейки"/"Формат"/"Формат ячеек"), где на вкладке "Число" можно выбрать формат "Числовой" и установить необходимую разрядность. Excel при этом не будет показывать десятичные разряды, но все равно будет учитывать их при вычислениях (они никуда не денутся, они просто станут невидимыми).

Во-вторых, нецелые значения можно округлить. Для этого можно использовать команды ОКРУГЛ(аргумент;число разрядов)ОКРУГЛВВЕРХ(аргумент;число разрядов) и ОКРУГЛВНИЗ(аргумент;число разрядов); их английские аналоги — ROUND, ROUNDUP и ROUNDDAWN. Как они работают, проще всего показать в таблице (табл. 4.3).

Таблица 4.3. Сравнение разных функций Excel, обеспечивающих округление данных 

Число ОКРУГЛ(число;2) ОКРУГЛ(число;0) ОКРУГЛ(число;) ОКРУГЛВВЕРХ(число;) ОКРУГЛВНИЗ(число;)
1,345 1,35 1 1 2 1
1,5 1,50 2 2 2 1
1,666 1,67 2 2 2 1

 

Как вы можете увидеть, если не указывать количество разрядов, аргумент будет округлен до целых значений.

Итак, указав для всех строк нашей модели округление, мы получим только целые значения. Лучше всего использовать именно округление, при котором значения, меньшие, чем 0,5 округляются в нижнюю сторону, а большие, чем 0,5 — в верхнюю. Такое округление окажет наименьшее влияние на конечный результат (округление вниз будет его занижать, а вверх — завышать). Приведенная в прошлом подпункте формула будет в таком случае выглядеть так обратите внимание, что одна функция вставлена в другую: {=ОКРУГЛ(ЕСЛИ((C5+C5*B$2*(B$3-C5)/B$3)<0;0;C5+C5*B$2*(B$3-C5)/B$3);)}

 

Вероятностное округление до целых

Давайте теперь рассмотрим ситуацию, когда дробные значения имеют биологический смысл. Например, известно, что простая воспроизводящая рождаемость (количество детей на одну мать, при котором численность поколения детей равна численности поколения родителей) составляет для высокоразвитых стран 2,03, а для слаборазвитых — 2,2 (предположим, что для Украины эта величина будет близка к 2,1). Если бы у каждой матери (пары родителей) было ровно 2 потомка (суммарный коэффициент рождаемости=2), неизбежная смертность привела бы к тому, что поколение детей оказалось бы меньше, чем поколение родителей.

А что означает суммарный коэффициент рождаемости 2,1? Матерей, которые рожают одну десятую потомка, к счастью, нет. Но такая рождаемость будет характерна для случая, когда в 9 семьях из 10 будет по 2 ребенка, а в одной — 3 (21 ребенок на 10 матерей). Округляя такую величину с помощью функций ОКРУГЛ и ОКРУГЛВНИЗ, мы всегда получим 2, а ОКРУГЛВВЕРХ — всегда получим 3. А как сделать, чтобы величина 2,1 округлялась до 2-х 9 раз из 10, а до 3-х — 1 раз из 10?

Для этого мы можем воспользоваться функцией СЛЧИС() или RAND() в английском варианте. Эта функция генерирует случайное число, находящееся между 0 и 1. Функция СЛЧИСМЕЖДУ(нижняя_граница;верхняя_граница) или  RANDBETWEEN задает диапазон, внутри которого должно находиться целое случайное число.

Для нас важно то, что формула {=ОКРУГЛВНИЗ(2,1+СЛЧИС();)} задает именно такую зависимость, которая в 9-ти случаях из 10-ти будет равна 2, и в 1-м — 3. При каждом пересчете случайное число будет принимать новое значение; запустить такие пересчеты можно, нажимая клавишу F9.

Таким образом, функция, которую мы редактировали, должна выглядеть так: {=ОКРУГЛВНИЗ(ЕСЛИ((C5+C5*B$2*(B$3-C5)/B$3)<0;0;C5+C5*B$2*(B$3-C5)/B$3)+СЛЧИС();)}.

Экспоненциальная и логистическая зависимости, построенные со случайным округлением, приведены в этом файле. Скачайте (а лучше — сами постройте!) его и исследуйте, как меняется итоговый результат при каждом нажатии клавиши F9 (рис. 4.4).

Рис. 4.4. Имитационное моделирование экспоненциального и логистического роста с вероятностным округлением

В приведенном на рис. 4.4. примере установлена очень низкая начальная численность популяции (1) и невысокий биотический потенциал. И логистическому, и, особенно, экспоненциальному росту долго "не везет", и численность популяции раз за разом округляется до единицы. Со временем ситуация меняется, и численность начинает расти. Чем выше численность популяции, тем меньше (относительно) влияние на ее рост процедуры округления.