levmar(LM演算法)使用小結

2021-08-03 19:39:28 字數 1391 閱讀 5288

levenberg-marquardt演算法是求解非線性問題的乙個非常好用的演算法,而levmar是開源的lm演算法,為我們的計算提供了方便,最近因為課題需要用到了裡面的 dlevmar_dif()函式,下面介紹其各引數的含義和在vs環境下直接執行levmar的方法。

《methods for non-linear least squares problems》非線性優化參考文獻

原理不在具體描述,可閱讀給出的參考文獻,其偽**如下:

其中j(x)是雅可比矩陣

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

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進行配置

接下來就可以使用dlevmar_dif()函式啦

排序演算法小結

1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...

KMP演算法小結

posted on 2011 06 14 byhuangchao 主要看了這裡,感覺講的十分的不錯,總結一下。首先宣告要搜尋的串為s,設長度為n,要匹配的串為m,設長度為m.先考慮暴力的演算法,暴力的演算法是遍歷s的每乙個字元,然後從這個字元開始和m串進行匹配。時間複雜度為o nm 怎麼在此基礎上進...

排序演算法小結

1 歸併排序 3.區別與聯絡 遞迴是從未知推到已知,相當於把未知的東西壓入棧,等到可以算出結果了,就一步一步出棧。迭代是從已知到未知,從已知的東西一步一步推至目標。遞迴與迭代就好像一對逆元。遞迴的 更加清晰,但開銷更大,也更容易出錯,除錯較困難 而迭代的 編寫更困難,但速度和開銷較小。4.空間占用 ...