optimize Module

This module re-implements a subset of SciPy optimization routines in Fortran.



Interfaces

public interface bisect

Find root of a function in an interval using bisection.

Parameters:

  • f : function to find root of
  • a, b : interval to search for root
  • xtol : absolute tolerance, optional, default 2e-12
  • rtol : relative tolerance, optional, default 1e-15
  • maxiter : maximum number of iterations, optional, default 100

Returns:

  • x : root of f in [a, b]
  • info : solver_info_t structure, optional

The function f must be continuous, and f(a) and f(b) must have opposite signs.

If the solver converges, info%converged is true and info%iterations is the number of iterations required. If the solver does not converge, info%converged is false and info%iterations is the maximum number of iterations.

The convergence criterion is abs(x - xa) < xtol + rtol*abs(x) where xa is the left endpoint of the current interval.

  • private function bisect_real64(f, a, b, xtol, rtol, maxiter, info) result(x)

    Impementation of bisect for real64

    Arguments

    Type IntentOptional Attributes Name
    procedure(func64) :: f

    function to find root of

    real(kind=rkind), intent(in) :: a

    interval to search for root

    real(kind=rkind), intent(in) :: b

    interval to search for root

    real(kind=rkind), intent(in), optional :: xtol

    absolute tolerance

    real(kind=rkind), intent(in), optional :: rtol

    relative tolerance

    integer, intent(in), optional :: maxiter

    maximum number of iterations

    type(solver_info_t), intent(out), optional :: info

    solver info

    Return Value real(kind=rkind)

  • private function bisect_real32(f, a, b, xtol, rtol, maxiter, info) result(x)

    Impementation of bisect for real32

    Arguments

    Type IntentOptional Attributes Name
    procedure(func32) :: f

    function to find root of

    real(kind=rkind), intent(in) :: a

    interval to search for root

    real(kind=rkind), intent(in) :: b

    interval to search for root

    real(kind=rkind), intent(in), optional :: xtol

    absolute tolerance

    real(kind=rkind), intent(in), optional :: rtol

    relative tolerance

    integer, intent(in), optional :: maxiter

    maximum number of iterations

    type(solver_info_t), intent(out), optional :: info

    solver info

    Return Value real(kind=rkind)

public interface newton

Find root of a function using Newton’s or secant method.

Parameters:

  • f : function to find root of
  • x0 : initial estimate of root
  • fprime: derivative of f, optional
  • xtol : absolute tolerance, optional, default 2e-12
  • rtol : relative tolerance, optional, default 1e-15
  • maxiter : maximum number of iterations, optional, default 100

Returns:

  • x : root of f in [a, b]
  • info : solver_info_t structure, optional

The function f must be continuous, x0 should be close enough to the root.

If the solver converges, info%converged is true and info%iterations is the number of iterations required. If the solver does not converge, info%converged is false and info%iterations is the maximum number of iterations.

The convergence criterion is abs(x - xa) < xtol + rtol*abs(x) where xa is the left endpoint of the current interval.

  • private function newton_real64(f, x0, fprime, xtol, rtol, maxiter, info) result(x)

    Impementation of bisect for real64

    Arguments

    Type IntentOptional Attributes Name
    procedure(func64) :: f

    function to find root of

    real(kind=rkind), intent(in) :: x0

    initial estimate of root

    procedure(func64), optional :: fprime

    function to find root of

    real(kind=rkind), intent(in), optional :: xtol

    absolute tolerance

    real(kind=rkind), intent(in), optional :: rtol

    relative tolerance

    integer, intent(in), optional :: maxiter

    maximum number of iterations

    type(solver_info_t), intent(out), optional :: info

    solver info

    Return Value real(kind=rkind)

public interface root_scalar

Find root of a function using given method

Parameters:

  • f : function to find root of
  • x0 : initial estimate of root, optional
  • fprime: derivative of f, optional
  • xtol : absolute tolerance, optional, default 2e-12
  • rtol : relative tolerance, optional, default 1e-15
  • maxiter : maximum number of iterations, optional, default 100
  • method : method to use, optional, default ‘bisect’

Returns:

  • x : root of f in [a, b], or close to x0
  • info : solver_info_t structure, optional

The function f must be continuous, x0 should be close enough to the root.

If the solver converges, info%converged is true and info%iterations is the number of iterations required. If the solver does not converge, info%converged is false and info%iterations is the maximum number of iterations.

The convergence criterion is abs(x - xa) < xtol + rtol*abs(x) where xa is the left endpoint of the current interval.

  • private function root_scalar_real64(f, x0, a, b, fprime, xtol, rtol, maxiter, method, info) result(x)

    Find root of a function using given method

    Arguments

    Type IntentOptional Attributes Name
    procedure(func64) :: f

    function to find root of

    real(kind=rkind), intent(in), optional :: x0

    initial estimate of root

    real(kind=rkind), intent(in), optional :: a

    interval to search for root

    real(kind=rkind), intent(in), optional :: b

    interval to search for root

    procedure(func64), optional :: fprime

    function to find root of

    real(kind=rkind), intent(in), optional :: xtol

    absolute tolerance

    real(kind=rkind), intent(in), optional :: rtol

    relative tolerance

    integer, intent(in), optional :: maxiter

    maximum number of iterations

    character(len=*), intent(in), optional :: method

    method to use

    type(solver_info_t), intent(out), optional :: info

    solver info

    Return Value real(kind=rkind)


Derived Types

type, public ::  solver_info_t

Structure containing information about a solver convergence

Components

Type Visibility Attributes Name Initial
logical, public :: converged = .false.

true if solver converged

integer, public :: iterations = 0

number of iterations