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;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								/* ************************************************************************* */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |