Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Brent's method instead of bisection for locating bifurcations #17

Open
antoine-levitt opened this issue May 26, 2020 · 5 comments
Open
Labels
enhancement New feature or request

Comments

@antoine-levitt
Copy link
Contributor

Feature request: use Brent's method for bifurcation location. Should be as robust and faster than bisection. There's a julia implementation over at Roots.jl (although the algorithm as described on wikipedia might be sufficient if you don't want to depend on Roots)

@rveltz
Copy link
Member

rveltz commented May 1, 2021

I thought about this recently and I have an issue. Typically, the function f used in the bisection is integer valued, it returns the number of unstable eigenvalues. The only way around it would be to use a more regular indicator but they will be more expensive to evaluate.

@antoine-levitt
Copy link
Contributor Author

antoine-levitt commented May 1, 2021

Can't you just rootfind on the eigenvalue itself? I thought that was how it worked

@rveltz
Copy link
Member

rveltz commented May 1, 2021

Probably on the closest to zero, you are right. Now the "devil is in the details":

  • it should work for systems with continuous symmetries for which there is always a zero eigenvalue (up to some precision). I deal with this case with the user passed parameter ContinuationPar.precisionStability by saying an eigenvalue is unstable if above precisionStability.
  • it should be able to cope with the case where many points cross the Imaginary axis at once (for example between two large continuation steps)

Another point is that I will feature event detection soon. There will be two kind of events: discrete and continuous. Discrete callbacks are the ones for which you look for a change in their value. For Continuous callbacks, you seek for their zeros. Bisection algo provides a single framework for handling the two different callbacks under the hood of an AbstractCallback. Now adding the Brent method will make this fall apart, but that's another issue (the one of growing code).

These callbacks will be the basis for codim 2 continuation (Bogdanov-Takens, Bautin, Hopf-Hopf...)

@antoine-levitt
Copy link
Contributor Author

One thing that could work is bisecting until you get to a region where you only have one crossing eigenvalue, and then do bisection. You could just say that you ignore eigenvalues that are smaller than some tolerance in absolute value

@rveltz
Copy link
Member

rveltz commented May 1, 2021

I will try to make a MWE when I have some time.

@rveltz rveltz added the enhancement New feature or request label Apr 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants