Predator-Prey Problem
Contents
- Download this m-file
- System of differential equations
- Given initial conditions
- Definition of the function f
- Solve the ODE using the Euler method
- Solve the initial value problem using ode45
- Plot both y1(t) and y2(t) vs. t
- Plot y2 vs. y1 (phase plane plot)
- Solve ODE with higher accuracy, then make phase plane plot
Download this m-file
You first have to download the file
and put it in the same directory as your other m-files.
System of differential equations
Let y1 denote the number of rabbits (prey), let y2 denote the number of foxes (predator). The population growth is described by
- y1' = a1*y1
- y2' = a2*y2
Here the growth rate a1 for rabbits is positive for y2=0, but decreases with increasing y2; the growth rate a2 for foxes is negative for y1=0, but increases with increasing y1:
- a1 = 2 - .5*y2
- a2 = -1 + .5*y1
Hence we obtain the following system of ODEs
- y1' = (2-.5*y2)*y1
- y2' = (-1+.5*y1)*y2
Given initial conditions
The initial rabbit population is 6, the initial fox population is 2:
- y1(0) = 6
- y2(0) = 2
Definition of the function f
We have an ODE system y' = f(t,y) where y is a vector and the vector-valued function f is given by
f = @(t,y) [(2-.5*y(2))*y(1); (-1+.5*y(1))*y(2)];
Solve the ODE using the Euler method
Assume that at time t we have the vector y. Then we compute the slope vector s=f(t,y) and define the new y-vector by y = y + h*s.
We repeat this until we reach the final time T.
Note that the values of the Euler method are not very accurate for h=0.1.
y = [6;2]; t = 0; % given initial value h = .1; % step size for i=1:100 plot(t,y(1),'b.',t,y(2),'r.'); hold on % plot rabbits in blue, foxes in red s = f(t,y); % find slope vector y = y + h*s; % find new y-vector by using s t = t + h; end hold off legend('rabbits','foxes')
Solve the initial value problem using ode45
We want to find the functions y1(t) and y2(t) for t in [0,15].
In Matlab we use [ts,ys] = ode45(f,[t0,T],y0).
Here the input arguments are:
- f is the ODE function (can be defined by an @-function, or an m-file)
- t0 is the initial time
- T is the final time
- y0 is the initial y-vector at time t0.
This returns the arrays ts, ys:
- ts is the vector of time values (Matlab chooses h automatically at each step)
- ys is an array containing the values of y: row j contains the values of y1 (rabbits) and y2 (foxes) at the time ts(j) .
[ts,ys] gives a table with t in column 1, y1 (rabbits) in column 2, y2 (foxes) in column 3
[ts,ys] = ode45(f,[0,15],[6;2]);
[ts,ys] % table with values of t, y1, y2 in each row
ans = 0 6.0000 2.0000 0.0251 6.1486 2.1050 0.0502 6.2923 2.2196 0.0754 6.4296 2.3446 0.1005 6.5591 2.4808 0.2069 6.9969 3.1941 0.3133 7.1111 4.1963 0.4197 6.7843 5.4927 0.5262 6.0208 6.9653 0.6137 5.1515 8.1505 0.7013 4.1971 9.1635 0.7888 3.2782 9.9004 0.8763 2.4945 10.3010 0.9560 1.9375 10.3842 1.0357 1.5046 10.2662 1.1153 1.1755 9.9993 1.1950 0.9308 9.6282 1.3057 0.6956 9.0121 1.4163 0.5356 8.3476 1.5270 0.4187 7.6803 1.6377 0.3389 7.0278 1.7386 0.2951 6.4553 1.8395 0.2644 5.9184 1.9404 0.2430 5.4190 2.0413 0.2288 4.9575 2.1513 0.2199 4.4964 2.2612 0.2165 4.0768 2.3711 0.2179 3.6961 2.4811 0.2237 3.3517 2.6374 0.2395 2.9189 2.7937 0.2645 2.5460 2.9499 0.3002 2.2261 3.1062 0.3487 1.9527 3.3371 0.4508 1.6229 3.5679 0.6020 1.3683 3.7988 0.8248 1.1784 4.0296 1.1519 1.0472 4.1967 1.4775 0.9889 4.3638 1.9031 0.9627 4.5309 2.4532 0.9754 4.6980 3.1507 1.0418 4.8650 4.0046 1.1925 5.0321 5.0184 1.4699 5.1992 6.0903 1.9739 5.3663 6.9628 2.8857 5.4157 7.1245 3.2691 5.4652 7.2152 3.7155 5.5146 7.2210 4.2281 5.5640 7.1303 4.8061 5.6135 6.9355 5.4442 5.6629 6.6364 6.1291 5.7124 6.2414 6.8408 5.7618 5.7669 7.5537 5.8406 4.9091 8.6141 5.9193 4.0192 9.4919 5.9981 3.1857 10.1190 6.0769 2.4763 10.4609 6.1518 1.9408 10.5379 6.2268 1.5209 10.4293 6.3017 1.1983 10.1813 6.3767 0.9553 9.8339 6.4820 0.7155 9.2451 6.5873 0.5508 8.6030 6.6926 0.4307 7.9520 6.7980 0.3479 7.3110 6.8961 0.3000 6.7334 6.9942 0.2660 6.1891 7.0924 0.2419 5.6807 7.1905 0.2252 5.2090 7.2970 0.2139 4.7376 7.4035 0.2081 4.3069 7.5101 0.2069 3.9147 7.6166 0.2098 3.5584 7.7638 0.2204 3.1202 7.9110 0.2385 2.7388 8.0582 0.2650 2.4080 8.2054 0.3012 2.1220 8.4423 0.3854 1.7435 8.6792 0.5125 1.4502 8.9161 0.7027 1.2285 9.1530 0.9859 1.0699 9.3284 1.2790 0.9914 9.5038 1.6692 0.9458 9.6791 2.1839 0.9381 9.8545 2.8522 0.9805 9.9937 3.5072 1.0657 10.1329 4.2840 1.2148 10.2721 5.1624 1.4650 10.4112 6.0746 1.8844 10.5057 6.6519 2.3133 10.6002 7.1044 2.9173 10.6947 7.3348 3.7426 10.7892 7.2474 4.8119 10.8574 6.9411 5.7304 10.9256 6.4349 6.7267 10.9938 5.7649 7.7362 11.0620 4.9923 8.6823 11.1302 4.1965 9.4829 11.1984 3.4424 10.0883 11.2666 2.7736 10.4783 11.3348 2.2138 10.6557 11.4057 1.7487 10.6446 11.4766 1.3848 10.4801 11.5475 1.1036 10.2026 11.6184 0.8899 9.8454 11.7113 0.6877 9.3046 11.8041 0.5445 8.7247 11.8970 0.4397 8.1366 11.9899 0.3646 7.5568 12.0920 0.3089 6.9412 12.1941 0.2699 6.3603 12.2962 0.2425 5.8184 12.3983 0.2237 5.3165 12.5019 0.2116 4.8476 12.6055 0.2048 4.4178 12.7090 0.2025 4.0252 12.8126 0.2041 3.6675 12.9561 0.2125 3.2250 13.0996 0.2278 2.8383 13.2430 0.2507 2.5014 13.3865 0.2823 2.2088 13.6312 0.3609 1.7983 13.8759 0.4819 1.4818 14.1207 0.6659 1.2432 14.3654 0.9441 1.0725 14.5240 1.1946 0.9959 14.6827 1.5195 0.9458 14.8413 1.9384 0.9247 15.0000 2.4731 0.9392
Plot both y1(t) and y2(t) vs. t
We can plot the rabbit population vs. t using plot(ts,ys(:,1)) since ys(:,1) gives the first column of the array ys with the rabbit values.
We can plot both rabbits and foxes vs. t using plot(ts,ys). Matlab now plots the first column of ys (rabbits) in blue, and the second column of ys (foxes) in red.
It appears that the functions y1(t), y2(t) are periodic with a period of about 5.
plot(ts,ys) % plot rabbit and fox population vs. t legend('rabbits','foxes'); xlabel('time t')
Plot y2 vs. y1 (phase plane plot)
We can also consider the solution (y1(t),y2(t)) as tracing a curve in the (y1,y2) plane ("phase plane"). We can plot this curve with plot(ys(:,1),ys(:,2)).
The phase plane plot should be a closed curve since the solution is periodic.
The vector field given by f shows the velocity vectors with which the point (y1(t),y2(t)) moves along the trajectory. We see that the point moves along the closed curve counterclockwise as t increases.
Note that we do not quite get a closed curve: after one period we arrive at a slightly different point. This is due to the error of the numerical method in ode45.
plot(ys(:,1),ys(:,2)); hold on % plot solution in phase plane xlabel('rabbits'); ylabel('foxes') vectfield(f,0:.8:7.5,0:.8:10.5); hold off % plot vector field
Solve ODE with higher accuracy, then make phase plane plot
We can define additional options using odeset. Here we specify a tolerance of 1e-10 for both the relative error ('RelTol') and the absolute error ('AbsTol').
Now the errors are much smaller, and we obtain a closed curve (at least for the visual accuracy of the plot).
opt = odeset('RelTol',1e-10,'AbsTol',1e-10); % use smaller tolerances [ts,ys] = ode45(f,[0,15],[6;2],opt); % use opt defined by odeset plot(ys(:,1),ys(:,2)); hold on % plot solution in phase plane xlabel('rabbits'); ylabel('foxes') vectfield(f,0:.8:7.5,0:.8:10.5); hold off % plot vector field