New version of BifurcationKit

Dear all,

I am glad to report a new version of BifurcationKit (BK). It has been a long time since I report progress on this library, this one is a massive one.

Before I start, I would like to highlight the fact that a github organisation has been created which contains several pluggins for BK, among which:

The new version of BK has been focused on periodic orbits, especially for ODE. BK is now able to follow Fold, Period-Doubling and Neimark-Sacker bifurcations of periodic orbits with 2 parameters (see tutorial). It is also able to detect codimension 2 bifurcations along those curves, like the Chenciner bifurcation (see tutorial).

What’s more, it is able to branch from Zero-Hopf, Hopf-Hopf and Bautin to these curves as is shown in this tutorial. In order to achieve that, several normal form computations have been added (see this function for example), this was tedious, to say the least.

Of course, all this is tested against analytics and the code coverage is quite high.

Is it possible for Julia to sponsor beefier GH actions? My tests are 2 hours long on GH…

Finally, all these methods are available for shooting and collocation which should allow to tackle large dimensional problem as well. Hence, many jacobians types can be selected, computed with AD, or custom procedures. This is very unique and putting all in a table is difficult because of the combinatorial explosion (this is why the testing is intensive). Only the GPU is not tested on GH.

The normal form associated to the bifurcations of periodic orbits is based on the normal form of the associated Poincare return map PRM. This is unlike what is done in MatCont where another (more precise) technics is used. However, the PRM allows to study large dimensional problems.

Given this set of functionalities, we are quite close to those of MatCont and we are not many in this small club (I would say we are two).

These are quite advanced tools for numerical bifurcation analysis and only a few of us actually use them. I believe the reason is that it requires some advanced knowledge of bifurcation theory but also that only MatCont provided it until now, and thus only for ODE. It is exciting as BK opens now the door of PDE (fluid dynamics, climate, lasers, etc) or non local equations, for which these scenarios could be studied.

I hope some of you find it useful.

We have some pretty big machines on the buildkite in the SciML queues if you need access.

Great thanks! Might consider it in the future.

A new version of bifurcationkit

Dear all,

Almost three years have passed since the previous major BifurcationKit (BK) update. Since then the package has reached v0.8.7,. What started as a continuation engine for F(u, λ) = 0 is now a broad numerical bifurcation toolbox for ODE, PDE, DAE, BVP, DDE and homoclinic problems, surrounded by a set of plugins that keeps growing.

Here is a tour of what is new or has not been reported.

The 2023 announcement was all about codim-2 continuation of periodic orbits. The years that followed were quiet but busy: a long succession of releases (v0.3 → v0.5) kept adding methods, hardening the codim-2 machinery. The next big change arrived at the end of 2025, with a ground-up refactor of the periodic-orbit machinery shipped as v0.6.0: a strict separation between the discretization (shooting, collocation, trapezoidal rule) and the problem one continues, exposed through PeriodicOrbit{Tdisc}. Discretizations now have consistent names — Shooting, Collocation, Trapeze.

A new preconditoner allows to run the computations of periodic orbits of Ginzburg-Landau equation on github CI!

Under the hood, the Poincaré return map was reworked around a single evolution primitive and the flow now exposes derivatives with respect to parameters and higher-order differentials, R01, R11, R20, R30. These feed the normal forms and make branching from codim-2 points more robust. The jet machinery dispatches cleanly between AutoDiff(), FiniteDifferences(), etc, and works for any AbstractBifurcationProblem.

this paves the way for the use of DifferentiationInterface in all BK

Normal-form computations got a lot of love too, basically relying on bordered linear solves for having more robust coefficient estimation. Additionally, the normal form now accepts start_with_eigen = Val(false), which builds the right/left kernel basis with a bordered linear system instead of an eigensolver — far more robust on large-scale problems. The Neimark–Sacker and period-doubling Iooss normal forms are now evaluated at the Gauss points, in the correct row layout of the collocation operator, which solves the long-standing bug.

Differential-Algebraic Equations (new in v0.8.5)

The latest release opens a whole new class of problems:

M(x,p)\,\dot x = F(x,p),

