Competing Species with Logistic Growth

Defining Vector Fields

f[x_,y_]:=x*(1-x)-a*x*y;
g[x_,y_]:=b*y*(1-y)-c*x*y;

Nullclines

Solve[f[x,y]==0,y]
Solve[f[x,y]==0,x]
Solve[g[x,y]==0,y]
Solve[g[x,y]==0,x]

The resulting nullclines are thus given by:
N1: x=0 (xd=0)
N2: y=(1-x)/a (xd=0)
N3: y=0 (yd=0)
N4: y=1-c/b x (yd=0)

There are three obvious fixed points:
(0,0) which corresponds to extinction
(1,0) which corresponds to species 1 surrviving while species 2 goes extinct
(0,1) which corresponds to species 2 surrviving while species 2 goes extinct
The existence of a fourth fixed point depends on whether the lines 
y=1/a-1/ax and y=1-c/bx intersect in the first quadrant.

Solve[1/a-1/a*x==1-c/b*x,x]

Since b>0 the condition that there is a fixed point in the first quadrant is given by:
((1-a)/(b-ac))>0
Note if a=1 and c/b=1 then the nullclines are overlap and we get a line of fixed points.

StreamPlots

a=2;
b=4;
c=1/4;
Bound=1.5;
plot1=StreamPlot[{f[x,y],g[x,y]},{x,0,Bound},{y,0,Bound},PlotRange->{{-.01,Bound},{-.01,Bound}}];
plot2=ContourPlot[f[x,y]==0,{x,-.01,Bound},{y,-.01,Bound},ContourStyle->{Thick,Red}];
plot3=ContourPlot[g[x,y]==0,{x,-.01,Bound},{y,-.01,Bound},ContourStyle->{Thick,Blue}];
Show[plot1,plot2,plot3]
Clear[a,b,c];

Stability of Fixed Points

D[f[x,y],x]
D[f[x,y],y]
D[g[x,y],x]
D[g[x,y],y]

J[x_,y_]:={{1-2 x-a y,-a x},{-c y,-c x+b (1-y)-b y}};

J[0,0]

The origin is thus unstable.

J[0,1]

(0,1)  is stable if 1-a<0.

J[1,0]

(1,0) is stable if b<c. We now analyze the last fixed point.

Simplify[(1/a-1/a*x)/.x->(-1+a)*b/(-b+a*c)]

The fourth fixed point is thus given by
((((1-a) b)/(b-a c)),((b-c)/(b-a c)))

FullSimplify[Eigenvalues[Simplify[J[(((1-a) *b)/(b-a *c)),((b-c)/(b-a *c))]]]]

This is a mess, but it indicates that the fixed point can be a saddle, stable node or perhaps a spiral. The nullclines and direction of flow are more useful for understanding the stability.

Case 1 (a>1 and c>b)

a=2;
b=2;
c=3;
Bound=1.5;
plot1=StreamPlot[{f[x,y],g[x,y]},{x,0,Bound},{y,0,Bound},PlotRange->{{-.01,Bound},{-.01,Bound}}];
plot2=ContourPlot[f[x,y]==0,{x,-.01,Bound},{y,-.01,Bound},ContourStyle->{Thick,Red}];
plot3=ContourPlot[g[x,y]==0,{x,-.01,Bound},{y,-.01,Bound},ContourStyle->{Thick,Blue}];
Show[plot1,plot2,plot3]
Clear[a,b,c];

The fixed point is a saddle. The reason for this is that since both (0,1) and (1,0) are stable there must be a seperatrix between there basins of attraction.

Case 1I (a<1 and c>b)

In this case the fourth fixed point won’t lie in the first quadrant. This causes one population to go exstinct while the other goes to carraying capacity.

a=1/2;
b=2;
c=3;
Bound=1.5;
plot1=StreamPlot[{f[x,y],g[x,y]},{x,0,Bound},{y,0,Bound},PlotRange->{{-.01,Bound},{-.01,Bound}}];
plot2=ContourPlot[f[x,y]==0,{x,-.01,Bound},{y,-.01,Bound},ContourStyle->{Thick,Red}];
plot3=ContourPlot[g[x,y]==0,{x,-.01,Bound},{y,-.01,Bound},ContourStyle->{Thick,Blue}];
Show[plot1,plot2,plot3]
Clear[a,b,c];

The fixed point is a saddle. The reason for this is that since both (0,1) and (1,0) are stable there must be a seperatrix between there basins of attraction.

Case III (a<1 and c<b)

a=1/2;
b=1.2;
c=1;
Bound=1.5;
plot1=StreamPlot[{f[x,y],g[x,y]},{x,0,Bound},{y,0,Bound},PlotRange->{{-.01,Bound},{-.01,Bound}}];
plot2=ContourPlot[f[x,y]==0,{x,-.01,Bound},{y,-.01,Bound},ContourStyle->{Thick,Red}];
plot3=ContourPlot[g[x,y]==0,{x,-.01,Bound},{y,-.01,Bound},ContourStyle->{Thick,Blue}];
Show[plot1,plot2,plot3]
Clear[a,b,c];

In this case everything is unstable except the fourth fixed point so it must be stable. This is where both species can coexist.