欧拉积分、中点积分与龙格-库塔积分

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

一、欧拉积分

设有如下微分方程:

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

并且 \(t_n\) 和 \(t_{n+1}\) 时刻的差为 \(t_{n+1} - t_n = \Delta t\),则欧拉积分定义为:

\(y_{n+1}=y_n + \Delta t\cdot f(t_n, y_n)\)

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

二、中点积分

设有如下微分方程:

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

并且 \(t_n\) 和 \(t_{n+1}\) 时刻的差为 \(t_{n+1} - t_n = \Delta t\),则显式中点积分定义为:

\(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))\)

隐式中点积分定义为:

\(y_{n+1}=y_n + \Delta t\cdot f(t_n + \frac{1}{2} \Delta t, \frac{1}{2}(y_n + y_{n+1}))\)

也就是说用 \(t_n + \frac{1}{2} \Delta t\) 时刻的斜率作为整个 \(t\rightarrow t+\Delta t\) 时刻的导数。

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

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

三、龙格-库塔积分

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

设有如下微分方程:

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

并且 \(t_n\) 和 \(t_{n+1}\) 时刻的差为 \(t_{n+1} - t_n = \Delta t\),则 RK4 积分定义为:

\(y_{n+1}=y_n + \frac{\Delta t}{6} \cdot (k_1 + 2k_2 + 2k3 + k_4)\)

其中:

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

\(k_1 = f(t_n, y_n)\)
\(k_2 = f(t_n + \frac{\Delta t}{2}, y_n + \frac{\Delta t}{2} \cdot k_1)\)
\(k_3 = f(t_n + \frac{\Delta t}{2}, y_n + \frac{\Delta t}{2} \cdot k_2)\)
\(k_4 = f(t_n + \Delta t, y_n + \Delta t \cdot k_3)\)

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

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

image399

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

Add a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注