Source code for pyjams.functions.general_functions

#!/usr/bin/env python
"""
General functions that are not specialised for fitting, optimisation,
sensitivity analysis, etc.

The current functions are:
    curvature - Curvature of a function f: f''/(1+f'^2)^3/2

This module was written by Matthias Cuntz while at Department of
Computational Hydrosystems, Helmholtz Centre for Environmental
Research - UFZ, Leipzig, Germany, and continued while at Institut
National de Recherche pour l'Agriculture, l'Alimentation et
l'Environnement (INRAE), Nancy, France.

:copyright: Copyright 2015-2022 Matthias Cuntz, see AUTHORS.rst for details.
:license: MIT License, see LICENSE for details.

.. moduleauthor:: Matthias Cuntz

Functions:

.. autosummary::
   curvature

History
    * Written Mar 2015 by Matthias Cuntz (mc (at) macu (dot) de)
    * Changed to Sphinx docstring and numpydoc, Dec 2019, Matthias Cuntz
    * Split logistic and curvature into separate files,
      May 2020, Matthias Cuntz
    * More consistent docstrings, Jan 2022, Matthias Cuntz

"""


__all__ = ['curvature']


# -----------------------------------------------------------
# curvature of function
[docs]def curvature(x, dfunc, d2func, *args, **kwargs): """ Curvature of a function f .. math:: f''/(1+f'^2)^{3/2} Parameters ---------- x : array_like Independent variable to evalute curvature dfunc : callable Function giving first derivative of function *f*: *f'*, to be called `dfunc(x, *args, **kwargs)` d2func : callable Function giving second derivative of function *f*: *f''*, to be called `d2func(x, *args, **kwargs)` args : iterable Arguments passed to *dfunc* and *d2func* kwargs : dict Keyword arguments passed to *dfunc* and *d2func* Returns ------- float or ndarray Curvature of function *f* at *x* Examples -------- .. code-block:: python from pyjams.functions import dlogistic_offset, d2logistic_offset curvature(1., dlogistic_offset, d2logistic_offset, [1., 2., 2., 1.]) """ return ( d2func(x, *args, **kwargs) / (1. + dfunc(x, *args, **kwargs)**2)**1.5 )
# ----------------------------------------------------------- if __name__ == '__main__': import doctest doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE) # import numpy as np # from logistic_function import dlogistic_offset, d2logistic_offset # from logistic_function import dlogistic_offset_p, d2logistic_offset_p # print(np.around(curvature(1., dlogistic_offset, d2logistic_offset, # 1., 2., 2., 1.), 4)) # # 0.2998 # print(np.around(curvature(1., dlogistic_offset_p, d2logistic_offset_p, # [1., 2., 2., 1.]), 4)) # # 0.2998