/** * @file numericalDerivative.h * @brief Some functions to compute numerical derivatives * @author Frank Dellaert */ // \callgraph #pragma once #include "Lie.h" #include "Matrix.h" //#define LINEARIZE_AT_IDENTITY namespace gtsam { /** * Numerically compute gradient of scalar function * Class X is the input argument * The class X needs to have dim, expmap, logmap */ template Vector numericalGradient(double (*h)(const X&), const X& x, double delta=1e-5) { double hx = h(x); double factor = 1.0/(2.0*delta); const size_t n = x.dim(); Vector d(n,0.0), g(n,0.0); for (size_t j=0;j Matrix numericalDerivative11(Y (*h)(const X&), const X& x, double delta=1e-5) { Y hx = h(x); double factor = 1.0/(2.0*delta); const size_t m = dim(hx), n = dim(x); Vector d(n,0.0); Matrix H = zeros(m,n); for (size_t j=0;j Matrix numericalDerivative21(Y (*h)(const X1&, const X2&), const X1& x1, const X2& x2, double delta=1e-5) { Y hx = h(x1,x2); double factor = 1.0/(2.0*delta); const size_t m = dim(hx), n = dim(x1); Vector d(n,0.0); Matrix H = zeros(m,n); for (size_t j=0;j Matrix numericalDerivative22 (Y (*h)(const X1&, const X2&), const X1& x1, const X2& x2, double delta=1e-5) { Y hx = h(x1,x2); double factor = 1.0/(2.0*delta); const size_t m = dim(hx), n = dim(x2); Vector d(n,0.0); Matrix H = zeros(m,n); for (size_t j=0;j Matrix numericalDerivative31 (Y (*h)(const X1&, const X2&, const X3&), const X1& x1, const X2& x2, const X3& x3, double delta=1e-5) { Y hx = h(x1,x2,x3); double factor = 1.0/(2.0*delta); const size_t m = dim(hx), n = dim(x1); Vector d(n,0.0); Matrix H = zeros(m,n); for (size_t j=0;j