math_code_LevenbergMarquardt_Analytical

/*这是一段用LevenbergMarquardt最小化y^2x-5*x的代码*/
/*非线性最小化问题(局部最小)*/
/*求导部分用解析法*/
/*Eighlish : http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm*/
/*中文 :http://zh.wikipedia.org/wiki/%E8%8E%B1%E6%96%87%E8%B4%9D%E6%A0%BC%EF%BC%8D%E9%A9%AC%E5%A4%B8%E7%89%B9%E6%96%B9%E6%B3%95*/
#include <iostream>
#include <Eigen/Dense>
#include <unsupported/Eigen/NonLinearOptimization>
struct ObjectFunctor
{
  int operator()(const Eigen::VectorXf &x, Eigen::VectorXf &fvec) const
  {
    // Implement y = x^2-5*x
    fvec(0) = x(0)*x(0) - 5.0 * x(0);
    return 0;
  }
  int df(const Eigen::VectorXf &x, Eigen::MatrixXf &fjac) const
  {
    // Implement dy/dx = 2*x
    fjac(0) = 2.0f * x(0);
    return 0;
  }
  int inputs() const { return 1; } // dimention of X
  int values() const { return 1; } // number of constraints
}; 
int main(int argc, char *argv[])
{
  Eigen::VectorXf x(1);
  x(0) = 2;
  std::cout << "x: " << x << std::endl;
 
  ObjectFunctor functor;
  Eigen::LevenbergMarquardtObjectFunctor, float> lm(functor);
  lm.minimize(x);
 
  std::cout << "x that minimizes the function: " << x << std::endl;
 
  return 0;
}

 

  

posted @ 2013-05-12 16:50  Greenbird  Views(381)  Comments(0Edit  收藏  举报

To further demonstrate the capabilities of KinFu Large Scale, we made another example with a room.