levmar(LM算法)使用小结2

 Levenberg-Marquardt算法是求解非线性问题的一个非常好用的算法,而levmar是开源的LM算法,为我们的计算提供了方便,最近因为课题需要用到了里面的 dlevmar_dif()函数,下面介绍其各参数的含义和在vs环境下直接运行levmar的方法。

一、LM算法与dlevmar_dif()
levmar下载地址 
《Methods for non-linear least squares problems》非线性优化参考文献 
原理不在具体描述,可阅读给出的参考文献,其伪代码如下: 

其中J(x)是雅可比矩阵 

 int dlevmar_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),//自己编写的函数,p为待优化的量,输入初始值,最后输出优化值;hx为待逼近的向量,通过p计算使hx不断逼近x;剩下的三个变量同下边相同
      double *p, //p为待优化的量,输入初始值,最后输出优化值
      double *x,//观测值,p最优时hx逼近x
      int m,//p的维数
      int n,//x或hx的维数
      int itmax,//最大迭代次数
      double *opts,//迭代过程中的一些阈值,包括最初计算阻尼系数时需要的系数、迭代结束需要的系数。如果不知道怎么设可以为NULL,代码有默认配置。
      double *info,//返回迭代结束的一些信息,如迭代次数、结束原因等。
      double *work,//一般设置为null
      double *covar,//在代码中没有用到,可设置为null
      void *adata)//附加信息,当需要向函数中传递其他自己需要的信息时使用,不用时可设置为null

二、在vs环境下配置levmar
Levmar依赖于一个叫LAPACK的库,这个库是Fortran语言编写的,可用于解多元线性方程式、计算特征向量、计算矩阵的QR分解,奇异值分解等等,但是dlevmar_der(),dlevmar_dif(),slevmar_der(),slevmar_dif(),dlevmar_bc_der(),dlevmar_bc_dif(),slevmar_bc_der(),slevmar_bc_dif()是不需要依赖这个库的,下面就介绍直接使用dlevmar_dif()的方法 
ps:若是想利用lapack可参考这一篇博客,依赖lapack进行配置 
将下载的压缩文件解压,获得一个名字为levmar2.6的文件夹,将这个问价夹包含在工程目录下,同时在属性设置中添加到包含目录 

然后将levmar中的 Axb.c compiler.h levmar.h levmar.c lm.c lm.h misc.c misc.h 添加到工程中。 
注意!有一些后缀是core的C文件(*_core.c),这些文件是不能直接编译的,即不需要添加到Visual c++ 的工程里。 
注释掉 levmar.h中的#define HAVE_LAPACK 

接下来就可以使用dlevmar_dif()函数啦

猜你喜欢

转载自blog.csdn.net/eric_e/article/details/85241496