青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Levmar:Levenberg-Marquardt非線性最小二乘算法

eryar@163.com

Abstract. Levmar is GPL native ANSI C implementations of the Levenberg-Marquardt optimization algorithm.The blog focus on the compilation of levmar on Windows with Visual Studio.

Key Words. Levmar, C, LM least squares

1. levmar簡介

Gauss-Newton算法是一個古老的處理非線性最小二乘問題的方法。該方法在迭代過程中要求矩陣J(x)滿秩。為了克服這個困難,Levenberg(1944)提出了一種新的方法,但未受到重視。后來Marquardt(1963)又重新提出,并在理論上進行了控討,得到Levenberg-Marquardt方法,簡稱LM方法。在此基礎上,Fletcher(1971)對其實現策略進行了改進,得到了Levenberg-Marquardt-Fletcher方法(LMF)。再后來,More(1978)將LM方法與信賴域方法結合,建立了帶信賴域的LM方法。

LM算法的產生主要是解決曲線最小二乘擬合問題,現在很多軟件使用LM算法來解決通用的曲線擬合問題。

本文主要介紹GPL開源庫levmar2.6使用Visual Studio在Windows上進行編譯。這個開源庫的官方網站是:http://users.ics.forth.gr/~lourakis/levmar/

wps_clip_image-24963

2. 編譯levmar

下載源碼levmar-2.6解壓,在其README.txt中對levmar的授權GPL、編譯等進行了說明。在Windows操作系統中,可以使用nmake /f Makefile.vc來編譯levmar和一個示例程序。

從官網介紹可知,levmar有些算法依賴LAPACK庫,一個線性代數計算開源庫。所以如果要使用那些算法,編譯的時候必須包含這個庫。從示例程序的源文件lmdemo.c中可以看出,有些問題的求解是需要LAPACK庫的,相關源碼列出如下:

  /* uncomment the appropriate line below to select a minimization problem */
  problem=
          //0; // Rosenbrock function
          //1; // modified Rosenbrock problem
          //2; // Powell's function
      //3; // Wood's function
          4; // Meyer's (reformulated) problem
          //5; // Osborne's problem
      //6; // helical valley function
#ifdef HAVE_LAPACK
      //7; // Boggs & Tolle's problem 3
      //8; // Hock - Schittkowski problem 28
      //9; // Hock - Schittkowski problem 48
      //10; // Hock - Schittkowski problem 51
#else // no LAPACK
#ifdef _MSC_VER
#pragma message("LAPACK not available, some test problems cannot be used")
#else
#warning LAPACK not available, some test problems cannot be used
#endif // _MSC_VER
#endif /* HAVE_LAPACK */
      //11; // Hock - Schittkowski problem 01
      //12; // Hock - Schittkowski modified problem 21
      //13; // hatfldb problem
      //14; // hatfldc problem
      //15; // equilibrium combustion problem
#ifdef HAVE_LAPACK
      //16; // Hock - Schittkowski modified #1 problem 52
      //17; // Schittkowski modified problem 235
      //18; // Boggs & Tolle modified problem #7
      //19; // Hock - Schittkowski modified #2 problem 52
      //20; // Hock - Schittkowski modified problem #76"
#endif /* HAVE_LAPACK */
  switch(problem){
  default: fprintf(stderr, "unknown problem specified (#%d)! Note that some minimization problems require LAPACK.\n", problem);
           exit(1);
    break;

從上述源碼可知,如果LAPACK庫不可用的時候,示例程序中的問題

l 7 Boggs & Tolle’s problem 3

l 8 Hock - Schittkowski problem 28

l 9 Hock - Schittkowski problem 48

l 10 Hock - Schittkowski problem 51

l 16 Hock - Schittkowskit modified #1 problem 52

l 17 Schittkowski modified problem 235

l 18 Boggs & Tolle modified problem #7

l 19 Hock - Schittkowski modified #2 problem 52

l 20 Hock - Schittkowski modified probem #76

這些問題的求解功能是不能使用的。從頭文件levmar.h中要以看出,

#ifdef LM_DBL_PREC
/* double precision LM, with & without Jacobian */
/* unconstrained minimization */
extern int dlevmar_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, int itmax, double *opts,
      double *info, double *work, double *covar, void *adata);
extern int dlevmar_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, int itmax, double *opts,
      double *info, double *work, double *covar, void *adata);
/* box-constrained minimization */
extern int dlevmar_bc_der(
       void (*func)(double *p, double *hx, int m, int n, void *adata),
       void (*jacf)(double *p, double *j, int m, int n, void *adata),  
       double *p, double *x, int m, int n, double *lb, double *ub, double *dscl,
       int itmax, double *opts, double *info, double *work, double *covar, void *adata);
extern int dlevmar_bc_dif(
       void (*func)(double *p, double *hx, int m, int n, void *adata),
       double *p, double *x, int m, int n, double *lb, double *ub, double *dscl,
       int itmax, double *opts, double *info, double *work, double *covar, void *adata);
