在 SLAM 系统中经常用到各种不同的数值积分方法,工程上最常见的有三种:欧拉积分(Euler method)、中点积分(Midpoint method)和龙格-库塔法积分(Runge–Kutta methods)。他们的区别就是如何用数值方法模拟一个斜率。这里简单总结如下:

一、欧拉积分

设有如下微分方程:

y′(t)=f(t,y(t))y'(t)=f(t,y(t))y′(t)=f(t,y(t))

并且 tnt_ntn​ 和 tn+1t_{n+1}tn+1​ 时刻的差为 tn+1−tn=Δtt_{n+1} - t_n = \Delta ttn+1​−tn​=Δt,则欧拉积分定义为:

yn+1=yn+Δt⋅f(tn,yn)y_{n+1}=y_n + \Delta t\cdot f(t_n, y_n)yn+1​=yn​+Δt⋅f(tn​,yn​)

也就是说用 t 时刻的斜率作为整个 t→t+Δtt\rightarrow t+\Delta tt→t+Δt 时刻的导数。

二、中点积分

设有如下微分方程:

y′(t)=f(t,y(t))y'(t)=f(t,y(t))y′(t)=f(t,y(t))

并且 tnt_ntn​ 和 tn+1t_{n+1}tn+1​ 时刻的差为 tn+1−tn=Δtt_{n+1} - t_n = \Delta ttn+1​−tn​=Δt,则显式中点积分定义为:

yn+1=yn+Δt⋅f(tn+12Δt,yn+12Δt⋅f(tn,yn))y_{n+1}=y_n + \Delta t\cdot f(t_n + \frac{1}{2} \Delta t, y_n + \frac{1}{2}\Delta t \cdot f(t_n, y_n))yn+1​=yn​+Δt⋅f(tn​+21​Δt,yn​+21​Δt⋅f(tn​,yn​))

隐式中点积分定义为:

yn+1=yn+Δt⋅f(tn+12Δt,12(yn+yn+1))y_{n+1}=y_n + \Delta t\cdot f(t_n + \frac{1}{2} \Delta t, \frac{1}{2}(y_n + y_{n+1}))yn+1​=yn​+Δt⋅f(tn​+21​Δt,21​(yn​+yn+1​))

也就是说用 tn+12Δtt_n + \frac{1}{2} \Delta ttn​+21​Δt 时刻的斜率作为整个 t→t+Δtt\rightarrow t+\Delta tt→t+Δt 时刻的导数。

欧拉积分与中点积分都是一阶近似并没有本质不同,二者只是一阶导数所取位置不同,他们的性能也有差别,如下图所示,作为一阶积分近似方法来讲,中点积分有时会稍好一些(带来更快的收敛速度)。


图示为方程 y′=y,y(0)=1y'=y, y(0)=1y′=y,y(0)=1 的数值积分。蓝色为欧拉法,绿色为中点法,红色为精确解 y=ety=e^{t}y=et。所用步长为 h=1.0。

三、龙格-库塔积分

龙格-库塔法(Runge-Kutta methods)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。在工程中最常用的是四阶龙格-库塔积分,也就是 RK4 积分,它的计算方式如下:

设有如下微分方程:

y′(t)=f(t,y(t))y'(t)=f(t,y(t))y′(t)=f(t,y(t))

并且 tnt_ntn​ 和 tn+1t_{n+1}tn+1​ 时刻的差为 tn+1−tn=Δtt_{n+1} - t_n = \Delta ttn+1​−tn​=Δt,则 RK4 积分定义为:

yn+1=yn+Δt6⋅(k1+2k2+2k3+k4)y_{n+1}=y_n + \frac{\Delta t}{6} \cdot (k_1 + 2k_2 + 2k3 + k_4)yn+1​=yn​+6Δt​⋅(k1​+2k2​+2k3+k4​)

其中:

k1是时间段开始时的斜率;
k2是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn + h/2的值;
k3也是中点的斜率,但是这次采用斜率k2决定y值;
k4是时间段终点的斜率,其y值用k3决定。
其数学公式如下:

k1=f(tn,yn)k_1 = f(t_n, y_n)k1​=f(tn​,yn​)
k2=f(tn+Δt2,yn+Δt2⋅k1)k_2 = f(t_n + \frac{\Delta t}{2}, y_n + \frac{\Delta t}{2} \cdot k_1)k2​=f(tn​+2Δt​,yn​+2Δt​⋅k1​)
k3=f(tn+Δt2,yn+Δt2⋅k2)k_3 = f(t_n + \frac{\Delta t}{2}, y_n + \frac{\Delta t}{2} \cdot k_2)k3​=f(tn​+2Δt​,yn​+2Δt​⋅k2​)
k4=f(tn+Δt,yn+Δt⋅k3)k_4 = f(t_n + \Delta t, y_n + \Delta t \cdot k_3)k4​=f(tn​+Δt,yn​+Δt⋅k3​)

从公式中可以看出两个中点的斜率具有更大的权重。

龙格-库塔法的示意图如下,它也是一种更高阶的逼近方法,通常也具有更好的逼近效果,总累计误差为 Δt4\Delta t^4Δt4 阶。

