Non-simple 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
An example of use of the methods presented here is provided in 2d generalized Bratu–Gelfand problem.
We expose our method to study non-simple branch points. Such branch point $(x_0,p_0)$ for the problem $F(x,p)=0$ satisfies $d=\dim \ker dF(x_0,p_0) > 1$ and the eigenvalues have zero imaginary part. At such point, we can apply Lyapunov-Schmidt reduction to transform the initial problem in large dimensions to a $d$-dimensional polynomial equation, called the reduced equation.
More precisely, it is possible to write $x = u + v$ where $u\in \ker dF(x_0,p_0)$ and $v\approx 0$ belongs to a vector space complement of $\ker dF(x_0,p_0)$. It can be shown that $u$ solves $\Phi(u,\delta p)=0$ with $\Phi(u,\delta p) = (I-\Pi)F(u+\psi(u,\delta p),p_0+\delta p)$ where $\psi$ is known implicitly and $\Pi$ is the spectral projector on $\ker dF(x_0,p_0)$. Fortunately, one can compute the Taylor expansion of $\Phi$ up to order 3. Computing the bifurcation diagram of this $d$-dimensional multivariate polynomials can be done using brute force methods.
Once the zeros of $\Phi$ have been located, we can use them as initial guess for continuation
but for the original $F$ !!
Reduced equation 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 a 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
. It returns a point with all requested information:
mutable struct NdBranchPoint{Tv, T, Tevl, Tevr, Tnf} <: BranchPoint
"bifurcation point"
x0::Tv
"Parameter value at the bifurcation point"
p::T
"Right eigenvectors"
ζ::Tevr
"Left eigenvectors"
ζstar::Tevl
"Normal form coefficients"
nf::Tnf
"Type of bifurcation point"
type::Symbol
end
Using the Reduced equation
Once a branch point has been computed bp = getNormalForm(...)
, you can do all sort of things.
- For example, quoted from the file
test/testNF.jl
, you can print the 2d reduced equation as follows:
julia> BifurcationKit.nf(bp2d)
2-element Array{String,1}:
" + (3.23 + 0.0im) * x1 * p + (-0.123 + 0.0im) * x1^3 + (-0.234 + 0.0im) * x1 * x2^2"
" + (-0.456 + 0.0im) * x1^2 * x2 + (3.23 + 0.0im) * x2 * p + (-0.123 + 0.0im) * x2^3"
You can evaluate the reduced equation as
bp2d(Val(:reducedForm), rand(2), 0.2)
. This can be used to find all the zeros of the reduced equation by sampling on a grid.Finally, given a $d$-dimensional vector $x$ and a parameter $\delta p$, you can have access to an initial guess $u$ (see above) by calling
bp2d(rand(2), 0.1)