pyerrors/pyerrors/roots.py
Justus Kuhlmann 26447d658c
better docstrings (#144)
* first example of returns statement in docstring

* added a some return statements for pandas API

* last return statements in pandas input

* added returns to bdio docstrings

* few returns statements added to docstring

* finished docstrings for hadrons submodule

* also finished docstrings for json submodule

* finished misc submodule

* added returns in docstrings in openqQCD

* made some cosmetic chanes to dostrings

* added return nad return statement in docstring

* linting

* Improved docstrings of mpm, fits, roots, misc to have return statements

returns added for misc.py

returns added for mpm.py

reutrns added for fits.py

* linting...

* Some polishing of docstrings
2023-01-16 14:57:22 +00:00

43 lines
1.4 KiB
Python

import numpy as np
import scipy.optimize
from autograd import jacobian
from .obs import derived_observable
def find_root(d, func, guess=1.0, **kwargs):
r'''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
-------
res : Obs
`Obs` valued root of the function.
'''
d_val = np.vectorize(lambda x: x.value)(np.array(d))
root = scipy.optimize.fsolve(func, guess, d_val)
# Error propagation as detailed in arXiv:1809.01289
dx = jacobian(func)(root[0], d_val)
try:
da = jacobian(lambda u, v: func(v, u))(d_val, root[0])
except TypeError:
raise Exception("It is required to use autograd.numpy instead of numpy within root functions, see the documentation for details.") from None
deriv = - da / dx
res = derived_observable(lambda x, **kwargs: (x[0] + np.finfo(np.float64).eps) / (np.array(d).reshape(-1)[0].value + np.finfo(np.float64).eps) * root[0],
np.array(d).reshape(-1), man_grad=np.array(deriv).reshape(-1))
return res