BifurcationKit.BifDetectEvent
— Constant`BifDetectEvent`
This event implements the detection of bifurcations points along a continuation curve. The detection is based on monitoring the number of unstable eigenvalues. More details are given at Detection of bifurcation points of Equilibria.
BifurcationKit.FoldDetectEvent
— Constant`FoldDetectEvent`
This event implements the detection of Fold points based on the p-component of the tangent vector to the continuation curve. It is designed to work with PALC(tangent = Bordered())
as continuation algorithm. To use it, pass event = FoldDetectEvent
to continuation
.
LinearAlgebra.I
— MethodI(coll, u, par)
Compute the identity matrix associated with the collocation problem.
BifurcationKit.AutoDiff
— TypeSingleton type to trigger the computation of the jacobian Matrix using ForwardDiff.jl. It can be used for example in newton or in deflated newton.
BifurcationKit.AutoDiffDense
— TypeThe jacobian is computed with automatic differentiation, works for dense matrices. Can be used for debugging.
BifurcationKit.AutoDiffDenseAnalytical
— TypeSame as for AutoDiffDense
but the jacobian is formed using a mix of AD and analytical formula. Mainly used for Shooting.
BifurcationKit.AutoDiffMF
— TypeSingleton type to trigger the computation of the jacobian vector product (jvp) using ForwardDiff.jl. It can be used for example in newton, in deflated newton or in continuation.
BifurcationKit.AutoSwitch
— Typestruct AutoSwitch{Talg, T} <: BifurcationKit.AbstractContinuationAlgorithm
Continuation algorithm which switches automatically between Natural continuation and PALC depending on the stiffness of the branch being continued.
alg::Any
: Continuation algorithm to switch to when Natural is discarded. TypicallyPALC()
tol_param::Any
: tolerance for switching to PALC(), default value = 0.5
BifurcationKit.BTMAProblem
— Typestruct BTMAProblem{Tprob, Tjac, Tu0, Tp, Tl<:Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}, Tplot, Trecord} <: BifurcationKit.AbstractMABifurcationProblem{Tprob}
Problem wrap of a functional. It is not meant to be used directly albeit perhaps by advanced users.
prob::Any
jacobian::Any
u0::Any
params::Any
lens::Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}
plotSolution::Any
recordFromSolution::Any
BifurcationKit.BTProblemMinimallyAugmented
— Typemutable struct BTProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem, vectype, S<:BifurcationKit.AbstractLinearSolver, Sa<:BifurcationKit.AbstractLinearSolver, Sbd<:BifurcationKit.AbstractBorderedLinearSolver, Sbda<:BifurcationKit.AbstractBorderedLinearSolver, Sbdblock<:BifurcationKit.AbstractBorderedLinearSolver, Tlens} <: BifurcationKit.AbstractProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem}
Structure to encode Bogdanov-Takens functional based on a Minimally Augmented formulation.
Fields
prob_vf
: Functional F(x, p) - vector field - with all derivativesa
: close to null vector of Jᵗb
: close to null vector of Jzero
: vector zero, to avoid allocating it many timeslinsolver
: linear solver. Used to invert the jacobian of MA functionallinsolverAdjoint
: linear solver for the jacobian adjointlinbdsolver
: bordered linear solverlinbdsolverAdjoint
: linear bordered solver for the jacobian adjointlinbdsolverBlock
: bordered linear solver for blockslens2
: second parameter axisusehessian
: whether to use the hessian of prob_vf
BifurcationKit.Bautin
— Typemutable struct Bautin{Tv, Tpar, Tlens, Tevr, Tevl, Tnf} <: BifurcationKit.AbstractBifurcationPoint
x0::Any
: Bifurcation pointparams::Any
: Parameters used by the vector field.lens::Any
: Parameter axis used to compute the branch on which this cusp point was detected.ζ::Any
: Right eigenvectorζ★::Any
: Left eigenvectornf::Any
: Normal form coefficientstype::Symbol
: Type of bifurcation
BifurcationKit.BifDiagNode
— TypeStructure to hold a connected component of a bifurcation diagram.
Fields
level::Int64
: current recursion levelcode::Int64
: code for finding the current node in the tree, this is the index of the bifurcation point from which γ branches offγ::Any
: branch associated to the current nodechild::Any
: children of current node. These are the different branches off the bifurcation point in γ
Methods
hasbranch(diagram)
from(diagram)
diagram[code]
For examplediagram[1,2,3]
returnsdiagram.child[1].child[2].child[3]
BifurcationKit.BifFunction
— Typestruct BifFunction{Tf, Tdf, Tdfad, Tj, Tjad, Td2f, Td2fc, Td3f, Td3fc, Tsym, Tδ} <: BifurcationKit.AbstractBifurcationFunction
Structure to hold the vector field and its derivatives. It should rarely be called directly. Also, in essence, it is very close to SciMLBase.ODEFunction
.
Fields
F::Any
: Vector field. Function of type out-of-placeresult = f(x, p)
or inplacef(result, x, p)
. For type stability, the types ofx
andresult
should matchdF::Any
: Differential ofF
with respect tox
, signaturedF(x,p,dx)
dFad::Any
: Adjoint of the Differential ofF
with respect tox
, signaturedFad(x,p,dx)
J::Any
: Jacobian ofF
at(x, p)
. It can assume three forms. 1. EitherJ
is a function andJ(x, p)
returns a::AbstractMatrix
. In this case, the default arguments ofcontparams::ContinuationPar
will makecontinuation
work. 2. OrJ
is a function andJ(x, p)
returns a function taking one argumentdx
and returningdr
of the same type asdx
. In our notation,dr = J * dx
. In this case, the default parameters ofcontparams::ContinuationPar
will not work and you have to use a Matrix Free linear solver, for exampleGMRESIterativeSolvers
, 3. OrJ
is a function andJ(x, p)
returns a variablej
which can assume any type. Then, you must implement a linear solverls
as a composite type, subtype ofAbstractLinearSolver
which is called likels(j, rhs)
and which returns the solution of the jacobian linear system. See for exampleexamples/SH2d-fronts-cuda.jl
. This linear solver is passed toNewtonPar(linsolver = ls)
which itself passed toContinuationPar
. Similarly, you have to implement an eigensolvereig
as a composite type, subtype ofAbstractEigenSolver
.Jᵗ::Any
: 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 avoids recomputing the jacobian as it would be if you passJᵗ = (x, p) -> transpose(dF(x, p))
.d2F::Any
: Second Differential ofF
with respect tox
, signatured2F(x,p,dx1,dx2)
d3F::Any
: Third Differential ofF
with respect tox
, signatured3F(x,p,dx1,dx2,dx3)
d2Fc::Any
: [internal] Second Differential ofF
with respect tox
which accept complex vectors dxid3Fc::Any
: [internal] Third Differential ofF
with respect tox
which accept complex vectors dxiisSymmetric::Any
: Whether the jacobian is auto-adjoint.δ::Any
: used internally to compute derivatives (with finite differences), for example for normal form computation and codim 2 continuation.inplace::Bool
: optionally sets whether the function is inplace or not
Methods
residual(pb::BifFunction, x, p)
callspb.F(x,p)
jacobian(pb::BifFunction, x, p)
callspb.J(x, p)
dF(pb::BifFunction, x, p, dx)
callspb.dF(x,p,dx)
- etc
BifurcationKit.BifurcationProblem
— Typestruct BifurcationProblem{Tvf, Tu, Tp, Tl<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tplot, Trec, Tgets} <: BifurcationKit.AbstractAllJetBifProblem
Structure to hold the bifurcation problem.
Fields
VF::Any
: Vector field, typically aBifFunction
u0::Any
: Initial guessparams::Any
: parameterslens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Typically aAccessors.PropertyLens
. It specifies which parameter axis amongparams
is used for continuation. For example, ifpar = (α = 1.0, β = 1)
, we can perform continuation w.r.t.α
by usinglens = (@optic _.α)
. If you have an arraypar = [ 1.0, 2.0]
and want to perform continuation w.r.t. the first variable, you can uselens = (@optic _[1])
. For more information, we refer toAccessors.jl
.plotSolution::Any
: user function to plot solutions during continuation. Signature:plot_solution(x, p; kwargs...)
for Plot.jl andplot_solution(ax, x, p; kwargs...)
for the Makie package(s).recordFromSolution::Any
:record_from_solution = (x, p; k...) -> norm(x)
function used record a few indicators about the solution. It could benorm
or(x, p) -> x[1]
. This is also useful when saving several huge vectors is not possible for memory reasons (for example on GPU). This function can return pretty much everything but you should keep it small. For example, you can do(x, p; k...) -> (x1 = x[1], x2 = x[2], nrm = norm(x))
or simply(x, p; k...) -> (sum(x), 1)
. This will be stored incontres.branch
wherecontres::ContResult
is the continuation curve of the bifurcation problem. Finally, the first component is used for plotting in the continuation curve.save_solution::Any
: function to save the full solution on the branch. Some problem are mutable (like periodic orbit functional with adaptive mesh) and this function allows to save the state of the problem along with the solution itself. Signaturesave_solution(x, p)
Methods
re_make(pb; kwargs...)
modify a bifurcation problemgetu0(pb)
callspb.u0
getparams(pb)
callspb.params
getlens(pb)
callspb.lens
getparam(pb)
callsget(pb.params, pb.lens)
setparam(pb, p0)
callsset(pb.params, pb.lens, p0)
record_from_solution(pb)
callspb.recordFromSolution
plot_solution(pb)
callspb.plotSolution
is_symmetric(pb)
callsis_symmetric(pb.prob)
Constructors
BifurcationProblem(F, u0, params, lens)
all derivatives are computed using ForwardDiff.BifurcationProblem(F, u0, params, lens; J, Jᵗ, d2F, d3F, kwargs...)
andkwargs
are the fields above. You can pass your own jacobian withJ
(seeBifFunction
for description of the jacobian function) and jacobian adjoint withJᵗ
. For example, this can be used to provide finite differences based jacobian usingBifurcationKit.finiteDifferences
.
BifurcationKit.BilinearMap
— Typestruct BilinearMap{Tm}
This structure wraps a bilinear map to allow evaluation on Complex arguments. This is especially useful when these maps are produced by ForwardDiff.jl.
BifurcationKit.BogdanovTakens
— Typemutable struct BogdanovTakens{Tv, Tpar, Tlens, Tevr, Tevl, Tnf, Tnf2} <: BifurcationKit.AbstractBifurcationPoint
x0::Any
: Bogdanov-Takens pointparams::Any
: Parameters used by the vector field.lens::Any
: Parameter axis used to compute the branch on which this BT point was detected.ζ::Any
: Right eigenvectorsζ★::Any
: Left eigenvectorsnf::Any
: Normal form coefficients (basic)nfsupp::Any
: Normal form coefficients (detailed)type::Symbol
: Type of bifurcation
BifurcationKit.Bordered
— TypeBordered Tangent predictor
BifurcationKit.BorderedArray
— Typemutable struct BorderedArray{vectype1, vectype2}
This defines an array (although not <: AbstractArray
) to hold two arrays or an array and a scalar. This is useful when one wants to add constraints (phase, ...) to a functional for example. It is used throughout the package for the Pseudo Arc Length Continuation, for the continuation of Fold / Hopf points, for periodic orbits... It is also used to define periodic orbits as (orbit, period). As such, it is a convenient alternative to cat
, vcat
and friends. We chose not to make it a subtype of AbstractArray as we wish to apply the current package to general "arrays", see Requested methods for Custom State. Finally, it proves useful for the GPU where the operation x[end]
can be slow.
BifurcationKit.BorderingBLS
— Typestruct BorderingBLS{S<:Union{Nothing, BifurcationKit.AbstractLinearSolver}, Ttol} <: BifurcationKit.AbstractBorderedLinearSolver
This struct is used to provide the bordered linear solver based on the Bordering Method. Using the options, you can trigger a sequence of Bordering reductions to meet a precision.
Reference
This is the solver BEC + k in Govaerts, W. “Stable Solvers and Block Elimination for Bordered Systems.” SIAM Journal on Matrix Analysis and Applications 12, no. 3 (July 1, 1991): 469–83. https://doi.org/10.1137/0612034.
solver::Union{Nothing, BifurcationKit.AbstractLinearSolver}
: Linear solver for the Bordering method. Default: nothingtol::Any
: Tolerance for checking precision Default: 1.0e-12check_precision::Bool
: Check precision of the linear solve? Default: truek::Int64
: Number of recursions to achieve tolerance Default: 1
Constructors
- there is a simple constructor
BorderingBLS(ls)
wherels
is a linear solver, for examplels = DefaultLS()
- you can use keyword argument to create such solver, for example
BorderingBLS(solver = DefaultLS(), tol = 1e-4)
BifurcationKit.Branch
— Typestruct Branch{Tkind, Tprob, T<:Union{ContResult, Vector{ContResult}}, Tbp} <: BifurcationKit.AbstractResult{Tkind, Tprob}
A Branch is a structure which encapsulates the result of the computation of a branch bifurcating from a bifurcation point.
γ::Union{ContResult, Vector{ContResult}}
: Set of branches branching off the bifurcation pointbp
bp::Any
: Bifurcation point. It is thought as the root of the branches in γ
BifurcationKit.BranchPoint
— Typemutable struct BranchPoint{Tv, Tτ, T, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevl, Tevr, Tnf} <: BifurcationKit.AbstractSimpleBranchPoint
x0::Any
: Bifurcation point.τ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the bifurcation point.params::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this bifurcation point was detected.ζ::Any
: Right eigenvector(s).ζ★::Any
: Left eigenvector(s).nf::Any
: Normal form coefficients.type::Symbol
: Type of bifurcation point
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.BranchPointMap
— Typemutable struct BranchPointMap{Tv, Tτ, T, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevl, Tevr, Tnf} <: BifurcationKit.AbstractSimpleBranchPointForMaps
x0::Any
: Bifurcation point.τ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the bifurcation point.params::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this bifurcation point was detected.ζ::Any
: Right eigenvector(s).ζ★::Any
: Left eigenvector(s).nf::Any
: Normal form coefficients.type::Symbol
: Type of bifurcation point
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.BranchPointPO
— Typemutable struct BranchPointPO{Tprob, Tv, T, Tevr, Tevl, Tnf} <: BifurcationKit.AbstractSimpleBifurcationPointPO
po::Any
: Bifurcation point (periodic orbit)T::Any
: Periodζ::Any
: Right eigenvector(s)ζ★::Any
: Left eigenvector(s)nf::Any
: Normal formprob::Any
: Periodic orbit problemprm::Bool
: Normal form computed using Poincaré return map
Associated methods
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.COPBLS
— Typestruct COPBLS{dim, 𝒯, TL, TU, Tp, Ts, Tj} <: BifurcationKit.AbstractBorderedLinearSolver
Bordered linear solver based on the condensation of parameters. dim
in the struct definition is the size of the border counting the phase condition. It is thus dim=1
for COPLS and dim=2
for the case of arclength continuation of periodic orbits as there are two constraints: the phase and the arclength.
Fields
cache::BifurcationKit.COPCACHE
: Cache for the COP method. It is a subtype of COPCACHE.solver::Any
: Linear solver. Defaults tonothing
.J::Any
: Cache for the bordered jacobian matrix.
Constructors
COPBLS()
COPBLS(coll::PeriodicOrbitOCollProblem; N = 0, cache::COPCACHE, solver = nothing, J = nothing)
Related
See solve_cop
.
BifurcationKit.COPCACHE
— Typestruct COPCACHE{dim, 𝒯, TL, TU, Tp}
Fields
blockⱼ::Matrix
blockₙ::Matrix
blockₙ₂::Matrix
Lₜ::Any
Uₜ::Any
last_row_𝐅𝐬⁻¹_analytical::Matrix
last_row_𝐅𝐬::Matrix
Jcoll::Matrix
Jext::Matrix
coll::Any
p::Vector{Vector{Int64}}
Constructor
COPCACHE(coll::PeriodicOrbitOCollProblem, δn = 0)
BifurcationKit.ContIterable
— Typestruct ContIterable{Tkind<:BifurcationKit.AbstractContinuationKind, Tprob, Talg, T, S, E, TnormC, Tfinalisesolution, TcallbackN, Tevent} <: BifurcationKit.AbstractContinuationIterable{Tkind<:BifurcationKit.AbstractContinuationKind}
Define a continuation iterator. This allows for example to do
iter = ContIterable(prob, alg, opts; kwargs...)
for state in iter
println("Continuation step = ", state.step)
end
More information is available on the website
Useful functions
setparam(iter, p)
set parameter with lensiter.prob.lens
top
is_event_active(iter)
whether the event detection is activecompute_eigenelements(iter)
whether to compute eigen elementssave_eigenvectors(iter)
whether to save eigen vectorsgetparams(iter)
get full list of continuation parametersisindomain(iter, p)
whetherp
in is domain [pmin, pmax]. (SeeContinuationPar
)is_on_boundary(iter, p)
whetherp
in is {pmin, pmax}
BifurcationKit.ContResult
— Typestruct ContResult{Tkind<:BifurcationKit.AbstractContinuationKind, Tbr, Teigvals, Teigvec, Biftype, Tsol, Tparc, Tprob, Talg} <: BifurcationKit.AbstractResult{Tkind<:BifurcationKit.AbstractContinuationKind, Tprob}
Structure which holds the results after a call to continuation
.
You can see the propertynames of a result br
by using propertynames(br)
or propertynames(br.branch)
.
Fields
branch::StructArrays.StructArray
: holds the low-dimensional information about the branch. More precisely,branch[i+1]
contains the following information(record_from_solution(u, param), param, itnewton, itlinear, ds, θ, n_unstable, n_imag, stable, step)
for each continuation stepi
.itnewton
number of Newton iterationsitlinear
total number of linear iterations during newton (corrector)n_unstable
number of eigenvalues with positive real part for each continuation step (to detect stationary bifurcation)n_imag
number of eigenvalues with positive real part and non zero imaginary part at current continuation step (useful to detect Hopf bifurcation).stable
stability of the computed solution for each continuation step. Hence,stable
should matcheig[step]
which corresponds tobranch[k]
for a givenk
.step
continuation step (here equali
)
eig::Array{@NamedTuple{eigenvals::Teigvals, eigenvecs::Teigvec, converged::Bool, step::Int64}, 1} where {Teigvals, Teigvec}
: A vector with eigen-elements at each continuation step.sol::Any
: Vector of solutions sampled along the branch. This is set by the argumentsave_sol_every_step::Int64
(default 0) inContinuationPar
.contparams::Any
: The parameters used for the call tocontinuation
which produced this branch. Must be aContinuationPar
kind::BifurcationKit.AbstractContinuationKind
: Type of solutions computed in this branch. Default: EquilibriumCont()prob::Any
: Bifurcation problem used to compute the branch, useful for branch switching. For example, when computing periodic orbits, the functionalPeriodicOrbitTrapProblem
,ShootingProblem
... will be saved here. Default: nothingspecialpoint::Vector
: A vector holding the set of detected bifurcation points. SeeSpecialPoint
for a list of special points.alg::Any
: Continuation algorithm used for the computation of the branch
Associated methods
length(br)
number of the continuation stepsshow(br)
display information about the brancheigenvals(br, ind)
returns the eigenvalues for the ind-th continuation stepeigenvec(br, ind, indev)
returns the indev-th eigenvector for the ind-th continuation stepget_normal_form(br, ind)
compute the normal form of the ind-th points inbr.specialpoint
getlens(br)
return the parameter axis used for the branchgetlenses(br)
return the parameter two axis used for the branch when 2 parameters continuation is used (Fold, Hopf, NS, PD)br[k+1]
gives information about the k-th step. A typical run yields the following
julia> br[1]
(x = 0.0, param = 0.1, itnewton = 0, itlinear = 0, ds = -0.01, θ = 0.5, n_unstable = 2, n_imag = 2, stable = false, step = 0, eigenvals = ComplexF64[0.1 - 1.0im, 0.1 + 1.0im], eigenvecs = ComplexF64[0.7071067811865475 - 0.0im 0.7071067811865475 + 0.0im; 0.0 + 0.7071067811865475im 0.0 - 0.7071067811865475im])
which provides the value param
of the parameter of the current point, its stability, information on the newton iterations, etc. The fields can be retrieved using propertynames(br.branch)
. This information is stored in br.branch
which is a StructArray
. You can thus extract the vector of parameters along the branch as
julia> br.param
10-element Vector{Float64}:
0.1
0.08585786437626905
0.06464466094067263
0.03282485578727799
-1.2623798512809007e-5
-0.07160718539365075
-0.17899902778635765
-0.3204203840236672
-0.4618417402609767
-0.5
get_solx(br, k)
returns the k-th solution on the branchget_solp(br, k)
returns the parameter value associated with k-th solution on the branchgetparams(br)
Parameters passed to continuation and used in the equationF(x, par) = 0
.setparam(br, p0)
set the parameter valuep0
according to::Lens
for the parameters of the problembr.prob
getlens(br)
get the lens used for the computation of the branchcontinuation(br, ind)
performs automatic branch switching (aBS) from ind-th bifurcation point. Typically branching from equilibrium to equilibrium, or periodic orbit to periodic orbit.continuation(br, ind, lens2)
performs two parameters(getLens(br), lens2)
continuation of the ind-th bifurcation point.continuation(br, ind, probPO::AbstractPeriodicOrbitProblem)
performs aBS from ind-th bifurcation point (which must be a Hopf bifurcation point) to branch of periodic orbits.eigenvals(br, ind)
give the eigenvalues at continuation stepind
eigenvalsfrombif(br, ind)
give the eigenvalues at bifurcation point indexind
BifurcationKit.ContState
— Typemutable struct ContState{Tv, T, Teigvals, Teigvec, Tcb} <: BifurcationKit.AbstractContinuationState{Tv}
Structure containing the state of the continuation procedure. The fields are meant to change during the continuation procedure.
If you mutate these fields yourself, you can break the continuation procedure. Use the methods below to access the fields knowing that they do not yield copies.
Arguments
z_pred
current solution on the branchconverged
Boolean for newton correctionτ
tangent predictorz
previous solutionitnewton
Number of newton iteration (in corrector)step
current continuation stepds
step sizestopcontinuation
Boolean to stop continuation
Useful functions
copy(state)
returns a copy ofstate
copyto!(dest, state)
copystate
intodest
getsolution(state)
returns the current solution (x, p)gettangent(state)
return the tangent at the current solutiongetpredictor(state)
return the predictor at the current solutiongetx(state)
returns the x component of the current solutiongetp(state)
returns the p component of the current solutionget_previous_solution(state)
returns the previous solution (x, p)getpreviousx(state)
returns the x component of the previous solutiongetpreviousp(state)
returns the p component of the previous solutionis_stable(state)
whether the current state is stable
BifurcationKit.ContinuationPar
— Typeoptions = ContinuationPar(dsmin = 1e-4,...)
Returns a variable containing parameters to affect the continuation
algorithm used to solve F(x, p) = 0
.
Arguments
dsmin, dsmax
are the minimum, maximum arclength allowed value. It controls the density of points in the computed branch of solutions.ds = 0.01
is the initial arclength.p_min, p_max
allowed parameter range forp
max_steps = 100
maximum number of continuation stepsnewton_options::NewtonPar
: options for the Newton algorithmsave_to_file = false
: save to file. A name is automatically generated or can be defined incontinuation
. This requiresusing JLD2
.save_sol_every_step::Int64 = 0
at which continuation steps do we save the current solutionplot_every_step = 10
at which continuation steps do we plot the current solution
Handling eigen elements, their computation is triggered by the argument detect_bifurcation
(see below)
nev = 3
number of eigenvalues to be computed. It is automatically increased to have at leastnev
unstable eigenvalues. To be set for proper bifurcation detection. See Detection of bifurcation points of Equilibria for more informations.save_eig_every_step = 1
record eigen vectors every specified steps. Important for memory limited resource, e.g. GPU.save_eigenvectors = true
Important for memory limited resource, e.g. GPU.
Handling bifurcation detection
tol_stability = 1e-10
lower bound on the real part of the eigenvalues to test for stability of equilibria and periodic orbitsdetect_fold = true
detect Fold bifurcations? It is a useful option although the detection of Fold is cheap. Indeed, it may happen that there is a lot of Fold points and this can saturate the memory in memory limited devices (e.g. on GPU)detect_bifurcation::Int
∈ {0, 1, 2, 3} If set to 0, nothing is done. If set to 1, the eigen-elements are computed. If set to 2, the bifurcations points are detected during the continuation run, but not located precisely. If set to 3, a bisection algorithm is used to locate the bifurcations points (slower). The possibility to switch off detection is a useful option. Indeed, it may happen that there are a lot of bifurcation points and this can saturate the memory of memory limited devices (e.g. on GPU)dsmin_bisection = 1e-16
dsmin for the bisection algorithm for locating bifurcation pointsn_inversion = 2
number of sign inversions in bisection algorithmmax_bisection_steps = 15
maximum number of bisection stepstol_bisection_eigenvalue = 1e-16
tolerance on real part of eigenvalue to detect bifurcation points in the bisection steps
Handling ds
adaptation (see continuation
for more information)
a = 0.5
aggressiveness factor. It is used to adaptds
in order to have a number of newton iterations per continuation step roughly constant. The highera
is, the larger the step sizeds
is changed at each continuation step.
Handling event detection
detect_event::Int
∈ {0, 1, 2} If set to 0, nothing is done. If set to 1, the event locations are sought during the continuation run, but not located precisely. If set to 2, a bisection algorithm is used to locate the event (slower).tol_param_bisection_event = 1e-16
tolerance on parameter to locate event
Misc
η = 150.
parameter to estimate tangent at first point with parameter p₀ + ds / ηdetect_loop
[WORK IN PROGRESS] detect loops in the branch and stop the continuation
For performance reasons, we decided to use an immutable structure to hold the parameters. One can use the package Accessors.jl
to drastically simplify the mutation of different fields. See tutorials for more examples.
BifurcationKit.ContinuousEvent
— Typestruct ContinuousEvent{Tcb, Tl, T} <: BifurcationKit.AbstractContinuousEvent
Structure to pass a ContinuousEvent function to the continuation algorithm. A continuous call back returns a tuple/scalar value and we seek its zeros.
nb::Int64
: number of events, ie the length of the result returned by the callback functioncondition::Any
: ,(iter, state) -> NTuple{nb, T}
callback function which, at each continuation state, returns a tuple. For example, to detect crossing 1.0 and -2.0, you can pass(iter, state) -> (getp(state)+2, getx(state)[1]-1)),
. Note that the typeT
should match the one of the parameter specified by the::Lens
incontinuation
.computeEigenElements::Bool
: whether the event requires to compute eigen elementslabels::Any
: Labels used to display information. For examplelabels[1]
is used to qualify an event of the type(0, 1.3213, 3.434)
. You can uselabels = ("hopf",)
orlabels = ("hopf", "fold")
. You must havelabels::Union{Nothing, NTuple{N, String}}
.tol::Any
: Tolerance on event value to declare it as true event.
BifurcationKit.Cusp
— Typemutable struct Cusp{Tv, Tpar, Tlens, Tevr, Tevl, Tnf} <: BifurcationKit.AbstractBifurcationPoint
x0::Any
: Bifurcation pointparams::Any
: Parameters used by the vector field.lens::Any
: Parameter axis used to compute the branch on which this cusp point was detected.ζ::Any
: Right eigenvectorζ★::Any
: Left eigenvectornf::Any
: Normal form coefficientstype::Symbol
: Type of bifurcation
BifurcationKit.CustomDist
— TypeWrapper for a distance. You need to pass a function d(u, v)
.
BifurcationKit.DCResult
— Typestruct DCResult{Tprob, Tbr, Tit, Tsol, Talg} <: BifurcationKit.AbstractBranchResult
Structure holding the result from deflated continuation.
prob::Any
: Bifurcation problembranches::Any
: Branches of solutioniter::Any
: Continuation iteratorsol::Any
: Solutionsalg::Any
: Algorithm
BifurcationKit.DefCont
— Typestruct DefCont{Tdo, Talg, Tps, Tas, Tud, Tk} <: BifurcationKit.AbstractContinuationAlgorithm
Structure which holds the parameters specific to Deflated continuation.
Fields
deflation_operator::Any
: Deflation operator,::DeflationOperator
Default: nothingalg::Any
: Used as a predictor,::AbstractContinuationAlgorithm
. For examplePALC()
,Natural()
,... Default: PALC()max_branches::Int64
: maximum number of (active) branches to be computed Default: 100seek_every_step::Int64
: whether to seek new (deflated) solution at every step Default: 1max_iter_defop::Int64
: maximum number of deflated Newton iterations Default: 5perturb_solution::Any
: perturb function Default: _perturbSolutionaccept_solution::Any
: accept (solution) function Default: _acceptSolutionupdate_deflation_op::Any
: function to update the deflation operator, ie pushing new solutions Default: _updateDeflationOpjacobian::Any
: jacobian for deflated newton. Can beDeflatedProblemCustomLS()
, orVal(:autodiff)
,Val(:fullIterative)
Default: DeflatedProblemCustomLS()
BifurcationKit.DefProbFullIterativeLinearSolver
— Typestruct DefProbFullIterativeLinearSolver{T} <: BifurcationKit.AbstractLinearSolverForDeflation
Full iterative linear solver for deflated problem.
BifurcationKit.DefaultEig
— TypeThe struct Default
is used to provide the backslash operator to our Package
BifurcationKit.DefaultGEig
— TypeThe struct Default
is used to provide the backslash operator to our Package
BifurcationKit.DefaultLS
— Typestruct DefaultLS <: BifurcationKit.AbstractDirectLinearSolver
This struct is used to provide the backslash operator. Can be used to solve (a₀ * I + a₁ * J) * x = rhs
.
useFactorization::Bool
: Whether to catch a factorization for multiple solves. Some operators may not support LU (like ApproxFun.jl) or QR factorization so it is best to let the user decides. Some matrices do not havefactorize
likeStaticArrays.MMatrix
. Default: true
BifurcationKit.DefaultPILS
— Typestruct DefaultPILS <: BifurcationKit.AbstractIterativeLinearSolver
Mainly for debugging!! This is defined as an iterative pseudo-inverse linear solver This struct is used to test Moore-Penrose continuation. Used to solve J * x = rhs
.
useFactorization::Bool
: Whether to catch a factorization for multiple solves. Some operators may not support LU (like ApproxFun.jl) or QR factorization so it is best to let the user decides. Some matrices do not havefactorize
likeStaticArrays.MMatrix
. Default: true
BifurcationKit.DeflatedProblem
— Typepb = DeflatedProblem(prob, M::DeflationOperator, jactype)
Create a DeflatedProblem
.
This creates a deflated functional (problem) $M(u) \cdot F(u) = 0$ where M
is a DeflationOperator
which encodes the penalization term. prob
is an AbstractBifurcationProblem
which encodes the functional. It is not meant not be used directly albeit by advanced users.
BifurcationKit.DeflatedProblem
— MethodReturn the deflated function M(u) * F(u) where M(u) ∈ R
BifurcationKit.DeflatedProblem
— MethodReturn the jacobian of the deflated function M(u) * F(u) where M(u) ∈ R
BifurcationKit.DeflatedProblemCustomLS
— Typestruct DeflatedProblemCustomLS{T} <: BifurcationKit.AbstractLinearSolverForDeflation
Custom linear solver for deflated problem, very close to the Sherman-Morrison formula.
BifurcationKit.DeflatedProblemCustomLS
— MethodImplement the custom linear solver for the deflated problem.
BifurcationKit.DeflationOperator
— Typestruct DeflationOperator{Tp<:Real, Tdot, T<:Real, vectype} <: BifurcationKit.AbstractDeflationFactor
Structure for defining a custom distance.
This operator allows to handle the following situation. Assume you want to solve F(x)=0
with a Newton algorithm but you want to avoid the process to return some already known solutions $roots_i$. The deflation operator penalizes these roots. You can create a DeflationOperator
to define a scalar function M(u)
used to find, with Newton iterations, the zeros of the following function $F(u) \cdot Π_i(\|u - root_i\|^{-2p} + \alpha) := F(u) \cdot M(u)$ where $\|u\|^2 = dot(u, u)$. The fields of the struct DeflationOperator
are as follows:
power::Real
: powerp
. You can use anInt
for exampledot::Any
: function, this function has to be bilinear and symmetric for the linear solver to work wellα::Real
: shiftroots::Vector
: rootstmp::Any
autodiff::Bool
δ::Real
Given defOp::DeflationOperator
, one can access its roots via defOp[n]
as a shortcut for defOp.roots[n]
. Note that you can also use defOp[end]
.
Also, one can add (resp. remove) a new root by using push!(defOp, newroot)
(resp. pop!(defOp)
). Finally length(defOp)
is a shortcut for length(defOp.roots)
Constructors
DeflationOperator(p::Real, α::Real, roots::Vector{vectype}; autodiff = false)
DeflationOperator(p::Real, dt, α::Real, roots::Vector{vectype}; autodiff = false)
DeflationOperator(p::Real, α::Real, roots::Vector{vectype}, v::vectype; autodiff = false)
The option autodiff
triggers the use of automatic differentiation for the computation of the gradient of the scalar function M
. This works only on AbstractVector
for now.
Custom distance
You are asked to pass a scalar product like dot
to build a DeflationOperator
. However, in some cases, you may want to pass a custom distance dist(u, v)
. You can do this using
`DeflationOperator(p, CustomDist(dist), α, roots)`
Note that passing CustomDist(dist, true)
will trigger the use of automatic differentiation for the gradient of M
.
Linear solvers
When used with newton, you have access to the following linear solvers
- custom solver
DeflatedProblemCustomLS()
which requires solving two linear systemsJ⋅x = rhs
. - For other linear solvers
<: AbstractLinearSolver
, a matrix free method is used for the deflated functional. - if passed
Val(:autodiff)
, thenForwardDiff.jl
is used to compute the jacobian Matrix of the deflated problem - if passed
Val(:fullIterative)
, then a full matrix free method is used for the deflated problem.
BifurcationKit.DenseAnalytical
— TypeThe jacobian is computed with an analytical formula works for dense matrices. This is the default algorithm.
BifurcationKit.DiscreteEvent
— Typestruct DiscreteEvent{Tcb, Tl} <: BifurcationKit.AbstractDiscreteEvent
Structure to pass a DiscreteEvent function to the continuation algorithm. A discrete call back returns a discrete value and we seek when it changes.
nb::Int64
: number of events, ie the length of the result returned by the callback functioncondition::Any
: =(iter, state) -> NTuple{nb, Int64}
callback function which at each continuation state, returns a tuple. For example, to detect a value change.computeEigenElements::Bool
: whether the event requires to compute eigen elementslabels::Any
: Labels used to display information. For examplelabels[1]
is used to qualify an event occurring in the first component. You can uselabels = ("hopf",)
orlabels = ("hopf", "fold")
. You must havelabels::Union{Nothing, NTuple{N, String}}
.
BifurcationKit.DotTheta
— Typestruct DotTheta{Tdot, Ta}
dot::Any
: dot product used in pseudo-arclength constraintapply!::Any
: Linear operator associated with dot product, i.e. dot(x, y) = <x, Ay>, where <,> is the standard dot product on R^N. You must provide an inplace function which evaluates A. For examplex -> rmul!(x, 1/length(x))
.
This parametric type allows to define a new dot product from the one saved in dt::dot
. More precisely:
dt(u1, u2, p1::T, p2::T, theta::T) where {T <: Real}
computes, the weighted dot product $\langle (u_1,p_1), (u_2,p_2)\rangle_\theta = \theta \Re \langle u_1,u_2\rangle +(1-\theta)p_1p_2$ where $u_i\in\mathbb R^N$. The $\Re$ factor is put to ensure a real valued result despite possible complex valued arguments.
This is used in the pseudo-arclength constraint with the dot product $\frac{1}{N} \langle u_1, u_2\rangle,\quad u_i\in\mathbb R^N$
BifurcationKit.EigArnoldiMethod
— Typestruct EigArnoldiMethod{T, Tby, Tw, Tkw, vectype} <: BifurcationKit.AbstractIterativeEigenSolver
sigma::Any
: Shift for Shift-Invert methodwhich::Any
: Which eigen-element to extract LR(), LM(), ...by::Any
: how do we sort the computed eigenvalues, defaults to realkwargs::Any
: Key words arguments passed to EigArpackx₀::Any
: Example of vector used for Krylov iterations
More information is available at ArnoldiMethod.jl. For example, you can pass the parameters tol, mindim, maxdim, restarts
.
Constructor
EigArnoldiMethod(;sigma = nothing, which = ArnoldiMethod.LR(), x₀ = nothing, kwargs...)
BifurcationKit.EigArpack
— Typestruct EigArpack{T, Tby, Tw} <: BifurcationKit.AbstractIterativeEigenSolver
sigma::Any
: Shift for Shift-Invert method with `(J - sigma⋅I)which::Symbol
: Which eigen-element to extract :LR, :LM, ...by::Any
: Sorting function, default to realkwargs::Any
: Keyword arguments passed to EigArpack
More information is available at Arpack.jl. You can pass the following parameters tol=0.0, maxiter=300, ritzvec=true, v0=zeros((0,))
.
Constructor
EigArpack(sigma = nothing, which = :LR; kwargs...)
BifurcationKit.EigKrylovKit
— Typestruct EigKrylovKit{T, vectype} <: BifurcationKit.AbstractMFEigenSolver
dim::Int64
: Krylov Dimension Default: KrylovDefaults.krylovdimtol::Any
: Tolerance Default: 0.0001restart::Int64
: Number of restarts Default: 200maxiter::Int64
: Maximum number of iterations Default: KrylovDefaults.maxiterverbose::Int64
: Verbosity ∈ {0, 1, 2} Default: 0which::Symbol
: Which eigenvalues are looked for :LR (largest real), :LM, ... Default: :LRissymmetric::Bool
: If the linear map is symmetric, only meaningful if T<:Real Default: falseishermitian::Bool
: If the linear map is hermitian Default: falsex₀::Any
: Example of vector to usen for Krylov iterations Default: nothing
BifurcationKit.Finaliser
— Typestruct Finaliser{Tp, Tf}
Structure to hold a specific finaliser and simplify dispatch on it. It is mainly used for periodic orbits computation and adaption of mesh and section. It is meant to be called like a callable struct.
BifurcationKit.FiniteDifferences
— TypeSingleton type to trigger the computation of the jacobian using finite differences. It can be used for example in newton or in deflated newton.
BifurcationKit.FiniteDifferencesMF
— TypeSingleton type to trigger the computation of the jacobian vector product (jvp) using finite differences. It can be used for example in newton or in deflated newton.
BifurcationKit.FloquetColl
— Typeeigfloquet = BifurcationKit.FloquetColl()
Computation of Floquet coefficients for the orthogonal collocation method. The method is based on the condensation of parameters described in [1] and used in Auto07p with a twist from [2] in which we form the monodromy matrix with a product of Ntst
matrices.
This is much faster than FloquetCollGEV
but less precise. The best version uses a Periodic Schur decomposition instead of the product of Ntst
matrices. This is provided in the package PeriodicSchurBifurcationKit.jl
.
References
[1] Doedel, Eusebius, Herbert B. Keller, et Jean Pierre Kernevez. «NUMERICAL ANALYSIS AND CONTROL OF BIFURCATION PROBLEMS (II): BIFURCATION IN INFINITE DIMENSIONS». International Journal of Bifurcation and Chaos 01, nᵒ 04 (décembre 1991): 745‑72. https://doi.org/10.1142/S0218127491000555.
[2] Lust, Kurt. «Improved Numerical Floquet Multipliers». International Journal of Bifurcation and Chaos 11, nᵒ 09 (septembre 2001): 2389‑2410. https://doi.org/10.1142/S0218127401003486.
BifurcationKit.FloquetCollGEV
— TypeComputation of Floquet coefficients for the orthogonal collocation method. The method is based on a formulation through a generalised eigenvalue problem (GEV). Relatively slow but quite precise.
This is a simplified version of [1].
Arguments
eigls
an eigensolverntot
total number of unknowns (without counting the period), ielength(::PeriodicOrbitOCollProblem)
n
space dimension
Example
You can create such solver like this (here n=2
):
eigfloquet = BifurcationKit.FloquetCollGEV(DefaultEig(), (30*4+1)*2, 2))
References
[1] Fairgrieve, Thomas F., and Allan D. Jepson. “O. K. Floquet Multipliers.” SIAM Journal on Numerical Analysis 28, no. 5 (October 1991): 1446–62. https://doi.org/10.1137/0728075.
BifurcationKit.FloquetQaD
— Typefloquet = FloquetQaD(eigsolver::AbstractEigenSolver)
This composite type implements the computation of the eigenvalues of the monodromy matrix in the case of periodic orbits problems (based on the Shooting method or Finite Differences (Trapeze method)), also called the Floquet multipliers. The method, dubbed Quick and Dirty (QaD), is not numerically very precise for large / small Floquet exponents when the number of time sections is large because of many matrix products. It allows, nevertheless, to detect bifurcations. The arguments are as follows:
eigsolver::AbstractEigenSolver
solver used to compute the eigenvalues.
If eigsolver == DefaultEig()
, then the monodromy matrix is formed and its eigenvalues are computed. Otherwise, a Matrix-Free version of the monodromy is used.
The computation of Floquet multipliers is necessary for the detection of bifurcations of periodic orbits (which is done by analyzing the Floquet exponents obtained from the Floquet multipliers). Hence, the eigensolver eigsolver
needs to compute the eigenvalues with largest modulus (and not with largest real part which is their default behavior). This can be done by changing the option which = :LM
of eigsolver
. Nevertheless, note that for most implemented eigensolvers in the current Package, the proper option is set.
BifurcationKit.FloquetWrapper
— Typemutable struct FloquetWrapper{Tpb, Tjacpb, Torbitguess, Tp}
Define a structure to interface the jacobian of the periodic orbits functional with the Floquet computation methods. If we use the same code as for newton
(see below) but in continuation
, it is difficult to tell to the eigensolver that it should use the monodromy matrix instead of the jacobian.
pb::Any
jacpb::Any
x::Any
par::Any
BifurcationKit.Flow
— Typestruct Flow{TF, Tf, Tts, Tff, Td, Tad, Tse, Tprob, TprobMono, Tfs, Tcb, Tδ} <: BifurcationKit.AbstractFlow
F::Any
: The vector field(x, p) -> F(x, p)
associated to a Cauchy problem. Used for the differential of the shooting problem. Default: nothingflow::Any
: The flow (or semigroup)(x, p, t) -> flow(x, p, t)
associated to the Cauchy problem. Only the last time point must be returned in the form (u = ...) Default: nothingflowTimeSol::Any
: Flow which returns the tuple (t, u(t)). Optional, mainly used for plotting on the user side. Default: nothingflowFull::Any
: [Optional] The flow (or semigroup) associated to the Cauchy problem(x, p, t) -> flow(x, p, t)
. The whole solution on the time interval [0,t] must be returned. It is not strictly necessary to provide this, it is mainly used for plotting on the user side. Please usenothing
as default. Default: nothingjvp::Any
: The differentialdflow
of the flow w.r.t.x
,(x, p, dx, t) -> dflow(x, p, dx, t)
. One important thing is that we requiredflow(x, dx, t)
to return a Named Tuple:(t = t, u = flow(x, p, t), du = dflow(x, p, dx, t))
, the last component being the value of the derivative of the flow. Default: nothingvjp::Any
: The adjoint differentialvjpflow
of the flow w.r.t.x
,(x, p, dx, t) -> vjpflow(x, p, dx, t)
. One important thing is that we requirevjpflow(x, p, dx, t)
to return a Named Tuple:(t = t, u = flow(x, p, t), du = vjpflow(x, p, dx, t))
, the last component being the value of the derivative of the flow. Default: nothingjvpSerial::Any
: [Optional] Serial version of dflow. Used internally when using parallel multiple shooting. Please usenothing
as default. Default: nothingprob::Any
: [Internal] store the ODEProblem associated to the flow of the Cauchy problem Default: nothingprobMono::Any
: [Internal] store the ODEProblem associated to the flow of the variational problem Default: nothingflowSerial::Any
: [Internal] Serial version of the flow Default: nothingcallback::Any
: [Internal] Store possible callback Default: nothingdelta::Any
: [Internal] Default: 1.0e-8
Simplified constructor(s)
We provide a simple constructor where you only pass the vector field F
, the flow ϕ
and its differential dϕ
:
fl = Flow(F, ϕ, dϕ)
Simplified constructors for DifferentialEquations.jl
These are some simple constructors for which you only have to pass a prob::ODEProblem
or prob::EnsembleProblem
(for parallel computation) from DifferentialEquations.jl
and an ODE time stepper like Tsit5()
. Hence, you can do for example
fl = Flow(prob, Tsit5(); kwargs...)
where kwargs
is passed to SciMLBase::solve
. If your vector field depends on parameters p
, you can define a Flow
using
fl = Flow(prob, Tsit5(); kwargs...)
Finally, you can pass two ODEProblem
where the second one is used to compute the variational equation:
fl = Flow(prob1::ODEProblem, alg1, prob2::ODEProblem, alg2; kwargs...)
BifurcationKit.Fold
— Typemutable struct Fold{Tv, Tτ, T, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevl, Tevr, Tnf} <: BifurcationKit.AbstractSimpleBranchPoint
x0::Any
: Bifurcation point.τ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the bifurcation point.params::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this bifurcation point was detected.ζ::Any
: Right eigenvector(s).ζ★::Any
: Left eigenvector(s).nf::Any
: Normal form coefficients.type::Symbol
: Type of bifurcation point
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.FoldMAProblem
— Typestruct FoldMAProblem{Tprob, Tjac, Tu0, Tp, Tl<:Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}, Tplot, Trecord} <: BifurcationKit.AbstractMABifurcationProblem{Tprob}
Problem wrap of a functional. It is not meant to be used directly albeit perhaps by advanced users.
prob::Any
jacobian::Any
u0::Any
params::Any
lens::Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}
plotSolution::Any
recordFromSolution::Any
BifurcationKit.FoldProblemMinimallyAugmented
— Typemutable struct FoldProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem, vectype, T<:Real, S<:BifurcationKit.AbstractLinearSolver, Sa<:BifurcationKit.AbstractLinearSolver, Sbd<:BifurcationKit.AbstractBorderedLinearSolver, Sbda<:BifurcationKit.AbstractBorderedLinearSolver, Tmass} <: BifurcationKit.AbstractProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem}
Structure to encode Fold / Hopf functional based on a Minimally Augmented formulation.
Fields
prob_vf
: Functional F(x, p) - vector field - with all derivativesa
: close to null vector of Jᵗb
: close to null vector of Jzero
: vector zero, to avoid allocating it many timesl1
: Lyapunov coefficientCP
: Cusp test valueBT
: Bogdanov-Takens test valueGH
: Bautin test valuesZH
: Zero-Hopf test valueslinsolver
: linear solver. Used to invert the jacobian of MA functionallinsolverAdjoint
: linear solver for the jacobian adjointlinbdsolver
: bordered linear solverlinbdsolverAdjoint
: linear bordered solver for the jacobian adjointusehessian
: whether to use the hessian of prob_vfmassmatrix
: whether to use a mass matrix M for studying M⋅∂ₜu = F(u), default = I
BifurcationKit.FullSparse
— TypeFor periodic orbits. The jacobian is a sparse matrix which is expressed with a custom analytical formula.
BifurcationKit.FullSparseInplace
— TypeSame as FullSparse but the Jacobian is allocated only once and updated inplace. This is much faster than FullSparse but the sparsity pattern of the vector field must be constant.
BifurcationKit.GEigArpack
— Typestruct GEigArpack{T, Tby, Tw, Tb} <: BifurcationKit.AbstractGEigenSolver
sigma::Any
: Shift for Shift-Invert method with `(J - sigma⋅I)which::Symbol
: Which eigen-element to extract :LR, :LM, ...by::Any
: Sorting function, default to realkwargs::Any
: Keyword arguments passed to EigArpackB::Any
: Mass matrix
More information is available at Arpack.jl. You can pass the following parameters tol=0.0, maxiter=300, ritzvec=true, v0=zeros((0,))
.
Constructor
EigArpack(sigma = nothing, which = :LR; kwargs...)
BifurcationKit.GMRESIterativeSolvers
— Typemutable struct GMRESIterativeSolvers{T, Tl, Tr} <: BifurcationKit.AbstractIterativeLinearSolver
Linear solver based on gmres from IterativeSolvers.jl
. Can be used to solve (a₀ * I + a₁ * J) * x = rhs
.
abstol::Any
: Absolute tolerance for solver Default: 0.0reltol::Any
: Relative tolerance for solver Default: 1.0e-8restart::Int64
: Number of restarts Default: 200maxiter::Int64
: Maximum number of iterations Default: 100N::Int64
: Dimension of the problem Default: 0verbose::Bool
: Display information during iterations Default: falselog::Bool
: Record information Default: trueinitially_zero::Bool
: Start with zero guess Default: truePl::Any
: Left preconditioner Default: IterativeSolvers.Identity()Pr::Any
: Right preconditioner Default: IterativeSolvers.Identity()ismutating::Bool
: Whether the linear operator is written inplace Default: false
BifurcationKit.GMRESKrylovKit
— Typemutable struct GMRESKrylovKit{T, Tl} <: BifurcationKit.AbstractIterativeLinearSolver
Create a linear solver based on GMRES from KrylovKit.jl
. Can be used to solve (a₀ * I + a₁ * J) * x = rhs
.
dim::Int64
: Krylov Dimension Default: KrylovDefaults.krylovdimatol::Any
: Absolute tolerance for solver Default: KrylovDefaults.tolrtol::Any
: Relative tolerance for solver Default: KrylovDefaults.tolmaxiter::Int64
: Maximum number of iterations Default: KrylovDefaults.maxiterverbose::Int64
: Verbosity ∈ {0,1,2} Default: 0issymmetric::Bool
: If the linear map is symmetric, only meaningful if T<:Real Default: falseishermitian::Bool
: If the linear map is hermitian Default: falseisposdef::Bool
: If the linear map is positive definite Default: falsePl::Any
: Left preconditioner Default: nothing
By tuning the options, you can select CG, GMRES... see here
BifurcationKit.Hopf
— Typemutable struct Hopf{Tv, Tτ, T, Tω, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevr, Tevl, Tnf} <: BifurcationKit.AbstractSimpleBranchPoint
x0::Any
: Hopf pointτ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the Hopf pointω::Any
: Frequency at the Hopf pointparams::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this Hopf point was detected.ζ::Any
: Right eigenvectorζ★::Any
: Left eigenvectornf::Any
: Normal form coefficient ex: (a = 0., b = 1 + 1im)type::Symbol
: Type of Hopf bifurcation
Associated methods
Predictor
You can call predictor(bp::Hopf, ds)
on such bifurcation point bp
to get the guess for the periodic orbit.
BifurcationKit.HopfHopf
— Typemutable struct HopfHopf{Tv, Tpar, Tlens, Tevr, Tevl, Tnf} <: BifurcationKit.AbstractBifurcationPoint
x0::Any
: Bifurcation pointparams::Any
: Parameters used by the vector field.lens::Any
: Parameter axis used to compute the branch on which this cusp point was detected.ζ::Any
: Right eigenvectorζ★::Any
: Left eigenvectornf::Any
: Normal form coefficientstype::Symbol
: Type of bifurcation
BifurcationKit.HopfMAProblem
— Typestruct HopfMAProblem{Tprob, Tjac, Tu0, Tp, Tl<:Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}, Tplot, Trecord} <: BifurcationKit.AbstractMABifurcationProblem{Tprob}
Problem wrap of a functional. It is not meant to be used directly albeit perhaps by advanced users.
prob::Any
jacobian::Any
u0::Any
params::Any
lens::Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}
plotSolution::Any
recordFromSolution::Any
BifurcationKit.HopfProblemMinimallyAugmented
— Typemutable struct HopfProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem, vectype, T<:Real, S<:BifurcationKit.AbstractLinearSolver, Sa<:BifurcationKit.AbstractLinearSolver, Sbd<:BifurcationKit.AbstractBorderedLinearSolver, Sbda<:BifurcationKit.AbstractBorderedLinearSolver, Tmass} <: BifurcationKit.AbstractProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem}
Structure to encode Fold / Hopf functional based on a Minimally Augmented formulation.
Fields
prob_vf
: Functional F(x, p) - vector field - with all derivativesa
: close to null vector of Jᵗb
: close to null vector of Jzero
: vector zero, to avoid allocating it many timesl1
: Lyapunov coefficientCP
: Cusp test valueBT
: Bogdanov-Takens test valueGH
: Bautin test valuesZH
: Zero-Hopf test valueslinsolver
: linear solver. Used to invert the jacobian of MA functionallinsolverAdjoint
: linear solver for the jacobian adjointlinbdsolver
: bordered linear solverlinbdsolverAdjoint
: linear bordered solver for the jacobian adjointusehessian
: whether to use the hessian of prob_vfmassmatrix
: whether to use a mass matrix M for studying M⋅∂ₜu = F(u), default = I
BifurcationKit.LSFromBLS
— Typestruct LSFromBLS{Ts} <: BifurcationKit.AbstractLinearSolver
This structure is used to provide the following linear solver. To solve (1) J⋅x = rhs, one decomposes J using Matrix by blocks and then use a bordering strategy to solve (1).
solver::Any
: Linear solver used to solve the smaller linear systems.
The solver only works for AbstractMatrix
BifurcationKit.MatrixBLS
— Typestruct MatrixBLS{S<:Union{Nothing, BifurcationKit.AbstractLinearSolver}} <: BifurcationKit.AbstractBorderedLinearSolver
This struct is used to provide the bordered linear solver based on inverting the full matrix.
solver::Union{Nothing, BifurcationKit.AbstractLinearSolver}
: Linear solver used to invert the full matrix.
BifurcationKit.MatrixFree
— TypeThe jacobian is computed using Jacobian-Free method, namely a jacobian vector product (jvp).
BifurcationKit.MatrixFreeBLS
— Typestruct MatrixFreeBLS{S<:Union{Nothing, BifurcationKit.AbstractLinearSolver}} <: BifurcationKit.AbstractBorderedLinearSolver
This struct is used to provide the bordered linear solver based a matrix free operator for the full system in (x, p)
.
Constructor
MatrixFreeBLS(solver, ::Bool)
Fields
solver::Union{Nothing, BifurcationKit.AbstractLinearSolver}
: Linear solver for solving the extended linear systemuse_bordered_array::Bool
: What is the structure used to hold(x, p)
. Iftrue
, this is achieved usingBorderedArray
. Iffalse
, aVector
is used.
BifurcationKit.MeshCollocationCache
— Typecache = MeshCollocationCache(Ntst::Int, m::Int, Ty = Float64)
Structure to hold the cache for the collocation method. More precisely, it starts from a partition of [0,1] based on the mesh points:
0 = τ₁ < τ₂ < ... < τₙₜₛₜ₊₁ = 1
On each mesh interval [τⱼ, τⱼ₊₁] mapped to [-1,1], a Legendre polynomial of degree m is formed.
Ntst::Int64
: Coarse mesh sizedegree::Int64
: Collocation degree, usually called mlagrange_vals::Matrix
: Lagrange matrixlagrange_∂::Matrix
: Lagrange matrix for derivativegauss_nodes::Vector
: Gauss nodesgauss_weight::Vector
: Gauss weightsτs::Vector
: Values of the coarse mesh, call τj. This can be adapted.σs::LinRange
: Values of collocation points, call σj. These are fixed.full_mesh::Vector
: Full mesh containing both the coarse mesh and the collocation points.
Constructor
MeshCollocationCache(Ntst::Int, m::Int, Ty = Float64)
Ntst
number of time stepsm
degree of the collocation polynomialsTy
type of the time variable
BifurcationKit.MinAugMatrixBased
— TypeThe jacobian for Minimally Augmented problem is based on an analytical formula and is matrix based.
BifurcationKit.MoorePenrose
— TypeMoore-Penrose predictor / corrector
Moore-Penrose continuation algorithm.
Additional information is available on the website.
Constructors
alg = MoorePenrose()
alg = MoorePenrose(tangent = PALC())
Fields
tangent::Any
: Tangent predictor, for examplePALC()
method::MoorePenroseLS
: Moore Penrose linear solver. Can be BifurcationKit.direct, BifurcationKit.pInv or BifurcationKit.iterativels::BifurcationKit.AbstractLinearSolver
: (Bordered) linear solver
BifurcationKit.MoorePenrose
— MethodMoorePenrose(; tangent, method, ls)
BifurcationKit.Multiple
— TypeMultiple Tangent continuation algorithm.
alg::PALC
: Tangent predictor used Default: PALC()τ::Any
: Save the current tangentα::Real
: Damping in Newton iterations, 0 < α < 1nb::Int64
: Number of predictorscurrentind::Int64
: Index of the largest converged predictor Default: 0pmimax::Int64
: Index for lookup in residual history Default: 1imax::Int64
: Maximum index for lookup in residual history Default: 4dsfact::Real
: Factor to increase ds upon successful step Default: 1.5
Constructor(s)
Multiple(alg, x0, α, n)
Multiple(pred, x0, α, n)
Multiple(x0, α, n)
BifurcationKit.NSMAProblem
— Typestruct NSMAProblem{Tprob, Tjac, Tu0, Tp, Tl<:Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}, Tplot, Trecord} <: BifurcationKit.AbstractMABifurcationProblem{Tprob}
Problem wrap of a functional. It is not meant to be used directly albeit perhaps by advanced users.
prob::Any
jacobian::Any
u0::Any
params::Any
lens::Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}
plotSolution::Any
recordFromSolution::Any
BifurcationKit.Natural
— TypeNatural continuation algorithm. The predictor is the constant predictor and the parameter is incremented by `ContinuationPar().ds` at each continuation step.
BifurcationKit.NdBranchPoint
— TypeThis is a type which holds information for the bifurcation points of equilibria with dim(Ker)>1.
mutable struct NdBranchPoint{Tv, Tτ, T, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevl, Tevr, Tnf} <: BifurcationKit.AbstractBranchPoint
x0::Any
: Bifurcation pointτ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the bifurcation pointparams::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this bifurcation point was detected.ζ::Any
: Right eigenvectorsζ★::Any
: Left eigenvectorsnf::Any
: Normal form coefficientstype::Symbol
: Type of bifurcation point
Associated methods
You can call type(bp::NdBranchPoint), length(bp::NdBranchPoint)
.
Predictor
You can call predictor(bp, ds)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
Manipulating the normal form
You can use
bp(Val(:reducedForm), x, p)
to evaluate the normal form polynomials on the vectorx
for (scalar) parameterp
.You can use
bp(x, δp::Real)
to get the (large dimensional guess) associated to the low dimensional vectorx
. Note that we must havelength(x) == length(bp)
.You can use
BifurcationKit.nf(bp; kwargs...)
to pretty print the normal form with a string.
BifurcationKit.NeimarkSacker
— Typemutable struct NeimarkSacker{Tv, Tτ, T, Tω, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevr, Tevl, Tnf} <: BifurcationKit.AbstractSimpleBranchPointForMaps
x0::Any
: Neimark-Sacker pointτ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the Neimark-Sacker pointω::Any
: Frequency at the Neimark-Sacker pointparams::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this Neimark-Sacker point was detected.ζ::Any
: Right eigenvectorζ★::Any
: Left eigenvectornf::Any
: Normal form coefficient ex: (a = 0., b = 1 + 1im)type::Symbol
: Type of Hopf bifurcation
Associated methods
Predictor
You can call predictor(bp::NeimarkSacker, ds)
on such bifurcation point bp
to get the guess for the periodic orbit.
BifurcationKit.NeimarkSackerPO
— Typemutable struct NeimarkSackerPO{Tprob, Tv, T, Tω, Tevr, Tevl, Tnf} <: BifurcationKit.AbstractSimpleBifurcationPointPO
po::Any
: Bifurcation point (periodic orbit)T::Any
: Periodp::Any
: Parameter value at the Neimark-Sacker pointω::Any
: Frequency of the Neimark-Sacker pointζ::Any
: Right eigenvector(s).ζ★::Any
: Left eigenvector(s).nf::Any
: Normal formprob::Any
: Periodic orbit problemprm::Bool
: Normal form computed using Poincaré return map
Associated methods
Predictor
You can call predictor(bp::NeimarkSackerPO, ds)
on such bifurcation point bp
to get the guess for the periodic orbit.
BifurcationKit.NeimarkSackerProblemMinimallyAugmented
— Typemutable struct NeimarkSackerProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem, vectype, T<:Real, S<:BifurcationKit.AbstractLinearSolver, Sa<:BifurcationKit.AbstractLinearSolver, Sbd<:BifurcationKit.AbstractBorderedLinearSolver, Sbda<:BifurcationKit.AbstractBorderedLinearSolver, Tmass} <: BifurcationKit.AbstractProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem}
Structure to encode the functional based on a Minimally Augmented formulation.
Fields
prob_vf
: Functional F(x, p) - vector field - with all derivativesa
: close to null vector of Jᵗb
: close to null vector of Jzero
: vector zero, to avoid allocating it many timesl1
: Lyapunov coefficientCP
: Cusp test valueFOLDNS
: Fold-Neimark Sacker test valueGPD
: Generalised period douling test valueFLIPNS
: Fold-NS test valuesR1
: Resonance 1R2
: Resonance 2R3
: Resonance 3R4
: Resonance 4linsolver
: linear solver. Used to invert the jacobian of MA functionallinsolverAdjoint
: linear solver for the jacobian adjointlinbdsolver
: bordered linear solverlinbdsolverAdjoint
: linear bordered solver for the jacobian adjointusehessian
: wether to use the hessian of prob_vfmassmatrix
: wether to use a mass matrix M for studying M⋅∂tu = F(u), default = I
BifurcationKit.NewtonPar
— Typestruct NewtonPar{T, L<:BifurcationKit.AbstractLinearSolver, E<:AbstractEigenSolver}
Returns a variable containing parameters to affect the newton
algorithm when solving F(x) = 0
.
Arguments (with default values):
tol::Any
: absolute tolerance forF(x)
Default: 1.0e-12max_iterations::Int64
: number of Newton iterations Default: 25verbose::Bool
: display Newton iterations? Default: falselinsolver::BifurcationKit.AbstractLinearSolver
: linear solver, must be<: AbstractLinearSolver
Default: DefaultLS()eigsolver::AbstractEigenSolver
: eigen solver, must be<: AbstractEigenSolver
Default: DefaultEig()linesearch::Bool
: Default: falseα::Any
: Default: convert(typeof(tol), 1.0)αmin::Any
: Default: convert(typeof(tol), 0.001)
Arguments for line search (Armijo)
linesearch = false
: use line search algorithm (i.e. Newton with Armijo's rule)α = 1.0
: initial value of α (damping) parameter for line search algorithmαmin = 0.001
: minimal value of the dampingalpha
For performance reasons, we decided to use an immutable structure to hold the parameters. One can use the package Accessors.jl
to drastically simplify the mutation of different fields. See the tutorials for examples.
BifurcationKit.NonLinearSolution
— TypeStructure which holds the solution from application of Newton-Krylov algorithm to a nonlinear problem.
For example
sol = newton(prob, NewtonPar())
Fields
u::Any
: solutionprob::Any
: nonlinear problem, typically aBifurcationProblem
residuals::Any
: sequence of residualsconverged::Bool
: has algorithm converged?itnewton::Int64
: number of newton stepsitlineartot::Any
: total number of linear iterations
methods
converged(sol)
return whether the solution has converged.
BifurcationKit.ODEBifProblem
— Typestruct ODEBifProblem{Tvf, Tu, Tp, Tl<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tplot, Trec, Tgets} <: BifurcationKit.AbstractAllJetBifProblem
Structure to hold the bifurcation problem.
Fields
VF::Any
: Vector field, typically aBifFunction
u0::Any
: Initial guessparams::Any
: parameterslens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Typically aAccessors.PropertyLens
. It specifies which parameter axis amongparams
is used for continuation. For example, ifpar = (α = 1.0, β = 1)
, we can perform continuation w.r.t.α
by usinglens = (@optic _.α)
. If you have an arraypar = [ 1.0, 2.0]
and want to perform continuation w.r.t. the first variable, you can uselens = (@optic _[1])
. For more information, we refer toAccessors.jl
.plotSolution::Any
: user function to plot solutions during continuation. Signature:plot_solution(x, p; kwargs...)
for Plot.jl andplot_solution(ax, x, p; kwargs...)
for the Makie package(s).recordFromSolution::Any
:record_from_solution = (x, p; k...) -> norm(x)
function used record a few indicators about the solution. It could benorm
or(x, p) -> x[1]
. This is also useful when saving several huge vectors is not possible for memory reasons (for example on GPU). This function can return pretty much everything but you should keep it small. For example, you can do(x, p; k...) -> (x1 = x[1], x2 = x[2], nrm = norm(x))
or simply(x, p; k...) -> (sum(x), 1)
. This will be stored incontres.branch
wherecontres::ContResult
is the continuation curve of the bifurcation problem. Finally, the first component is used for plotting in the continuation curve.save_solution::Any
: function to save the full solution on the branch. Some problem are mutable (like periodic orbit functional with adaptive mesh) and this function allows to save the state of the problem along with the solution itself. Signaturesave_solution(x, p)
Methods
re_make(pb; kwargs...)
modify a bifurcation problemgetu0(pb)
callspb.u0
getparams(pb)
callspb.params
getlens(pb)
callspb.lens
getparam(pb)
callsget(pb.params, pb.lens)
setparam(pb, p0)
callsset(pb.params, pb.lens, p0)
record_from_solution(pb)
callspb.recordFromSolution
plot_solution(pb)
callspb.plotSolution
is_symmetric(pb)
callsis_symmetric(pb.prob)
Constructors
BifurcationProblem(F, u0, params, lens)
all derivatives are computed using ForwardDiff.BifurcationProblem(F, u0, params, lens; J, Jᵗ, d2F, d3F, kwargs...)
andkwargs
are the fields above. You can pass your own jacobian withJ
(seeBifFunction
for description of the jacobian function) and jacobian adjoint withJᵗ
. For example, this can be used to provide finite differences based jacobian usingBifurcationKit.finiteDifferences
.
BifurcationKit.PALC
— Typestruct PALC{Ttang<:BifurcationKit.AbstractTangentComputation, Tbls<:BifurcationKit.AbstractLinearSolver, T, Tdot} <: BifurcationKit.AbstractContinuationAlgorithm
Pseudo-arclength continuation algorithm.
Additional information is available on the website.
Fields
tangent::BifurcationKit.AbstractTangentComputation
: Tangent predictor, must be a subtype ofAbstractTangentComputation
. For exampleSecant()
orBordered()
, Default: Secant()θ::Any
:θ
is a parameter in the arclength constraint. It is very important to tune it. It should be tuned for the continuation to work properly especially in the case of large problems where the < x - x0, dx0 > component in the constraint equation might be favoured too much. Also, large thetas favour p as the corresponding term in N involves the term 1-theta. Default: 0.5_bothside::Bool
: [internal], Default: falsebls::BifurcationKit.AbstractLinearSolver
: Bordered linear solver used to invert the jacobian of the newton bordered problem. It is also used to compute the tangent for the predictorBordered()
, Default: MatrixBLS()dotθ::Any
:dotθ = DotTheta()
, this sets up a dot product(x, y) -> dot(x, y) / length(x)
used to define the weighted dot product (resp. norm) $\|(x, p)\|^2_\theta$ in the constraint $N(x, p)$ (see online docs on PALC). This argument can be used to remove the factor1/length(x)
for example in problems where the dimension of the state space changes (mesh adaptation, ...) or when a specific (FEM) dot product is provided. Default: DotTheta()
BifurcationKit.PDEBifProblem
— Typestruct PDEBifProblem{Tvf, Tu, Tp, Tl<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tplot, Trec, Tgets} <: BifurcationKit.AbstractAllJetBifProblem
Structure to hold the bifurcation problem.
Fields
VF::Any
: Vector field, typically aBifFunction
u0::Any
: Initial guessparams::Any
: parameterslens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Typically aAccessors.PropertyLens
. It specifies which parameter axis amongparams
is used for continuation. For example, ifpar = (α = 1.0, β = 1)
, we can perform continuation w.r.t.α
by usinglens = (@optic _.α)
. If you have an arraypar = [ 1.0, 2.0]
and want to perform continuation w.r.t. the first variable, you can uselens = (@optic _[1])
. For more information, we refer toAccessors.jl
.plotSolution::Any
: user function to plot solutions during continuation. Signature:plot_solution(x, p; kwargs...)
for Plot.jl andplot_solution(ax, x, p; kwargs...)
for the Makie package(s).recordFromSolution::Any
:record_from_solution = (x, p; k...) -> norm(x)
function used record a few indicators about the solution. It could benorm
or(x, p) -> x[1]
. This is also useful when saving several huge vectors is not possible for memory reasons (for example on GPU). This function can return pretty much everything but you should keep it small. For example, you can do(x, p; k...) -> (x1 = x[1], x2 = x[2], nrm = norm(x))
or simply(x, p; k...) -> (sum(x), 1)
. This will be stored incontres.branch
wherecontres::ContResult
is the continuation curve of the bifurcation problem. Finally, the first component is used for plotting in the continuation curve.save_solution::Any
: function to save the full solution on the branch. Some problem are mutable (like periodic orbit functional with adaptive mesh) and this function allows to save the state of the problem along with the solution itself. Signaturesave_solution(x, p)
Methods
re_make(pb; kwargs...)
modify a bifurcation problemgetu0(pb)
callspb.u0
getparams(pb)
callspb.params
getlens(pb)
callspb.lens
getparam(pb)
callsget(pb.params, pb.lens)
setparam(pb, p0)
callsset(pb.params, pb.lens, p0)
record_from_solution(pb)
callspb.recordFromSolution
plot_solution(pb)
callspb.plotSolution
is_symmetric(pb)
callsis_symmetric(pb.prob)
Constructors
BifurcationProblem(F, u0, params, lens)
all derivatives are computed using ForwardDiff.BifurcationProblem(F, u0, params, lens; J, Jᵗ, d2F, d3F, kwargs...)
andkwargs
are the fields above. You can pass your own jacobian withJ
(seeBifFunction
for description of the jacobian function) and jacobian adjoint withJᵗ
. For example, this can be used to provide finite differences based jacobian usingBifurcationKit.finiteDifferences
.
BifurcationKit.PDMAProblem
— Typestruct PDMAProblem{Tprob, Tjac, Tu0, Tp, Tl<:Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}, Tplot, Trecord} <: BifurcationKit.AbstractMABifurcationProblem{Tprob}
Problem wrap of a functional. It is not meant to be used directly albeit perhaps by advanced users.
prob::Any
jacobian::Any
u0::Any
params::Any
lens::Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}
plotSolution::Any
recordFromSolution::Any
BifurcationKit.POCollCache
— Typecache to remove allocations from PeriodicOrbitOCollProblem
BifurcationKit.POSolution
— TypeStructure to encode the solution associated to a functional like ::PeriodicOrbitOCollProblem
or ::ShootingProblem
. In the particular case of ::PeriodicOrbitOCollProblem
, this allows to use the collocation polynomials to interpolate the solution. Hence, if sol::POSolution
, one can call
sol = BifurcationKit.POSolution(prob_coll, x)
sol(t)
on any time t
.
BifurcationKit.POSolutionAndState
— TypeStructure to save a solution from a PO functional on the branch. This is useful for branching in case of mesh adaptation or when the phase condition is adapted.
BifurcationKit.PairOfEvents
— Typestruct PairOfEvents{Tc<:BifurcationKit.AbstractContinuousEvent, Td<:BifurcationKit.AbstractDiscreteEvent} <: BifurcationKit.AbstractEvent
Structure to pass a PairOfEvents function to the continuation algorithm. It is composed of a pair ContinuousEvent / DiscreteEvent. A PairOfEvents
is constructed by passing to the constructor a ContinuousEvent
and a DiscreteEvent
:
PairOfEvents(contEvent, discreteEvent)
Fields
eventC::BifurcationKit.AbstractContinuousEvent
: Continuous eventeventD::BifurcationKit.AbstractDiscreteEvent
: Discrete event
BifurcationKit.PeriodDoubling
— Typemutable struct PeriodDoubling{Tv, Tτ, T, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevl, Tevr, Tnf} <: BifurcationKit.AbstractSimpleBranchPointForMaps
x0::Any
: Bifurcation point.τ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the bifurcation point.params::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this bifurcation point was detected.ζ::Any
: Right eigenvector(s).ζ★::Any
: Left eigenvector(s).nf::Any
: Normal form coefficients.type::Symbol
: Type of bifurcation point
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.PeriodDoublingPO
— Typemutable struct PeriodDoublingPO{Tprob, Tv, T, Tevr, Tevl, Tnf} <: BifurcationKit.AbstractSimpleBifurcationPointPO
po::Any
: Bifurcation point (periodic orbit)T::Any
: Periodζ::Any
: Right eigenvector(s)ζ★::Any
: Left eigenvector(s)nf::Any
: Normal formprob::Any
: Periodic orbit problemprm::Bool
: Normal form computed using Poincaré return map
Associated methods
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.PeriodDoublingProblemMinimallyAugmented
— Typemutable struct PeriodDoublingProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem, vectype, T<:Real, S<:BifurcationKit.AbstractLinearSolver, Sa<:BifurcationKit.AbstractLinearSolver, Sbd<:BifurcationKit.AbstractBorderedLinearSolver, Sbda<:BifurcationKit.AbstractBorderedLinearSolver, Tmass} <: BifurcationKit.AbstractProblemMinimallyAugmented{Tprob<:BifurcationKit.AbstractBifurcationProblem}
Structure to encode the functional based on a Minimally Augmented formulation.
Fields
prob_vf
: Functional F(x, p) - vector field - with all derivativesa
: close to null vector of Jᵗb
: close to null vector of Jzero
: vector zero, to avoid allocating it many timesl1
: Lyapunov coefficientCP
: Cusp test valueFOLDNS
: Fold-Neimark Sacker test valueGPD
: Generalised period douling test valueFLIPNS
: Fold-NS test valuesR1
: Resonance 1R2
: Resonance 2R3
: Resonance 3R4
: Resonance 4linsolver
: linear solver. Used to invert the jacobian of MA functionallinsolverAdjoint
: linear solver for the jacobian adjointlinbdsolver
: bordered linear solverlinbdsolverAdjoint
: linear bordered solver for the jacobian adjointusehessian
: wether to use the hessian of prob_vfmassmatrix
: wether to use a mass matrix M for studying M⋅∂tu = F(u), default = I
BifurcationKit.PeriodicOrbitOCollProblem
— Typepb = PeriodicOrbitOCollProblem(kwargs...)
This composite type implements an orthogonal collocation (at Gauss points) method of piecewise polynomials to locate periodic orbits. More details (maths, notations, linear systems) can be found here.
Arguments
prob
a bifurcation problemϕ::AbstractVector
used to set a section for the phase constraint equationxπ::AbstractVector
used in the section for the phase constraint equationN::Int
dimension of the state spacemesh_cache::MeshCollocationCache
cache for collocation. See docs ofMeshCollocationCache
update_section_every_step
updates the section everyupdate_section_every_step
step during continuationjacobian = DenseAnalytical()
describes the type of jacobian used in Newton iterations. Can only beAutoDiffDense(), DenseAnalytical(), FullSparse(), FullSparseInplace()
.meshadapt::Bool = false
whether to use mesh adaptationverbose_mesh_adapt::Bool = true
verbose mesh adaptation informationK::Float64 = 500
parameter for mesh adaptation, control new mesh step size. More precisely, we set max(hᵢ) / min(hᵢ) ≤ K if hᵢ denotes the time steps.
Methods
Here are some useful methods you can apply to pb
length(pb)
gives the total number of unknownssize(pb)
returns the triplet(N, m, Ntst)
getmesh(pb)
returns the mesh0 = τ0 < ... < τNtst+1 = 1
. This is useful because this mesh is born to vary during automatic mesh adaptationget_mesh_coll(pb)
returns the (static) mesh0 = σ0 < ... < σm+1 = 1
get_times(pb)
returns the vector of times (length1 + m * Ntst
) at the which the collocation is applied.generate_solution(pb, orbit, period)
generate a guess from a functiont -> orbit(t)
which approximates the periodic orbit.POSolution(pb, x)
return a function interpolating the solutionx
using a piecewise polynomials function
Orbit guess
You can evaluate the residual of the functional (and other things) by calling pb(orbitguess, p)
on an orbit guess orbitguess
. Note that orbitguess
must be of size 1 + N * (1 + m * Ntst) where N is the number of unknowns in the state space and orbitguess[end]
is an estimate of the period $T$ of the limit cycle.
Constructors
PeriodicOrbitOCollProblem(Ntst::Int, m::Int; kwargs)
creates an empty functional withNtst
andm
.
Note that you can generate this guess from a function using generate_solution
or generate_ci_problem
.
Functional
A functional, hereby called G
, encodes this problem. The following methods are available
pb(orbitguess, p)
evaluates the functional G onorbitguess
BifurcationKit.PeriodicOrbitTrapProblem
— TypeThis composite type implements Finite Differences based on a Trapezoidal rule (Order 2 in time) to locate periodic orbits. More details (maths, notations, linear systems) can be found here.
Fields
prob
a bifurcation problemM::Int
number of time slicesϕ
used to set a section for the phase constraint equation, of size N*Mxπ
used in the section for the phase constraint equation, of size N*Mlinsolver: = DefaultLS()
linear solver for each time slice, i.e. to solveJ⋅sol = rhs
. This is only needed for the computation of the Floquet multipliers in a full matrix-free setting.ongpu::Bool
whether the computation takes place on the gpu (Experimental)massmatrix
a mass matrix. You can pass for example a sparse matrix. Default: identity matrix.update_section_every_step
updates the section everyupdate_section_every_step
step during continuationjacobian::Symbol
symbol which describes the type of jacobian used in Newton iterations (see below).
The scheme is as follows. We first consider a partition of $[0,1]$ given by $0<s_0<\cdots<s_m=1$ and one looks for T = x[end]
such that
$M_a\cdot\left(x_{i} - x_{i-1}\right) - \frac{T\cdot h_i}{2} \left(F(x_{i}) + F(x_{i-1})\right) = 0,\ i=1,\cdots,m-1$
with $u_{0} := u_{m-1}$ and the periodicity condition $u_{m} - u_{1} = 0$ and
where $h_1 = s_i-s_{i-1}$. $M_a$ is a mass matrix. Finally, the phase of the periodic orbit is constrained by using a section (but you could use your own)
$\sum_i\langle x_{i} - x_{\pi,i}, \phi_{i}\rangle=0.$
Constructors
The structure can be created by calling PeriodicOrbitTrapProblem(;kwargs...)
. For example, you can declare such a problem without vector field by doing
PeriodicOrbitTrapProblem(M = 100)
Orbit guess
You will see below that you can evaluate the residual of the functional (and other things) by calling pb(orbitguess, p)
on an orbit guess orbitguess
. Note that orbitguess
must be a vector of size M * N + 1 where N is the number of unknowns in the state space and orbitguess[M*N+1]
is an estimate of the period $T$ of the limit cycle. More precisely, using the above notations, orbitguess
must be $orbitguess = [x_{1},x_{2},\cdots,x_{M}, T]$.
Note that you can generate this guess from a function solution using generate_solution
or generate_ci_problem
.
Functional
A functional, hereby called G
, encodes this problem. The following methods are available
pb(orbitguess, p)
evaluates the functional G onorbitguess
pb(orbitguess, p, du)
evaluates the jacobiandG(orbitguess).du
functional atorbitguess
ondu
pb(Val(:JacFullSparse), orbitguess, p)
return the sparse matrix of the jacobiandG(orbitguess)
atorbitguess
without the constraints. It is calledA_γ
in the docs.pb(Val(:JacFullSparseInplace), J, orbitguess, p)
. Same aspb(Val(:JacFullSparse), orbitguess, p)
but overwritesJ
inplace. Note that the sparsity pattern must be the same independently of the values of the parameters or oforbitguess
. In this case, this is significantly faster thanpb(Val(:JacFullSparse), orbitguess, p)
.pb(Val(:JacCyclicSparse), orbitguess, p)
return the sparse cyclic matrix Jc (see the docs) of the jacobiandG(orbitguess)
atorbitguess
pb(Val(:BlockDiagSparse), orbitguess, p)
return the diagonal of the sparse matrix of the jacobiandG(orbitguess)
atorbitguess
. This allows to design Jacobi preconditioner. Useblockdiag
.
Jacobian
Specify the choice of the jacobian (and linear algorithm), jacobian
must belong to [:FullLU, :FullSparseInplace, :Dense, :DenseAD, :BorderedLU, :BorderedSparseInplace, :FullMatrixFree, :BorderedMatrixFree, :FullMatrixFreeAD]
. This is used to select a way of inverting the jacobian dG
of the functional G.
- For
jacobian = :FullLU
, we use the default linear solver based on a sparse matrix representation ofdG
. This matrix is assembled at each newton iteration. This is the default algorithm. - For
jacobian = :FullSparseInplace
, this is the same as for:FullLU
but the sparse matrixdG
is updated inplace. This method allocates much less. In some cases, this is significantly faster than using:FullLU
. Note that this method can only be used if the sparsity pattern of the jacobian is always the same. - For
jacobian = :Dense
, same as above but the matrixdG
is dense. It is also updated inplace. This option is useful to study ODE of small dimension. - For
jacobian = :DenseAD
, evaluate the jacobian using ForwardDiff - For
jacobian = :BorderedLU
, we take advantage of the bordered shape of the linear solver and use a LU decomposition to invertdG
using a bordered linear solver. - For
jacobian = :BorderedSparseInplace
, this is the same as for:BorderedLU
but the cyclic matrixdG
is updated inplace. This method allocates much less. In some cases, this is significantly faster than using:BorderedLU
. Note that this method can only be used if the sparsity pattern of the jacobian is always the same. - For
jacobian = :FullMatrixFree
, a matrix free linear solver is used fordG
: note that a preconditioner is very likely required here because of the cyclic shape ofdG
which affects negatively the convergence properties of GMRES. - For
jacobian = :BorderedMatrixFree
, a matrix free linear solver is used but forJc
only (see docs): it means thatoptions.linsolver
is used to invertJc
. These two Matrix-Free options thus expose different part of the jacobiandG
in order to use specific preconditioners. For example, an ILU preconditioner onJc
could remove the constraints indG
and lead to poor convergence. Of course, for these last two methods, a preconditioner is likely to be required. - For
jacobian = :FullMatrixFreeAD
, the evaluation map of the differential is derived using automatic differentiation. Thus, unlike the previous two cases, the user does not need to pass a Matrix-Free differential.
For these methods to work on the GPU, for example with CuArrays
in mode allowscalar(false)
, we face the issue that the function extract_period_fdtrap
won't be well defined because it is a scalar operation. Note that you must pass the option ongpu = true
for the functional to be evaluated efficiently on the gpu.
BifurcationKit.PeriodicOrbitTrapProblem
— MethodThis method returns the jacobian of the functional G encoded in PeriodicOrbitTrapProblem using a Sparse representation.
BifurcationKit.PeriodicOrbitTrapProblem
— MethodThis method returns the jacobian of the functional G encoded in PeriodicOrbitTrapProblem using an inplace update. In case where the passed matrix J0 is a sparse one, it updates J0 inplace assuming that the sparsity pattern of J0 and dG(orbitguess0) are the same.
BifurcationKit.Pitchfork
— Typemutable struct Pitchfork{Tv, Tτ, T, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevl, Tevr, Tnf} <: BifurcationKit.AbstractSimpleBranchPoint
x0::Any
: Bifurcation point.τ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the bifurcation point.params::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this bifurcation point was detected.ζ::Any
: Right eigenvector(s).ζ★::Any
: Left eigenvector(s).nf::Any
: Normal form coefficients.type::Symbol
: Type of bifurcation point
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.PitchforkMap
— Typemutable struct PitchforkMap{Tv, Tτ, T, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevl, Tevr, Tnf} <: BifurcationKit.AbstractSimpleBranchPointForMaps
x0::Any
: Bifurcation point.τ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the bifurcation point.params::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this bifurcation point was detected.ζ::Any
: Right eigenvector(s).ζ★::Any
: Left eigenvector(s).nf::Any
: Normal form coefficients.type::Symbol
: Type of bifurcation point
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.PoincareShootingProblem
— Typepb = PoincareShootingProblem(flow::Flow, M, sections; δ = 1e-8, interp_points = 50, parallel = false)
This composite type implements the Poincaré Shooting method to locate periodic orbits by relying on Poincaré return maps. More details (maths, notations, linear systems) can be found here. The arguments are as follows
flow::Flow
: implements the flow of the Cauchy problem though the structureFlow
.M
: the number of Poincaré sections. IfM == 1
, then the simple shooting is implemented and the multiple one otherwise.sections
: function or callable struct which implements a Poincaré section condition. The evaluationsections(x)
must return a scalar number whenM == 1
. Otherwise, one must implement a functionsection(out, x)
which populatesout
with theM
sections. SeeSectionPS
for type of section defined as a hyperplane.δ = 1e-8
used to compute the jacobian of the functional by finite differences. If set to0
, an analytical expression of the jacobian is used instead.interp_points = 50
number of interpolation point used to define the callback (to compute the hitting of the hyperplane section)parallel = false
whether the shooting are computed in parallel (threading). Only available through the use of Flows defined byEnsembleProblem
.par
parameters of the modellens
parameter axisupdate_section_every_step
updates the section everyupdate_section_every_step
step during continuationjacobian::Symbol
symbol which describes the type of jacobian used in Newton iterations (see below).
Jacobian
jacobian
Specify the choice of the linear algorithm, which must belong to[AutoDiffMF(), MatrixFree(), AutodiffDense(), AutoDiffDenseAnalytical(), FiniteDifferences(), FiniteDifferencesMF()]
. This is used to select a way of inverting the jacobian dG- For
MatrixFree()
, matrix free jacobian, the jacobian is specified by the user inprob
. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutoDiffMF()
, we use Automatic Differentiation (AD) to compute the (matrix-free) derivative ofx -> prob(x, p)
using a directional derivative. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutodiffDense()
. Same as forAutoDiffMF
but the jacobian is formed as a dense Matrix. You can use a direct solver or an iterative one. - For
FiniteDifferences()
, same as forAutoDiffDense
but we use Finite Differences to compute the jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument. - For
AutoDiffDenseAnalytical()
. Same as forAutoDiffDense
but the jacobian is formed using a mix of AD and analytical formula. - For
FiniteDifferencesMF()
, use Finite Differences to compute the matrix-free jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument.
- For
Simplified constructors
The first important constructor is the following which is used for branching to periodic orbits from Hopf bifurcation points pb = PoincareShootingProblem(M::Int, prob::Union{ODEProblem, EnsembleProblem}, alg; kwargs...)
A convenient way is to create a functional is
pb = PoincareShootingProblem(prob::ODEProblem, alg, section; kwargs...)
for simple shooting or
pb = PoincareShootingProblem(prob::Union{ODEProblem, EnsembleProblem}, alg, M::Int, section; kwargs...)
for multiple shooting . Here prob
is an Union{ODEProblem, EnsembleProblem}
which is used to create a flow using the ODE solver alg
(for example Tsit5()
). Finally, the arguments kwargs
are passed to the ODE solver defining the flow. We refer to DifferentialEquations.jl
for more information.
- Another convenient call is
pb = PoincareShootingProblem(prob::Union{ODEProblem, EnsembleProblem}, alg, normals::AbstractVector, centers::AbstractVector; δ = 1e-8, kwargs...)
where normals
(resp. centers
) is a list of normals (resp. centers) which defines a list of hyperplanes $\Sigma_i$. These hyperplanes are used to define partial Poincaré return maps.
Computing the functionals
A functional, hereby called G
encodes this shooting problem. You can then call pb(orbitguess, par)
to apply the functional to a guess. Note that orbitguess::AbstractVector
must be of size M * N where N is the number of unknowns in the state space and M
is the number of Poincaré maps. Another accepted guess
is such that guess[i]
is the state of the orbit on the i
th section. This last form allows for non-vector state space which can be convenient for 2d problems for example.
Note that you can generate this guess from a function solution using generate_solution
.
pb(orbitguess, par)
evaluates the functional G onorbitguess
pb(orbitguess, par, du)
evaluates the jacobiandG(orbitguess).du
functional atorbitguess
ondu
pb
(Val(:JacobianMatrixInplace), J, x, par)` compute the jacobian of the functional analytically. This is based on ForwardDiff.jl. Useful mainly for ODEs.pb(Val(:JacobianMatrix), x, par)
same as above but out-of-place.
You can use the function getperiod(pb, sol, par)
to get the period of the solution sol
for the problem with parameters par
.
BifurcationKit.PoincaréMap
— TypeConstruct a Poincaré return map Π
to an hyperplane Σ
from a AbstractPeriodicOrbitProblem
. If the state space is of size Nₓ x N𝕪
, then we can evaluate the map as Π(xₛ, par)
where xₛ ∈ Σ
is of size Nₓ x N𝕪
.
BifurcationKit.Polynomial
— TypePolynomial Tangent predictor
n::Int64
: Order of the polynomialk::Int64
: Length of the last solutions vector used for the polynomial fitA::Matrix{T} where T<:Real
: Matrix for the interpolationtangent::BifurcationKit.AbstractTangentComputation
: Algo for tangent when polynomial predictor is not possiblesolutions::DataStructures.CircularBuffer
: Vector of solutionsparameters::DataStructures.CircularBuffer{T} where T<:Real
: Vector of parametersarclengths::DataStructures.CircularBuffer{T} where T<:Real
: Vector of arclengthscoeffsSol::Vector
: Coefficients for the polynomials for the solutioncoeffsPar::Vector{T} where T<:Real
: Coefficients for the polynomials for the parameterupdate::Bool
: Update the predictor by adding the last point (x, p)? This can be disabled in order to just use the polynomial prediction. It is useful when the predictor is called mutiple times during bifurcation detection using bisection.
Constructor(s)
Polynomial(pred, n, k, v0)
Polynomial(n, k, v0)
n
order of the polynomialk
length of the last solutions vector used for the polynomial fitv0
example of solution to be stored. It is only used to get theeltype
of the tangent.
Can be used like
PALC(tangent = Polynomial(Bordered(), 2, 6, rand(1)))
BifurcationKit.Secant
— TypeSecant Tangent predictor
BifurcationKit.SectionPS
— Typestruct SectionPS{Tn, Tc, Tnb, Tcb, Tr} <: BifurcationKit.AbstractSection
This composite type (named for SectionPoincaréShooting) encodes a type of Poincaré sections implemented by hyperplanes. It can be used in conjunction with PoincareShootingProblem
. Each hyperplane is defined par a point (one example in centers
) and a normal (one example in normals
).
M::Int64
normals::Any
centers::Any
indices::Vector{Int64}
normals_bar::Any
centers_bar::Any
radius::Any
Constructor(s)
SectionPS(normals::Vector{Tv}, centers::Vector{Tv})
BifurcationKit.SectionSS
— Typestruct SectionSS{Tn, Tc} <: BifurcationKit.AbstractSection
This composite type (named for Section Standard Shooting) encodes a type of section implemented by a single hyperplane. It can be used in conjunction with ShootingProblem
. The hyperplane is defined by a point center
and a normal
.
normal::Any
: Normal to define hyperplanecenter::Any
: Representative point on hyperplane
BifurcationKit.SetOfEvents
— Typestruct SetOfEvents{Tc<:Tuple, Td<:Tuple} <: BifurcationKit.AbstractEvent
Multiple events can be chained together to form a SetOfEvents
. A SetOfEvents
is constructed by passing to the constructor ContinuousEvent
, DiscreteEvent
or other SetOfEvents
instances:
SetOfEvents(cb1, cb2, cb3)
Example
BifurcationKit.SetOfEvents(BK.FoldDetectCB, BK.BifDetectCB)
You can pass as many events as you like.
eventC::Tuple
: Continuous eventeventD::Tuple
: Discrete event
BifurcationKit.ShootingProblem
— Typepb = ShootingProblem(flow::Flow, ds, section; parallel = false)
Create a problem to implement the Simple / Parallel Multiple Standard Shooting method to locate periodic orbits. More details (maths, notations, linear systems) can be found here. The arguments are as follows
flow::Flow
: implements the flow of the Cauchy problem though the structureFlow
.ds
: vector of time differences for each shooting. Its length is writtenM
. IfM == 1
, then the simple shooting is implemented and the multiple one otherwise.section
: implements a phase condition. The evaluationsection(x, T)
must return a scalar number wherex
is a guess for one point on the periodic orbit andT
is the period of the guess. Also, the methodsection(x, T, dx, dT)
must be available and which returns the differential ofsection
. The type ofx
depends on what is passed to the newton solver. SeeSectionSS
for a type of section defined as a hyperplane.parallel
whether the shooting is computed in parallel (threading). Available through the use of Flows defined byEnsembleProblem
(this is automatically set up for you).par
parameters of the modellens
parameter axisupdate_section_every_step
updates the section everyupdate_section_every_step
step during continuationjacobian::Symbol
symbol which describes the type of jacobian used in Newton iterations (see below).
A functional, hereby called G
, encodes the shooting problem. For example, the following methods are available:
pb(orbitguess, par)
evaluates the functional G onorbitguess
pb(orbitguess, par, du)
evaluates the jacobiandG(orbitguess)⋅du
functional atorbitguess
ondu
.pb
(Val(:JacobianMatrixInplace), J, x, par)` compute the jacobian of the functional analytically. This is based on ForwardDiff.jl. Useful mainly for ODEs.pb(Val(:JacobianMatrix), x, par)
same as above but out-of-place.
You can then call pb(orbitguess, par)
to apply the functional to a guess. Note that orbitguess::AbstractVector
must be of size M * N + 1
where N is the number of unknowns of the state space and orbitguess[M * N + 1]
is an estimate of the period T
of the limit cycle. This form of guess is convenient for the use of the linear solvers in IterativeSolvers.jl
(for example) which only accept AbstractVector
s. Another accepted guess is of the form BorderedArray(guess, T)
where guess[i]
is the state of the orbit at the i
th time slice. This last form allows for non-vector state space which can be convenient for 2d problems for example, use GMRESKrylovKit
for the linear solver in this case.
Note that you can generate this guess from a function solution using generate_solution
or generate_ci_problem
.
Jacobian
jacobian
Specify the choice of the linear algorithm, which must belong to[AutoDiffMF(), MatrixFree(), AutodiffDense(), AutoDiffDenseAnalytical(), FiniteDifferences(), FiniteDifferencesMF()]
. This is used to select a way of inverting the jacobian dG- For
MatrixFree()
, matrix free jacobian, the jacobian is specified by the user inprob
. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutoDiffMF()
, we use Automatic Differentiation (AD) to compute the (matrix-free) derivative ofx -> prob(x, p)
using a directional derivative. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutodiffDense()
. Same as forAutoDiffMF
but the jacobian is formed as a dense Matrix. You can use a direct solver or an iterative one. - For
FiniteDifferences()
, same as forAutoDiffDense
but we use Finite Differences to compute the jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument. - For
AutoDiffDenseAnalytical()
. Same as forAutoDiffDense
but the jacobian is formed using a mix of AD and analytical formula. - For
FiniteDifferencesMF()
, use Finite Differences to compute the matrix-free jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument.
- For
Simplified constructors
- The first important constructor is the following which is used for branching to periodic orbits from Hopf bifurcation points:
pb = ShootingProblem(M::Int, prob::Union{ODEProblem, EnsembleProblem}, alg; kwargs...)
- A convenient way to build the functional is to use:
pb = ShootingProblem(prob::Union{ODEProblem, EnsembleProblem}, alg, centers::AbstractVector; kwargs...)
where prob
is an ODEProblem
(resp. EnsembleProblem
) which is used to create a flow using the ODE solver alg
(for example Tsit5()
). centers
is list of M
points close to the periodic orbit, they will be used to build a constraint for the phase. parallel = false
is an option to use Parallel simulations (Threading) to simulate the multiple trajectories in the case of multiple shooting. This is efficient when the trajectories are relatively long to compute. Finally, the arguments kwargs
are passed to the ODE solver defining the flow. Look at DifferentialEquations.jl
for more information. Note that, in this case, the derivative of the flow is computed internally using Finite Differences.
- Another way to create a Shooting problem with more options is the following where in particular, one can provide its own scalar constraint
section(x)::Number
for the phase:
pb = ShootingProblem(prob::Union{ODEProblem, EnsembleProblem}, alg, M::Int, section; parallel = false, kwargs...)
or
pb = ShootingProblem(prob::Union{ODEProblem, EnsembleProblem}, alg, ds, section; parallel = false, kwargs...)
- The next way is an elaboration of the previous one
pb = ShootingProblem(prob1::Union{ODEProblem, EnsembleProblem}, alg1, prob2::Union{ODEProblem, EnsembleProblem}, alg2, M::Int, section; parallel = false, kwargs...)
or
pb = ShootingProblem(prob1::Union{ODEProblem, EnsembleProblem}, alg1, prob2::Union{ODEProblem, EnsembleProblem}, alg2, ds, section; parallel = false, kwargs...)
where we supply now two ODEProblem
s. The first one prob1
, is used to define the flow associated to F
while the second one is a problem associated to the derivative of the flow. Hence, prob2
must implement the following vector field $\tilde F(x,y,p) = (F(x,p), dF(x,p)\cdot y)$.
BifurcationKit.SolPeriodicOrbit
— TypeThis struct allows to have a unified interface with Shooting methods in term of plotting.
BifurcationKit.SpecialPoint
— Typestruct SpecialPoint{T, Tp, Tv, Tvτ} <: BifurcationKit.AbstractBifurcationPoint
Structure to record special points on a curve. There are two types of special points that are recorded in this structure: bifurcation points and events (see https://bifurcationkit.github.io/BifurcationKitDocs.jl/dev/EventCallback/).
type::Symbol
: Description of the special points. In case of Events, this field records the user passed named to the event, or the default:userD
,:userC
. In case of bifurcation points, it can be one of the following:- :bp Bifurcation point, simple eigenvalue crossing the imaginary axis - :fold Fold point - :hopf Hopf point - :nd not documented bifurcation point. Detected by multiple eigenvalues crossing. Generally occurs in problems with symmetries or in cases where the continuation step size is too large and merge two different bifurcation points. - :cusp Cusp point - :gh Generalized Hopf point (also called Bautin point) - :bt Bogdanov-Takens point - :zh Zero-Hopf point - :hh Hopf-Hopf point - :ns Neimark-Sacker point - :pd Period-doubling point - :R1 Strong resonance 1:1 of periodic orbits - :R2 Strong resonance 1:2 of periodic orbits - :R3 Strong resonance 1:3 of periodic orbits - :R4 Strong resonance 1:4 of periodic orbits - :foldFlip Fold / Flip of periodic orbits - :foldNS Fold / Neimark-Sacker of periodic orbits - :pdNS Period-Doubling / Neimark-Sacker of periodic orbits - :gpd Generalized Period-Doubling of periodic orbits - :nsns Double Neimark-Sacker of periodic orbits - :ch Chenciner bifurcation of periodic orbits Default: :none
idx::Int64
: Index inbr.branch
orbr.eig
(seeContResult
) for which the bifurcation occurs. Default: 0param::Any
: Parameter value at the special point (this is an estimate). Default: 0.0norm::Any
: Norm of the equilibrium at the special point Default: 0.0printsol::Any
:printsol = record_from_solution(x, param)
whererecord_from_solution
is one of the arguments tocontinuation
Default: 0.0x::Any
: Equilibrium at the special point Default: Vector{T}(undef, 0)τ::BorderedArray{Tvτ, T} where {T, Tvτ}
: Tangent along the branch at the special point Default: BorderedArray(x, T(0))ind_ev::Int64
: Eigenvalue index responsible for detecting the special point (if applicable) Default: 0step::Int64
: Continuation step at which the special occurs Default: 0status::Symbol
:status ∈ {:converged, :guess, :guessL}
indicates whether the bisection algorithm was successful in detecting the special (bifurcation) point. Ifstatus == :guess
, the bissection algorithm failed to meet the requirements given in::ContinuationPar
. Same forstatus == :guessL
but the bissection algorithm stopped on the left of the bifurcation point. Default: :guessδ::Tuple{Int64, Int64}
:δ = (δr, δi)
where δr indicates the change in the number of unstable eigenvalues and δi indicates the change in the number of unstable eigenvalues with nonzero imaginary part.abs(δr)
is thus an estimate of the dimension of the kernel of the Jacobian at the special (bifurcation) point. Default: (0, 0)precision::Any
: Precision in the location of the special point Default: -1interval::Tuple{T, T} where T
: Interval parameter containing the special point Default: (0, 0)
BifurcationKit.TWProblem
— TypeTWProblem(prob, ∂::Tuple, u₀; DAE = 0, jacobian::Symbol = :AutoDiff)
This composite type implements a functional for freezing symmetries in order, for example, to compute travelling waves (TW). Note that you can freeze many symmetries, not just one, by passing many Lie generators. When you call pb(x, par)
, it computes:
┌ ┐
│ f(x, par) - s⋅∂⋅x │
│ <x - u₀, ∂⋅u₀> │
└ ┘
Arguments
prob
bifurcation problem with continuous symmetries∂::Tuple = (T1, T2, ⋯)
tuple of Lie generators. In effect, each of these is an (differential) operator which can be specified as a (sparse) matrix or as an operator implementingLinearAlgebra.mul!
.u₀
reference solution
Additional Constructor(s)
pb = TWProblem(prob, ∂, u₀; kw...)
This simplified call handles the case where a single symmetry needs to be frozen.
Useful function
updatesection!(pb::TWProblem, u0)
updates the reference solution of the problem usingu0
.nb_constraints(::TWProblem)
number of constraints (or Lie generators)
BifurcationKit.Transcritical
— Typemutable struct Transcritical{Tv, Tτ, T, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevl, Tevr, Tnf} <: BifurcationKit.AbstractSimpleBranchPoint
x0::Any
: Bifurcation point.τ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the bifurcation point.params::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this bifurcation point was detected.ζ::Any
: Right eigenvector(s).ζ★::Any
: Left eigenvector(s).nf::Any
: Normal form coefficients.type::Symbol
: Type of bifurcation point
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.TranscriticalMap
— Typemutable struct TranscriticalMap{Tv, Tτ, T, Tpar, Tlens<:Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}, Tevl, Tevr, Tnf} <: BifurcationKit.AbstractSimpleBranchPointForMaps
x0::Any
: Bifurcation point.τ::Any
: Tangent of the curve at the bifurcation point.p::Any
: Parameter value at the bifurcation point.params::Any
: Parameters used by the vector field.lens::Union{typeof(identity), IndexLens, PropertyLens, ComposedFunction}
: Parameter axis used to compute the branch on which this bifurcation point was detected.ζ::Any
: Right eigenvector(s).ζ★::Any
: Left eigenvector(s).nf::Any
: Normal form coefficients.type::Symbol
: Type of bifurcation point
Predictor
You can call predictor(bp, ds; kwargs...)
on such bifurcation point bp
to find the zeros of the normal form polynomials.
BifurcationKit.TrilinearMap
— Typestruct TrilinearMap{Tm}
This structure wraps a trilinear map to allow evaluation on Complex arguments. This is especially useful when these maps are produced by ForwardDiff.jl.
BifurcationKit.WrapPOColl
— Typestruct WrapPOColl{Tprob, Tjac, Tu0, Tp, Tl<:Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}, Tplot, Trecord} <: BifurcationKit.AbstractBifurcationProblem
Problem wrap of a functional. It is not meant to be used directly albeit perhaps by advanced users.
prob::Any
jacobian::Any
u0::Any
params::Any
lens::Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}
plotSolution::Any
recordFromSolution::Any
BifurcationKit.WrapPOSh
— Typestruct WrapPOSh{Tprob, Tjac, Tu0, Tp, Tl<:Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}, Tplot, Trecord} <: BifurcationKit.AbstractBifurcationProblem
Problem wrap of a functional. It is not meant to be used directly albeit perhaps by advanced users.
prob::Any
jacobian::Any
u0::Any
params::Any
lens::Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}
plotSolution::Any
recordFromSolution::Any
BifurcationKit.WrapPOTrap
— Typestruct WrapPOTrap{Tprob, Tjac, Tu0, Tp, Tl<:Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}, Tplot, Trecord} <: BifurcationKit.AbstractBifurcationProblem
Problem wrap of a functional. It is not meant to be used directly albeit perhaps by advanced users.
prob::Any
jacobian::Any
u0::Any
params::Any
lens::Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}
plotSolution::Any
recordFromSolution::Any
BifurcationKit.WrapTW
— Typestruct WrapTW{Tprob, Tjac, Tu0, Tp, Tl<:Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}, Tplot, Trecord} <: BifurcationKit.AbstractBifurcationProblem
Problem wrap of a functional. It is not meant to be used directly albeit perhaps by advanced users.
prob::Any
jacobian::Any
u0::Any
params::Any
lens::Union{typeof(identity), Nothing, IndexLens, PropertyLens, ComposedFunction}
plotSolution::Any
recordFromSolution::Any
BifurcationKit.ZeroHopf
— Typemutable struct ZeroHopf{Tv, Tpar, Tlens, Tevr, Tevl, Tnf} <: BifurcationKit.AbstractBifurcationPoint
x0::Any
: Bifurcation pointparams::Any
: Parameters used by the vector field.lens::Any
: Parameter axis used to compute the branch on which this cusp point was detected.ζ::Any
: Right eigenvectorζ★::Any
: Left eigenvectornf::Any
: Normal form coefficientstype::Symbol
: Type of bifurcation
BifurcationKit.cbMaxNorm
— Typecb = cbMaxNorm(maxres)
Create a callback used to reject residuals larger than cb.maxres
in the Newton iterations. See docs for newton
.
Base.size
— Functionsize(tree)
size(tree, code)
Return the size of the bifurcation diagram. The argument code
is the same as in get_branch
.
Base.size
— MethodThe method size
returns (n, m, Ntst) when applied to a PeriodicOrbitOCollProblem
BifurcationKit.Aγ!
— MethodFunction to compute the Matrix-Free version of Aγ, see docs for its expression.
BifurcationKit.HopfPoint
— MethodFor an initial guess from the index of a Hopf bifurcation point located in ContResult.specialpoint, returns a point which can be refined using newton_hopf
.
BifurcationKit.Jc
— MethodFunction to compute the Matrix-Free version of the cyclic matrix Jc, see docs for its expression.
BifurcationKit.PoincareMap
— MethodPoincareMap(wrap, po, par, optn)
Constructor for the Poincaré return map. Return a PoincaréMap
BifurcationKit.PoincareMap
— MethodPoincareMap(wrap, po, par, optn)
Constructor for the Poincaré return map. Return a PoincaréMap
BifurcationKit.PrecPartialSchurArnoldiMethod
— FunctionPrecPartialSchurArnoldiMethod(J, N, nev, which = LM(); tol = 1e-9, kwargs...)
Builds a preconditioner based on deflation of nev
eigenvalues chosen according to which
. A partial Schur decomposition is computed (Matrix-Free), using the package ArnoldiMethod.jl
, from which a projection is built. See the package ArnoldiMethod.jl
for how to pass the proper options.
BifurcationKit.PrecPartialSchurKrylovKit
— FunctionPrecPartialSchurKrylovKit(J, x0, nev, which = :LM; krylovdim = max(2nev, 20), verbosity = 0)
Builds a preconditioner based on deflation of nev
eigenvalues chosen according to which
. A partial Schur decomposition is computed (Matrix-Free), using the package KrylovKit.jl
, from which a projection is built. The options are similar to the ones of EigKrylovKit()
.
BifurcationKit.SaveAtEvent
— Method`SaveAtEvent(positions::Tuple)`
This event implements the detection of when the parameter values, used during continuation, equals one of the values in positions
. This state is then saved in the branch.
For example, you can use it like continuation(args...; event = SaveAtEvent((1., 2., -3.)))
BifurcationKit._axpy
— MethodThis function returns a₀ * I + a₁ * J and ensures that we don't perform unnecessary computations like 0I + 1J.
BifurcationKit._axpy_op
— MethodThis function implements the operator a₀ * I + a₁ * J and ensures that we don't perform unnecessary computations like 0I + 1J.
BifurcationKit._cat!
— Method_cat!(br, br2)
Merge two ContResult
s and put the result in br
.
BifurcationKit._contresult
— Method_contresult(iter, state, printsol, br, x0, contParams)
Function is used to initialize the composite type ContResult
according to the options contained in contParams
Arguments
br
result fromget_state_summary
par
: parameterslens
: lens to specify the continuation parametereiginfo
: eigen-elements (eigvals, eigvecs)
BifurcationKit._isinplace
— MethodDetermine if the vector field is of the form f!(out,z,p)
.
BifurcationKit._keep_opts_cont
— MethodInternal function to select the keys out of nt that are valid for the continuation function below. Can be used like foo(kw...) = _keep_opts_cont(values(nt))
BifurcationKit._merge
— MethodSame as _cat! but determine the ordering so that the branches merge properly
BifurcationKit.analytical_jacobian!
— Methodanalytical_jacobian!(
J,
coll,
u,
pars;
_transpose,
ρD,
ρF,
ρI
)
Compute the jacobian of the problem defining the periodic orbits by orthogonal collocation using an analytical formula. More precisely, it discretises
ρD * D - T*(ρF * F + ρI * I)
BifurcationKit.applyD
— Methodss
tuple of speedsD
tuple of Lie generators
BifurcationKit.bifurcation_points
— Methodbifurcation_points(br)
Return the list of bifurcation points on a branch. It essentially filters the field specialpoint
.
BifurcationKit.bifurcationdiagram!
— Methodbifurcationdiagram!(
prob,
node,
maxlevel,
options;
code,
halfbranch,
verbosediagram,
kwargs...
)
Similar to bifurcationdiagram
but you pass a previously computed node
from which you want to further compute the bifurcated branches. It is usually used with node = get_branch(diagram, code)
from a previously computed bifurcation diagram
.
Arguments
node::BifDiagNode
a node in the bifurcation diagrammaxlevel = 1
required maximal level of recursion.options = (x, p, level) -> contparams
this function allows to change thecontinuation
options depending on the branchinglevel
. The argumentx, p
denotes the current solution toF(x, p)=0
.
Optional arguments
code = "0"
code used to display iterationsusedeflation = false
halfbranch = false
for Pitchfork / Transcritical bifurcations, compute only half of the branch. Can be useful when there are symmetries.verbosediagram
verbose specific to bifurcation diagram. Print information about the branches as they are being computed.kwargs
optional arguments as forcontinuation
but also for the different versions listed in Continuation.
BifurcationKit.bifurcationdiagram
— Methodbifurcationdiagram(
prob,
alg,
level,
options;
linear_algo,
kwargs...
)
Compute the bifurcation diagram associated with the problem F(x, p) = 0
recursively.
Arguments
prob::AbstractBifurcationProblem
bifurcation problemalg
continuation algorithmlevel
maximum branching (or recursion) level for computing the bifurcation diagramoptions = (x, p, level) -> contparams
this function allows to change thecontinuation
options depending on the branchinglevel
. The argumentx, p
denotes the current solution toF(x, p)=0
.kwargs
optional arguments. Look atbifurcationdiagram!
for more details.
Simplified call:
We also provide the method
bifurcationdiagram(prob, br::ContResult, level::Int, options; kwargs...)
where br
is a branch computed after a call to continuation
from which we want to compute the bifurcating branches recursively.
BifurcationKit.biorthogonalise
— Methodbiorthogonalise(ζs, ζ★s, verbose; _dot)
Bi-orthogonalise the two sets of vectors.
Optional argument
_dot = dot
specify your own dot product
BifurcationKit.bogdanov_takens_normal_form
— Methodbogdanov_takens_normal_form(
prob_ma,
L,
pt;
δ,
verbose,
detailed,
autodiff,
bls,
bls_block
)
Compute the Bogdanov-Takens normal form.
Arguments
prob_ma
aFoldProblemMinimallyAugmented
orHopfProblemMinimallyAugmented
pt::BogdanovTakens
BogdanovTakens bifurcation pointls
linear solver
Optional arguments
δ = 1e-8
used for finite differencesverbose
bool to print informationautodiff = true
only for Bogdanov-Takens point. Whether to use ForwardDiff for the many differentiations that are required to compute the normal form.detailed = true
only for Bogdanov-Takens point. Whether to compute only a simplified normal form.
BifurcationKit.bogdanov_takens_normal_form
— Methodbogdanov_takens_normal_form(
_prob,
br,
ind_bif;
δ,
nev,
verbose,
ζs,
ζs_ad,
lens,
Teigvec,
scaleζ,
bls,
bls_adjoint,
bls_block,
detailed,
autodiff
)
Compute the Bogdanov-Takens normal form.
Arguments
prob
bifurcation problem, typicallybr.prob
br
branch result from a call tocontinuation
ind_bif
index of the bifurcation point inbr
options
options for the Newton solver
Optional arguments
δ = 1e-8
used for finite differences with respect to parametersnev = 5
number of eigenvalues to compute to estimate the spectral projectorverbose
bool to print informationautodiff = true
Whether to use ForwardDiff for the many differentiations that are required to compute the normal form.detailed = true
Whether to compute only a simplified normal form where not all coefficients are computed.ζs
list of vectors spanning the kernel ofdF
at the bifurcation point. Useful to enforce the basis for the normal form.ζs_ad
list of vectors spanning the kernel oftranspose(dF)
at the bifurcation point. Useful to enforce the basis for the normal form. The vectors must be listed so that the corresponding eigenvalues are equals to the ones associated to each vector in ζs.scaleζ
function to normalise the kernel basis. Indeed, when used with large vectors andnorm
, it results in ζs and the normal form coefficient being super small.bls
specify Bordered linear solver for dF.bls_adjoint
specify Bordered linear solver for transpose(dF).
BifurcationKit.branch_normal_form
— Method[WIP] Note that the computation of this normal form is not implemented yet.
BifurcationKit.bt_point
— MethodFor an initial guess from the index of a BT bifurcation point located in ContResult.specialpoint, returns a point which will be refined using newtonBT
.
BifurcationKit.compute_error!
— Methodcompute_error!(coll, x; normE, verbosity, K, par, kw...)
Perform mesh adaptation of the periodic orbit problem. Modify pb
and x
inplace if the adaptation is successfull.
See page 367 of [1] and also [2].
References: [1] Ascher, Uri M., Robert M. M. Mattheij, and Robert D. Russell. Numerical Solution of Boundary Value Problems for Ordinary Differential Equations. Society for Industrial and Applied Mathematics, 1995. https://doi.org/10.1137/1.9781611971231.
[2] R. D. Russell and J. Christiansen, “Adaptive Mesh Selection Strategies for Solving Boundary Value Problems,” SIAM Journal on Numerical Analysis 15, no. 1 (February 1978): 59–80, https://doi.org/10.1137/0715004.
BifurcationKit.continuation
— Functioncontinuation(br, ind_bif, lens2; ...)
continuation(
br,
ind_bif,
lens2,
options_cont;
prob,
start_with_eigen,
detect_codim2_bifurcation,
update_minaug_every_step,
kwargs...
)
Codimension 2 continuation of Fold / Hopf points. This function turns an initial guess for a Fold / Hopf point into a curve of Fold / Hopf points based on a Minimally Augmented formulation. The arguments are as follows
br
results returned after a call to continuationind_bif
bifurcation index inbr
lens2
second parameter used for the continuation, the first one is the one used to computebr
, e.g.getlens(br)
options_cont = br.contparams
arguments to be passed to the regular continuation
Optional arguments:
bdlinsolver
bordered linear solver for the constraint equationupdate_minaug_every_step
update vectorsa, b
in Minimally Formulation everyupdate_minaug_every_step
stepsstart_with_eigen = false
whether to start the Minimally Augmented problem with information from eigen elementsdetect_codim2_bifurcation ∈ {0,1,2}
whether to detect Bogdanov-Takens, Bautin and Cusp. If equals1
non precise detection is used. If equals2
, a bisection method is used to locate the bifurcations.kwargs
keywords arguments to be passed to the regular continuation
where the parameters are as above except that you have to pass the branch br
from the result of a call to continuation
with detection of bifurcations enabled and index
is the index of Hopf point in br
you want to refine.
For ODE problems, it is more efficient to use the Matrix based Bordered Linear Solver passing the option bdlinsolver = MatrixBLS()
It is recommended that you use the option start_with_eigen = true
BifurcationKit.continuation
— Methodcontinuation(
probPO,
orbitguess,
alg,
contParams,
linear_algo;
δ,
eigsolver,
record_from_solution,
plot_solution,
kwargs...
)
This is the continuation method for computing a periodic orbit using a (Standard / Poincaré) Shooting method.
Arguments
Similar to continuation
except that probPO
is either a ShootingProblem
or a PoincareShootingProblem
. By default, it prints the period of the periodic orbit.
Optional arguments
eigsolver
specify an eigen solver for the computation of the Floquet exponents, defaults toFloquetQaD
jacobian
Specify the choice of the linear algorithm, which must belong to[AutoDiffMF(), MatrixFree(), AutodiffDense(), AutoDiffDenseAnalytical(), FiniteDifferences(), FiniteDifferencesMF()]
. This is used to select a way of inverting the jacobian dG- For
MatrixFree()
, matrix free jacobian, the jacobian is specified by the user inprob
. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutoDiffMF()
, we use Automatic Differentiation (AD) to compute the (matrix-free) derivative ofx -> prob(x, p)
using a directional derivative. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutodiffDense()
. Same as forAutoDiffMF
but the jacobian is formed as a dense Matrix. You can use a direct solver or an iterative one. - For
FiniteDifferences()
, same as forAutoDiffDense
but we use Finite Differences to compute the jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument. - For
AutoDiffDenseAnalytical()
. Same as forAutoDiffDense
but the jacobian is formed using a mix of AD and analytical formula. - For
FiniteDifferencesMF()
, use Finite Differences to compute the matrix-free jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument.
- For
BifurcationKit.continuation
— Methodcontinuation(
prob,
alg,
contparams;
linear_algo,
bothside,
kwargs...
)
Compute the continuation curve associated to the functional F
which is stored in the bifurcation problem prob
. General information is available in Continuation methods: introduction.
Arguments:
prob::AbstractBifurcationFunction
a::AbstractBifurcationProblem
, typically aBifurcationProblem
which holds the vector field and its jacobian. We also refer toBifFunction
for more details.alg
continuation algorithm, for exampleNatural(), PALC(), Multiple(),...
. See algoscontparams::ContinuationPar
parameters for continuation. SeeContinuationPar
Optional Arguments:
plot = false
whether to plot the solution/branch/spectrum while computing the branchbothside = true
compute the branches on the two sides of the initial parameter valuep0
, merge them and return it.normC = norm
norm used in the nonlinear solvesfilename
to save the computed branch during continuation. The identifier .jld2 will be appended to this filename. This requiresusing JLD2
.callback_newton
callback for newton iterations. See docs ofnewton
. For example, it can be used to change the preconditioners.finalise_solution = (z, tau, step, contResult; kwargs...) -> true
Function called at the end of each continuation step. Can be used to alter the continuation procedure (stop it by returningfalse
), save personal data, plot... The notations arez = BorderedArray(x, p)
wherex
(resp.p
) is the current solution (resp. parameter value),tau::BorderedArray
is the tangent atz
,step::Int
is the index of the current continuation step andcontResult
is the current branch. For advanced use:- the state
state::ContState
of the continuation iterator is passed inkwargs
. This can be used for testing whether this is called from bisection for locating bifurcation points / events:in_bisection(state)
for example. This allows to escape some personal code in this case.
- the iterator
iter::ContIterable
of the continuation is passed inkwargs
.
- the state
verbosity::Int = 0
controls the amount of information printed during the continuation process. Must belong to{0,1,2,3}
. In casecontparams.newton_options.verbose = false
, the following is valid (otherwise the newton iterations are shown). Each case prints more information than the previous one:- case 0: print nothing
- case 1: print basic information about the continuation: used predictor, step size and parameter values
- case 2: print newton iterations number, stability of solution, detected bifurcations / events
- case 3: print information during bisection to locate bifurcations / events
linear_algo
set the linear solver for the continuation algorithmalg.
For example,PALC
needs a linear solver for an enlarged problem (sizen+1
instead ofn
) and one thus needs to tune the one passed incontparams.newton_options.linsolver
. This is a convenient argument to thus change thealg
linear solver and is used mostly internally. The proper way is to pass directly toalg
the correct linear solver.kind::AbstractContinuationKind
[Internal] flag to describe continuation kind (equilibrium, codim 2, ...). Default =EquilibriumCont()
Output:
contres::ContResult
composite type which contains the computed branch. SeeContResult
for more information.
Just change the sign of ds
in ContinuationPar
.
Use debug mode to access more irformation about the progression of the continuation run, like iterative solvers convergence, problem update, ...
BifurcationKit.continuation
— Methodcontinuation(
prob,
algdc,
contParams;
verbosity,
plot,
linear_algo,
dot_palc,
callback_newton,
filename,
normC,
kwcont...
)
This function computes the set of curves of solutions γ(s) = (x(s), p(s))
to the equation F(x,p) = 0
based on the algorithm of deflated continuation as described in Farrell, Patrick E., Casper H. L. Beentjes, and Ásgeir Birkisson. “The Computation of Disconnected Bifurcation Diagrams.” ArXiv:1603.00809 [Math], March 2, 2016. http://arxiv.org/abs/1603.00809.
Depending on the options in contParams
, it can locate the bifurcation points on each branch. Note that you can specify different predictors using alg
.
Arguments:
prob::AbstractBifurcationProblem
bifurcation problemalg::DefCont
, deflated continuation algorithm, seeDefCont
contParams
parameters for continuation. SeeContinuationPar
for more information about the options
Optional Arguments:
plot = false
whether to plot the solution while computing,callback_newton
callback for newton iterations. see docs fornewton
. Can be used to change preconditioners or affect the newton iterations. In the deflation part of the algorithm, when seeking for new branches, the callback is passed the keyword argumentfromDeflatedNewton = true
to tell the user can it is not in the continuation part (regular newton) of the algorithm,verbosity::Int
controls the amount of information printed during the continuation process. Must belong to{0,⋯,5}
,normC = norm
norm used in the Newton solves,dot_palc = (x, y) -> dot(x, y) / length(x)
, dot product used to define the weighted dot product (resp. norm) $\|(x, p)\|^2_\theta$ in the constraint $N(x, p)$ (see online docs on PALC). This argument can be used to remove the factor1/length(x)
for example in problems where the dimension of the state space changes (mesh adaptation, ...),
Outputs:
contres::DCResult
composite type which contains the computed branches. SeeContResult
for more information,
BifurcationKit.continuation
— Methodcontinuation(
br,
ind_bif,
_contParams,
pbPO;
prob_vf,
alg,
δp,
ampfactor,
usedeflation,
nev,
kwargs...
)
Perform automatic branch switching from a Hopf bifurcation point labelled ind_bif
in the list of the bifurcated points of a previously computed branch br::ContResult
. It first computes a Hopf normal form.
Arguments
br
branch result from a call tocontinuation
ind_hopf
index of the bifurcation point inbr
contParams
parameters for the call tocontinuation
probPO
problem used to specify the way the periodic orbit is computed. It can bePeriodicOrbitTrapProblem
,ShootingProblem
orPoincareShootingProblem
.
Optional arguments
alg = br.alg
continuation algorithmδp
used to specify a particular guess for the parameter on the bifurcated branch which is otherwise determined bycontParams.ds
. This allows to use a step larger thancontParams.dsmax
.ampfactor = 1
factor to 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 branchnev
number of eigenvalues to be computed to get the right eigenvector- all
kwargs
fromcontinuation
A modified version of prob
is passed to plot_solution
and finalise_solution
.
You have to be careful about the options contParams.newton_options.linsolver
. In the case of Matrix-Free solver, you have to pass the right number of unknowns N * M + 1
. Note that the options for the preconditioner are not accessible yet.
BifurcationKit.continuation
— Methodcontinuation(
prob,
orbitguess,
alg,
_contParams;
linear_algo,
kwargs...
)
This is the continuation routine for computing a periodic orbit using a (Standard / Poincaré) Shooting method.
Arguments
Similar to continuation
except that prob
is either a ShootingProblem
or a PoincareShootingProblem
. By default, it prints the period of the periodic orbit.
Optional argument
linear_algo::AbstractBorderedLinearSolver
jacobian
Specify the choice of the linear algorithm, which must belong to[AutoDiffMF(), MatrixFree(), AutodiffDense(), AutoDiffDenseAnalytical(), FiniteDifferences(), FiniteDifferencesMF()]
. This is used to select a way of inverting the jacobian dG- For
MatrixFree()
, matrix free jacobian, the jacobian is specified by the user inprob
. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutoDiffMF()
, we use Automatic Differentiation (AD) to compute the (matrix-free) derivative ofx -> prob(x, p)
using a directional derivative. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutodiffDense()
. Same as forAutoDiffMF
but the jacobian is formed as a dense Matrix. You can use a direct solver or an iterative one. - For
FiniteDifferences()
, same as forAutoDiffDense
but we use Finite Differences to compute the jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument. - For
AutoDiffDenseAnalytical()
. Same as forAutoDiffDense
but the jacobian is formed using a mix of AD and analytical formula. - For
FiniteDifferencesMF()
, use Finite Differences to compute the matrix-free jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument.
- For
BifurcationKit.continuation
— Methodcontinuation(
probPO,
orbitguess,
alg,
_contParams,
linear_algo;
δ,
eigsolver,
record_from_solution,
plot_solution,
kwargs...
)
This is the continuation method for computing a periodic orbit using an orthogonal collocation method.
Arguments
Similar to continuation
except that prob
is a PeriodicOrbitOCollProblem
. By default, it prints the period of the periodic orbit.
Keywords arguments
eigsolver
specify an eigen solver for the computation of the Floquet exponents, defaults toFloquetQaD
BifurcationKit.continuation
— Methodcontinuation(
prob,
orbitguess,
alg,
_contParams;
894,
record_from_solution,
linear_algo,
kwargs...
)
This is the continuation routine for computing a periodic orbit using a functional G based on Finite Differences and a Trapezoidal rule.
Arguments
prob::PeriodicOrbitTrapProblem
encodes the functional Gorbitguess
a guess for the periodic orbit whereorbitguess[end]
is an estimate of the period of the orbit. It could be a vector of sizeN * M + 1
whereM
is the number of time slices,N
is the dimension of the phase space. This must be compatible with the numbersN, M
inprob
.alg
continuation algorithmcontParams
same as for the regularcontinuation
method
Keyword arguments
linear_algo
same as incontinuation
Specify the choice of the jacobian (and linear algorithm), jacobian
must belong to [:FullLU, :FullSparseInplace, :Dense, :DenseAD, :BorderedLU, :BorderedSparseInplace, :FullMatrixFree, :BorderedMatrixFree, :FullMatrixFreeAD]
. This is used to select a way of inverting the jacobian dG
of the functional G.
- For
jacobian = :FullLU
, we use the default linear solver based on a sparse matrix representation ofdG
. This matrix is assembled at each newton iteration. This is the default algorithm. - For
jacobian = :FullSparseInplace
, this is the same as for:FullLU
but the sparse matrixdG
is updated inplace. This method allocates much less. In some cases, this is significantly faster than using:FullLU
. Note that this method can only be used if the sparsity pattern of the jacobian is always the same. - For
jacobian = :Dense
, same as above but the matrixdG
is dense. It is also updated inplace. This option is useful to study ODE of small dimension. - For
jacobian = :DenseAD
, evaluate the jacobian using ForwardDiff - For
jacobian = :BorderedLU
, we take advantage of the bordered shape of the linear solver and use a LU decomposition to invertdG
using a bordered linear solver. - For
jacobian = :BorderedSparseInplace
, this is the same as for:BorderedLU
but the cyclic matrixdG
is updated inplace. This method allocates much less. In some cases, this is significantly faster than using:BorderedLU
. Note that this method can only be used if the sparsity pattern of the jacobian is always the same. - For
jacobian = :FullMatrixFree
, a matrix free linear solver is used fordG
: note that a preconditioner is very likely required here because of the cyclic shape ofdG
which affects negatively the convergence properties of GMRES. - For
jacobian = :BorderedMatrixFree
, a matrix free linear solver is used but forJc
only (see docs): it means thatoptions.linsolver
is used to invertJc
. These two Matrix-Free options thus expose different part of the jacobiandG
in order to use specific preconditioners. For example, an ILU preconditioner onJc
could remove the constraints indG
and lead to poor convergence. Of course, for these last two methods, a preconditioner is likely to be required. - For
jacobian = :FullMatrixFreeAD
, the evaluation map of the differential is derived using automatic differentiation. Thus, unlike the previous two cases, the user does not need to pass a Matrix-Free differential.
Note that by default, the method prints the period of the periodic orbit as function of the parameter. This can be changed by providing your record_from_solution
argument.
BifurcationKit.continuation
— Methodcontinuation(br, ind_bif; ...)
continuation(
br,
ind_bif,
options_cont;
alg,
δp,
ampfactor,
nev,
usedeflation,
verbosedeflation,
max_iter_deflation,
perturb,
plot_solution,
Teigvec,
scaleζ,
tol_fold,
kwargs_deflated_newton,
kwargs...
)
Automatic branch switching at branch points based on a computation of the normal form. More information is provided in Branch switching. An example of use is provided in 2d generalized Bratu–Gelfand problem.
Arguments
br
branch result from a call tocontinuation
ind_bif
index of the bifurcation point inbr
from which you want to branch fromoptions_cont
options for the call tocontinuation
Optional arguments
alg = br.alg
continuation algorithm to be used, default value:br.alg
δp
used to specify a specific value for the parameter on the bifurcated branch which is otherwise determined byoptions_cont.ds
. This allows to use a step larger thanoptions_cont.dsmax
.ampfactor = 1
factor to alter the amplitude of the bifurcated solution. Useful to magnify the bifurcated solution when the bifurcated branch is very steep. Can also be used to select the upper/lower branch in Pitchfork bifurcations.nev
number of eigenvalues to be computed to get the right eigenvectorusedeflation = false
whether to use nonlinear deflation (see Deflated problems) to help finding the guess on the bifurcatedverbosedeflation
print deflated newton iterationsmax_iter_deflation
number of newton steps in deflated newtonperturb = identity
which perturbation function to use during deflated newtonTeigvec = _getvectortype(br)
type of the eigenvector. Useful whenbr
was loaded from a file and this information was lostscaleζ = norm
pass a norm to normalize vectors during normal form computationplot_solution
change plot solution method in the problembr.prob
kwargs
optional arguments to be passed tocontinuation
, the regularcontinuation
one and toget_normal_form
.
In the case of a very large model and use of special hardware (GPU, cluster), we suggest to discouple the computation of the reduced equation, the predictor and the bifurcated branches. Have a look at methods(BifurcationKit.multicontinuation)
to see how to call these versions. These methods has been tested on GPU with very high memory pressure.
BifurcationKit.continuation
— Methodcontinuation(
br,
ind_bif,
_contParams;
alg,
δp,
ampfactor,
usedeflation,
linear_algo,
detailed,
prm,
override,
kwargs...
)
Branch switching at a bifurcation point on a branch of periodic orbits (PO) specified by a br::AbstractBranchResult
. The functional used to compute the PO is br.prob
. A deflated Newton-Krylov solver can be used to improve the branch switching capabilities.
Arguments
br
branch of periodic orbits computed with aPeriodicOrbitTrapProblem
ind_bif
index of the branch point_contParams
parameters to be used by a regularcontinuation
Optional arguments
δp = 0.1
used to specify a particular guess for the parameter in the branch which is otherwise determined bycontParams.ds
. This allows to use a step larger thancontParams.dsmax
.ampfactor = 1
factor which alters the amplitude of the bifurcated solution. Useful to magnify the bifurcated solution when the bifurcated branch is very steep.detailed = false
whether to fully compute the normal form.usedeflation = true
whether to use nonlinear deflation (see Deflated problems) to help finding the guess on the bifurcated branchrecord_from_solution = (u, p) -> u[end]
, record method used in the bifurcation diagram, by default this records the period of the periodic orbit.linear_algo = BorderingBLS()
, same as forcontinuation
kwargs
keywords arguments used for a call to the regularcontinuation
and the ones specific to periodic orbits (POs).
BifurcationKit.continuation
— Methodcontinuation(
prob,
x0,
par0,
x1,
p1,
alg,
lens,
contParams;
bothside,
kwargs...
)
[Internal] This function is not meant to be called directly.
This function is the analog of continuation
when the first two points on the branch are passed (instead of a single one). Hence x0
is the first point on the branch (with palc s=0
) with parameter par0
and x1
is the second point with parameter set(par0, lens, p1)
.
BifurcationKit.continuation_coll_fold
— Methodcontinuation_coll_fold(br, ind_bif, lens2; ...)
continuation_coll_fold(
br,
ind_bif,
lens2,
options_cont;
start_with_eigen,
bdlinsolver,
kwargs...
)
Continuation of curve of fold bifurcations of periodic orbits computed using collocation method.
Arguments
br
branch of periodic orbits computed with aPeriodicOrbitTrapProblem
ind_bif
index of the fold pointlens2::AllOpticTypes
second parameter axisoptions_cont
parameters to be used by a regularcontinuation
BifurcationKit.continuation_coll_ns
— Methodcontinuation_coll_ns(br, ind_bif, lens2; ...)
continuation_coll_ns(
br,
ind_bif,
lens2,
options_cont;
alg,
start_with_eigen,
bdlinsolver,
prm,
kwargs...
)
Continuation of curve of Neimark-Sacker bifurcations of periodic orbits computed using collocation method.
Arguments
br
branch of periodic orbits computed with aPeriodicOrbitTrapProblem
ind_bif
index of the NS pointlens2::AllOpticTypes
second parameter axisoptions_cont
parameters to be used by a regularcontinuation
BifurcationKit.continuation_coll_pd
— Methodcontinuation_coll_pd(br, ind_bif, lens2; ...)
continuation_coll_pd(
br,
ind_bif,
lens2,
options_cont;
alg,
start_with_eigen,
bdlinsolver,
prm,
kwargs...
)
Continuation of curve of period-doubling bifurcations of periodic orbits computed using collocation method.
Arguments
br
branch of periodic orbits computed with aPeriodicOrbitTrapProblem
ind_bif
index of the PD pointlens2::AllOpticTypes
second parameter axisoptions_cont
parameters to be used by a regularcontinuation
BifurcationKit.continuation_fold
— Methodcontinuation_fold(
prob,
alg,
foldpointguess,
par,
lens1,
lens2,
eigenvec,
eigenvec_ad,
options_cont;
update_minaug_every_step,
normC,
bdlinsolver,
bdlinsolver_adjoint,
jacobian_ma,
compute_eigen_elements,
usehessian,
kind,
record_from_solution,
kwargs...
)
Codim 2 continuation of Fold points. This function turns an initial guess for a Fold point into a curve of Fold points based on a Minimally Augmented formulation. The arguments are as follows
prob::AbstractBifurcationFunction
foldpointguess
initial guess (x0, p10) for the Fold point. It should be aBorderedArray
as returned by the functionfoldpoint
par
set of parameterslens1
parameter axis for parameter 1lens2
parameter axis for parameter 2eigenvec
guess for the right null vectoreigenvec_ad
guess for the left null vectoroptions_cont
arguments to be passed to the regularcontinuation
Optional arguments:
jacobian_ma::Symbol = :autodiff
, how the linear system of the Fold problem is solved. Can be:autodiff, :finiteDifferencesMF, :finiteDifferences, :minaug
bdlinsolver
bordered linear solver for the constraint equation with top-left block J. Required in the linear solver for the Minimally Augmented Fold functional. This option can be used to pass a dedicated linear solver for example with specific preconditioner.bdlinsolver_adjoint
bordered linear solver for the constraint equation with top-left block J^*. Required in the linear solver for the Minimally Augmented Fold functional. This option can be used to pass a dedicated linear solver for example with specific preconditioner.update_minaug_every_step
update vectorsa, b
in Minimally Formulation everyupdate_minaug_every_step
stepscompute_eigen_elements = false
whether to compute eigenelements. Ifoptions_cont.detect_event>0
, it allows the detection of ZH points.kwargs
keywords arguments to be passed to the regularcontinuation
Simplified call
continuation_fold(br::AbstractBranchResult, ind_fold::Int64, lens2::AllOpticTypes, options_cont::ContinuationPar ; kwargs...)
where the parameters are as above except that you have to pass the branch br
from the result of a call to continuation
with detection of bifurcations enabled and index
is the index of Fold point in br
that you want to continue.
The adjoint of the jacobian J
is computed internally when Jᵗ = nothing
by using transpose(J)
which works fine when J
is an AbstractArray
. In this case, do not pass the jacobian adjoint like Jᵗ = (x, p) -> transpose(d_xF(x, p))
otherwise the jacobian would be computed twice!
For ODE problems, it is more efficient to use the Matrix based Bordered Linear Solver passing the option bdlinsolver = MatrixBLS()
. This is the default setting.
In order to trigger the detection, pass detect_event = 1 or 2
in options_cont
.
BifurcationKit.continuation_hopf
— Methodcontinuation_hopf(
prob_vf,
alg,
hopfpointguess,
par,
lens1,
lens2,
eigenvec,
eigenvec_ad,
options_cont;
update_minaug_every_step,
normC,
linsolve_adjoint,
bdlinsolver,
bdlinsolver_adjoint,
jacobian_ma,
compute_eigen_elements,
usehessian,
kind,
massmatrix,
record_from_solution,
kwargs...
)
codim 2 continuation of Hopf points. This function turns an initial guess for a Hopf point into a curve of Hopf points based on a Minimally Augmented formulation. The arguments are as follows
prob::AbstractBifurcationProblem
hopfpointguess
initial guess (x0, p10) for the Hopf point. It should be aVector
or aBorderedArray
par
set of parameterslens1
parameter axis for parameter 1lens2
parameter axis for parameter 2eigenvec
guess for the iω eigenvector at p1_0eigenvec_ad
guess for the -iω eigenvector at p1_0options_cont
keywords arguments to be passed to the regularcontinuation
Optional arguments:
jacobian_ma::Symbol = :autodiff
, how the linear system of the Fold problem is solved. Can be:autodiff, :finiteDifferencesMF, :finiteDifferences, :minaug
linsolve_adjoint
solver for (J+iω)^* ⋅sol = rhsbdlinsolver
bordered linear solver for the constraint equation with top-left block (J-iω). Required in the linear solver for the Minimally Augmented Hopf functional. This option can be used to pass a dedicated linear solver for example with specific preconditioner.bdlinsolver_adjoint
bordered linear solver for the constraint equation with top-left block (J-iω)^*. Required in the linear solver for the Minimally Augmented Hopf functional. This option can be used to pass a dedicated linear solver for example with specific preconditioner.update_minaug_every_step
update vectorsa,b
in Minimally Formulation everyupdate_minaug_every_step
stepscompute_eigen_elements = false
whether to compute eigenelements. Ifoptions_cont.detect_event>0
, it allows the detection of ZH, HH points.kwargs
keywords arguments to be passed to the regularcontinuation
Simplified call:
continuation_hopf(br::AbstractBranchResult, ind_hopf::Int, lens2::AllOpticTypes, options_cont::ContinuationPar ; kwargs...)
where the parameters are as above except that you have to pass the branch br
from the result of a call to continuation
with detection of bifurcations enabled and index
is the index of Hopf point in br
that you want to refine.
For ODE problems, it is more efficient to use the Matrix based Bordered Linear Solver passing the option bdlinsolver = MatrixBLS()
. This is the default setting.
The adjoint of the jacobian J
is computed internally when Jᵗ = nothing
by using transpose(J)
which works fine when J
is an AbstractArray
. In this case, do not pass the jacobian adjoint like Jᵗ = (x, p) -> transpose(d_xF(x, p))
otherwise the jacobian would be computed twice!
In order to trigger the detection, pass detect_event = 1,2
in options_cont
. Note that you need to provide d3F
in prob
.
BifurcationKit.continuation_potrap
— Methodcontinuation_potrap(
prob,
orbitguess,
alg,
contParams,
linear_algo;
eigsolver,
record_from_solution,
plot_solution,
kwargs...
)
This is the continuation routine for computing a periodic orbit using a functional G based on Finite Differences and a Trapezoidal rule.
Arguments
prob::PeriodicOrbitTrapProblem
encodes the functional Gorbitguess
a guess for the periodic orbit whereorbitguess[end]
is an estimate of the period of the orbit. It could be a vector of sizeN * M + 1
whereM
is the number of time slices,N
is the dimension of the phase space. This must be compatible with the numbersN, M
inprob
.alg
continuation algorithmcontParams
same as for the regularcontinuation
methodlinear_algo
same as incontinuation
Keywords arguments
eigsolver
specify an eigen solver for the computation of the Floquet exponents, defaults toFloquetQaD
Specify the choice of the jacobian (and linear algorithm), jacobian
must belong to [:FullLU, :FullSparseInplace, :Dense, :DenseAD, :BorderedLU, :BorderedSparseInplace, :FullMatrixFree, :BorderedMatrixFree, :FullMatrixFreeAD]
. This is used to select a way of inverting the jacobian dG
of the functional G.
- For
jacobian = :FullLU
, we use the default linear solver based on a sparse matrix representation ofdG
. This matrix is assembled at each newton iteration. This is the default algorithm. - For
jacobian = :FullSparseInplace
, this is the same as for:FullLU
but the sparse matrixdG
is updated inplace. This method allocates much less. In some cases, this is significantly faster than using:FullLU
. Note that this method can only be used if the sparsity pattern of the jacobian is always the same. - For
jacobian = :Dense
, same as above but the matrixdG
is dense. It is also updated inplace. This option is useful to study ODE of small dimension. - For
jacobian = :DenseAD
, evaluate the jacobian using ForwardDiff - For
jacobian = :BorderedLU
, we take advantage of the bordered shape of the linear solver and use a LU decomposition to invertdG
using a bordered linear solver. - For
jacobian = :BorderedSparseInplace
, this is the same as for:BorderedLU
but the cyclic matrixdG
is updated inplace. This method allocates much less. In some cases, this is significantly faster than using:BorderedLU
. Note that this method can only be used if the sparsity pattern of the jacobian is always the same. - For
jacobian = :FullMatrixFree
, a matrix free linear solver is used fordG
: note that a preconditioner is very likely required here because of the cyclic shape ofdG
which affects negatively the convergence properties of GMRES. - For
jacobian = :BorderedMatrixFree
, a matrix free linear solver is used but forJc
only (see docs): it means thatoptions.linsolver
is used to invertJc
. These two Matrix-Free options thus expose different part of the jacobiandG
in order to use specific preconditioners. For example, an ILU preconditioner onJc
could remove the constraints indG
and lead to poor convergence. Of course, for these last two methods, a preconditioner is likely to be required. - For
jacobian = :FullMatrixFreeAD
, the evaluation map of the differential is derived using automatic differentiation. Thus, unlike the previous two cases, the user does not need to pass a Matrix-Free differential.
Note that by default, the method prints the period of the periodic orbit as function of the parameter. This can be changed by providing your record_from_solution
argument.
BifurcationKit.continuation_sh_fold
— Methodcontinuation_sh_fold(br, ind_bif, lens2; ...)
continuation_sh_fold(
br,
ind_bif,
lens2,
options_cont;
start_with_eigen,
bdlinsolver,
Jᵗ,
kwargs...
)
Continuation of curve of fold bifurcations of periodic orbits computed using shooting method.
Arguments
br
branch of periodic orbits computed with aPeriodicOrbitTrapProblem
ind_bif
index of the fold pointlens2::AllOpticTypes
second parameter axisoptions_cont
parameters to be used by a regularcontinuation
BifurcationKit.continuation_sh_ns
— Methodcontinuation_sh_ns(br, ind_bif, lens2; ...)
continuation_sh_ns(
br,
ind_bif,
lens2,
options_cont;
alg,
start_with_eigen,
bdlinsolver,
kwargs...
)
Continuation of curve of Neimark-Sacker bifurcations of periodic orbits computed using shooting method.
Arguments
br
branch of periodic orbits computed with aPeriodicOrbitTrapProblem
ind_bif
index of the NS pointlens2::AllOpticTypes
second parameter axisoptions_cont
parameters to be used by a regularcontinuation
BifurcationKit.continuation_sh_pd
— Methodcontinuation_sh_pd(br, ind_bif, lens2; ...)
continuation_sh_pd(
br,
ind_bif,
lens2,
options_cont;
alg,
start_with_eigen,
Jᵗ,
kwargs...
)
Continuation of curve of period-doubling bifurcations of periodic orbits computed using shooting method.
Arguments
br
branch of periodic orbits computed with aPeriodicOrbitTrapProblem
ind_bif
index of the PD pointlens2::AllOpticTypes
second parameter axisoptions_cont
parameters to be used by a regularcontinuation
BifurcationKit.correct_bifurcation
— Methodcorrect_bifurcation(contres)
This function uses information in the branch to detect codim 2 bifurcations like BT, ZH and Cusp.
BifurcationKit.cusp_normal_form
— Methodcusp_normal_form(
_prob,
br,
ind_bif;
δ,
nev,
verbose,
ζs,
lens,
Teigvec,
scaleζ
)
Compute the Cusp normal form.
Arguments
prob
bifurcation problempt::Cusp
Cusp bifurcation pointls
linear solver
Optional arguments
δ = 1e-8
used for finite differencesverbose
bool to print information
BifurcationKit.cylic_potrap_block!
— MethodThis function populates Jc with the cyclic matrix using the different Jacobians
BifurcationKit.detect_loop
— Methoddetect_loop(br, x, p; rtol, verbose)
Function to detect continuation branches which loop on themselves.
BifurcationKit.diff_poincare_map
— MethodThis function computes the derivative of the Poincare return map Π(x) = ϕ(t(x),x) where t(x) is the return time of x to the section.
BifurcationKit.eigenvals
— Functioneigenvals(br, ind)
eigenvals(br, ind, verbose)
Return the eigenvalues of the ind-th continuation step. verbose
is used to tell the number of unstable eigen elements.
Note that ind = 0
is allowed.
BifurcationKit.eigenvalsfrombif
— Methodeigenvalsfrombif(br, ind)
Return the eigenvalues of the ind-th bifurcation point.
BifurcationKit.eigenvec
— Methodeigenvec(br, ind, indev)
Return the indev-th eigenvectors of the ind-th continuation step.
BifurcationKit.finite_differences!
— Methodfinite_differences!(F, J, x; δ)
Compute a Jacobian by Finite Differences, update J. Use the centered formula (f(x+δ)-f(x-δ))/2δ.
BifurcationKit.finite_differences
— Methodfinite_differences(F, x; δ)
Compute a Jacobian by Finite Differences. Use the centered formula (f(x+δ)-f(x-δ))/2δ.
BifurcationKit.foldpoint
— Methodfoldpoint(br, index)
For an initial guess from the index of a Fold bifurcation point located in ContResult.specialpoint, returns a point which will can refined using newtonFold
.
BifurcationKit.from
— Methodfrom(br)
Return the bifurcation point of a ::Branch
.
BifurcationKit.generate_ci_problem
— Methodgenerate_ci_problem(
pb,
bifprob,
sol,
period;
optimal_period
)
Generate a periodic orbit problem from a solution.
Arguments
pb
aPeriodicOrbitOCollProblem
which provides basic information, like the number of time slicesM
bifprob
a bifurcation problem to provide the vector fieldsol
basically anODEProblem
or a functiont -> sol(t)
period
estimate of the period of the periodic orbit
Output
- returns a
PeriodicOrbitOCollProblem
and an initial guess.
BifurcationKit.generate_ci_problem
— Methodgenerate_ci_problem(
pb,
bifprob,
sol,
tspan;
optimal_period,
ktrap...
)
Generate a periodic orbit problem from a solution.
Arguments
pb
aPeriodicOrbitTrapProblem
which provides basic information, like the number of time slicesM
bifprob
a bifurcation problem to provide the vector fieldsol
basically, andODEProblem
tspan = (0,1.)
estimate of the time span (period) of the periodic orbit
Output
- returns a
PeriodicOrbitTrapProblem
and an initial guess.
BifurcationKit.generate_ci_problem
— Methodgenerate_ci_problem(
pb,
bifprob,
prob_de,
sol,
tspan;
alg,
ksh...
)
Generate a periodic orbit problem from a solution.
Arguments
pb
aPoincareShootingProblem
which provides basic information, like the number of time slicesM
bifprob
a bifurcation problem to provide the vector fieldprob_de::ODEProblem
associated tosol
sol
basically, and `ODEProblemperiod
estimate of the period of the periodic orbitk
kwargs arguments passed to the constructor ofShootingProblem
Output
- returns a
ShootingProblem
and an initial guess.
BifurcationKit.generate_ci_problem
— Methodgenerate_ci_problem(
shooting,
bifprob,
prob_de,
sol,
tspan;
prob_mono,
alg,
alg_mono,
use_bordered_array,
ksh...
)
Generate a periodic orbit problem from a solution.
Arguments
pb
aShootingProblem
which provides basic information, like the number of time slicesM
bifprob
a bifurcation problem to provide the vector fieldprob_de::ODEProblem
associated tosol
sol
basically anODEProblem
or a functiont -> sol(t)
tspan::Tuple
estimate of the period of the periodic orbitalg
algorithm for solving the Cauchy problemprob_mono
problem for monodromyalg_mono
algorithm for solving the monodromy Cauchy problemk
kwargs arguments passed to the constructor ofShootingProblem
Output
- returns a
ShootingProblem
and an initial guess.
BifurcationKit.generate_solution
— Methodgenerate_solution(pb, orbit, period)
This function generates an initial guess for the solution of the problem pb
based on the orbit t -> orbit(t)
for t ∈ [0, 2π] and the period period
.
BifurcationKit.generate_solution
— Methodgenerate_solution(pb, orbit, period)
This function generates an initial guess for the solution of the problem pb
based on the orbit t -> orbit(t * period)
for t ∈ [0,1] and the period
.
BifurcationKit.get_Ls
— MethodL, ∂L = get_Ls(pb)
Return the collocation matrices for evaluation and derivation.
BifurcationKit.get_adjoint_basis
— Methodget_adjoint_basis(L★, λ, eigsolver; nev, verbose)
Return a left eigenvector for an eigenvalue closest to λ. nev
indicates how many eigenvalues must be computed by the eigensolver. Indeed, for iterative solvers, it may be needed to compute more eigenvalues than necessary.
BifurcationKit.get_bifurcation_type
— MethodFunction for coarse detection of bifurcation points.
BifurcationKit.get_blocks
— Methodget_blocks(coll, Jac)
This function extracts the indices of the blocks composing the matrix J which is a M x M Block matrix where each block N x N has the same sparsity.
BifurcationKit.get_blocks
— Methodget_blocks(A, N, M)
This function extracts the indices of the blocks composing the matrix A which is a M x M Block matrix where each block N x N has the same sparsity.
BifurcationKit.get_branch
— Methodget_branch(diagram, code)
Return the part of the diagram (bifurcation diagram) by recursively descending down the diagram using the Int
valued tuple code
. For example get_branch(diagram, (1,2,3,))
returns diagram.child[1].child[2].child[3]
.
BifurcationKit.get_branches_from_BP
— Methodget_branches_from_BP(diagram, indbif)
Return the part of the diagram corresponding to the indbif-th bifurcation point on the root branch.
BifurcationKit.get_first_points_on_branch
— Functionget_first_points_on_branch(br, bpnf, solfromRE; ...)
get_first_points_on_branch(
br,
bpnf,
solfromRE,
options_cont;
δp,
Teigvec,
usedeflation,
verbosedeflation,
max_iter_deflation,
lsdefop,
perturb_guess,
kwargs...
)
Function to transform predictors solfromRE
in the normal form coordinates of bpnf
into solutions. Note that solfromRE = (before = Vector{vectype}, after = Vector{vectype})
.
BifurcationKit.get_normal_form
— Methodget_normal_form(
prob,
br,
id_bif;
nev,
verbose,
ζs,
ζs_ad,
lens,
Teigvec,
scaleζ,
detailed,
autodiff,
bls,
bls_adjoint,
bls_block
)
Compute the normal form of the bifurcation point located at br.specialpoint[ind_bif]
.
Arguments
prob::AbstractBifurcationProblem
br
result from a call tocontinuation
ind_bif
index of the bifurcation point inbr.specialpoint
Optional arguments
nev
number of eigenvalues used to compute the spectral projection. This number has to be adjusted when used with iterative methods.verbose
whether to display informationζs
list of vectors spanning the kernel ofdF
at the bifurcation point. Useful to enforce the basis for the normal form.lens::Lens
specify which parameter to take the partial derivative ∂pFscaleζ
function to normalise the kernel basis. Indeed, when used with large vectors andnorm
, it results in ζs and the normal form coefficient being super small.autodiff = true
whether to use ForwardDiff for the differentiations w.r.t the parameters that are required to compute the normal form. Used for example for Bogdanov-Takens point. You can set toautodiff = false
if you wish.detailed = true
whether to compute only a simplified normal form. Used for example for Bogdanov-Takens point.bls = MatrixBLS()
specify Bordered linear solver. Used for example for Bogdanov-Takens point.bls_adjoint = bls
specify Bordered linear solver for the adjoint problem.bls_block = bls
specify Bordered linear solver when the border has dimension 2 (1 forbls
).
Available method
You can directly call
get_normal_form(br, ind_bif ; kwargs...)
which is a shortcut for get_normal_form(getprob(br), br, ind_bif ; kwargs...)
.
Once the normal form nf
has been computed, you can call predictor(nf, δp)
to obtain an estimate of the bifurcating branch.
BifurcationKit.get_normal_form
— Methodget_normal_form(
prob,
br,
id_bif;
nev,
verbose,
ζs,
lens,
Teigvec,
scaleζ,
prm,
autodiff,
detailed,
δ
)
Compute the normal form of periodic orbits. We detail the additional keyword arguments specific to periodic orbits
Optional arguments
prm = true
compute the normal form using Poincaré return map (PRM). If false, use the Iooss normal form.
BifurcationKit.get_normal_form1d
— Methodget_normal_form1d(
prob,
br,
ind_bif;
nev,
verbose,
lens,
Teigvec,
tol_fold,
scaleζ,
autodiff
)
Compute a normal form based on Golubitsky, Martin, David G Schaeffer, and Ian Stewart. Singularities and Groups in Bifurcation Theory. New York: Springer-Verlag, 1985, VI.1.d page 295.
BifurcationKit.get_normal_form1d_maps
— Methodget_normal_form1d_maps(
prob,
bp,
ls;
bls,
verbose,
tol_fold,
scaleζ,
autodiff
)
Compute a normal form based on Golubitsky, Martin, David G Schaeffer, and Ian Stewart. Singularities and Groups in Bifurcation Theory. New York: Springer-Verlag, 1985, VI.1.d page 295.
Note
We could have copied the implementation of get_normal_form1d
but we would have to redefine the jacobian which for shooting problem might sound a bit hacky. Nevertheless, it amounts to applying the same result to G(x) ≡ F(x) - x. Hence, we only chnage the linear solvers below.
BifurcationKit.get_periodic_orbit
— Methodget_periodic_orbit(prob, u, p)
Compute the full periodic orbit associated to x
. Mainly for plotting purposes.
BifurcationKit.get_periodic_orbit
— Methodget_periodic_orbit(prob, u, p)
Compute the full periodic orbit associated to x
. Mainly for plotting purposes.
BifurcationKit.get_periodic_orbit
— Methodget_periodic_orbit(prob, x_bar, p)
Compute the full periodic orbit associated to x
. Mainly for plotting purposes.
BifurcationKit.get_periodic_orbit
— Methodget_periodic_orbit(prob, x, par; kode...)
Compute the full periodic orbit associated to x
. Mainly for plotting purposes.
BifurcationKit.get_solp
— Methodget_solp(br, ind)
Return the parameter for the ind-th point stored in br.sol
BifurcationKit.get_solx
— Methodget_solx(br, ind)
Return the solution for the ind-th point stored in br.sol
BifurcationKit.get_time_diff
— Methodget_time_diff(pb, u)
Compute norm(du/dt)
BifurcationKit.get_times
— Methodget_times(cache)
Return all the times at which the problem is evaluated.
BifurcationKit.getamplitude
— Methodgetamplitude(prob, x, p; ratio)
Compute the amplitude of the periodic orbit associated to x
. The keyword argument ratio = 1
is used as follows. If length(x) = ratio * n
, the call returns the amplitude over x[1:n]
.
BifurcationKit.getamplitude
— Methodgetamplitude(prob, x, p; ratio)
Compute the amplitude of the periodic orbit associated to x
. The keyword argument ratio = 1
is used as follows. If length(x) = 1 + ratio * n
, the call returns the amplitude over x[1:n]
.
BifurcationKit.getmaximum
— Methodgetmaximum(prob, x, p; ratio)
Compute the maximum of the periodic orbit associated to x
. The keyword argument ratio = 1
is used as follows. If length(x) = ratio * n
, the call returns the amplitude over x[1:n]
.
BifurcationKit.getmaximum
— Methodgetmaximum(prob, x, p)
Compute the maximum of the periodic orbit associated to x
.
BifurcationKit.getmaximum
— Methodgetmaximum(prob, x, p; ratio)
Compute the maximum of the periodic orbit associated to x
. The keyword argument ratio = 1
is used as follows. If length(x) = 1 + ratio * n
, the call returns the amplitude over x[1:n]
.
BifurcationKit.getmesh
— MethodReturns the vector of size m+1, 0 = τ₁ < τ₂ < ... < τₘ < τₘ₊₁ = 1
BifurcationKit.getparams
— MethodReturn the parameters of the bifurcation problem.
BifurcationKit.getparams
— MethodReturn the parameters of the bifurcation problem of the branch.
BifurcationKit.getperiod
— Functiongetperiod(, x)
getperiod(, x, par)
Compute the period of the periodic orbit associated to x
.
BifurcationKit.getperiod
— Methodgetperiod(prob, x, p)
Compute the period of the periodic orbit associated to x
.
BifurcationKit.getperiod
— Methodgetperiod(psh, x_bar, par)
Compute the period of the periodic orbit associated to x_bar
.
BifurcationKit.guess_from_hopf
— Methodguess_from_hopf(
br,
ind_hopf,
eigsolver,
M,
amplitude;
phase
)
This function returns several useful quantities regarding a Hopf bifurcation point. More precisely, it returns:
- the parameter value at which a Hopf bifurcation occurs
- the period of the bifurcated periodic orbit
- a guess for the bifurcated periodic orbit
- the equilibrium at the Hopf bifurcation point
- the eigenvector at the Hopf bifurcation point.
The arguments are
br
: the continuation branch which lists the Hopf bifurcation pointsind_hopf
: index of the bifurcation branch, as inbr.specialpoint
eigsolver
: the eigen solver used to find the eigenvectorsM
number of time slices in the periodic orbit guessamplitude
: amplitude of the periodic orbit guess
BifurcationKit.hopfMALinearSolver
— MethodThis function solves the linear problem associated with a linearization of the minimally augmented formulation of the Hopf bifurcation point. The keyword debugArray
is used to debug the routine by returning several key quantities.
BifurcationKit.hopf_normal_form
— Methodhopf_normal_form(
prob,
br,
ind_hopf;
nev,
verbose,
lens,
Teigvec,
detailed,
scaleζ
)
Compute the Hopf normal form.
Arguments
prob::AbstractBifurcationProblem
bifurcation problembr
branch result from a call tocontinuation
ind_hopf
index of the bifurcation point inbr
options
options for the Newton solver
Optional arguments
nev = 5
number of eigenvalues to compute to estimate the spectral projectorverbose
bool to print information
Available method
Once the normal form hopfnf
has been computed, you can call predictor(hopfnf, ds)
to obtain an estimate of the bifurcating periodic orbit.
BifurcationKit.hopf_normal_form
— Methodhopf_normal_form(prob, pt, ls; verbose, L)
Compute the Hopf normal form.
Arguments
prob::AbstractBifurcationProblem
bifurcation problempt::Hopf
Hopf bifurcation pointls
linear solver
Optional arguments
verbose
bool to print information
BifurcationKit.init
— MethodAllows to alter the continuation parameters based on the bifurcation problem and the continuation algorithm.
BifurcationKit.is_stable
— MethodThis function checks whether the solution with eigenvalues eigvalues
is stable. It also computes the number of unstable eigenvalues with nonzero imaginary part
BifurcationKit.jacobian_potrap_block
— MethodMatrix by blocks expression of the Jacobian for the PO functional computed at the space-time guess: u0
BifurcationKit.kernel_dimension
— Methodkernel_dimension(bp)
Return the dimension of the kernel of the special point.
BifurcationKit.locate_bifurcation!
— FunctionFunction to locate precisely bifurcation points using a bisection algorithm. We make sure that at the end of the algorithm, the state is just after the bifurcation point (in the s coordinate).
BifurcationKit.mod_counter
— Methodmod_counter(step, everyN)
This function implements a counter. If everyN == 0
, it returns false. Otherwise, it returns true
when step
is a multiple of everyN
BifurcationKit.multicontinuation
— Functionmulticontinuation(br, bpnf, defOpm, defOpp; ...)
multicontinuation(
br,
bpnf,
defOpm,
defOpp,
options_cont;
alg,
δp,
Teigvec,
verbosedeflation,
max_iter_deflation,
lsdefop,
plot_solution,
kwargs...
)
Automatic branch switching at branch points based on a computation of the normal form. More information is provided in Branch switching. An example of use is provided in 2d generalized Bratu–Gelfand problem.
Arguments
br
branch result from a call tocontinuation
bpnf
normal formdefOpm::DeflationOperator, defOpp::DeflationOperator
to specify converged points on nonn-trivial branches before/after the bifurcation points.
The rest is as the regular multicontinuation
function.
BifurcationKit.multicontinuation
— Functionmulticontinuation(br, ind_bif; ...)
multicontinuation(
br,
ind_bif,
options_cont;
δp,
ampfactor,
nev,
Teigvec,
ζs,
verbosedeflation,
scaleζ,
perturb_guess,
plot_solution,
kwargs...
)
Automatic branch switching at branch points based on a computation of the normal form. More information is provided in Branch switching. An example of use is provided in 2d generalized Bratu–Gelfand problem.
Arguments
br
branch result from a call tocontinuation
ind_bif
index of the bifurcation point inbr
from which you want to branch fromoptions_cont
options for the call tocontinuation
Optional arguments
alg = br.alg
continuation algorithm to be used, default value:br.alg
δp
used to specify a particular guess for the parameter on the bifurcated branch which is otherwise determined byoptions_cont.ds
. This allows to use a step larger thanoptions_cont.dsmax
.ampfactor = 1
factor which alters the amplitude of the bifurcated solution. Useful to magnify the bifurcated solution when the bifurcated branch is very steep.nev
number of eigenvalues to be computed to get the right eigenvectorverbosedeflation = true
whether to display the nonlinear deflation iterations (see Deflated problems) to help finding the guess on the bifurcated branchscaleζ
norm used to normalize eigenbasis when computing the reduced equationTeigvec
type of the eigenvector. Useful whenbr
was loaded from a file and this information was lostζs
basis of the kernelperturb_guess = identity
perturb the guess from the predictor just before the deflated-newton correctionkwargs
optional arguments to be passed tocontinuation
, the regularcontinuation
one.
In the case of a very large model and use of special hardware (GPU, cluster), we suggest to discouple the computation of the reduced equation, the predictor and the bifurcated branches. Have a look at methods(BifurcationKit.multicontinuation)
to see how to call these versions. These methods has been tested on GPU with very high memory pressure.
BifurcationKit.neimark_sacker_normal_form
— Methodneimark_sacker_normal_form(
prob,
br,
ind_ns;
nev,
verbose,
lens,
Teigvec,
detailed,
scaleζ
)
Compute the Neimark-Sacker normal form.
Arguments
prob::AbstractBifurcationProblem
bifurcation problembr
branch result from a call tocontinuation
ind_ns
index of the bifurcation point inbr
options
options for the Newton solver
Optional arguments
nev = 5
number of eigenvalues to compute to estimate the spectral projectorverbose
bool to print informationdetailed = false
compute the coefficient a in the normal form
BifurcationKit.neimark_sacker_normal_form
— Methodneimark_sacker_normal_form(prob, pt, ls; detailed, verbose)
Compute the Neimark-Sacker normal form.
Arguments
prob::AbstractBifurcationProblem
bifurcation problempt::NeimarkSacker
Neimark-Sacker bifurcation pointls
linear solver
Optional arguments
verbose
bool to print information
BifurcationKit.newton
— Methodnewton(prob, orbitguess, options; lens, δ, kwargs...)
This is the Newton-Krylov Solver for computing a periodic orbit using the (Standard / Poincaré) Shooting method. Note that the linear solver has to be appropriately set up in options
.
Arguments
Similar to newton
except that prob
is either a ShootingProblem
or a PoincareShootingProblem
. These two problems have specific options to be tuned, we refer to their link for more information and to the tutorials.
prob
a problem of type<: AbstractShootingProblem
encoding the shooting functional G.orbitguess
a guess for the periodic orbit. SeeShootingProblem
and SeePoincareShootingProblem
for information regarding the shape oforbitguess
.par
parameters to be passed to the functionaloptions
same as for the regularnewton
method.
Optional argument
jacobian
Specify the choice of the linear algorithm, which must belong to[AutoDiffMF(), MatrixFree(), AutodiffDense(), AutoDiffDenseAnalytical(), FiniteDifferences(), FiniteDifferencesMF()]
. This is used to select a way of inverting the jacobian dG- For
MatrixFree()
, matrix free jacobian, the jacobian is specified by the user inprob
. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutoDiffMF()
, we use Automatic Differentiation (AD) to compute the (matrix-free) derivative ofx -> prob(x, p)
using a directional derivative. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutodiffDense()
. Same as forAutoDiffMF
but the jacobian is formed as a dense Matrix. You can use a direct solver or an iterative one. - For
FiniteDifferences()
, same as forAutoDiffDense
but we use Finite Differences to compute the jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument. - For
AutoDiffDenseAnalytical()
. Same as forAutoDiffDense
but the jacobian is formed using a mix of AD and analytical formula. - For
FiniteDifferencesMF()
, use Finite Differences to compute the matrix-free jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument.
- For
BifurcationKit.newton
— Method newton(prob::AbstractBifurcationProblem, options::NewtonPar; normN = norm, callback = (;x, fx, J, residual, step, itlinear, options, x0, residuals; kwargs...) -> true, kwargs...)
This is the Newton-Krylov Solver for F(x, p0) = 0
with Jacobian w.r.t. x
written J(x, p0)
and initial guess x0
. It is important to set the linear solver options.linsolver
properly depending on your problem. This linear solver is used to solve $J(x, p_0)u = -F(x, p_0)$ in the Newton step. You can for example use linsolver = DefaultLS()
which is the operator backslash: it works well for Sparse / Dense matrices. See Linear solvers (LS) for more informations.
Arguments
prob
a::AbstractBifurcationProblem
, typically aBifurcationProblem
which holds the vector field and its jacobian. We also refer toBifFunction
for more details.options::NewtonPar
variable holding the internal parameters used by thenewton
method
Optional Arguments
normN = norm
specifies a norm for the convergence criteriacallback
function passed by the user which is called at the end of each iteration. The default one is the followingcb_default((x, fx, J, residual, step, itlinear, options, x0, residuals); k...) = true
. Can be used to update a preconditionner for example. You can use for examplecbMaxNorm
to limit the residuals norms. If yo want to specify your own, the arguments passed to the callback are as followsx
current solutionfx
current residualJ
current jacobianresidual
current norm of the residualstep
current newton stepitlinear
number of iterations to solve the linear systemoptions
a copy of the argumentoptions
passed tonewton
residuals
the history of residualskwargs
kwargs arguments, contain your initial guessx0
kwargs
arguments passed to the callback. Useful whennewton
is called fromcontinuation
Output:
solution::NonLinearSolution
, we refer toNonLinearSolution
for more information.
Make sure that the linear solver (Matrix-Free...) corresponds to your jacobian (Matrix-Free vs. Matrix based).
BifurcationKit.newton
— Methodnewton(
br,
ind_bif;
normN,
options,
start_with_eigen,
lens2,
kwargs...
)
This function turns an initial guess for a Fold / Hopf point into a solution to the Fold / Hopf problem based on a Minimally Augmented formulation.
Arguments
br
results returned after a call to continuationind_bif
bifurcation index inbr
Optional arguments:
options::NewtonPar
, default valuebr.contparams.newton_options
normN = norm
options
You can pass newton parameters different from the ones stored inbr
by using this argumentoptions
.bdlinsolver
bordered linear solver for the constraint equationstart_with_eigen = false
whether to start the Minimally Augmented problem with information from eigen elements.kwargs
keywords arguments to be passed to the regular Newton-Krylov solver
For ODE problems, it is more efficient to use the Matrix based Bordered Linear Solver passing the option bdlinsolver = MatrixBLS()
It is recommended that you use the option start_with_eigen=true
BifurcationKit.newton
— Methodnewton(probPO, orbitguess, defOp, options; kwargs...)
This function is similar to newton(probPO, orbitguess, options, jacobianPO; kwargs...)
except that it uses deflation in order to find periodic orbits different from the ones stored in defOp
. We refer to the mentioned method for a full description of the arguments. The current method can be used in the vicinity of a Hopf bifurcation to prevent the Newton-Krylov algorithm from converging to the equilibrium point.
BifurcationKit.newton
— Methodnewton(probPO, orbitguess, options; kwargs...)
This is the Newton Solver for computing a periodic orbit using orthogonal collocation method. Note that the linear solver has to be apropriately set up in options
.
Arguments
Similar to newton
except that prob
is a PeriodicOrbitOCollProblem
.
prob
a problem of type<: PeriodicOrbitOCollProblem
encoding the shooting functional G.orbitguess
a guess for the periodic orbit.options
same as for the regularnewton
method.
Optional argument
jacobian
Specify the choice of the linear algorithm, which must belong to(AutoDiffDense(), )
. This is used to select a way of inverting the jacobian dG- For
AutoDiffDense()
. The jacobian is formed as a dense Matrix. You can use a direct solver or an iterative one usingoptions
. The jacobian is formed inplace. - For
DenseAnalytical()
Same as forAutoDiffDense
but the jacobian is formed using a mix of AD and analytical formula.
- For
BifurcationKit.newton
— Methodnewton(probPO, orbitguess, options; kwargs...)
This is the Krylov-Newton Solver for computing a periodic orbit using a functional G based on Finite Differences and a Trapezoidal rule.
Arguments:
prob
a problem of typePeriodicOrbitTrapProblem
encoding the functional Gorbitguess
a guess for the periodic orbit whereorbitguess[end]
is an estimate of the period of the orbit. It should be a vector of sizeN * M + 1
whereM
is the number of time slices,N
is the dimension of the phase space. This must be compatible with the numbersN, M
inprob
.par
parameters to be passed to the functionaloptions
same as for the regularnewton
method
Specify the choice of the jacobian (and linear algorithm), jacobian
must belong to [:FullLU, :FullSparseInplace, :Dense, :DenseAD, :BorderedLU, :BorderedSparseInplace, :FullMatrixFree, :BorderedMatrixFree, :FullMatrixFreeAD]
. This is used to select a way of inverting the jacobian dG
of the functional G.
- For
jacobian = :FullLU
, we use the default linear solver based on a sparse matrix representation ofdG
. This matrix is assembled at each newton iteration. This is the default algorithm. - For
jacobian = :FullSparseInplace
, this is the same as for:FullLU
but the sparse matrixdG
is updated inplace. This method allocates much less. In some cases, this is significantly faster than using:FullLU
. Note that this method can only be used if the sparsity pattern of the jacobian is always the same. - For
jacobian = :Dense
, same as above but the matrixdG
is dense. It is also updated inplace. This option is useful to study ODE of small dimension. - For
jacobian = :DenseAD
, evaluate the jacobian using ForwardDiff - For
jacobian = :BorderedLU
, we take advantage of the bordered shape of the linear solver and use a LU decomposition to invertdG
using a bordered linear solver. - For
jacobian = :BorderedSparseInplace
, this is the same as for:BorderedLU
but the cyclic matrixdG
is updated inplace. This method allocates much less. In some cases, this is significantly faster than using:BorderedLU
. Note that this method can only be used if the sparsity pattern of the jacobian is always the same. - For
jacobian = :FullMatrixFree
, a matrix free linear solver is used fordG
: note that a preconditioner is very likely required here because of the cyclic shape ofdG
which affects negatively the convergence properties of GMRES. - For
jacobian = :BorderedMatrixFree
, a matrix free linear solver is used but forJc
only (see docs): it means thatoptions.linsolver
is used to invertJc
. These two Matrix-Free options thus expose different part of the jacobiandG
in order to use specific preconditioners. For example, an ILU preconditioner onJc
could remove the constraints indG
and lead to poor convergence. Of course, for these last two methods, a preconditioner is likely to be required. - For
jacobian = :FullMatrixFreeAD
, the evaluation map of the differential is derived using automatic differentiation. Thus, unlike the previous two cases, the user does not need to pass a Matrix-Free differential.
BifurcationKit.newton
— MethodThis specific Newton-Krylov method first tries to converge to a solution sol0
close the guess x0
. It then attempts to converge from the guess x1
while avoiding the previous converged solution close to sol0
. This is very handy for branch switching. The method is based on a deflated Newton-Krylov solver.
Arguments
Compared to newton
, the only different arguments are
defOp::DeflationOperator
deflation operatorlinsolver
linear solver used to invert the Jacobian of the deflated functional.- custom solver
DeflatedProblemCustomLS()
which requires solving two linear systemsJ⋅x = rhs
. - For other linear solvers
<: AbstractLinearSolver
, a matrix free method is used for the deflated functional. - if passed
Val(:autodiff)
, thenForwardDiff.jl
is used to compute the jacobian Matrix of the deflated problem - if passed
Val(:fullIterative)
, then a full matrix free method is used for the deflated problem.
- custom solver
BifurcationKit.newton
— Methodnewton(prob, orbitguess, defOp, options; lens, kwargs...)
This is the deflated Newton-Krylov Solver for computing a periodic orbit using a (Standard / Poincaré) Shooting method.
Arguments
Similar to newton
except that prob
is either a ShootingProblem
or a PoincareShootingProblem
.
Optional argument
jacobian
Specify the choice of the linear algorithm, which must belong to[AutoDiffMF(), MatrixFree(), AutodiffDense(), AutoDiffDenseAnalytical(), FiniteDifferences(), FiniteDifferencesMF()]
. This is used to select a way of inverting the jacobian dG- For
MatrixFree()
, matrix free jacobian, the jacobian is specified by the user inprob
. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutoDiffMF()
, we use Automatic Differentiation (AD) to compute the (matrix-free) derivative ofx -> prob(x, p)
using a directional derivative. This is to be used with an iterative solver (e.g. GMRES) to solve the linear system - For
AutodiffDense()
. Same as forAutoDiffMF
but the jacobian is formed as a dense Matrix. You can use a direct solver or an iterative one. - For
FiniteDifferences()
, same as forAutoDiffDense
but we use Finite Differences to compute the jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument. - For
AutoDiffDenseAnalytical()
. Same as forAutoDiffDense
but the jacobian is formed using a mix of AD and analytical formula. - For
FiniteDifferencesMF()
, use Finite Differences to compute the matrix-free jacobian ofx -> prob(x, p)
using theδ = 1e-8
which can be passed as an argument.
- For
Output:
- solution::NonLinearSolution, see
NonLinearSolution
BifurcationKit.newton
— Methodnewton(prob, defOp, options; ...)
newton(prob, defOp, options, _linsolver; kwargs...)
This is the deflated version of the Krylov-Newton Solver for F(x, p0) = 0
.
We refer to the regular newton
for more information. It penalises the roots saved in defOp.roots
. The other arguments are as for newton
. See DeflationOperator
for more information on defOp
.
Arguments
Compared to newton
, the only different arguments are
defOp::DeflationOperator
deflation operatorlinsolver
linear solver used to invert the Jacobian of the deflated functional.- custom solver
DeflatedProblemCustomLS()
which requires solving two linear systemsJ⋅x = rhs
. - For other linear solvers
<: AbstractLinearSolver
, a matrix free method is used for the deflated functional. - if passed
Val(:autodiff)
, thenForwardDiff.jl
is used to compute the jacobian Matrix of the deflated problem - if passed
Val(:fullIterative)
, then a full matrix free method is used for the deflated problem.
- custom solver
BifurcationKit.newton
— Methodnewton(probPO, orbitguess, defOp, options; kwargs...)
This function is similar to newton(probPO, orbitguess, options, jacobianPO; kwargs...)
except that it uses deflation in order to find periodic orbits different from the ones stored in defOp
. We refer to the mentioned method for a full description of the arguments. The current method can be used in the vicinity of a Hopf bifurcation to prevent the Newton-Krylov algorithm from converging to the equilibrium point.
BifurcationKit.newton_bt
— Methodnewton_bt(
prob,
btpointguess,
par,
lens2,
eigenvec,
eigenvec_ad,
options;
normN,
jacobian_ma,
usehessian,
bdlinsolver,
bdlinsolver_adjoint,
bdlinsolver_block,
kwargs...
)
This function turns an initial guess for a BT point into a solution to the BT problem based on a Minimally Augmented formulation. The arguments are as follows
prob::AbstractBifurcationFunction
btpointguess
initial guess (x0, p0) for the BT point. It should be aBorderedArray
as returned by the functionBTPoint
par
parameters used for the vector fieldeigenvec
guess for the 0 eigenvectoreigenvec_ad
guess for the 0 adjoint eigenvectoroptions::NewtonPar
options for the Newton-Krylov algorithm, seeNewtonPar
.
Optional arguments:
normN = norm
bdlinsolver
bordered linear solver for the constraint equationjacobian_ma::Symbol = true
specify the way the (newton) linear system is solved. Can be (:autodiff, :finitedifferences, :minaug)kwargs
keywords arguments to be passed to the regular Newton-Krylov solver
Simplified call
Simplified call to refine an initial guess for a BT point. More precisely, the call is as follows
newton(br::AbstractBranchResult, ind_bt::Int; options = br.contparams.newton_options, kwargs...)
The parameters / options are as usual except that you have to pass the branch br
from the result of a call to continuation
with detection of bifurcations enabled and index
is the index of bifurcation point in br
you want to refine. You can pass newton parameters different from the ones stored in br
by using the argument options
.
The adjoint of the jacobian J
is computed internally when Jᵗ = nothing
by using transpose(J)
which works fine when J
is an AbstractArray
. In this case, do not pass the jacobian adjoint like Jᵗ = (x, p) -> transpose(d_xF(x, p))
otherwise the jacobian will be computed twice!
For ODE problems, it is more efficient to pass the option jacobian_ma = :autodiff
BifurcationKit.newton_bt
— Methodnewton_bt(
br,
ind_bt;
probvf,
normN,
options,
nev,
start_with_eigen,
bdlinsolver,
bdlinsolver_adjoint,
kwargs...
)
This function turns an initial guess for a Bogdanov-Takens point into a solution to the Bogdanov-Takens problem based on a Minimally Augmented formulation.
Arguments
br
results returned after a call to continuationind_bif
bifurcation index inbr
Optional arguments:
options::NewtonPar
, default valuebr.contparams.newton_options
normN = norm
options
You can pass newton parameters different from the ones stored inbr
by using this argumentoptions
.jacobian_ma::Symbol = true
specify the way the (newton) linear system is solved. Can be (:autodiff, :finitedifferences, :minaug)bdlinsolver
bordered linear solver for the constraint equationstart_with_eigen = false
whether to start the Minimally Augmented problem with information from eigen elements.kwargs
keywords arguments to be passed to the regular Newton-Krylov solver
For ODE problems, it is more efficient to pass the option jacobian = :autodiff
For ODE problems, it is more efficient to pass the option start_with_eigen = true
BifurcationKit.newton_fold
— Methodnewton_fold(
prob,
foldpointguess,
par,
eigenvec,
eigenvec_ad,
options;
normN,
bdlinsolver,
usehessian,
kwargs...
)
This function turns an initial guess for a Fold point into a solution to the Fold problem based on a Minimally Augmented formulation. The arguments are as follows
prob::AbstractBifurcationFunction
foldpointguess
initial guess (x0, p0) for the Fold point. It should be aBorderedArray
as returned by the functionfoldpoint
par
parameters used for the vector fieldeigenvec
guess for the right null vectoreigenvec_ad
guess for the left null vectoroptions::NewtonPar
options for the Newton-Krylov algorithm, seeNewtonPar
.
Optional arguments:
normN = norm
bdlinsolver
bordered linear solver for the constraint equationkwargs
keywords arguments to be passed to the regular Newton-Krylov solver
Simplified call
Simplified call to refine an initial guess for a Fold point. More precisely, the call is as follows
newtonFold(br::AbstractBranchResult, ind_fold::Int; options = br.contparams.newton_options, kwargs...)
The parameters / options are as usual except that you have to pass the branch br
from the result of a call to continuation
with detection of bifurcations enabled and index
is the index of bifurcation point in br
you want to refine. You can pass newton parameters different from the ones stored in br
by using the argument options
.
The adjoint of the jacobian J
is computed internally when Jᵗ = nothing
by using transpose(J)
which works fine when J
is an AbstractArray
. In this case, do not pass the jacobian adjoint like Jᵗ = (x, p) -> transpose(d_xF(x, p))
otherwise the jacobian will be computed twice!
For ODE problems, it is more efficient to pass the Bordered Linear Solver using the option bdlinsolver = MatrixBLS()
BifurcationKit.newton_hopf
— Methodnewton_hopf(
prob,
hopfpointguess,
par,
eigenvec,
eigenvec_ad,
options;
normN,
bdlinsolver,
usehessian,
kwargs...
)
This function turns an initial guess for a Hopf point into a solution to the Hopf problem based on a Minimally Augmented formulation. The arguments are as follows
prob::AbstractBifurcationProblem
wherep
is a set of parameters.hopfpointguess
initial guess (x0, p0) for the Hopf point. It should aBorderedArray
as returned by the functionHopfPoint
.par
parameters used for the vector fieldeigenvec
guess for the iω eigenvectoreigenvec_ad
guess for the -iω eigenvectoroptions::NewtonPar
options for the Newton-Krylov algorithm, seeNewtonPar
.
Optional arguments:
normN = norm
bdlinsolver
bordered linear solver for the constraint equationkwargs
keywords arguments to be passed to the regular Newton-Krylov solver
Simplified call:
Simplified call to refine an initial guess for a Hopf point. More precisely, the call is as follows
newton_hopf(br::AbstractBranchResult, ind_hopf::Int; normN = norm, options = br.contparams.newton_options, kwargs...)
The parameters / options are as usual except that you have to pass the branch br
from the result of a call to continuation
with detection of bifurcations enabled and index
is the index of bifurcation point in br
you want to refine. You can pass newton parameters different from the ones stored in br
by using the argument options
.
The adjoint of the jacobian J
is computed internally when Jᵗ = nothing
by using transpose(J)
which works fine when J
is an AbstractArray
. In this case, do not pass the jacobian adjoint like Jᵗ = (x, p) -> transpose(d_xF(x, p))
otherwise the jacobian will be computed twice!
For ODE problems, it is more efficient to use the Matrix based Bordered Linear Solver passing the option bdlinsolver = MatrixBLS()
BifurcationKit.newton_palc
— FunctionThis is the classical Newton-Krylov solver for F(x, p) = 0
together with the scalar condition n(x, p) ≡ θ ⋅ <x - x0, τx> + (1-θ) ⋅ (p - p0) * τp - n0 = 0
. This makes a problem of dimension N + 1.
The initial guess for the newton method is located in state.z_pred
BifurcationKit.newton_pd
— Methodnewton_pd(
prob,
pdpointguess,
par,
eigenvec,
eigenvec_ad,
options;
normN,
bdlinsolver,
usehessian,
kwargs...
)
This function turns an initial guess for a PD point into a solution to the PD problem based on a Minimally Augmented formulation. The arguments are as follows
prob::AbstractBifurcationFunction
pdpointguess
initial guess (x0, p0) for the PD point. It should be aBorderedArray
as returned by the functionPDPoint
par
parameters used for the vector fieldeigenvec
guess for the 0 eigenvectoreigenvec_ad
guess for the 0 adjoint eigenvectoroptions::NewtonPar
options for the Newton-Krylov algorithm, seeNewtonPar
.
Optional arguments:
normN = norm
bdlinsolver
bordered linear solver for the constraint equationkwargs
keywords arguments to be passed to the regular Newton-Krylov solver
Simplified call
Simplified call to refine an initial guess for a PD point. More precisely, the call is as follows
newton_pd(br::AbstractBranchResult, ind_pd::Int; options = br.contparams.newton_options, kwargs...)
The parameters / options are as usual except that you have to pass the branch br
from the result of a call to continuation
with detection of bifurcations enabled and index
is the index of bifurcation point in br
you want to refine. You can pass newton parameters different from the ones stored in br
by using the argument options
.
The adjoint of the jacobian J
is computed internally when Jᵗ = nothing
by using transpose(J)
which works fine when J
is an AbstractArray
. In this case, do not pass the jacobian adjoint like Jᵗ = (x, p) -> transpose(d_xF(x, p))
otherwise the jacobian will be computed twice!
For ODE problems, it is more efficient to pass the Bordered Linear Solver using the option bdlinsolver = MatrixBLS()
BifurcationKit.nf
— Methodnf(bp; tol, digits)
Print the normal form bp
with a nice string.
BifurcationKit.ns_point
— Methodns_point(br, index)
For an initial guess from the index of a NS bifurcation point located in ContResult.specialpoint, returns a point which will be refined using newtonFold
.
BifurcationKit.pd_point
— Methodpd_point(br, index)
For an initial guess from the index of a PD bifurcation point located in ContResult.specialpoint, returns a point which will be refined using newton_fold
.
BifurcationKit.phase_condition
— Methodphase_condition(pb, uc, Ls, period)
[INTERNAL] Implementation of phase condition ∫_0^T < u(t), ∂ϕ(t) > dt. Note that it works for non uniform mesh.
Arguments
Ls = (L, ∂L)
fromget_Ls
- uj n x (m + 1)
- guj n x m
BifurcationKit.potrap_functional!
— MethodThis function implements the functional for finding periodic orbits based on finite differences using the Trapezoidal rule. It works for inplace / out of place vector fields pb.F
BifurcationKit.potrap_functional_jac!
— MethodMatrix free expression of the Jacobian of the problem for computing periodic obits when evaluated at u
and applied to du
.
BifurcationKit.predictor
— Methodpredictor(nf, δp, ampfactor; override)
Compute the predictor for the simple branch point of periodic orbit.
BifurcationKit.predictor
— Methodpredictor(hp, ds; verbose, ampfactor)
This function provides prediction for the periodic orbits branching off the Hopf bifurcation point.
Arguments
bp::Hopf
the bifurcation pointds
at with distance relative to the bifurcation point do you want the prediction. Can be negative. Basically the new parameter isp = bp.p + ds
.
Optional arguments
verbose
display informationampfactor = 1
factor multiplied to the amplitude of the periodic orbit.
Returned values
t -> orbit(t)
2π periodic function guess for the bifurcated orbit.amp
amplitude of the guess of the bifurcated periodic orbits.ω
frequency of the periodic orbit (corrected with normal form coefficients)period
of the periodic orbit (corrected with normal form coefficients)p
new parameter valuedsfactor
factor which has been multiplied toabs(ds)
in order to select the correct side of the bifurcation point where the bifurcated branch exists.
BifurcationKit.predictor
— Methodpredictor(nf, δp, ampfactor; override)
Compute the predictor for the period bifurcation of periodic orbit.
BifurcationKit.predictor
— Methodpredictor(gh, , ϵ; verbose, ampfactor)
Compute the predictor for the curve of Folds of periodic orbits near the Bautin bifurcation point.
Reference
Kuznetsov, Yu A., H. G. E. Meijer, W. Govaerts, and B. Sautois. “Switching to Nonhyperbolic Cycles from Codim 2 Bifurcations of Equilibria in ODEs.” Physica D: Nonlinear Phenomena 237, no. 23 (December 2008): 3061–68. https://doi.org/10.1016/j.physd.2008.06.006.
BifurcationKit.predictor
— Methodpredictor(bt, , ds; verbose, ampfactor)
Compute the predictor for the Fold curve near the Bogdanov-Takens point.
BifurcationKit.predictor
— Methodpredictor(bt, , ds; verbose, ampfactor)
Compute the predictor for the curve of homoclinic orbits near the Bogdanov-Takens point.
Reference
Al-Hdaibat, B., W. Govaerts, Yu. A. Kuznetsov, and H. G. E. Meijer. “Initialization of Homoclinic Solutions near Bogdanov–Takens Points: Lindstedt–Poincaré Compared with Regular Perturbation Method.” SIAM Journal on Applied Dynamical Systems 15, no. 2 (January 2016): 952–80. https://doi.org/10.1137/15M1017491.
BifurcationKit.predictor
— Methodpredictor(bt, , ds; verbose, ampfactor)
Compute the predictor for the Hopf curve near the Bogdanov-Takens point.
BifurcationKit.predictor
— Methodpredictor(hh, , ds; verbose, ampfactor)
Compute the predictor for the Hopf curve near the Hopf-Hopf bifurcation point.
BifurcationKit.predictor
— Methodpredictor(hh, , ϵ; verbose, ampfactor)
Compute the predictor for the curve of Neimark-Sacker points near the Hopf-Hopf bifurcation point.
Reference
Kuznetsov, Yu A., H. G. E. Meijer, W. Govaerts, and B. Sautois. “Switching to Nonhyperbolic Cycles from Codim 2 Bifurcations of Equilibria in ODEs.” Physica D: Nonlinear Phenomena 237, no. 23 (December 2008): 3061–68. https://doi.org/10.1016/j.physd.2008.06.006.
BifurcationKit.predictor
— Methodpredictor(
bp,
δp;
verbose,
ampfactor,
nbfailures,
maxiter,
perturb,
J,
normN,
optn
)
This function provides prediction for what the zeros of the reduced equation / normal form should be for the parameter value δp
. The algorithm for finding these zeros is based on deflated newton.
Optional arguments
J
jacobian of the normal form. It is evaluated with ForwardDiff otherwise.perturb
perturb function used in Deflated newtonnormN
norm used for newton.
BifurcationKit.predictor
— Methodpredictor(
bp,
,
δp;
verbose,
ampfactor,
nbfailures,
maxiter,
perturb,
J,
igs,
normN,
optn
)
This function provides prediction for what the zeros of the reduced equation / normal form should be should be for the parameter value δp
. The algorithm for finding these zeros is based on deflated newton. The initial guesses are the vertices of the hypercube.
Optional arguments
J
jacobian of the normal form. It is evaluated with ForwardDiff otherwise.perturb
perturb function used in Deflated newtonnormN
norm used for newton.igs
vector of initial guesses. If not passed, these are the vertices of the hypercube.
BifurcationKit.predictor
— Methodpredictor(zh, , ds; verbose, ampfactor)
Compute the predictor for the curve of Fold bifurcations near the Zero-Hopf bifurcation point.
BifurcationKit.predictor
— Methodpredictor(zh, , ds; verbose, ampfactor)
Compute the predictor for the curve of Hopf bifurcations near the Zero-Hopf bifurcation point.
BifurcationKit.predictor
— Methodpredictor(zh, , ϵ; verbose, ampfactor)
Compute the predictor for the curve of Neimark-Sacker bifurcations near the Zero-Hopf bifurcation point.
Reference
Kuznetsov, Yu A., H. G. E. Meijer, W. Govaerts, and B. Sautois. “Switching to Nonhyperbolic Cycles from Codim 2 Bifurcations of Equilibria in ODEs.” Physica D: Nonlinear Phenomena 237, no. 23 (December 2008): 3061–68. https://doi.org/10.1016/j.physd.2008.06.006.
BifurcationKit.predictor
— Methodpredictor(bp, ds; verbose, ampfactor)
This function provides prediction for the zeros of the Pitchfork bifurcation point.
Arguments
bp::Pitchfork
the bifurcation pointds
at with distance relative to the bifurcation point do you want the prediction. Based on the criticality of the Pitchfork, its sign is enforced no matter what you pass. Basically the parameter isbp.p + abs(ds) * dsfactor
wheredsfactor = ±1
depending on the criticality.
Optional arguments
verbose
display informationampfactor = 1
factor multiplying prediction
Returned values
x0
trivial solution (which bifurcates)x1
non trivial guessp
new parameter valuedsfactor
factor which has been multiplied toabs(ds)
in order to select the correct side of the bifurcation point where the bifurcated branch exists.amp
non trivial zero of the normal form
BifurcationKit.predictor
— Methodpredictor(bp, ds; verbose, ampfactor)
This function provides prediction for the zeros of the Transcritical bifurcation point.
Arguments
bp::Transcritical
the bifurcation pointds
distance to the bifurcation point for the prediction. Can be negative. Basically the parameter isp = bp.p + ds
Optional arguments
verbose
display informationampfactor = 1
factor multiplying prediction
Returned values
x0
trivial solution (which bifurcates)x1
non trivial guess, corrected with Lyapunov-Schmidt expansionp
new parameter valueamp
non trivial zero of the normal form (not corrected)xm1
non trivial guess for the parameterpm1
pm1
parameter valuebp.p - ds
BifurcationKit.projection
— Methodprojection(psh, x)
Compute the projection of each vector (x[i, :]
is a Vector
) on the Poincaré section.
BifurcationKit.projection
— Methodprojection(psh, x)
Compute the projection of each vector (x[i]
is a Vector
) on the Poincaré section.
BifurcationKit.re_make
— Methodre_make(
prob;
u0,
params,
lens,
record_from_solution,
plot_solution,
J,
Jᵗ,
d2F,
d3F
)
This function changes the fields of a problem ::AbstractBifurcationProblem
. For example, you can change the initial condition by doing
re_make(prob; u0 = new_u0)
BifurcationKit.set_collocation_size
— Methodset_collocation_size(pb, Ntst, m)
This function change the parameters Ntst, m
for the collocation problem pb
and return a new problem.
BifurcationKit.setparam
— Methodsetparam(br, p0)
Set the parameter value p0
according to the ::Lens
stored in br
for the parameters of the problem br.prob
.
BifurcationKit.solve_cop
— Methodsolve_cop(coll, J, rhs0, cop_cache; _DEBUG, _USELU)
Solve the linear system associated with the collocation problem for computing periodic orbits. It returns the solution to the equation J * sol = rhs0
. It can also solve a bordered version of the above problem and the border size δn
is inferred at run time.
Arguments
coll::PeriodicOrbitOCollProblem
collocation problemJ::Matrix
rhs0::Vector
Optional arguments
_DEBUG = false
use a debug mode in which the condensation of parameters is performed without an analytical formula._USELU = false
use LU factorization instead of gaussian elimination and backward substitution to solve the linear problem.
BifurcationKit.split_events
— Methodsplit_events(cs, ds, args...)
Split comma separated callbacks into sets of continuous and discrete callbacks. Inspired by DiffEqBase.
BifurcationKit.update!
— Methodupdate!(hyp::SectionPS, normals, centers)
Update the hyperplanes saved in hyp
.
BifurcationKit.updatesection!
— Methodupdatesection!(pb, centers_bar, par; _norm)
This function updates the normals and centers of the hyperplanes defining the Poincaré sections.
BifurcationKit.∫
— Function∫(pb, uc, vc)
∫(pb, uc, vc, T)
[INTERNAL] Implementation of ∫_0^T < u(t), v(t) > dt.
∫(pb, uc, vc, T = 1)
Arguments
- uj n x (m + 1)
- vj n x (m + 1)