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 $$ 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")

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