1、原理介绍
LM算法涉及到快速下降法与牛顿法,其中牛顿法进行拟合,下降法进行判断,详细的介绍很多,其中使用MATLAB实现的代码可参考如下网址:
matlab ,lsqnonlin的使用 LM算法_碎片球球的博客-CSDN博客_lsqnonlin原理
但是使用C++实现的代码,则这个网址存在缺陷,运行部成功,下面代码是结合矩阵库Eigen,用C++进行编写的代码,如下所示:
#include<iostream>
#include<Eigen\Dense>
using namespace std;
using namespace Eigen;
#define Length 9
void main()
{
double data[Length] = { 0.25, 0.5, 1, 1.5, 2, 3, 4, 6, 8 };
double obsdata[Length] = { 19.21, 18.15, 15.36, 14.10, 12.89, 9.32, 7.45, 5.24, 3.01 };
int n_iters = 50;//迭代次数
double lamda = 0.01;//阻尼系数
//初始值 a0,b0
double a0 = 10;
double b0 = 1;
//第一步:变量赋值
int update = 1;
double a_est = a0;
double b_est = b0;
MatrixXd J(9, 2);