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

Muller's method #403

Open
fgittins opened this issue Apr 8, 2024 · 5 comments
Open

Muller's method #403

fgittins opened this issue Apr 8, 2024 · 5 comments
Labels

Comments

@fgittins
Copy link

fgittins commented Apr 8, 2024

What kind of problems is it mostly used for? Please describe.

Determining the roots of univariate complex functions. Muller's method is commonly used to determine the (quasi-normal) oscillation modes of neutron stars [1, 2].

Note: Given that this method only works for univariate functions, it might be too restrictive for NonlinearSolve.jl, but I thought I would suggest it anyway, since I frequently use it. Also, the algorithm is very simple so it should be easy to implement.

Describe the algorithm you’d like

The algorithm is quite simple and described well in Press et al. [3]. (See also Wikipedia [4].)

To summarise: Muller's method is a generalisation of the secant method, with the key difference being that it uses quadratic interpolation across three points (as opposed to linear interpolation among two). Solving for the roots of a quadratic is trivial and allows the method to work for complex roots.

Other implementations to know about

There is an existing Julia implementation in Roots.jl [5] and a Fortran routine in IMSL [6].

References

[1] Kokkotas & Schutz (1992)
[2] Kruger, PhD Thesis (2016)
[3] Press et al. (2007), Sec. 9.5.2, p. 466
[4] Wikipedia, Muller's method
[5] Roots.muller
[6] IMSL Math/Library Users Manual, Zanly

@ChrisRackauckas ChrisRackauckas added the good first issue Good for newcomers label Apr 8, 2024
@avik-pal
Copy link
Member

avik-pal commented Apr 8, 2024

Given that this method only works for univariate functions, it might be too restrictive for NonlinearSolve.jl

This would be great to have in SimpleNonlinearSolve

@fgittins
Copy link
Author

fgittins commented Apr 9, 2024

Thanks for the feedback. I had some time so I put together an initial implementation at this algorithm with some simple tests. If it looks reasonable, I can make a pull request.

One thing to note is that differently to other non-linear solvers, Muller's method requires three initial guesses. This would need to be made clear in subsequent documentation.

@avik-pal
Copy link
Member

yes open the pr

@fgittins
Copy link
Author

I'm resurrecting this issue. I have a working version of this algorithm in my fork of SimpleNonlinearSolve.jl. Since this is now deprecated and development has moved to NonlinearSolve.jl, it will need to be re-worked slightly.

Does anyone know off-hand what needs changing to implement it successfully?

@ChrisRackauckas
Copy link
Member

It should be relatively the same. SimpleNonlinearSolve.jl mostly moved repos and changed from using DiffEqBase to NonlinearSolveBase, but its system isn't that different IIRC.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants