1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- from ._trustregion import (_minimize_trust_region)
- from ._trlib import (get_trlib_quadratic_subproblem)
- __all__ = ['_minimize_trust_krylov']
- def _minimize_trust_krylov(fun, x0, args=(), jac=None, hess=None, hessp=None,
- inexact=True, **trust_region_options):
- """
- Minimization of a scalar function of one or more variables using
- a nearly exact trust-region algorithm that only requires matrix
- vector products with the hessian matrix.
- .. versionadded:: 1.0.0
- Options
- -------
- inexact : bool, optional
- Accuracy to solve subproblems. If True requires less nonlinear
- iterations, but more vector products.
- """
- if jac is None:
- raise ValueError('Jacobian is required for trust region ',
- 'exact minimization.')
- if hess is None and hessp is None:
- raise ValueError('Either the Hessian or the Hessian-vector product '
- 'is required for Krylov trust-region minimization')
- # tol_rel specifies the termination tolerance relative to the initial
- # gradient norm in the Krylov subspace iteration.
- # - tol_rel_i specifies the tolerance for interior convergence.
- # - tol_rel_b specifies the tolerance for boundary convergence.
- # in nonlinear programming applications it is not necessary to solve
- # the boundary case as exact as the interior case.
- # - setting tol_rel_i=-2 leads to a forcing sequence in the Krylov
- # subspace iteration leading to quadratic convergence if eventually
- # the trust region stays inactive.
- # - setting tol_rel_b=-3 leads to a forcing sequence in the Krylov
- # subspace iteration leading to superlinear convergence as long
- # as the iterates hit the trust region boundary.
- # For details consult the documentation of trlib_krylov_min
- # in _trlib/trlib_krylov.h
- #
- # Optimality of this choice of parameters among a range of possibilities
- # has been tested on the unconstrained subset of the CUTEst library.
- if inexact:
- return _minimize_trust_region(fun, x0, args=args, jac=jac,
- hess=hess, hessp=hessp,
- subproblem=get_trlib_quadratic_subproblem(
- tol_rel_i=-2.0, tol_rel_b=-3.0,
- disp=trust_region_options.get('disp', False)
- ),
- **trust_region_options)
- else:
- return _minimize_trust_region(fun, x0, args=args, jac=jac,
- hess=hess, hessp=hessp,
- subproblem=get_trlib_quadratic_subproblem(
- tol_rel_i=1e-8, tol_rel_b=1e-6,
- disp=trust_region_options.get('disp', False)
- ),
- **trust_region_options)
|