Этот пример показывает, как решить дифференциальное уравнение, представляющее модель хищника/добычи, используя оба ode23
и ode45
. Эти функции предназначены для численного решения обыкновенных дифференциальных уравнений с использованием переменного размера шага методов интегрирования Рунге - Кутты. ode23
использует простую пару формул 2-го и 3-го порядков для средней точности и ode45
использует пару 4-го и 5-го порядков для более высокой точности.
Рассмотрим пару обыкновенных дифференциальных уравнений первого порядка, известных как уравнения Лоток-Вольтерра, или модель хищника-добычи:
Переменные и измерить размеры популяций добычи и хищников, соответственно. Квадратичный перекрестный термин учитывает взаимодействия между видами. Популяции жертв увеличений, когда хищников нет, и популяции хищников уменьшается, когда добыча скудна.
Чтобы симулировать систему, создайте функцию, которая возвращает вектора-столбца производных состояний, заданных состояний и временных значений. Эти две переменные и могут быть представлены в MATLAB как первые два значения в векторе y
. Точно так же производные являются первыми двумя значениями в векторе yp
. Функция должна принимать значения для t
и y
и возвращает значения, произведенные уравнениями в yp
.
yp(1) = (1 - alpha*y(2))*y(1)
yp(2) = (-1 + beta*y(1))*y(2)
В этом примере уравнения содержатся в файле, называемом lotka.m
. Этот файл использует значения параметров и .
type lotka
function yp = lotka(t,y) %LOTKA Lotka-Volterra predator-prey model. % Copyright 1984-2014 The MathWorks, Inc. yp = diag([1 - .01*y(2), -1 + .02*y(1)])*y;
Использование ode23
для решения дифференциального уравнения, заданного в lotka
через интервал . Используйте начальное условие так, чтобы населения хищников и добычи были равны.
t0 = 0; tfinal = 15; y0 = [20; 20]; [t,y] = ode23(@lotka,[t0 tfinal],y0);
Постройте график результирующих населений относительно времени.
plot(t,y) title('Predator/Prey Populations Over Time') xlabel('t') ylabel('Population') legend('Prey','Predators','Location','North')
Теперь постройте населения друг против друга. Получившийся график фазовой плоскости делает циклическую связь между населениями очень ясной.
plot(y(:,1),y(:,2)) title('Phase Plane Plot') xlabel('Prey Population') ylabel('Predator Population')
Решите систему второй раз, используя ode45
, вместо ode23
. The ode45
решатель занимает больше времени для каждого шага, но он также делает большие шаги. Тем не менее, выход ode45
является плавным, потому что по умолчанию решатель использует непрерывную формулу расширения, чтобы получить выход в четырех одинаково разнесенных временных точках в диапазоне каждого сделанного шага. (Можно настроить число точек с помощью 'Refine'
опция.) Постройте график обоих решений для сравнения.
[T,Y] = ode45(@lotka,[t0 tfinal],y0); plot(y(:,1),y(:,2),'-',Y(:,1),Y(:,2),'-'); title('Phase Plane Plot') legend('ode23','ode45')
Результаты показывают, что решение дифференциальных уравнений с помощью различных численных методов может дать несколько другие ответы.