with a possibly singular mass matrix. This is wrapped in DAEMassBifProblem, stability is decided by the generalized eigenproblem J v = λ M v, and the eigensolver is automatically wrapped in EigenDAE. Fold and Hopf points are detected and refined with mass-aware bordered systems, the Hopf normal form is available for DAEs. Under the hood, it required a massive refactor of the linear/eigen solver API plus many changes in Fold/Hopf continuation API.

This paves the way to handling PDE based on FEM/etc and lead to the joint development of GridapBifurcationKit.jl. This API could be used for Ferrite.jl, BCube.jl, etc.
You can also do fancy things like computing waves with frozen symmetry - computing modulated spiral waves of the complex Ginzburg-Landau equation on the disk specified with Gridap.

!!! info The next big step will be seamless continuation of periodic orbits of DAE. This is possible already (see GridapBifurcationKit.jl, collpits) but a big hacky.

Boundary Value Problems — the next big thing :construction:

!!! warning
This is the newest and the most unfinished part of BK. It is very much a work in progress, and it will be the subject of a next major PR.

BK is progressively growing a general boundary value problem interface for

\frac{du}{dt} = F(u,p),\qquad g(u(t_0), u(t_f), p) = 0,

of which periodic orbits are just the special case g(u₀, u₁) = u₀ - u₁. It reuses the same discretizers — Trapeze, Collocation (now with non-uniform meshes through TimeMesh) and Shooting — and adds BVPModel, DiscretizedBVP, discretize, generate_solution, mesh adaptation and the BVPBifProblem wrapper for continuation and deflated continuation. The mathematical plumbing is in place and promising, but the final unification with the periodic-orbit machinery is exactly what the next major PR is about. Sneak peek: BVP documentation. In passing, the hope is to remove a lot of redundant code, solve BVP, allow for non-autonomous systems.

Plotting

Plotting is now backend-agnostic: set_plot_backend! switches between BK_Plots(), BK_Makie() and BK_NoPlot() on the fly, and the Makie support gained, among others, stability segments and proper unstable-branch styling.

Unified documentation

The documentation now regroups the main packages in the top banner (idea from SciML).

A growing ecosystem

The real story of these three years is arguably the ecosystem around BK:

  • DDEBifurcationKit.jl — delay differential equations, now with state-dependent delays, analytical Jacobians, Floquet exponents, codim-2 detection and automatic branch switching from Hopf points.
  • HclinicBifurcationKit.jl — homoclinic/heteroclinic orbits with adaptive collocation or shooting, branch switching from Bogdanov–Takens, and now the ability to seed a homoclinic problem from a periodic orbit of large period.
  • MultiParamContinuation.jl (new) — Henderson’s chart/atlas covering algorithm for multi-parameter continuation: continue the surfaces of codimension-1 bifurcations in three parameters, or a surface of periodic orbits, with a BifurcationKit and a Makie extension. The chart adaptation is now more robust, matrix-free problems are allowed (no issue with dimension) and the metric can be changed.

Future

A big thank you to all contributors, users!!

Just wanted to take this opportunity to thank the BifurcationKit developers for this excellent piece of software, and how happy I am to hear about the merged DAE functionality and upcoming BVP and non-autonomous functionality.

This summer, we worked on continuing equations that coupled one set of externally forced (non-autonomous) periodic ODEs at a fast time scale so that they were always at their limit cycle to a set of slowly-changing variables that deformed the limit cycles. Although we had to hack around the lack of explicit DAE and non-autonomous support by following some of the BifurcationKit documentation on how to implement our own eigensolver, the project still went off very well, and BifurcationKit played ball with our cobbled-together Frankencode very nicely. The project is currently on a bit of a hiatus, but when we pick it up again, I’m eager to see how much easier it’ll be once we can use actual BifurcationKit functionality to implement the equations.

Congrats on the new version!

I just wanted to share this paper I found: [2607.18894v1] Bifurcation Analysis of Sub-Synchronous Oscillations Related to Grid-Forming Converter Inner Controllers. Here they build a model of a grid forming inverter (GFM) in ModelingToolkit.jl, and then do a stability analysis on it using BifurcationKit.jl.

Thank you.

I saw this reference, this is pretty cool.