如果您正在寻找通用稀疏的Levenberg-Marquardt公司++实现,请查看稀疏LM.

介绍

此网站提供GPL公司本机ANSI C实现Levenberg-Marquardt优化算法,也可以从C++中使用,Matlab公司,波尔,蟒蛇,哈斯克尔Tcl公司并解释其用途。两者都有无约束的受约束的(在线性方程、不等式和方框约束下)Levenberg-Marquardt包括变体。这个勒文贝格·马夸特(百万)算法是一种迭代技术,它可以找到表示为非线性函数的平方和。它已成为非线性最小二乘的标准技术问题,可以认为是最陡下降高斯-纽顿方法。当当前解距离正确解很远时,算法表现为最陡下降方法:速度慢,但保证收敛。当当前解接近正确解时,它变成了高斯-纽顿方法。


动机

这个不羁例程来自Minpack公司,写在80年代初阿贡国家实验室,可能是使用最广泛的LM算法的免费实现。不羁用FORTRAN77编写,多年来证明成为一个可靠的软件。考虑到FORTRAN例程可以从C/C++调用,可以想知道用C语言写LM版本的动机是什么FORTRAN从C调用,程序员应该知道关于名称篡改、参数传递、多维数组内存布局的若干规则,与普通C规则相比,链接约定等是不自然的。第二个原因是这种方法想当然地认为目标编程环境的FORTRAN编译器是可用的,而这可能不是情况必然如此。另一个原因与未能理解FORTRAN的内部工作有关实现:有时,当需要精确理解FORTRAN代码的功能时对于不了解FORTRAN语言的程序员来说,其中的一些部分似乎是无法理解的。自动FORTRAN到C的翻译器(例如。f2 c(f2 c))不要解决问题,因为生成的C代码对于“未经培训”的人来说相当难以辨认。此外,描述实现所基于的数学可能是模糊的或不可访问的。最后但并非最不重要的是,候选人C语言中的LM实现应该是免费的,并且在技术上是可靠的。例如,LM算法的C变量在“数值分析方法库“书籍(即。mrq最小值),并不总是一个可行的选择:除了版权之外,它是据说缺乏稳健性.上述原因导致了利瓦尔包含C实现的包也可用于C++的LM风格。


技术概述

利瓦尔包括双精度和单精度LM C/C++实现,用解析差分和有限差分逼近雅可比矩阵。根据以下条款免费提供这个通用公共许可证.背后的数学理论无约束的利瓦尔在题为非线性最小二乘问题的方法,作者:K.Madsen、H.B.Nielsen和O.Tingleff,丹麦技术大学;Matlab实现演讲中提出的算法也有注释。然而请注意,这里采用的最小化问题的公式略为课堂讲稿.还有一个短音符,快速概述课堂讲稿中的材料。

要处理线性方程约束,利瓦尔采用基于QR分解的变量消除,如本书第15章所述数值优化诺塞达尔和赖特。对于框约束的情况,利瓦尔实现提出的算法作者:C.Kanzow、N.Yamashita和M.Fukushima,勒文贝格·马夸特具有强局部收敛性质的约束非线性方程组的求解方法,《计算与应用数学杂志》1722004年,第375-397页。

利瓦尔提供了以下两个关于由增强的正规方程组:

  1. 如果你有LAPACK公司(或同等供应商库如英特尔的MKL、AMD的AMCL、Sun的性能库、IBM的ESSL、SGI的SCSL、NAG等),可以使用包含的基于LAPACK的解算器。这是默认选项。采用的解算器基于LU分解。此外,对于其他方法的试验,线性提供了基于Cholesky和QR分解的解算器。
  2. 如果LAPACK不可用,则可以通过取消定义使用无LAPACK-、基于LU的线性系统解算器HAVE_LAPACK(夏令营_背包)在里面利瓦尔。小时.

强烈建议使用LAPACK或同等供应商库;如果您的站点没有安装我建议CLAPACK公司,LAPACK的f2版本。微软Win用户可以从以下位置下载预编译的LAPACK/BLAS库在这里.您还可以考虑将CLAPACK与地图集,(自动调整的BLAS实现)或数学库(K.Goto的高性能BLAS)。另一方面,LAPACK的使用对于编译无约束例程不是强制性的第二种选择使利瓦尔完全独立。受约束的线性方程然而,没有LAPACK就无法编译例程。
利瓦尔也支持等离子体,平行线同构多核体系结构的线性代数。使用等离子体可以加速从而提高了大型优化问题的性能。

用于使用的接口利瓦尔来自高级编程环境和语言,如Matlab公司,波尔 蟒蛇,哈斯克尔Tcl公司也可用;请参阅常见问题解答了解更多详细信息。


可用功能

