/** * @file numericalDerivative.h * @brief Some functions to compute numerical derivatives * @author Frank Dellaert */ // \callgraph #pragma once #include "Matrix.h" namespace gtsam { /** * Numerically compute gradient of scalar function * Class X is the input argument * needs dim, exmap, vector */ 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) { Vector hx = h(x).vector(); double factor = 1.0/(2.0*delta); const size_t m = hx.size(), n = x.dim(); 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) { Vector hx = h(x1,x2).vector(); double factor = 1.0/(2.0*delta); const size_t m = hx.size(), n = x1.dim(); 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) { Vector hx = h(x1,x2).vector(); double factor = 1.0/(2.0*delta); const size_t m = hx.size(), n = x2.dim(); 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) { Vector hx = h(x1,x2,x3).vector(); double factor = 1.0/(2.0*delta); const size_t m = hx.size(), n = x1.dim(); Vector d(n,0.0); Matrix H = zeros(m,n); for (size_t j=0;j