## num-dual

Generalized (hyper) dual numbers for the calculation of exact (partial) derivatives

### 3 releases(breaking)

 0.3.0 Aug 10, 2021 Jul 26, 2021 Jul 7, 2021

#65 in Math

Used in dualnum

MIT/Apache

125KB
3K SLoC

# num-dual

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

## Installation and Usage

### Python

You can install the python package either from pypi:

``````pip install num_dual
``````

or from source (you need a rust compiler for that):

``````pip install git+https://github.com/itt-ustutt/num-dual
``````

### Rust

Add this to your `Cargo.toml`:

``````[dependencies]
num-dual = "0.3"
``````

## Example

### Python

Compute the first and second derivative of a scalar-valued function.

``````from num_dual import derive2
import numpy as np

def f(x):
return np.exp(x) / np.sqrt(np.sin(x)**3 + np.cos(x)**3)

x = derive2(1.5)
result = f(x)
print('f(x)    = {}'.format(result.value))
print('df/dx   = {}'.format(result.first_derivative))
print('d2f/dx2 = {}'.format(result.second_derivative))
``````

### Rust

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 + ε
let xy_dual_vec = StaticVec::new_vec([x,y]).map(DualVec64::<2>::from).derive();
println!("{}", f(xy_dual_vec, xy_dual_vec).eps);  // [1200, 1000]
// Calculate a Hessian
let xy_dual2 = StaticVec::new_vec([x,y]).map(Dual2Vec64::<2>::from).derive();
println!("{}", f(xy_dual2, xy_dual2).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
}
``````

## Documentation

• You can find the documentation of the rust crate here.
• The documentation of the python package can be found here.

### Python

For the following commands to work you have to have the package installed (see: installing from source).

``````cd docs
make html
``````

Open `_build/html/index.html` in your browser.

~0.1–28MB
~494K SLoC