#ifdef HAVE_LAPACK
/* linear equation constrained minimization */
extern int dlevmar_lec_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *A, double *b, int k,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
extern int dlevmar_lec_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *A, double *b, int k,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
/* box & linear equation constrained minimization */
extern int dlevmar_blec_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, double *A, double *b, int k, double *wghts,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
extern int dlevmar_blec_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, double *A, double *b, int k, double *wghts,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
/* box, linear equations & inequalities constrained minimization */
extern int dlevmar_bleic_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub,
      double *A, double *b, int k1, double *C, double *d, int k2,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
extern int dlevmar_bleic_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, 
      double *A, double *b, int k1, double *C, double *d, int k2,
      int itmax, double *opts, double *info, double *work, double *covar, void *adata);
/* box & linear inequality constraints */
extern int dlevmar_blic_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, double *C, double *d, int k2,
      int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
extern int dlevmar_blic_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *lb, double *ub, double *C, double *d, int k2,
      int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
/* linear equation & inequality constraints */
extern int dlevmar_leic_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *A, double *b, int k1, double *C, double *d, int k2,
      int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
extern int dlevmar_leic_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *A, double *b, int k1, double *C, double *d, int k2,
      int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
/* linear inequality constraints */
extern int dlevmar_lic_der(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      void (*jacf)(double *p, double *j, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *C, double *d, int k2,
      int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
extern int dlevmar_lic_dif(
      void (*func)(double *p, double *hx, int m, int n, void *adata),
      double *p, double *x, int m, int n, double *C, double *d, int k2,
      int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata);
#endif /* HAVE_LAPACK */
#endif /* LM_DBL_PREC */

從頭文件levmar.h中的代碼可以看出,在#ifdef HAVE_LAPACK和#endif /* HAVE_LAPACK */之間的函數都是不可用的。除此之外的函數是可用的,如基本的dlevmar_der和dlevmar_dif等函數是不依賴LAPACK庫的。如果只使用這幾個函數,則可以不用配置LAPACK庫,編譯levmar就很簡單了。

如果不使用LAPACK庫,可以先在頭文件levmar.h中把#define HAVE_LAPACK 這一行注釋掉:

wps_clip_image-1378

然后再修改Makefile.vc文件,在Makefile.vc中可以看到如下圖所示一句注釋,即當不使用LAPACK庫是,把那一行注釋掉(前面加#):

wps_clip_image-511

這時就可以啟動Visual Studio的編譯器CL來編譯levmar庫了。配置好編譯環境的命令工具從Visual Studio的菜單來啟動:

wps_clip_image-31275

要編譯32位的levmar庫,可以使用x86的命令工具,要編譯64位的levmar,可以使用x64的命令工具。啟動命令工具后,切換到levmar源碼文件夾,并輸入命令

nmake /f Makefile.vc

如下圖所示:

wps_clip_image-5008

編譯成功生成levmar.lib和lmdemo.exe說明編譯成功了。

wps_clip_image-7636

接著在命令窗口中運行lmdemo.exe,測試levmar例子程序。如果lmdemo正常運行,說明levmar已經成功編譯。

自己的程序如果要使用levmar,就可以像使用其他開源庫一樣,設置頭文件路徑及庫levmar.lib的路徑,就可以使用了。

wps_clip_image-10013


為了方便大家在移動端也能看到我的博文和討論交流,現已注冊微信公眾號,歡迎大家掃描下方二維碼關注。
Shing Liu(eryar@163.com)


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲图片你懂的| 久久久亚洲欧洲日产国码αv| 亚洲免费影院| 日韩午夜中文字幕| 99精品福利视频| 一区二区三区产品免费精品久久75 | 亚洲一级特黄| 亚洲视频专区在线| 亚洲免费伊人电影在线观看av| 午夜在线播放视频欧美| 久久精品国产99| 久久亚洲春色中文字幕久久久| 老司机午夜精品| 亚洲欧洲在线视频| 在线一区欧美| 久久亚洲高清| 欧美无砖砖区免费| 国内久久精品| 国产精品99久久久久久www| 欧美一二区视频| 欧美国产日本| 亚洲免费人成在线视频观看| 久久久久国产精品一区二区| 欧美日韩理论| 狠狠狠色丁香婷婷综合久久五月 | 亚洲免费视频网站| 久久综合中文字幕| 亚洲伦理网站| 久久久久久网址| 国产精品ⅴa在线观看h| 在线不卡a资源高清| 亚洲综合第一页| 欧美激情精品久久久久久| 亚洲视屏在线播放| 国产精品久久久久久久电影| 欧美成人自拍| 久久综合伊人77777| 欧美日韩中文字幕综合视频| 国产午夜精品美女毛片视频| 99视频一区二区三区| 久色婷婷小香蕉久久| 亚洲图片欧洲图片av| 久久蜜臀精品av| 国产精品一香蕉国产线看观看 | 国产精品日韩高清| 亚洲国产小视频在线观看| 亚洲图片欧洲图片av| 你懂的一区二区| 性色av一区二区三区红粉影视| 欧美成人午夜| 亚洲国产高清自拍| 玖玖国产精品视频| 久久av在线| 国产欧美激情| 午夜国产精品视频| 亚洲精品国产精品国产自| 久久精品日韩一区二区三区| 国产欧美日韩视频| 久久国产日韩| 久久国产乱子精品免费女| 国产亚洲欧洲| 免费不卡中文字幕视频| 久久久久国产精品一区三寸| 一区视频在线| 亚洲国产99| 欧美另类视频| 正在播放亚洲一区| 中文无字幕一区二区三区| 国产精品久久久久7777婷婷| 亚洲永久精品国产| 亚洲一区自拍| 国产亚洲综合在线| 美女视频黄a大片欧美| 老牛影视一区二区三区| 亚洲精品美女在线| 夜夜嗨av一区二区三区网页| 国产精品你懂的在线| 久久久久国产精品www| 另类人畜视频在线| 一区二区高清视频| 亚洲欧美国产精品va在线观看| 国产一区二区三区网站| 欧美韩日高清| 国产精品xxx在线观看www| 久久精品道一区二区三区| 久久嫩草精品久久久精品一| 夜夜狂射影院欧美极品| 香蕉久久夜色精品国产使用方法| 在线观看亚洲一区| 9色porny自拍视频一区二区| 国产一区白浆| 亚洲人成在线播放网站岛国| 国产精品一页| 91久久久久久国产精品| 在线国产欧美| 欧美电影免费观看高清| 欧美在线播放| 日韩午夜激情电影| 亚洲欧美电影在线观看| 亚洲电影网站| 亚洲女同性videos| 亚洲成在人线av| 一本色道久久综合狠狠躁的推荐| 国产精品资源在线观看| 亚洲电影免费观看高清| 国产欧美一区二区三区久久| 亚洲国产精品久久久久婷婷884| 欧美日韩一区二区三区在线 | 久久精品91久久久久久再现| 欧美成人精品激情在线观看| 欧美一区91| 欧美日韩大片| 欧美成人精品1314www| 国产欧美日韩在线视频| 一区二区三区视频在线| 99av国产精品欲麻豆| 久久综合久久久久88| 久久深夜福利免费观看| 国产欧美日韩一级| 亚洲午夜激情免费视频| 一区二区三区视频在线看| 美女免费视频一区| 久久亚洲欧洲| 国产最新精品精品你懂的| 亚洲伊人第一页| 亚洲欧美日韩国产成人精品影院| 欧美国产另类| 欧美韩日精品| 亚洲激情视频| 能在线观看的日韩av| 欧美高清视频一二三区| 精品av久久久久电影| 欧美亚洲日本国产| 久久国产精品久久久| 国产欧美日韩在线视频| 欧美一级片在线播放| 久久精品国语| 国产又爽又黄的激情精品视频| 亚洲欧美久久久久一区二区三区| 亚洲欧美一区二区三区在线| 国产精品看片资源| 亚洲欧美清纯在线制服| 久久国产精品久久久久久| 国产一区二区三区不卡在线观看 | 久久久免费精品| 国产日韩欧美制服另类| 亚洲女同在线| 久久国产精品黑丝| 韩国在线一区| 免费观看一级特黄欧美大片| 欧美激情第9页| 亚洲美女在线观看| 欧美日韩久久不卡| 在线视频欧美日韩| 在线视频精品一区| 国内成+人亚洲+欧美+综合在线| 亚洲校园激情| 欧美一区久久| 影音先锋日韩精品| 欧美国产精品人人做人人爱| 亚洲毛片av在线| 欧美亚洲一区在线| 好看的日韩视频| 欧美黑人在线观看| 亚洲午夜激情| 美女露胸一区二区三区| 亚洲一二三区视频在线观看| 国产欧美日韩一区二区三区| 久久久美女艺术照精彩视频福利播放 | 国产精品青草久久久久福利99| 亚洲女同在线| 欧美高清视频在线观看| 日韩一级精品视频在线观看| 国产精品播放| 久久一区二区三区四区| 亚洲人成在线观看网站高清| 午夜精品成人在线| 在线观看成人av电影| 国产精品盗摄久久久| 久久夜色精品国产| av成人黄色| 麻豆精品视频在线观看| 亚洲午夜精品| 国产精品一卡二| 亚洲国产精品成人综合| 先锋a资源在线看亚洲| 欧美日韩国产探花| 久久一区亚洲| 另类亚洲自拍| 久久综合伊人77777| 国产日韩欧美成人| 亚洲女ⅴideoshd黑人| 一区二区三区黄色| 欧美精品一区二区三区视频| 欧美成年人网站| 在线成人小视频| 久久激情视频久久| 久久精品国产视频| 国产亚洲激情| 久久久久9999亚洲精品|