The library NLopt performs nonlinear local and global optimization for functions with and without gradient information. It provides a simple, unified interface and wraps many algorithms for global and local, constrained or unconstrained, optimization, and provides interfaces for many other languages, including C++, Fortran, Python, Matlab or GNU Octave, OCaml, GNU Guile, GNU R, Lua, Rust, and Julia.
Please see citation information here: https://nlopt.readthedocs.io/en/latest/Citing_NLopt/