Вопрос задан 28.06.2026 в 11:36. Предмет Информатика. Спрашивает Любимов Сергей.

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

Перейти к ответам

Ответы на вопрос

Отвечает Фоменко Илья.

Составлю готовый вариант модели на уравнениях Лотки — Вольтерры: с формулами, полным кодом для PascalABC.Net и пояснением, что менять в параметрах.

Ниже приведён пример модели «Хищник — жертва» для PascalABC.Net. В основе модели лежат уравнения Лотки — Вольтерры. Программа рассчитывает изменение численности двух популяций и строит график: зелёная линия — жертвы, красная линия — хищники.

pascal
uses GraphABC;

const
WindowW = 900;
WindowH = 600;

LeftMargin = 70;
RightMargin = 30;
TopMargin = 40;
BottomMargin = 70;

// Параметры модели
alpha = 0.7; // скорость размножения жертв
beta = 0.02; // вероятность встречи хищника и жертвы
gamma = 0.5; // естественная смертность хищников
delta = 0.01; // рост численности хищников за счёт поедания жертв

// Начальные условия
prey0 = 40.0; // начальная численность жертв
predator0 = 9.0; // начальная численность хищников

// Параметры расчёта
dt = 0.05; // шаг по времени
tMax = 60.0; // максимальное время моделирования

var
prey, predator, time: array of real;
steps: integer;
maxPop: real;

procedure CalculateModel;
var
i: integer;
dx, dy: real;
begin
steps := Round(tMax / dt);

SetLength(prey, steps + 1);
SetLength(predator, steps + 1);
SetLength(time, steps + 1);

prey[0] := prey0;
predator[0] := predator0;
time[0] := 0;

for i := 0 to steps - 1 do
begin
// Уравнение для жертв:
// рост популяции минус гибель от хищников
dx := alpha * prey[i] - beta * prey[i] * predator[i];

// Уравнение для хищников:
// смертность плюс прирост за счёт питания жертвами
dy := -gamma * predator[i] + delta * prey[i] * predator[i];

// Метод Эйлера
prey[i + 1] := prey[i] + dt * dx;
predator[i + 1] := predator[i] + dt * dy;

// Численность не может быть отрицательной
if prey[i + 1] < 0 then
prey[i + 1] := 0;

if predator[i + 1] < 0 then
predator[i + 1] := 0;

time[i + 1] := time[i] + dt;
end;
end;

procedure FindMaxPopulation;
var
i: integer;
begin
maxPop := prey[0];

for i := 0 to steps do
begin
if prey[i] > maxPop then
maxPop := prey[i];

if predator[i] > maxPop then
maxPop := predator[i];
end;

if maxPop <= 0 then
maxPop := 1;
end;

function ScreenX(t: real): integer;
begin
Result := LeftMargin + Round(t / tMax * (WindowW - LeftMargin - RightMargin));
end;

function ScreenY(pop: real): integer;
begin
Result := WindowH - BottomMargin -
Round(pop / maxPop * (WindowH - TopMargin - BottomMargin));
end;

procedure DrawAxes;
begin
SetPenColor(clBlack);
SetPenWidth(2);

// Ось Y
Line(LeftMargin, TopMargin, LeftMargin, WindowH - BottomMargin);

// Ось X
Line(LeftMargin, WindowH - BottomMargin,
WindowW - RightMargin, WindowH - BottomMargin);

SetFontSize(11);
TextOut(WindowW div 2 - 60, WindowH - 35, 'Время');
TextOut(10, 20, 'Численность');

// Подписи
TextOut(LeftMargin - 10, WindowH - BottomMargin + 10, '0');
TextOut(WindowW - 80, WindowH - BottomMargin + 10, FloatToStr(tMax));

TextOut(15, TopMargin - 5, FloatToStr(Round(maxPop)));
end;

procedure DrawLegend;
begin
SetFontSize(12);

SetPenColor(clGreen);
SetBrushColor(clGreen);
Rectangle(WindowW - 190, 40, WindowW - 170, 55);

SetPenColor(clBlack);
SetBrushColor(clWhite);
TextOut(WindowW - 160, 37, 'Жертвы');

SetPenColor(clRed);
SetBrushColor(clRed);
Rectangle(WindowW - 190, 70, WindowW - 170, 85);

SetPenColor(clBlack);
SetBrushColor(clWhite);
TextOut(WindowW - 160, 67, 'Хищники');
end;

procedure DrawGraphs;
var
i: integer;
begin
ClearWindow(clWhite);

DrawAxes;
DrawLegend;

SetFontSize(14);
TextOut(250, 10, 'Модель «Хищник — жертва»');

// График численности жертв
SetPenColor(clGreen);
SetPenWidth(2);

for i := 1 to steps do
Line(ScreenX(time[i - 1]), ScreenY(prey[i - 1]),
ScreenX(time[i]), ScreenY(prey[i]));

// График численности хищников
SetPenColor(clRed);
SetPenWidth(2);

for i := 1 to steps do
Line(ScreenX(time[i - 1]), ScreenY(predator[i - 1]),
ScreenX(time[i]), ScreenY(predator[i]));
end;

begin
CalculateModel;
FindMaxPopulation;

SetWindowSize(WindowW, WindowH);
SetWindowCaption('Модель Хищник — жертва');

DrawGraphs;
end.

Эта программа моделирует систему из двух популяций:

pascal
dx := alpha * prey[i] - beta * prey[i] * predator[i];
dy := -gamma * predator[i] + delta * prey[i] * predator[i];

Здесь prey — численность жертв, а predator — численность хищников.

Смысл коэффициентов следующий:

alpha показывает, как быстро размножаются жертвы, если хищников нет.

beta отвечает за уменьшение численности жертв из-за встреч с хищниками.

gamma показывает естественную смертность хищников при отсутствии пищи.

delta показывает, насколько успешно хищники увеличивают свою численность за счёт поедания жертв.

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

pascal
prey[i + 1] := prey[i] + dt * dx;
predator[i + 1] := predator[i] + dt * dy;

После запуска появляется окно с графиком. Обычно динамика получается колебательной: сначала увеличивается численность жертв, затем вслед за ней растёт численность хищников. Когда хищников становится много, количество жертв уменьшается. После сокращения численности жертв хищникам не хватает пищи, и их численность тоже падает. Затем цикл повторяется.

Параметры модели можно менять в начале программы. Например, если увеличить beta, хищники будут быстрее уничтожать жертв. Если увеличить alpha, популяция жертв будет восстанавливаться быстрее. Если увеличить gamma, хищники будут быстрее вымирать при недостатке пищи.

Отвечает Kuan Agibay.

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос