Predator-Prey Problem

Contents

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

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:

Hence we obtain the following system of ODEs

Given initial conditions

The initial rabbit population is 6, the initial fox population is 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:

This returns the arrays ts, ys:

[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