#dual #numbers #autograd #variables #automatic #derivative #numerical

epsilon

使用双数进行快速自动微分

7个版本

0.313.4 2022年12月10日
0.313.3 2022年12月10日
0.313.0 2022年11月25日
0.3.13 2022年11月25日
0.0.1 2018年10月21日

#6 in #dual

Download history 8/week @ 2024-03-26 38/week @ 2024-04-02 63/week @ 2024-07-02

每月63次下载

AGPL-3.0-or-later

17KB
321

epsilon - 使用双数进行快速自动微分

双数是一种简单的前向梯度传播方式,即跟踪所有表达式的导数,以自动微分函数而不存储计算图。

使用双数,可以在数字中增加一个“双”部分,表示某个输入变量相对于该项的导数。输入变量有一个单位双数部分为1,每个结果表达式都有一个双数部分,表示到该点的导数。

这可以通过为每个输入变量存储一个双数部分简单地扩展到多个变量。

更多详细信息请参阅维基百科


此存储库使用宏静态生成双数的代码,这意味着可以为每个依赖变量提供名称,并生成具有反映变量名称的方法的相应方法。

此存储库生成的类型接口与标准数值Rust类型非常相似,这意味着大多数使用f64的代码应该很容易转换为使用双数。

示例用法

use epsilon::make_dual;
// We want to compute dz/dx and dz/dy for z = x^2+y*sin(y) at x=5, y=7
make_dual! { MyDual, x, y } // Create a dual number with terms `x` and `y`

let (x, y) = (MyDual::x(5.), MyDual::y(7.)); // Perform the calculations, and compute the derivative at x=5, y=7

let z = x.pow(2.) + y * y.sin();

let dzdx = z.d_dx();
let dzdy = z.d_dy();

assert_eq!(dzdx, 10.); // 2 * x
assert_eq!(dzdy, 5.934302379121921); // y*cos(y) + sin(y)

依赖项