num_dual

Function gradient

source
pub fn gradient<G, T: DualNum<F>, F: DualNumFloat, D: Dim>(
    g: G,
    x: OVector<T, D>,
) -> (T, OVector<T, D>)
where G: FnOnce(OVector<DualVec<T, F, D>, D>) -> DualVec<T, F, D>, DefaultAllocator: Allocator<D>,
Expand description

Calculate the gradient of a scalar function

let v = SVector::from([4.0, 3.0]);
let fun = |v: SVector<DualSVec64<2>, 2>| (v[0].powi(2) + v[1].powi(2)).sqrt();
let (f, g) = gradient(fun, v);
assert_eq!(f, 5.0);
assert_relative_eq!(g[0], 0.8);
assert_relative_eq!(g[1], 0.6);

The variable vector can also be dynamically sized

let v = DVector::repeat(4, 2.0);
let fun = |v: DVector<DualDVec64>| v.iter().map(|v| v * v).sum::<DualDVec64>().sqrt();
let (f, g) = gradient(fun, v);
assert_eq!(f, 4.0);
assert_relative_eq!(g[0], 0.5);
assert_relative_eq!(g[1], 0.5);
assert_relative_eq!(g[2], 0.5);
assert_relative_eq!(g[3], 0.5);