RK4 算法在 SLAM 中也有很好的应用,特别是 VIO 中的预积分部分,比如张腾将王京的 VI ORB SLAM2 代码改成 RK4 积分后,精度也得到了一定的提升:
https://github.com/RomaTeng/ORB-VINS_RK4

当然 RK4 算法比起欧拉积分、中点积分计算量要大不少,SLAM 中影响精度的地方非常多,仅靠 RK4 改进其对于精度的提升程度通常也不会特别大,不过对于速度要求不高而精度要求很高的场合还是值得尝试的。

参考文献
[1] https://en.wikipedia.org/wiki/Euler_method
[2] https://en.wikipedia.org/wiki/Midpoint_method
[3] https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods
[4] https://www.maplesoft.com/support/help/maple/view.aspx?path=Student%2FNumericalAnalysis%2FRungeKutta

VIO-SLAM中的欧拉积分、中点积分与龙格-库塔积分相关推荐

  1. 【Unity编程】Unity中的欧拉旋转

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自 ...

  2. 常见的数值积分方法_欧拉积分/中值积分/龙格-库塔积分

    参考:常见的数值积分方法 (欧拉.中值.龙格-库塔,[常用于IMU中]) 1. 积分基本概念 设F(x)为函数f(x)的一个原函数,我们把函数f(x)的所有原函数F(x)+C(C为任意常数)叫做函数f ...

  3. 变分法中的欧拉方程的细致讲解详细推导

    文章目录 前言 0.泛函的概念 1.变分学基本引理 引理内容 引理的理解与说明 2.单方程单变量欧拉方程 2.1.单方程单变量一次的欧拉方程的证明 定理内容 定理的理解与证明 2.2.单方程单变量高次 ...

  4. (不会还有人不会做欧拉方程吧)考研数学中的欧拉方程

    具有如下结构的变系数线性微分方程被称为欧拉方程: f(x)=xny(n)+a1xn−1y(n−1)+...+an−1xy′+any.f(x) = x^{n}y^{(n)}+a_1x^{n-1}y^{( ...

  5. 四阶龙格库塔法的基本思想_龙格库塔积分算法

    龙格库塔法 龙格库塔法是常用于模拟常微分方程的解的重要的一类隐式或显式迭代法.这些技术由数学家C. Runge和M.W. Kutta于1900年左右发明.由于此算法精度高,采取措施对误差进行抑制,所以 ...

  6. 一阶欧拉近似matlab,MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程.doc

    MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程 姓名:樊元君 学号:2012200902 日期:2012.11.06 一.实验目的 掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题 ...

  7. 欧拉编程c语言作业数值分析,数值分析作业 欧拉 龙格库塔

    <数值分析作业 欧拉 龙格库塔>由会员分享,可在线阅读,更多相关<数值分析作业 欧拉 龙格库塔(5页珍藏版)>请在人人文库网上搜索. 1.9.2对初值问题试用欧拉方法取步长h= ...

  8. 数值积分方法:欧拉积分、中点积分和龙格-库塔法积分

    目录 写在前面 原理 代码 CMakeLists.txt euler.cpp midpoint.cpp rk4.cpp compile&run 参考 完 写在前面 1.本文内容 数值积分方法: ...

  9. Unity 布料仿真笔记2 欧拉积分 Verlet积分分析

    前言 An object at rest remains at rest, unless acted upon by an exterior force. An object in motion re ...

最新文章

  1. Linux 网络 tcp C/S通信模型
  2. 汇编 int 10h
  3. c# winform做简单的折线图(VS2017)
  4. 招募 | 清华大学计算机系副教授黄民烈招募NLP方向博士后
  5. 【数据结构总结】第二章:线性表
  6. (2) freemarker入门案例2
  7. 在学术论文投稿时你遇到过最奇葩的审稿意见是什么?
  8. aws beanstalk mysql_AWS Beanstalk搭建WordPress站点
  9. 电脑C盘软件搬家,一键解决C盘不够用问题!
  10. 产品的国内版和国际版背后的思考
  11. 行为树BT设计与实现
  12. WPS的标题样式如何保存成默认
  13. Eclipse连接小米手机无连接显示解决办法
  14. OpenWrt固件刷入及相关实验
  15. 横河变送器EJA110E-JMS4J-919EA
  16. 浏览器崩溃原因大集合
  17. 解决某APP游戏内购
  18. 7-7 六度空间 (30 point(s))
  19. 计算机培训计划方案结尾怎么写,学习计划怎么写结尾
  20. 基于图像变换的最小二乘法及其应用(新生研讨课)

热门文章

  1. bzoj2001 [Hnoi2010]City 城市建设 动态最小生成树
  2. 最大公约数算法GCD
  3. Postgresql - SQL - 对表中数据的插入、更新、删除进行跟踪
  4. Pydantic官方文档
  5. Java程序的运行过程(执行流程)分析
  6. 人体三维重构论文集合:awesome 3d human reconstruction
  7. 强烈推荐,阿里开源的11个神级项目
  8. 使用QStyle 高端定制弹出菜单 QPushButton源码剖析(一)
  9. C#中string用法
  10. IOS移动APP网络层设计方案