利瓦尔提供了几个可由用户调用的函数,这些函数遵循以下命名约定:第一个字母(d日)指定双精度或单精度以及后缀(_命令_dif(差分))表示解析的或近似的雅可比。如果存在lec(发光二极管),公元前气泡分量表示线性方程、方框和联立方框以及线性方程约束。更具体地说,利瓦尔包括以下功能:

  • 无约束优化
    • dlevmar_der():双精度解析雅可比
    • dlevmar_dif():双精度,有限差分近似雅可比
    • slevmar_der():单精度解析雅可比
    • slevmar_dif():单精度有限差分近似雅可比矩阵

  • 约束优化
    • dlevmar_lec_der():双精度,线性方程约束,解析雅可比
    • dlevmar_lec_dif():双精度,线性方程约束,有限差分近似雅可比
    • slevmar_lec_der():单精度,线性方程约束,解析雅可比
    • slevmar_lec_dif():单精度,线性方程约束,有限差分近似雅可比

    • dlevmar_bc_der():双精度,方框约束,解析雅可比
    • dlevmar_bc_dif():双精度,方框约束,有限差分近似雅可比
    • slevmar_bc_der():单精度,方框约束,解析雅可比
    • slevmar_bc_dif():单精度,方框约束,有限差分近似雅可比

    • dlevmar_blec_dr():双精度,方框和线性方程约束,解析雅可比
    • dlevmar_blec_dif():双精度,方框和线性方程约束,有限差分近似雅可比
    • slevmar_blec_der():单精度,箱形和线性方程约束,解析雅可比
    • slevmar_blec_dif():单精度、方框和线性方程约束、有限差分近似雅可比

    • dlevmar_bleic_der():双精度、方框、线性方程和不等式约束、解析雅可比
    • dlevmar_bleic_dif():双精度、方框、线性方程和不等式约束、有限差分近似雅可比
    • slevmar_bleic_der():单精度、方框、线性方程和不等式约束、解析雅可比
    • slevmar_bleic_dif():单精度、方框、线性方程和不等式约束、有限差分近似雅可比

    • 便利包装纸xlevmar_blic_der()/xlevmar_blic_dif(),xlevmar_leic_der()/xlevmar_leic_dif()&xlevmar _ lic _ der()/xlevmar _ lic _ dif()xlevmar_bleic_der()/xlevmar_bleic_dif()还提供了。

注意,使用有限差分近似雅可比矩阵会导致函数的重复计算待安装。为了减少这些评估的总数xxxxxxx(如果)功能实现使用Broyden的秩一更新对雅可比矩阵进行正割逼近。所有函数基本上都解决了相同的问题,即它们寻找最能描述(根据L2范数)的参数向量p测量向量x。更精确地说,给定一个向量函数f:R^m-->R^n,其中n>=m,他们计算这样的pf(p)~=x,即平方范数||e|^2=x-f(p)|^2是最小化的。此外形式lb[i]<=p[i]<=ub[i],形式A*p=b与A k1xm和b k1x1的线性等式约束线性不等式约束C*p>=d与Ck2xm和dk2x1可以在极小值上执行。有关由实现的无约束LM算法的更多详细信息利瓦尔可以在这里找到笔记.

简单地说,函数的参数如下:指向计算向量函数f及其函数的例程的指针雅可比(如果适用),指参数向量p和测量向量x的初始估计p的维数m,x的维数n,最大迭代次数,指向其元素的3元素数组的指针指定特定的最小化选项,一个指向数组元素的指针,其中包含有关将返回最小化的结果,一个指向工作内存的指针,一个指向协方差矩阵的指针和一个指针到特定于应用程序的数据结构这可能是计算要最小化的函数及其导数所必需的。更多详细信息见下文。此外,包括lmdemo。c(c)示例程序给出了最小化几个非线性函数的工作示例。精确的原型dlevmar_der(),dlevmar_dif()接下来给出,以及对每个参数。slevmar_der()slevmar_dif()是相同的,除了双精度变量被更改为浮点变量。以下描述中的I和O分别表示输入和输出参数。受约束的优化例程具有非常相似的参数,有关详细描述,请参阅代码中的注释。

dlevmar_der()

.::切换显示::。

dlevmar_dif()

.::切换显示::。

注意传递无效的由于两个函数最后四个参数的值导致默认值为已使用。咨询Madsen等人课堂讲稿有关角色的详细信息opts选项信息论据。参数工作是为了习惯避免相关的开销通过重复分配和释放相同大小的内存块开展。您可以使用宏,而不是让函数自己分配所需的内存LM_DER_WORKSZ公司LM_DIF_WORKSZ公司要计算适当的内存大小,请分配内存并将其传递给每个调用。lmdemo公司。c(c)提供了这样一个示例。最后一个参数(即。阿达塔)旨在帮助避免在计算要最小化的函数及其雅可比矩阵的例程。包含指向适当数据的指针的结构可以设置结构,并将指向该结构的指针传递给LM函数,然后LM函数将其传递给每个调用用户提供的例程。


联系人地址

如果您觉得此软件包有用或有任何意见/问题/建议,请通过以下地址与我联系:

请注意,尽管我试图回复大多数信息,但我可能需要很长时间才能回复。
如果您使用利瓦尔在您发表的作品中,请包括对本网站的引用/确认:bibtex入口 ].



自2005年11月10日星期四15:08:15开始的点击量