Crates.io | num-hyperdual |
lib.rs | num-hyperdual |
version | 0.1.1 |
source | src |
created_at | 2021-05-03 12:42:55.627288 |
updated_at | 2021-06-23 11:35:24.570019 |
description | Generalized (hyper) dual numbers for the calculation of exact (partial) derivatives |
homepage | https://github.com/itt-ustutt/num-hyperdual |
repository | https://github.com/itt-ustutt/num-hyperdual |
max_upload_size | |
id | 392488 |
size | 193,583 |
Generalized, recursive, scalar and vector (hyper) dual numbers for the automatic and exact calculation of (partial) derivatives.
Add this to your Cargo.toml
:
[dependencies]
num-hyperdual = "0.1"
This example defines a generic function that can be called using any (hyper) dual number and automatically calculates derivatives.
use num_hyperdual::*;
fn f<D: DualNum<f64>>(x: D, y: D) -> D {
x.powi(3) * y.powi(2)
}
fn main() {
let (x, y) = (5.0, 4.0);
// Calculate a simple derivative
let x_dual = Dual64::from(x).derive();
let y_dual = Dual64::from(y);
println!("{}", f(x_dual, y_dual)); // 2000 + 1200ε
// Calculate a gradient
let x_dual2 = DualN64::<2>::from(x).derive(0);
let y_dual2 = DualN64::<2>::from(y).derive(1);
println!("{}", f(x_dual2, y_dual2).eps); // [1200, 1000]
// Calculate a Hessian
let x_hyperdual2 = HyperDualN64::<2>::from(x).derive(0);
let y_hyperdual2 = HyperDualN64::<2>::from(y).derive(1);
println!("{}", f(x_hyperdual2, y_hyperdual2).hessian); // [[480, 600], [600, 250]]
// for x=cos(t) and y=sin(t) calculate the third derivative w.r.t. t
let t = HD3_64::from(1.0).derive();
println!("{}", f(t.cos(), t.sin()).v3); // 7.358639755305733
}