1. 程式人生 > >levmar(LM演算法)使用小結2

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()函式啦