logo

Bifurcation Diagram 📂Dynamics

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

bifurcation.png

Considering the case of the Logistic family xn+1=axn(1xn) x_{n+1} = a x_{n} \left( 1 - x_{n} \right) , it is presumed that the values of xNx_{N} for a sufficiently large NN, given the changes in parameter aa, fall within the black region of the following bifurcation diagram. When 1<a<31<a<3, it appears as a single line, suggesting that xNx_N stays at a fixed point, and when 3<a<3.43 < a < 3.4, there are two lines indicating that xNx_{N} could be one of the two values. Being one of the two values implies that xnx_{n} is part of a periodic-22 orbit. Then around a=3.4a = 3.4, a periodic-222^2 orbit emerges.

In this sense, referring to this graph as a Branching Diagram seems appropriate. On the other hand, as 3.6<a3.6<a progresses, the black region gradually extends until at a=4a=4, it encompasses all values from 00 to 11. 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.5a < 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.8a = 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")

  1. Yorke. (1996). CHAOS: An Introduction to Dynamical Systems: p19. ↩︎