19 个版本

0.7.0 2023 年 3 月 29 日
0.6.0 2022 年 11 月 12 日
0.5.2 2022 年 11 月 12 日
0.5.1 2022 年 5 月 6 日
0.1.4 2018 年 11 月 10 日

#408算法

Download history 117/week @ 2024-03-11 31/week @ 2024-03-18 25/week @ 2024-03-25 65/week @ 2024-04-01 15/week @ 2024-04-08 13/week @ 2024-04-15 17/week @ 2024-04-22 14/week @ 2024-04-29 13/week @ 2024-05-06 16/week @ 2024-05-13 19/week @ 2024-05-20 23/week @ 2024-05-27 61/week @ 2024-06-03 23/week @ 2024-06-10 60/week @ 2024-06-17 36/week @ 2024-06-24

181 每月下载量
用于 4 crates

MIT/Apache 许可协议

72KB
2K SLoC

autodiff

一个自动微分库。

On crates.io On docs.rs Build status

当前支持的功能

  • 前向自动微分

  • 反向自动微分

要使用此库计算关于变量的导数

  1. 创建一个类型为 F 的变量,该变量实现了来自 num-traitscrate 的 Float 特性。

  2. 使用此变量作为输入计算您的函数。

  3. 使用 deriv 方法从该变量请求导数。

免责声明

此库仍在开发中,不适合生产使用。

示例

以下示例对由闭包定义的 1D 函数进行微分。

    // Define a function `f(x) = e^{-0.5*x^2}`.
    let f = |x: FT<f64>| (-x * x / F1::cst(2.0)).exp();

    // Differentiate `f` at zero.
    println!("{}", diff(f, 0.0)); // prints `0`

要计算函数的梯度,请按如下方式使用 grad 函数

    // Define a function `f(x,y) = x*y^2`.
    let f = |x: &[FT<f64>]| x[0] * x[1] * x[1];

    // Differentiate `f` at `(1,2)`.
    let g = grad(f, &vec![1.0, 2.0]);
    println!("({}, {})", g[0], g[1]); // prints `(4, 4)`

计算多变量函数的特定导数

     // Define a function `f(x,y) = x*y^2`.
     let f = |v: &[FT<f64>]| v[0] * v[1] * v[1];
 
     // Differentiate `f` at `(1,2)` with respect to `x` (the first unknown) only.
     let v = vec![
         F1::var(1.0), // Create a variable.
         F1::cst(2.0), // Create a constant.
     ];
     println!("{}", f(&v).deriv()); // prints `4`

功能

通过 approxcgmathnalgebra 特性标志分别支持 approxcgmathna

许可协议

此存储库根据您的选择受以下协议之一许可:

致谢

此库最初是 rust-ad 的分支。

依赖关系

~0.1–0.9MB
~17K SLoC