Levmar(C++版本)的资料-dlevmar_dif

levmar_dif是一个C++实现的优化库函数,它通过内部的有限差分方法来近似Jacobian,减少了对func函数的调用次数。该函数使用Broyden的一级更新来计算雅可比的割线近似,适用于没有现成Jacobian的情况。函数返回迭代次数,信息数组包含了优化过程的各种指标,如误差、迭代次数和终止原因等。
摘要由CSDN通过智能技术生成

学习目标:

记录一下levmar(c++ 版)的一些资料


学习内容:

官网网址为:http://users.ics.forth.gr/~lourakis/levmar/index.html

dlevmar_dif()函数接口说明

  • 类似于dlevmar_der(),不同的是Jacobian在内部借助有限差分进行近似。.
  • Broyden的一级更新用于计算雅可比的割线近似值,有效地避免了调用
  • ffunc多次用于计算有限差分近似。
  • 如果分析Jacobian可用,请使用上面的dlevmar_der()。
  • 如果成功,返回迭代次数(>=0),如果失败,返回-1

int dlevmar_dif(void (*func)(double *p, double *hx, int m, int n, void *adata),

  • func:描述测量的函数关系。
  • double p, / I/O:初始参数估计。输出包含估计的解决方案 */
  • double x, / I: 测量向量。NULL表示零向量 */
  • int m, /* I: 参数向量维度(即#未知数) */
  • int n, /* I: 测量矢量维数 */
  • int itmax, /* I:最大迭代次数 */
  • double opts[5], /* I:opts[0-4]=最小值。选项[\tau,\epsiln1,\epsilon2,\epsin
LM算法,全称为Levenberg-Marquard算法,它可用于解决非线性最小二乘问题,多用于曲线拟合等场合。 LM算法的实现并不算难,它的关键是用模型函数 f 对待估参数向量 p 在其邻域内做线性近似,忽略掉二阶以上的导数项,从而转化为线性最小二乘问题,它具有收敛速度快等优点。LM算法属于一种“信赖域法”——所谓的信赖域法,此处稍微解释一下:在最优化算法中,都是要求一个函数的极小值,每一步迭代中,都要求目标函数值是下降的,而信赖域法,顾名思义,就是从初始点开始,先假设一个可以信赖的最大位移 s ,然后在以当前点为中心,以 s 为半径的区域内,通过寻找目标函数的一个近似函数(二次的)的最优点,来求解得到真正的位移。在得到了位移之后,再计算目标函数值,如果其使目标函数值的下降满足了一定条件,那么就说明这个位移是可靠的,则继续按此规则迭代计算下去;如果其不能使目标函数值的下降满足一定的条件,则应减小信赖域的范围,再重新求解。 事实上,你从所有可以找到的资料里看到的LM算法的说明,都可以找到类似于“如果目标函数值增大,则调整某系数再继续求解;如果目标函数值减小,则调整某系数再继续求解”的迭代过程,这种过程与上面所说的信赖域法是非常相似的,所以说LM算法是一种信赖域法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值