跳转到主要内容

计算数值导数

项目描述

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

为任意舍入误差和误差传播的解析函数提供快速的数值导数。

点击此处查看完整文档.

功能

  • 稳健地计算任意实解析映射ℝⁿ → ℝⁱ¹ × … × ℝⁱⁿ的广义雅可比矩阵

  • 导数可以计算到指定的精度(以节省计算时间)或直到函数的最大精度

  • 基于John D’Errico的DERIVEST算法:即使对于具有大舍入误差的函数也能正常工作

  • 比numdifftools在等效精度下快1000倍

  • 返回导数的误差估计

  • 支持任意辅助函数参数

  • 基于数值计算的雅可比矩阵执行统计误差传播

  • 轻量级软件包,仅依赖于numpy

计划中的功能

  • 使用相同的算法数值计算Hessian矩阵

  • 进一步泛化计算以支持形状为(N, K)的函数参数,在这种情况下,计算长度为N的K个向量的雅可比矩阵

示例

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

与numdifftools的比较

速度

Jacobi比numdifftools更好地利用了向量化计算,并且如果导数是平凡的,则收敛迅速。这导致在某些情况下速度显著加快。

运行时间越短越好(并且比率 > 1)。

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

精度

机器精度由虚线表示。Jacobi的精度与numdifftools相当。误差估计的量级正确,但略微低估了实际偏差。对于大多数应用来说,这并不重要。

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

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

jacobi-0.9.2.tar.gz (998.3 kB 查看哈希值)

上传时间 源代码

构建分发

jacobi-0.9.2-py3-none-any.whl (11.8 kB 查看哈希值)

上传时间 Python 3

由以下组织支持