levmar 优化库

levmar 是一个基于 C/C++ 实现的 Levenberg-Marquardt 非线性最小二乘算法的优化库。

Levenberg-Marquardt 算法

Gauss-Newton 算法是一个古老的处理非线性最小二乘问题的方法。该方法在迭代过程中要求矩阵 J(x) 满秩。为了克服这个困难,Levenberg(1944)提出了一种新的方法,但未受到重视。后来 Marquardt(1963)又重新提出,并在理论上进行了探讨,得到 Levenberg-Marquardt 方法,简称 LM 方法。在此基础上,Fletcher(1971)对其实现策略进行了改进,得到了 Levenberg-Marquardt-Fletcher 方法(LMF)。再后来,More(1978)将 LM 方法与信赖域方法结合,建立了带信赖域的 LM 方法。

LM 算法的产生主要是解决曲线最小二乘拟合问题,现在很多软件使用 LM 算法来解决通用的曲线拟合问题。

Download

  1. 从官网下载levmar-2.6.tgz: http://users.ics.forth.gr/~lourakis/levmar/levmar-2.6.tgz
  2. 下载 levmar 的依赖库LAPACK: http://www.netlib.org/clapack/clapack-3.2.1-CMAKE.tgz
  3. 分别解压得到两个文件夹: levmar-2.6,clapack-3.2.1-CMAKE

Build

Build LAPACK

  1. 打开 CMake-Gui, Where is the source code:clapack-3.2.1-CMAKE 文件夹, 并在该文件夹内新建 BUILD 文件夹, 将 Where to build the binaries: 填为该 BUILD 文件夹.
  2. 点击Configure, 配置Visual Studio 15 2017,x64,Use default native compilers, 会有一些红色的 warning, 可直接忽略
  3. 点击Generate->Open Project.
  4. 可以将解决方案依次配置为 Debug\MinSizeRel\Release\RelWithDebInfo, 然后生成解决方案. 也可以点击 生成 -> 批生成 -> 勾选前四个ALL_BUILD-> 生成.
  5. BUILD 目录下生成了一系列库文件, 将其复制出来,后续将添加到 levmar 库中
1
2
3
4
[clapack-3.2.1-CMAKE\BUILD]\BLAS\SRC\Debug:       blas.lib
[clapack-3.2.1-CMAKE\BUILD]\F2CLIBS\libf2c\Debug: libf2c.lib -> copy and rename to f2c.lib
[clapack-3.2.1-CMAKE\BUILD]\SRC\Debug: lapack.lib
[clapack-3.2.1-CMAKE\BUILD]\Testing\MATGEN\Debug: tmglib.lib

其中除了 Debug, 也可能生成了其他配置的对应库文件, 都可以复制到相应的文件夹中.

  1. 头文件 blaswrap.h,clapack.h,f2c.h 复制到 INCLUDE 文件夹中.

Build levmar

  1. 打开 CMake-Gui,Where is the source code:levmar-2.6 文件夹, 并在该文件夹内新建 build 文件夹, 将 Where to build the binaries: 填为该 build 文件夹.

  2. 点击Configure, 配置Visual Studio 15 2017,x64,Use default native compilers,

  3. LAPACKBLAS_DIR 的 Value 从默认的 usr/lib 文件夹路径改成之前放置 LAPACK 的 lib 库的路径.(levmar也可以不依赖于 lapack 进行编译, 只需将 HAVE_LAPACK 取消勾选即可, 但部分功能将不可用)

  4. 点击Generate->Open Project.

  5. 可以将解决方案依次配置为 Debug\MinSizeRel\Release\RelWithDebInfo, 然后生成解决方案. 也可以点击 生成 -> 批生成 -> 勾选前四个ALL_BUILD-> 生成.

  6. 将解决方案下的 lmdemo 设置为启动项目,运行测试. 得到如下测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
Covariance of the fit:
0.00483514 -0.00162445 -0.000548114
-0.00162445 0.000546079 0.000184356
-0.000548114 0.000184356 6.22705e-05

Results for Meyer's (reformulated) problem:
Levenberg-Marquardt returned 215 in 215 iter, reason 2
Solution: 2.481778 6.181346 3.502236

Minimization info:
1308.25 8.79459e-05 5.8718e-08 5.01074e-31 2106.35 215 2 282 22 216

按任意键关闭此窗口...
  1. BUILD 目录下生成了一系列库文件, 将其复制出来.
  • RelWithDebInfo
    • levmar.lib
    • lmdemo.ilk
    • lmdemo.pdb
  • Debug
    • xxx
  • Release
    • xxx
  • MinSizeRel
    • xxx
  1. 另外将几个头文件复制到 include 文件夹下: compiler.h, levmar.h, lm.h, misc.h

Reference

作者

Luo Siyou

发布于

2022-12-18

更新于

2023-01-12

许可协议