# Bifurcation Analysis

In control theory, bifurcation is generally described as a sudden topological change in behavior in a system. More specifically, the term refers to a change in a system behavior when a parameter or set of parameters are varied.

The code snippet below is a MATLAB script that can be run to form the subsequent plots. It begins by initializing differential equations and forming state space (`ss`) equations `Z1` and `Z2`. With these, a meshgrid and vector field can be computed and plotted on. We'd also like to overlay contours of the ode45 numerical solution to our state space and so we loop over a range of initial conditions (`x_range`) and contour values (`Z_sol`) to obtain a plot that resembles 1 frame of the GIFs shown below.

In order to form the GIF, many of these individual frames needed to be created with the parameter `a` being varied across a range of -3:3 at 0.1 increments (`a_range`). A simple for loop will allows us to iterate over our desired range, saving the files as .jpg images as we go. This then allows us to upload all the .jpg images into a GIF creating tool online at gifmaker.me forming a nice looping GIF of our images. Finer increments of iteration across our range give better smoothness to the GIF, although chewing up large amount of memory. Essentially, bifurcation is the topological change that is visible when `a` is varied across `a_range`. In linear systems this is not present, since linear change input maps to linear change in output. Bifurcation is an interesting behavior that arises in non-linear systems since its can give rise to system altering toplogies like limit cycles and stable/unstable equilibrium.

Fig. 1 was formed using exactly this source code. Fig. 2 is a slight deviation in `ss`. The `a` value located in the second equation is replaced with a 1. This gives rise to a asymmetrical spreading of the trajectories.

``````
% Script plotting phase portraits of non-linear bifurcations [Fig1]

% init system and states
number = 1;
for a_range = -3:0.1:3

g = 9.81;
L = 1;
a = a_range;
b = 0.1;
ss = @(t,Z) [Z(2)+Z(1)*(a-Z(1)^2-Z(2)^2); -Z(1)+Z(2)*(a-Z(1)^2-Z(2)^2)];
Z1 = linspace(-pi,pi,25);
Z2 = linspace(-pi,pi,25);

% Generate Meshgrid for numerically solving
[x,y] = meshgrid(Z1,Z2);
size(x)
size(y)

% Establish U and V vectors
u = zeros(size(x));
v = zeros(size(y));

% Init Loop over Vector field to compute Derivatives
t = 0;
for i = 1:numel(x)
Theta_d = ss(t,[x(i); y(i)]);
u(i) = Theta_d(1);
v(i) = Theta_d(2);
Mag = sqrt(u(i)^2+v(i)^2);
u(i) = u(i)/Mag;
v(i) = v(i)/Mag;
end

%Plot our vector field
figure
quiver(x,y,u,v,'r'); figure(gcf)
xlabel('X')
ylabel('Y')
axis tight equal;

hold on

for x_range = [-1,0,1]
for Z_sol = -10:1:10
[ts,ys] = ode45(ss,[0,10],[x_range;Z_sol]);
plot(ys(:,1),ys(:,2),'b');
%plot(-ys(:,1),ys(:,2),'b')
%plot(ys(1,1),ys(1,2),'bo') %start of contour
%plot(ys(end,1),ys(end,2),'ks') %end of contour
end
end

axis([-2 2 -2 2])
grid on

s1 = 'figure_';
s2 = num2str(number);
s3 = '.jpg';
filo = strcat(s1,s2,s3);
number = number+1;

doc saveas
saveas(gcf,filo);

end
``````

## Fig. 1 ## Fig. 2 