61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
|  | /**
 | ||
|  |  * @file    numericalDerivative.cpp | ||
|  |  * @brief   Some functions to compute numerical derivatives | ||
|  |  * @author  Frank Dellaert | ||
|  |  */ | ||
|  | 
 | ||
|  | #include "numericalDerivative.h"
 | ||
|  | 
 | ||
|  | namespace gtsam { | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  |   Matrix NumericalDerivative11 | ||
|  |   (Vector (*h)(const Vector&), const Vector& x_, double delta) { | ||
|  |     Vector x(x_), hx = h(x); | ||
|  |     double factor = 1.0/(2.0*delta); | ||
|  |     const size_t m = hx.size(), n = x.size(); | ||
|  |     Matrix H = zeros(m,n); | ||
|  |     for (size_t j=0;j<n;j++) { | ||
|  |       x(j) +=   delta; Vector hxplus = h(x); | ||
|  |       x(j) -= 2*delta; Vector hxmin  = h(x); | ||
|  |       x(j) +=   delta; Vector dh = (hxplus-hxmin)*factor; | ||
|  |       for (size_t i=0;i<m;i++) H(i,j) = dh(i); | ||
|  |     } | ||
|  |     return H; | ||
|  |   } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  |   Matrix NumericalDerivative21 | ||
|  |   (Vector (*h)(const Vector&, const Vector&), const Vector& x1_, const Vector& x2, double delta) { | ||
|  |     Vector x1(x1_), hx = h(x1,x2); | ||
|  |     double factor = 1.0/(2.0*delta); | ||
|  |     const size_t m = hx.size(), n = x1.size(); | ||
|  |     Matrix H = zeros(m,n); | ||
|  |     for (size_t j=0;j<n;j++) { | ||
|  |       x1(j) +=   delta; Vector hxplus = h(x1,x2); | ||
|  |       x1(j) -= 2*delta; Vector hxmin  = h(x1,x2); | ||
|  |       x1(j) +=   delta; Vector dh = (hxplus-hxmin)*factor; | ||
|  |       for (size_t i=0;i<m;i++) H(i,j) = dh(i); | ||
|  |     } | ||
|  |     return H; | ||
|  |   } | ||
|  | 
 | ||
|  | /* ************************************************************************* */ | ||
|  |   Matrix NumericalDerivative22 | ||
|  |   (Vector (*h)(const Vector&, const Vector&), const Vector& x1, const Vector& x2_, double delta) { | ||
|  |     Vector x2(x2_), hx = h(x1,x2); | ||
|  |     double factor = 1.0/(2.0*delta); | ||
|  |     const size_t m = hx.size(), n = x2.size(); | ||
|  |     Matrix H = zeros(m,n); | ||
|  |     for (size_t j=0;j<n;j++) { | ||
|  |       x2(j) +=   delta; Vector hxplus = h(x1,x2); | ||
|  |       x2(j) -= 2*delta; Vector hxmin  = h(x1,x2); | ||
|  |       x2(j) +=   delta; Vector dh = (hxplus-hxmin)*factor; | ||
|  |       for (size_t i=0;i<m;i++) H(i,j) = dh(i); | ||
|  |     } | ||
|  |     return H; | ||
|  |   } | ||
|  | /* ************************************************************************* */ | ||
|  | 
 | ||
|  | } |