Skip to content

Feature: Higher-order Bautin normal form and unfolding#254

Open
mmbosschaert wants to merge 2 commits intobifurcationkit:masterfrom
mmbosschaert:master
Open

Feature: Higher-order Bautin normal form and unfolding#254
mmbosschaert wants to merge 2 commits intobifurcationkit:masterfrom
mmbosschaert:master

Conversation

@mmbosschaert
Copy link

Higher-Order Bautin Normal Form and Unfolding

This PR implements higher-order computation of the Bautin (Generalized Hopf) normal form and its associated predictor for fold of periodic orbits continuation.

Summary

The Bautin bifurcation occurs when the first Lyapunov coefficient vanishes at a Hopf point, requiring higher-order analysis. Previously, the code computed up to the second Lyapunov coefficient. This PR extends the computation to the third Lyapunov coefficient and implements a higher-order predictor that uses additional higher-order parameter-dependent terms for more accurate approximation to the fold of period orbits curve emanating from the Bautin bifurcation point.

This test validates the higher-order Bautin normal form computation and predictor:
- Uses Symbolics.jl to compute jet derivatives up to 7th order
- Tests Stuart-Landau equation with quintic and septic nonlinearities
- Verifies l2 and l3 coefficients match theoretical formulas (4·c5 and 8·c7)
- Confirms predictor actually uses c₃ (l3) by comparing predictions with/without it
- Shows parameter predictions differ by ~1e-7 when c₃ is included vs zeroed

The test proves the higher-order predictor is working correctly.
@rveltz
Copy link
Member

rveltz commented Oct 14, 2025

Thanks a lot for this massive PR! I will review this asap.

Best regards

~cv && @debug "[Bautin H3100] Linear solver for J did not converge. it = $it"

h2200 = D40(q0, q0, cq0, cq0) .+
4 .* C(q0, cq0, H1100) .+ C(cq0, cq0, H2000) .+ C(q0, q0, conj.(H2000)) .+
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

align with = sign (4 spaces)


G32 = dot(p0, D50(q0, q0, q0, cq0, cq0))
G32 += (dot(p0, D40(q0, q0, q0, conj.(H2000))) +
3dot(p0, D40(q0, cq0, cq0, H2000)) +
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

idem as above

@rveltz
Copy link
Member

rveltz commented Feb 4, 2026

You should modify the documentation as well https://github.com/bifurcationkit/BifurcationKitDocs.jl/blob/main/docs/src/bautin.md

You can probably add your name and a link to this PR there to underline you contribution

@rveltz
Copy link
Member

rveltz commented Feb 4, 2026

It seems your code only works for 2d systems as I have tried locally. I suggest minor changes in test/test_bautin_higherorder.jl to verify this claim.

@rveltz
Copy link
Member

rveltz commented Feb 5, 2026

If you want some help, I need to be able to push to your PR. This is possible as explained here

(4) On user-owned forks, if you want to allow anyone with push access to the upstream repository to make changes to your pull request, select Allow edits from maintainers.

@mmbosschaert
Copy link
Author

Thanks. It looks like ‘Allow edits and access to secrets by maintainers’ is already checked. Am I missing something?

@rveltz
Copy link
Member

rveltz commented Feb 26, 2026

I am not sure I am a maintener on your branch, am I?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants