Bifurcation Diagram
Definition
A Bifurcation Diagram denotes a graph showing the changes occurring with the variation of parameters in a dynamical system, illustrating bifurcation.
Example1
Considering the case of the Logistic family $$ x_{n+1} = a x_{n} \left( 1 - x_{n} \right) $$ , it is presumed that the values of $x_{N}$ for a sufficiently large $N$, given the changes in parameter $a$, fall within the black region of the following bifurcation diagram. When $1<a<3$, it appears as a single line, suggesting that $x_N$ stays at a fixed point, and when $3 < a < 3.4$, there are two lines indicating that $x_{N}$ could be one of the two values. Being one of the two values implies that $x_{n}$ is part of a periodic-$2$ orbit. Then around $a = 3.4$, a periodic-$2^2$ orbit emerges.
In this sense, referring to this graph as a Branching Diagram seems appropriate. On the other hand, as $3.6<a$ progresses, the black region gradually extends until at $a=4$, it encompasses all values from $0$ to $1$. This visually and experimentally demonstrates that the logistic map is chaotic. Understanding the bifurcation diagram of a dynamical system is significantly beneficial in this regard.
When $a < 3.5$, there is a somewhat understandable pattern, but it suddenly becomes chaotic, then periodic again, and chaotic once more. This phenomenon is called a Crisis. Meanwhile, the periodic intervals near $a = 3.8$ are known as Periodic Windows.
Code
Here is some Julia code for plotting the bifurcation diagram of the logistic family.
function logistic(r, x)
return r * x * (1 - x)
end
logistic(4, 0.5)
function iter(f, p, x0, n)
x = [x0]
for t in 1:n
push!(x, f(p, x[end]))
end
return x
end
traj = iter(logistic, 3, 0.5, 100)
using Plots, LaTeXStrings
plot(traj)
function bifurcation(h)
xaxis_ = []
yaxis_ = []
for r ∈ 1:h:4
preiterated = iter(logistic, r, 0.5, 200)[101:end]
xaxis_ = [xaxis_; fill(r, length(preiterated))]
yaxis_ = [yaxis_; preiterated]
end
return xaxis_, yaxis_
end
# @time xaxis, yaxis = bifurcation(0.01)
# diagram = scatter(xaxis, yaxis, markersize = 0.1, markeralpha = 0.5, legend = false, xlims = (1, 4), ylims = (0, 1))
@time xaxis, yaxis = bifurcation(0.001)
diagram = scatter(xaxis, yaxis,
xlabel = L"a", ylabel = L"x",
markersize = 0.1, markeralpha = 0.5, legend = false, xlims = (1, 4), ylims = (0, 1));
png(diagram, "bifurcation.png")
Yorke. (1996). CHAOS: An Introduction to Dynamical Systems: p19. ↩︎