# pyerrors.roots

View Source

     0import numpy as np
     1import scipy.optimize
     2from autograd import jacobian
     3from .obs import derived_observable
     4
     5
     6def find_root(d, func, guess=1.0, **kwargs):
     7    r'''Finds the root of the function func(x, d) where d is an `Obs`.
     8
     9    Parameters
    10    -----------------
    11    d : Obs
    12        Obs passed to the function.
    13    func : object
    14        Function to be minimized. Any numpy functions have to use the autograd.numpy wrapper.
    15        Example:
    16        ```python
    17        import autograd.numpy as anp
    18        def root_func(x, d):
    19            return anp.exp(-x ** 2) - d
    20        ```
    21    guess : float
    22        Initial guess for the minimization.
    23
    24    Returns
    25    -------
    26    Obs
    27        `Obs` valued root of the function.
    28    '''
    29    root = scipy.optimize.fsolve(func, guess, d.value)
    30
    31    # Error propagation as detailed in arXiv:1809.01289
    32    dx = jacobian(func)(root[0], d.value)
    33    try:
    34        da = jacobian(lambda u, v: func(v, u))(d.value, root[0])
    35    except TypeError:
    36        raise Exception("It is required to use autograd.numpy instead of numpy within root functions, see the documentation for details.") from None
    37    deriv = - da / dx
    38
    39    res = derived_observable(lambda x, **kwargs: (x[0] + np.finfo(np.float64).eps) / (d.value + np.finfo(np.float64).eps) * root[0], [d], man_grad=[deriv])
    40    return res

def find_root(d, func, guess=1.0, **kwargs):
View Source

     7def find_root(d, func, guess=1.0, **kwargs):
     8    r'''Finds the root of the function func(x, d) where d is an `Obs`.
     9
    10    Parameters
    11    -----------------
    12    d : Obs
    13        Obs passed to the function.
    14    func : object
    15        Function to be minimized. Any numpy functions have to use the autograd.numpy wrapper.
    16        Example:
    17        ```python
    18        import autograd.numpy as anp
    19        def root_func(x, d):
    20            return anp.exp(-x ** 2) - d
    21        ```
    22    guess : float
    23        Initial guess for the minimization.
    24
    25    Returns
    26    -------
    27    Obs
    28        `Obs` valued root of the function.
    29    '''
    30    root = scipy.optimize.fsolve(func, guess, d.value)
    31
    32    # Error propagation as detailed in arXiv:1809.01289
    33    dx = jacobian(func)(root[0], d.value)
    34    try:
    35        da = jacobian(lambda u, v: func(v, u))(d.value, root[0])
    36    except TypeError:
    37        raise Exception("It is required to use autograd.numpy instead of numpy within root functions, see the documentation for details.") from None
    38    deriv = - da / dx
    39
    40    res = derived_observable(lambda x, **kwargs: (x[0] + np.finfo(np.float64).eps) / (d.value + np.finfo(np.float64).eps) * root[0], [d], man_grad=[deriv])
    41    return res

Finds the root of the function func(x, d) where d is an `Obs`.

###### Parameters

- d (Obs): Obs passed to the function.
- func (object): Function to be minimized. Any numpy functions have to use the autograd.numpy wrapper. Example: `python import autograd.numpy as anp def root_func(x, d): return anp.exp(-x ** 2) - d`
- guess (float): Initial guess for the minimization.

###### Returns

- Obs: `Obs` valued root of the function.