Generalized, recursive, scalar and vector (hyper) dual numbers for the automatic and exact calculation of (partial) derivatives. Including bindings for python.
The python package can be installed directly from PyPI:
pip install num_dual
Add this to your Cargo.toml
:
[dependencies]
num-dual = "0.6"
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))
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
}
- You can find the documentation of the rust crate here.
- The documentation of the python package can be found here.
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.
If you want to learn more about the topic of dual numbers and automatic differentiation, we have listed some useful resources for you here:
- Initial paper about hyper-dual numbers: Fike, J. and Alonso, 2011
- Website about all topics regarding automatic differentiation: autodiff.org
- Our paper about dual numbers in equation of state modeling: Rehner, P. and Bauer, G., 2021
If you find num-dual
useful for your own scientific studies, consider citing our publication accompanying this library.
@ARTICLE{rehner2021,
AUTHOR={Rehner, Philipp and Bauer, Gernot},
TITLE={Application of Generalized (Hyper-) Dual Numbers in Equation of State Modeling},
JOURNAL={Frontiers in Chemical Engineering},
VOLUME={3},
YEAR={2021},
URL={https://www.frontiersin.org/article/10.3389/fceng.2021.758090},
DOI={10.3389/fceng.2021.758090},
ISSN={2673-2718}
}