手写非线性最小二乘

使用梯度下降法来求解非线性最小二乘问题

 

方法1:梯度下降法

#include 
#include 
#include 
#include 
#include 
#include 
#include 
class descent_method
{
private:
    /* data */

    double a_; //初始数值
    double b_;
    double c_;
    double lamda_;
    Eigen::Vector3d Gradient_;
    int max_iter_;
    double min_step_;
    //Eigen::MatrixXd Gradient_; // 梯度矩阵

    void cal_Gradient();
    void update_deltT();
    std::vector x_obs_;
    std::vector y_obs_;

public:
    descent_method(double a, double b, double c);
    void add_obs(double x, double y);
    void solve_cost();
    ~descent_method();
};

descent_method::descent_method(double a, double b, double c) : a_(a), b_(b), c_(c)
{
    max_iter_ = 50000;
    min_step_ = 1e-3;
    lamda_ =1e-3;
}

descent_method::~descent_method()
{
}
void descent_method::add_obs(double x, double y) //添加观测
{
    x_obs_.push_back(x);
    y_obs_.push_back(y);
}
void descent_method::solve_cost()
{
    for (int i = 0; i < max_iter_; i++) //最大的迭代次数
    {
        cal_Gradient(); //计算梯度
        //std::cout<<"success cal J"<

目前梯度下降算法还存在一些问题,例如如何调lamda的参数跟min_step之间的关系

 

参考博客:

[1] https://www.jianshu.com/p/bf6ec56e26bd

[2] https://zhuanlan.zhihu.com/p/42383070

你可能感兴趣的:(【SLAM探索】)