Expand description

Generalized, recursive, scalar and vector (hyper) dual numbers for the automatic and exact calculation of (partial) derivatives.


This example defines a generic function that can be called using any (hyper) dual number and automatically calculates derivatives.

use num_dual::*;

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 xy_dual_vec = StaticVec::new_vec([x, y]).map(DualVec64::<2>::from).derive();
    println!("{}", f(xy_dual_vec[0], xy_dual_vec[1]).eps);  // [1200, 1000]

    // Calculate a Hessian
    let xy_dual2 = StaticVec::new_vec([x, y]).map(Dual2Vec64::<2>::from).derive();
    println!("{}", f(xy_dual2[0], xy_dual2[1]).v2);         // [[480, 600], [600, 250]]

    // for x=cos(t) and y=sin(t) calculate the third derivative w.r.t. t
    let t = Dual3_64::from(1.0).derive();
    println!("{}", f(t.cos(), t.sin()).v3);                 // 7.358639755305733


A second order dual number for the calculation of Hessians.

A scalar third order dual number for the calculation of third derivatives.

A dual number for the calculations of gradients or Jacobians.

A hyper dual number for the calculation of second partial derivatives.

A statically allocated MxN matrix. The struct is used in the vector (hyper) dual numbers and provides utilities for the calculation of Jacobians.


Implementation of bessel functions for double precision (hyper) dual numbers.

A generalized (hyper) dual number.

The underlying data type of individual derivatives. Usually f32 or f64.

Type Definitions