Skip to main content

Compute numerical derivatives.

Project description

https://img.shields.io/pypi/v/jacobi https://img.shields.io/badge/github-docs-success https://img.shields.io/badge/github-source-blue https://zenodo.org/badge/270612858.svg

Fast numerical derivatives for analytic functions with arbitrary round-off error and error propagation.

Click here for full documentation.

Features

  • Robustly compute the generalised Jacobi matrix for an arbitrary real analytic mapping ℝⁿ → ℝⁱ¹ × … × ℝⁱⁿ

  • Derivative is either computed to specified accuracy (to save computing time) or until maximum precision of function is reached

  • Algorithm based on John D’Errico’s DERIVEST: works even with functions that have large round-off error

  • Up to 1000x faster than numdifftools at equivalent precision

  • Returns error estimates for derivatives

  • Supports arbitrary auxiliary function arguments

  • Perform statistical error propagation based on numerically computed jacobian

  • Lightweight package, only depends on numpy

Planned features

  • Compute the Hessian matrix numerically with the same algorithm

  • Further generalize the calculation to support function arguments with shape (N, K), in that case compute the Jacobi matrix for each of the K vectors of length N

Examples

from matplotlib import pyplot as plt
import numpy as np
from jacobi import jacobi


# function of one variable with auxiliary argument; returns a vector
def f(x):
    return np.sin(x) / x


x = np.linspace(-10, 10, 200)
fx = f(x)

# f(x) is a simple vectorized function, jacobian is diagonal
fdx, fdxe = jacobi(f, x, diagonal=True)
# fdxe is uncertainty estimate for derivative

plt.plot(x, fx, color="k", label="$f(x) = sin(x) / x$")
plt.plot(x, fdx, label="$f'(x)$ computed with jacobi")
scale = 14
plt.fill_between(
    x,
    fdx - fdxe * 10**scale,
    fdx + fdxe * 10**scale,
    label=f"$f'(x)$ error estimate$\\times \\, 10^{{{scale}}}$",
    facecolor="C0",
    alpha=0.5,
)
plt.legend()
https://hdembinski.github.io/jacobi/_images/example.svg
from jacobi import propagate
import numpy as np
from scipy.special import gamma


# arbitrarily complex function that calls compiled libraries, numba-jitted code, etc.
def fn(x):
    r = np.empty(3)
    r[0] = 1.5 * np.exp(-x[0] ** 2)
    r[1] = gamma(x[1] ** 3.1)
    r[2] = np.polyval([1, 2, 3], x[0])
    return r  # x and r have different lengths

# fn accepts a parameter vector x, which has an associated covariance matrix xcov
x = [1.0, 2.0]
xcov = [[1.1, 0.1], [0.1, 2.3]]
y, ycov = propagate(fn, x, xcov)  # y=f(x) and ycov = J xcov J^T

Comparison to numdifftools

Speed

Jacobi makes better use of vectorized computation than numdifftools and converges rapidly if the derivative is trivial. This leads to a dramatic speedup in some cases.

Smaller run-time is better (and ratio > 1).

https://hdembinski.github.io/jacobi/_images/speed.svg

Precision

The machine precision is indicated by the dashed line. Jacobi is comparable in accuracy to numdifftools. The error estimate has the right order of magnitude but slightly underestimates the true deviation. This does not matter for most applications.

https://hdembinski.github.io/jacobi/_images/precision.svg

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jacobi-0.9.1.tar.gz (997.5 kB view details)

Uploaded Source

Built Distribution

jacobi-0.9.1-py3-none-any.whl (11.1 kB view details)

Uploaded Python 3

File details

Details for the file jacobi-0.9.1.tar.gz.

File metadata

  • Download URL: jacobi-0.9.1.tar.gz
  • Upload date:
  • Size: 997.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.4

File hashes

Hashes for jacobi-0.9.1.tar.gz
Algorithm Hash digest
SHA256 a5bda7f4ef32e94ce6b71ff9e8cfeedd3a092c98ab767f05f8d009068cfc6fa7
MD5 4614f82be1bff13a897c25c0bec79cb7
BLAKE2b-256 80d2ef5eb4d403d0f1b08fe230214e57f9fef33328fc6b445c5b881f135f8790

See more details on using hashes here.

File details

Details for the file jacobi-0.9.1-py3-none-any.whl.

File metadata

  • Download URL: jacobi-0.9.1-py3-none-any.whl
  • Upload date:
  • Size: 11.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.4

File hashes

Hashes for jacobi-0.9.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cfc2957b898a275201f010bd95d38698684ebfb5e89572552b527c2dd10ac99c
MD5 27747eb4d7ea86fb742bfad7a9281f22
BLAKE2b-256 0f1d13af5cb059e5143c8c4bee83cde39300847ab43c0f61191eb69291d3d351

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page