# Module `Owl_maths_root`

Root finding algorithms for nonlinear functions

###### Type definition
`type solver = `
 `| Bisec` `| FalsePos` `| Ridder` `| Brent` (*Type of root functions of univariate functions.*)
###### Core functions
```val fzero : ?solver:solver -> ?max_iter:int -> ?xtol:float -> ( float -> float ) -> float -> float -> float```

`fzero ~solver f a b` tries to find the root of univariate function `f` in the bracket `[a, b]` using method `solver`. This is the hub function of the individual root finding algorithms in the following sections. You can certainly call each individual ones.

Parameters: * `solver`: solver, default one is Brent method. * `max_iter`: maximum number of iterations, default value is `1000`. * `xtol`: the tolerance of `x` on abscissa, default value is `1e-6`. * `f`: the univariate scalar function to find root. * `a`: boundary of bracket. * `b`: boundary of bracket.

###### Root of univariate functions
```val bisec : ?max_iter:int -> ?xtol:float -> ( float -> float ) -> float -> float -> float```

`bisec f a b` tries to find the root of univariate function `f` in the bracket defined by `[a, b]`.

Parameters: * `max_iter`: maximum number of iterations. * `xtol`: the tolerance of `x` on abscissa. * `f`: the univariate scalar function to find root. * `a`: boundary of bracket. * `b`: boundary of bracket.

```val false_pos : ?max_iter:int -> ?xtol:float -> ( float -> float ) -> float -> float -> float```

`false_pos f a b` tries to find the root of univariate function `f` in the bracket defined by `[a, b]`.

Parameters: * `max_iter`: maximum number of iterations. * `xtol`: the tolerance of `x` on abscissa. * `f`: the univariate scalar function to find root. * `a`: boundary of bracket. * `b`: boundary of bracket.

```val ridder : ?max_iter:int -> ?xtol:float -> ( float -> float ) -> float -> float -> float```

`ridder f a b` tries to find the root of univariate function `f` in the bracket defined by `[a, b]`.

Parameters: * `max_iter`: maximum number of iterations. * `xtol`: the tolerance of `x` on abscissa. * `f`: the univariate scalar function to find root. * `a`: boundary of bracket. * `b`: boundary of bracket.

```val brent : ?max_iter:int -> ?xtol:float -> ( float -> float ) -> float -> float -> float```

`brent f a b` tries to find the root of univariate function `f` in the bracket defined by `[a, b]`.

Parameters: * `max_iter`: maximum number of iterations. * `xtol`: the tolerance of `x` on abscissa. * `f`: the univariate scalar function to find root. * `a`: boundary of bracket. * `b`: boundary of bracket.

Refer to :cite:`brent2013algorithms`

###### Helper functions
```val bracket_expand : ?rate:float -> ?max_iter:int -> ( float -> float ) -> float -> float -> (float * float) option```

`bracket_expand f a b` expands the bracket `[a, b]` for a given function `f` until it finds `f a` and `f b` have different signs.

Parameters: * `max_iter`: maximum number of iterations, the default is 100 * `rate`: rate of growth, the default is 1.6 * `f`: the univariate scalar function to find root. * `a`: initial boundary of bracket. * `b`: initial boundary of bracket.