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

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>
            欧美资源在线观看| 亚洲级视频在线观看免费1级| 国产精品夜色7777狼人| 欧美视频三区在线播放| 欧美另类亚洲| 国产美女搞久久| 国产一区二区三区免费不卡| 激情av一区| 亚洲日本理论电影| 亚洲视频视频在线| 欧美一级网站| 欧美成人a∨高清免费观看| 欧美激情一区二区久久久| 亚洲激情网站| 亚洲欧美色婷婷| 久久久免费精品视频| 欧美激情精品久久久久久黑人| 欧美紧缚bdsm在线视频| 国产精品电影网站| 激情久久久久| 99精品国产高清一区二区| 亚洲欧美高清| 欧美激情在线播放| 一区二区不卡在线视频 午夜欧美不卡' | 国产一区久久久| 亚洲黄色天堂| 久久久91精品国产| 在线视频亚洲欧美| 欧美经典一区二区三区| 国产伊人精品| 亚洲欧美国产高清va在线播| 国产精品99久久久久久久女警| 久久国产加勒比精品无码| 亚洲国产美女| 久久久噜噜噜久久| 国产欧美日韩专区发布| 99成人在线| 美女国内精品自产拍在线播放| 在线一区二区三区四区五区| 欧美freesex交免费视频| 国产亚洲精品bt天堂精选| 亚洲视频在线观看| 亚洲激情二区| 久久精品国产一区二区三| 国产精品久久久久久久app| 亚洲片在线资源| 欧美大秀在线观看| 久久综合久久美利坚合众国| 国产日韩精品在线播放| 亚洲在线视频观看| 夜夜狂射影院欧美极品| 欧美日韩 国产精品| 亚洲人屁股眼子交8| 久久免费视频网站| 欧美一级艳片视频免费观看| 国产区精品在线观看| 亚洲欧美综合v| 亚洲嫩草精品久久| 国产三级精品三级| 久久久不卡网国产精品一区| 亚洲天堂成人| 国产精品最新自拍| 久久三级视频| 久久婷婷久久| 亚洲福利视频一区| 亚洲国产高清视频| 欧美日韩黄视频| 亚洲综合日韩| 亚洲欧洲av一区二区三区久久| 国产精品另类一区| 久久久99爱| 久久综合久久88| 亚洲精美视频| 日韩午夜激情电影| 国产拍揄自揄精品视频麻豆| 久久久久免费视频| 久久一综合视频| 日韩香蕉视频| 这里只有精品在线播放| 国产日韩精品一区观看 | 国产精品久久久久久模特| 亚洲精品在线一区二区| 亚洲精品一二区| 国产精品久久久久久久久久直播| 国产精品99久久99久久久二8 | 亚洲欧洲精品成人久久奇米网| 亚洲精品1234| 国产精品毛片| 麻豆成人小视频| 欧美精品综合| 久久国产精品久久久久久久久久| 久久精品国产亚洲高清剧情介绍 | 亚洲美女免费精品视频在线观看| 最新精品在线| 国产一区二区三区四区在线观看| 欧美国产日本高清在线| 国产精品成人一区二区艾草| 免费成人激情视频| 欧美性事在线| 亚洲高清三级视频| 国产欧美在线播放| 日韩视频第一页| 亚洲国产高清视频| 亚洲一区二区视频在线观看| 亚洲人体1000| 亚洲综合电影| 亚洲素人一区二区| 老鸭窝毛片一区二区三区| 亚洲自拍啪啪| 欧美大片va欧美在线播放| 久久久久久伊人| 国产精品激情电影| 亚洲人成人99网站| 亚洲国产日韩在线| 久久成人免费电影| 欧美在线视频导航| 欧美性片在线观看| 艳女tv在线观看国产一区| 亚洲欧洲精品一区二区精品久久久| 亚洲一区久久久| 亚洲在线视频一区| 欧美色精品天天在线观看视频| 欧美激情视频一区二区三区不卡| 国产免费观看久久| 亚洲香蕉在线观看| 亚洲一区二区三区国产| 欧美精品久久一区二区| 欧美国产成人精品| 亚洲国产欧美在线| 蜜臀91精品一区二区三区| 免费的成人av| 激情视频亚洲| 久久久久久999| 美女主播视频一区| 伊人一区二区三区久久精品| 久久青草久久| 你懂的网址国产 欧美| 在线不卡中文字幕| 久久亚洲综合网| 国产亚洲精品久| 香蕉亚洲视频| 久久久夜夜夜| 激情国产一区二区| 久久九九99视频| 嫩草国产精品入口| 亚洲人体偷拍| 欧美亚洲第一页| 欧美一进一出视频| 欧美成人第一页| 99国产成+人+综合+亚洲欧美| 欧美日本一区| 午夜一区二区三视频在线观看| 久久精品亚洲精品国产欧美kt∨| 韩国在线一区| 欧美激情在线播放| 一区二区三区回区在观看免费视频| 亚洲欧美视频一区| 禁久久精品乱码| 欧美激情自拍| 亚洲欧美日韩国产精品| 蜜桃久久av一区| 亚洲视频网站在线观看| 国产欧美一区二区精品秋霞影院| 久久成人免费视频| 亚洲精品国产精品乱码不99| 午夜国产不卡在线观看视频| 狠狠色综合一区二区| 欧美久久视频| 久久成人av少妇免费| 亚洲经典三级| 久久精品国产亚洲高清剧情介绍| 亚洲黄网站在线观看| 国产精品视频网址| 欧美成人tv| 久久精品国产欧美激情| 亚洲视频在线观看| 亚洲国产精品视频| 久久久国产精品亚洲一区 | 久久香蕉精品| 99re在线精品| 在线观看视频欧美| 国产精品亚洲美女av网站| 欧美高潮视频| 久久福利资源站| 在线视频欧美一区| 亚洲人成人一区二区在线观看| 久久综合电影一区| 性做久久久久久久久| av成人福利| 亚洲人成亚洲人成在线观看| 国产三区精品| 国产精品久久一级| 欧美精品在线一区| 免费不卡中文字幕视频| 久久福利视频导航| 欧美一区二区国产| 亚洲欧美日产图| 正在播放亚洲| 夜夜狂射影院欧美极品| 亚洲精品一区二区三区四区高清|