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 在 算法 中
181 每月下载量
用于 4 crates
72KB
2K SLoC
autodiff
一个自动微分库。
当前支持的功能
-
前向自动微分
-
反向自动微分
要使用此库计算关于变量的导数
-
创建一个类型为
F
的变量,该变量实现了来自num-traits
crate 的Float
特性。 -
使用此变量作为输入计算您的函数。
-
使用
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`
功能
通过 approx
、cgmath
和 nalgebra
特性标志分别支持 approx
、cgmath
和 na
。
许可协议
此存储库根据您的选择受以下协议之一许可:
- Apache 许可协议第 2 版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可协议 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
。
致谢
此库最初是 rust-ad 的分支。
依赖关系
~0.1–0.9MB
~17K SLoC