Simple bifurcation branch point
The general method is exposed in Golubitsky, Martin, David G Schaeffer, and Ian Stewart. Singularities and Groups in Bifurcation Theory. New York: Springer-Verlag, 1985, VI.1.d page 295
A simple branch point $(x_0,p_0)$ for the problem $F(x,p)=0$ satisfies $\dim \ker dF(x_0,p_0) = 1$. At such point, we can apply Lyapunov-Schmidt reduction to transform the initial problem in large dimensions to a scalar polynomial ($\delta p \equiv p-p_0$):
\[a\delta p + z\left(b_1\delta p + \frac{b_2}{2}z + \frac{b_3}{6}z^2\right) = 0 \tag{E}\]
whose solutions give access to all solutions in a neighborhood of $(x,p)$.
More precisely, if $\ker dF(x_0,p_0) = \mathbb R\zeta$, one can show that $x_0+z\zeta$ is close to a solution on a new branch, thus satisfying $F(x_0+z\zeta,p_0+\delta p)\approx 0$.
In the above scalar equation,
- if $a\neq 0$, this is a Saddle-Node bifurcation
- if $a=0,b_2\neq 0$, the bifurcation point is a Transcritical one where the bifurcated branch exists on each side of $p$.
- if $a=0,b_2=0, b_3\neq 0$, the bifurcation point is a Pitchfork one where the bifurcated branch only exists on one side of $p$. If it exists at smaller values then $p$, this is a subcritical Pitchfork bifurcation. In the other case, this is a supercritical Pitchfork bifurcation.
Normal form computation
The reduced equation (E) can be automatically computed as follows
getNormalForm(br::ContResult, ind_bif::Int ;
verbose = false, ζs = nothing, lens = br.param_lens)
where prob
is the bifurcation problem. br
is a branch computed after a call to continuation
with detection of bifurcation points enabled and ind_bif
is the index of the bifurcation point on the branch br
. The above call returns a point with information needed to compute the bifurcated branch. For more information about the optional parameters, we refer to getNormalForm
. The result returns the following:
mutable struct SimpleBranchPoint{Tv, T, Tevl, Tevr, Tnf} <: BranchPoint
"bifurcation point"
x0::Tv
"Parameter value at the bifurcation point"
p::T
"Right eigenvector(s)"
ζ::Tevr
"Left eigenvector(s)"
ζstar::Tevl
"Normal form coefficients"
nf::Tnf
"Type of bifurcation point"
type::Symbol
end
You should not need to call getNormalForm
except if you need the full information about the branch point.