Bifurcation.mws

Bifurcations

Begin with restart to clear memomry and packages DEtools and plots containing the DEplot and display, respectively.

>    restart: with(DEtools): with(plots):

Warning, the name changecoords has been redefined

Consider the autonomous differential equation diff(y,t) = f(y)  for the following function.

>    f:=y->y^2-5;

f := proc (y) options operator, arrow; y^2-5 end proc

Note that this function has two roots, corresponding to equilibrium (or fixed point) solutions. This tells us that we expect three types of solution behaviors. For y < -sqrt(5)  and sqrt(5) < y  the solution is an increasing function and for abs(y) < sqrt(5)  the solution is decreasing.

>    plot(f(y),y=-3..3);

[Maple Plot]

This can be seen from the slope field with several initial conditions displayed.

>    ics:=[[y(0)=-3],[y(0)=-2],[y(0)=-1],[y(0)=0],[y(0)=1],[y(0)=2],[y(0)=3]]:
DEplot(diff(y(t),t)=f(y(t)),y(t),t=-6..6,y=-3..3,ics,stepsize=0.1);

[Maple Plot]

Saddle-Node Bifurcation

This function is one in a family of functions of the form

>    f:=y->y^2+mu;

f := proc (y) options operator, arrow; y^2+mu end proc

It is interesting to see the behavior of solutions as the parameter mu  is varied. first we see how f(y)  changes as the parameter is varied.
(Click on the figure and use the animations controls that will appear above.)

>    for i to 21 do mu:=(i-11)/2:str:=cat( "The value of mu is ",convert(mu,string), "."):
P[i]:=plot(f(y),y=-3..3,title=str): od: display(seq(P[k],k=1..21),insequence=true);

[Maple Plot]

>    for i to 21 do mu:=(i-11)/2:str:=cat( "The value of mu is ",convert(mu,string), "."):
P[i]:=DEplot(diff(y(t),t)=f(y(t)),y(t),t=-6..6,y=-3..3,ics,title=str,stepsize=.1): od:

>    display(seq(P[k],k=1..21),insequence=true);

Note that the nature and number of the equilibrium solutions changes as the parameter increase. This change of behavior at mu = 0  is called a bifurcation and this type of birfurcation is called a saddle-node bifurcation.

[Maple Plot]

Transcritical Bifurcation

>    f:=y->mu*y-y^2;

f := proc (y) options operator, arrow; mu*y-y^2 end proc

>    for i to 21 do mu:=(i-11)/2:str:=cat( "The value of mu is ",convert(mu,string), "."):
P[i]:=plot(f(y),y=-6..6,title=str): od: display(seq(P[k],k=1..21),insequence=true);

[Maple Plot]

>    for i to 21 do mu:=(i-11)/2:str:=cat( "The value of mu is ",convert(mu,string), ".");
P[i]:=DEplot(diff(y(t),t)=f(y(t)),y(t),t=-6..6,y=-6..6,ics,title=str,stepsize=.1): od:

>    display(seq(P[k],k=1..21),insequence=true);

[Maple Plot]

Pitchfork Bifurcation - Subcritical

>    f:=y->mu*y+y^3;

f := proc (y) options operator, arrow; mu*y+y^3 end proc

>    for i to 21 do mu:=(i-11)/2:str:=cat( "The value of mu is ",convert(mu,string), "."):
P[i]:=plot(f(y),y=-3..3,title=str): od: display(seq(P[k],k=1..21),insequence=true);

[Maple Plot]

>    for i to 21 do mu:=(i-11)/2:str:=cat( "The value of mu is ",convert(mu,string), ".");
P[i]:=DEplot(diff(y(t),t)=f(y(t)),y(t),t=-6..6,y=-3..3,ics,title=str,stepsize=.1): od:

>    display(seq(P[k],k=1..21),insequence=true);

[Maple Plot]

Pitchfork Bifurcation - Supercritical

>    f:=y->mu*y-y^3;

f := proc (y) options operator, arrow; mu*y-y^3 end proc

>    for i to 21 do mu:=(i-11)/2:str:=cat( "The value of mu is ",convert(mu,string), "."):
P[i]:=plot(f(y),y=-3..3,title=str): od: display(seq(P[k],k=1..21),insequence=true);

[Maple Plot]

>    for i to 21 do mu:=(i-11)/2:str:=cat( "The value of mu is ",convert(mu,string), ".");
P[i]:=DEplot(diff(y(t),t)=f(y(t)),y(t),t=-6..6,y=-3..3,ics,title=str,stepsize=.1): od:

>    display(seq(P[k],k=1..21),insequence=true);

[Maple Plot]

Finding Equlibria and Classification

Some functions are not easily plotted such as the following example from the text:

>    f:=y->y*(cos(y^5+2*y)-27*Pi*y^4);

f := proc (y) options operator, arrow; y*(cos(y^5+2*y)-27*Pi*y^4) end proc

One could plot the function and locate equilibrium points (roots of f). In this case there are two with y = 0  the simplest.

>    plot(f(y),y=-.1..0.4);

[Maple Plot]

One need only find the roots and look at the slopes at these points. Thus, one does not have to plot the function to classify points.

>    Df:=diff(f(y),y);

Df := cos(y^5+2*y)-27*Pi*y^4+y*(-sin(y^5+2*y)*(5*y^4+2)-108*Pi*y^3)

First we make sure of the first root. We see that the slope is positive, so y = 0  is a source .

>    x:=fsolve(f(y),y,-0.2..0.2); evalf(subs(y=x,Df));

x := 0.

1.

The second root has a negative slope, so it is a sink .

>    x:=fsolve(f(y),y,0.2..0.4); evalf(subs(y=x,Df));

x := .3125242774

-3.612753336

Determining Bifurcation Points

>    f:=y->y*(1-y)^2+mu;

f := proc (y) options operator, arrow; y*(1-y)^2+mu end proc

Looking at f for different values of mu  leads to trying to understand what happens at the bifurcation points. For mu = 0  there are two equilibrium solutions. If we change the parameter by a small amount we see a change in the number of equilibrium solutions.

>    plot({y*(1-y)^2-.5,y*(1-y)^2,y*(1-y)^2+.5},y=-1..2,color=black);

[Maple Plot]

>    for i to 21 do mu:=(i-11)/2:str:=cat( "The value of mu is ",convert(mu,string), "."):
P[i]:=plot(f(y),y=-1..2,title=str): od: display(seq(P[k],k=1..21),insequence=true);

[Maple Plot]

There are two points at which diff(f(y),y) = 0 . This is where the graph can be tangent to the horizontal axis.

>    mu:='mu': solve(diff(f(y),y)=0);

1, 1/3

This occurs for the bifurcation parameter found by solving f(y) = 0  for each point:

>    f(1)=0; f(1/3)=0;

mu = 0

4/27+mu = 0

Now you can following the solution behavior as the parameter moves into and out of the interval ( -mu/27, 0 ).

>    ics:=[[y(0)=-2],[y(0)=-1],[y(0)=-0.5],[y(0)=0],[y(0)=0.5],[y(0)=1],[y(0)=2]]:
for i to 21 do mu:=(i-11)/27:str:=cat( "The value of mu is ",convert(mu,string), "."):
P[i]:=DEplot(diff(y(t),t)=f(y(t)),y(t),t=-3..3,y=-1..2.5,ics,title=str,stepsize=.05): od:
display(seq(P[k],k=1..21),insequence=true);

[Maple Plot]

>