minimize(func, jac=None, hess=None, start_params=None, tol=1e-12, maxiter=10000, algorithm=None):
"""
Wrapper for scipy.optimize.minimize. Helps that all algorithms have common syntax. The exception is
algorithm="nonlin", which calls scipy.optimize.least_squares: then func must return the vector of residuals z,
so that sum(z^2) is minimized, and jac is the Jacobian dz/dp or a scipy finite-difference scheme like '3-point'.
Args:
func: to-be-minimized function
jac (func, optional): Explicit Jacobian. Defaults to None.
hess (func, optional): Explicit Hessian. Defaults to None.
start_params (array-like, optional): Starting guess. Defaults to None.
tol (float, optional): Solve tolerance. Defaults to 1e-12.
maxiter (int, optional): Maximum number of solve iterations. Defaults to 10000.
algorithm (str, optional): Solve algorithm. Defaults to Scipy default, usually BFGS.
Raises:
e: scipy.optimize exception
ValueError: minimizer fails to converge
Returns:
array-like: solution vector
"""