CPP/Eigen/LevenbergMarquardtNumerical

From ProgrammingExamples
< CPP
Revision as of 09:53, 5 November 2011 by Daviddoria (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

LevenbergMarquardtNumerical.cpp

#include <iostream>
 
#include <Eigen/Dense>
 
#include <unsupported/Eigen/NonLinearOptimization>
 
// LM minimize for sum_i (f_i(x))^2
 
struct MyFunctor
{
  int operator()(const Eigen::VectorXf &x, Eigen::VectorXf &fvec) const
  {
    // Implement y = (x-5)^2 (remember, operator() should return the value BEFORE it is squared.
    fvec(0) = x(0) - 5.0;
    return 0;
  }
 
  int df(const Eigen::VectorXf &x, Eigen::MatrixXf &fjac) const
  {
    Eigen::VectorXf epsilon(1);
    epsilon(0) = 1e-5;
 
    Eigen::VectorXf fvec1;
    operator()(x + epsilon, fvec1);
    Eigen::VectorXf fvec2;
    operator()(x - epsilon, fvec2);
    fjac = (fvec1 - fvec2)/2.0f;
    return 0;
  }
 
  int inputs() const { return 1; }// inputs is the dimension of x.
  int values() const { return 1; } // "values" is the number of f_i and 
};
 
 
int main(int argc, char *argv[])
{
  Eigen::VectorXf x(1);
  x(0) = 2;
  std::cout << "x: " << x << std::endl;
 
  MyFunctor functor;
  Eigen::LevenbergMarquardt<MyFunctor, float> lm(functor);
  lm.minimize(x);
 
  std::cout << "x that minimizes the function: " << x << std::endl;
 
  return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
 
PROJECT(NumericalDerivative)
include_directories(/media/portable/src/Eigen)
# FIND_PACKAGE(Eigen3 REQUIRED)
# INCLUDE(${Eigen_USE_FILE})
 
include_directories(${EIGEN3_INCLUDE_DIR} ${EIGEN3_INCLUDE_DIR}/unsupported/)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET")
 
ADD_EXECUTABLE(NumericalDerivative NumericalDerivative.cpp )