Branch switching

Branch switching from simple branch point to equilibria

You can perform automatic branch switching by calling continuation with the following options:

continuation(F, dF, d2F, d3F, br::ContResult, ind_bif::Int, optionsCont::ContinuationPar;
	Jᵗ = nothing, δ = 1e-8, nev = 5, verbose = false, kwargs...)

where br is a branch computed after a call to continuation with detection of bifurcation points enabled. This call computes the branch bifurcating from the ind_bifth bifurcation point in br. An example of use is provided in A generalized Bratu–Gelfand problem in two dimensions.

Branch switching from non simple branch point to equilibria

We provide an experimental automatic branch switching method in this case. The method is to first compute the reduced equation (see Non-simple branch point) and use it to compute the nearby solutions. These solutions are seeded as initial guess for continuation. Hence, you can perform automatic branch switching by calling continuation with the following options:

continuation(F, dF, d2F, d3F, br::ContResult, ind_bif::Int, optionsCont::ContinuationPar;
	Jᵗ = nothing, δ = 1e-8, nev = 5, verbose = false, kwargs...)

Branch switching from Hopf point to periodic orbits

In order to compute the bifurcated branch of periodic solutions at a Hopf bifurcation point, you need to choose a method. Indeed, we provide two methods to compute periodic orbits:

Once you have decided which method you want, you can call the following method.

continuation(F, dF, d2F, d3F, br::ContResult, ind_bif::Int, _contParams::ContinuationPar, prob::AbstractPeriodicOrbitProblem ;
	Jᵗ = nothing, δ = 1e-8, δp = nothing, ampfactor = 1, kwargs...)

We refer to continuation for more information about the arguments. Here, we just say a few words about how we can specify prob::AbstractPeriodicOrbitProblem. For Periodic orbits based on finite differences, you can pass prob = PeriodicOrbitTrapProblem(M = 51) where M is the number of times slices in the periodic orbit. For Periodic orbits based on the shooting method, you need more parameters. For example, you can pass prob = ShootingProblem(2, par, prob, Euler()) or prob = PoincareShootingProblem(2, par, prob, Euler()) where prob::ODEProblem is an ODE problem to specify the Cauchy problem and par is the set of parameters passed to the vector field and which must be the same as br.params.

Several examples are provided like Brusselator 1d (automatic) or Complex Ginzburg-Landau 2d.

Precise options

Although very convenient, the automatic branch switching does not allow the very fine tuning of parameters. It must be used as a first attempt before recurring to manual branch switching

Branch switching from Branch point of curve of periodic orbits

We only provide (for now) this method for the case of PeriodicOrbitTrapProblem. The call is as follows. Please note that a deflation is included in this method to simplify branch switching.

An example of use is provided in Brusselator 1d (automatic).

BifurcationKit.continuationPOTrapBPFromPOFunction
continuationPOTrapBPFromPO(br, ind_bif, _contParams; Jᵗ, δ, δp, ampfactor, usedeflation, linearPO, printSolution, linearAlgo, updateSectionEveryStep, kwargs...)

Branch switching at a Branch point of periodic orbits specified by a PeriodicOrbitTrapProblem. This is still experimental. A deflated Newton-Krylov solver is used to improve the branch switching capabilities.

Arguments

Optional arguments

  • Jᵗ = (x, p) -> transpose(d_xF(x, p)) jacobian adjoint, it should be implemented in an efficient manner. For matrix-free methods, transpose is not readily available and the user must provide a dedicated method. In the case of sparse based jacobian, Jᵗ should not be passed as it is computed internally more efficiently, i.e. it avoid recomputing the jacobian as it would be if you pass Jᵗ = (x, p) -> transpose(dF(x, p))
  • δ used internally to compute derivatives w.r.t the parameter p.
  • δp = 0.1 used to specify a particular guess for the parameter in the branch which is otherwise determined by contParams.ds. This allows to use a step larger than contParams.dsmax.
  • ampfactor = 1 factor which alter the amplitude of the bifurcated solution. Useful to magnify the bifurcated solution when the bifurcated branch is very steep.
  • usedeflation = true whether to use nonlinear deflation (see Deflated problems) to help finding the guess on the bifurcated branch
  • linearPO = :BorderedLU linear solver used for the Newton-Krylov solver when applied to PeriodicOrbitTrapProblem.
  • printSolution = (u,p) -> u[end], print method used in the bifurcation diagram, by default this prints the period of the periodic orbit.
  • linearAlgo = BorderingBLS(), same as for continuation
  • kwargs keywords arguments used for a call to the regular continuation
  • updateSectionEveryStep = 1 updates the section every when mod(step, updateSectionEveryStep) == 1 during continuation