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