[常微分方程的数值解法系列三] 改进欧拉法(预估校正法)

在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其中主要就是求解微分方程。但之前求解微分方程的解析方法主要是应用于一些简单和特殊的微分方程求解中,对于一般形式的微分方程,一般很难用解析方法求出精确解,只能用数值方法求解。该系列主要介绍一些常用的常微分方程的数值解法,主要包括:

这个系列后面文章会用到前面文章的理论和技术,所以建议按照顺序查看。

简介

[常微分方程的数值解法系列二] 欧拉法文中主要介绍了常用的微分方程的数值解法-向前(显式)欧拉法。但向前(显式)欧拉法虽然计算量小,但是精度比较低;梯形公式是可以提高精度,但是在推导式右端有未知量。所以为了取长补短,在实际计算中是将两种公式的思想结合起来使用。
向前(显式)欧拉公式
x i + 1 = x i + Δ t ⋅ f ( t i , x i ) x_{i+1}=x_{i} + \Delta t \cdot f(t_{i}, x_{i}) xi+1=xi+Δtf(ti,xi)
梯形公式
x i + 1 = x i + Δ t 2 [ f ( t i , x i ) + f ( t i + 1 , x i + 1 ) ] x_{i+1}=x_{i} +\frac{\Delta t}{2}\left[ f(t_i,x_i) + f(t_{i+1},x_{i+1})\right] xi+1=xi+2Δt[f(ti,xi)+f(ti+1,xi+1)]

预估-校正

结合上诉向前(显式)欧拉公式和梯形公式,具体步骤如下:
预估
利用向前(显式)欧拉公式预估一个 x ( t i + 1 ) \mathbf{x}(t_{i+1}) x(ti+1)初始的近似值,也称作预估值
x ^ i + 1 = x i + Δ t ⋅ f ( t i , x i ) , (1) \hat{x}_{i+1} = x_{i} + \Delta t \cdot f(t_{i}, x_{i}), \tag{1} x^i+1=xi+Δtf(ti,xi),(1)
校正
然后利用这个预估值 x ^ i + 1 \hat{x}_{i+1} x^i+1作为梯形公式右端 x i + 1 x_{i+1} xi+1的输入,计算最终的 x ( t i + 1 ) \mathbf{x}(t_{i+1}) x(ti+1)最终的近似值,也称作校正值
x i + 1 = x i + Δ t 2 [ f ( t i , x i ) + f ( t i + 1 , x ^ i + 1 ) ] , (2) x_{i+1}=x_{i} +\frac{\Delta t}{2}\left[ f(t_i,x_i) + f(t_{i+1},\hat{x}_{i+1})\right], \tag{2} xi+1=xi+2Δt[f(ti,xi)+f(ti+1,x^i+1)],(2)

上面的预估-校正公式称作为改进欧拉公式
或者上面的公式可以表示为:
{ x f = x i + Δ t ⋅ f ( t i , x i ) , x b = x i + Δ t ⋅ f ( t i + 1 , x f ) , x i + 1 = 1 2 ( x f + x b ) , (3) \begin{cases} x_f = x_{i} + \Delta t \cdot f(t_{i}, x_{i}), \\ x_b = x_{i} + \Delta t \cdot f(t_{i+1}, x_{f}), \\ x_{i+1} = \frac{1}{2}(x_f + x_b) \end{cases}, \tag{3} xf=xi+Δtf(ti,xi),xb=xi+Δtf(ti+1,xf),xi+1=21(xf+xb),(3)
其中 x f x_f xf表示利用向前(显式)欧拉公式的近似值, x b x_b xb表示利用向后(隐式)欧拉公式的近似值(利用了 x f x_f xf),最后取平均值。
上面利用 f ( t i + 1 , x ^ i + 1 ) f(t_{i+1},\hat{x}_{i+1}) f(ti+1,x^i+1)是有误差的,也可通过多次迭代减少误差,具体公式如下
{ x i + 1 ( 0 ) = x i + Δ t ⋅ f ( t i , x i ) , x i + 1 ( k + 1 ) = x i + Δ t 2 [ f ( t i , x i ) + f ( t i + 1 , x i + 1 ( k ) ) ] , k = 0 , 1 , 2 , ⋯ , (4) \begin{cases} x_{i+1}^{(0)}=x_{i} + \Delta t \cdot f(t_{i}, x_{i}), \\ x_{i+1}^{(k+1)}=x_{i} +\frac{\Delta t}{2}\left[ f(t_i,x_i) + f(t_{i+1},x_{i+1}^{(k)})\right], \quad k=0,1,2,\cdots \end{cases}, \tag{4} {xi+1(0)=xi+Δtf(ti,xi),xi+1(k+1)=xi+2Δt[f(ti,xi)+f(ti+1,xi+1(k))],k=0,1,2,,(4)

截断误差

[常微分方程的数值解法系列一] 常微分方程文中公式 ( 3 ) (3) (3)可知常微分方程的数值解法的局部截断误差为
e i = x i − x ( t i ) \boldsymbol{e}_i = x_i - \mathbf{x}(t_i) ei=xix(ti)
所以对于改进欧拉法来说局部截断误差为:
e i + 1 = x i + Δ t 2 [ f ( t i , x i ) + f ( t i + 1 , x i + 1 ) ] − x ( t i + 1 ) , (5) \boldsymbol{e}_{i+1} = x_{i} +\frac{\Delta t}{2}\left[ f(t_i,x_i) + f(t_{i+1},x_{i+1})\right] - \mathbf{x}(t_{i+1}), \tag{5} ei+1=xi+2Δt[f(ti,xi)+f(ti+1,xi+1)]x(ti+1),(5)
对式子右边 f ( t i + 1 , x i + 1 ) f(t_{i+1},x_{i+1}) f(ti+1,xi+1) x ( t i + 1 ) \mathbf{x}(t_{i+1}) x(ti+1)分别作泰勒展开
f ( t i + 1 , x i + 1 ) = f ( t i + Δ t , x i + Δ t ⋅ f ( t i , x i ) ) = f ( t i , x i ) + Δ t f t ′ ( t i , x i ) + ( Δ t ⋅ f ( t i , x i ) ) ⋅ f x ′ ( t i , x i ) + O ( Δ t 2 ) = x ′ ( t i ) + Δ t x ′ ′ ( t i ) + O ( Δ t 2 ) x ( t i + 1 ) = x ( t i + Δ t ) = x ( t i ) + Δ t x ′ ( t i ) + Δ t 2 2 ! x ′ ′ ( t i ) + O ( Δ t 3 ) \begin{aligned} f(t_{i+1},x_{i+1}) &= f(t_i + \Delta t, x_{i} + \Delta t \cdot f(t_{i}, x_{i})) \\ &= f(t_i,x_i) + \Delta t f_t^{\prime}(t_i,x_i) + (\Delta t \cdot f(t_{i}, x_{i}))\cdot f_x^{\prime}(t_i,x_i) + \mathbf{O}(\Delta t^2) \\ &=\mathbf{x}^{\prime}(t_i) + \Delta t \mathbf{x}^{\prime\prime}(t_i) + \mathbf{O}(\Delta t^2) \\ \mathbf{x}(t_{i+1}) &= \mathbf{x}(t_i + \Delta t) = \mathbf{x}(t_{i})+\Delta t \mathbf{x}^{\prime}(t_{i}) + \frac{\Delta t^2}{2!} \mathbf{x}^{\prime\prime}(t_{i}) + \mathbf{O}(\Delta t^3) \end{aligned} f(ti+1,xi+1)x(ti+1)=f(ti+Δt,xi+Δtf(ti,xi))=f(ti,xi)+Δtft(ti,xi)+(Δtf(ti,xi))fx(ti,xi)+O(Δt2)=x(ti)+Δtx(ti)+O(Δt2)=x(ti+Δt)=x(ti)+Δtx(ti)+2!Δt2x(ti)+O(Δt3)
带入公式 ( 5 ) (5) (5)可得
e i + 1 = x i + Δ t 2 [ f ( t i , x i ) + f ( t i + 1 , x i + 1 ) ] − x ( t i + 1 ) = x i + Δ t 2 [ x ′ ( t i ) + x ′ ( t i ) + Δ t x ′ ′ ( t i ) + O ( Δ t 2 ) ] − x ( t i ) + Δ t x ′ ( t i ) + Δ t 2 2 ! x ′ ′ ( t i ) + O ( Δ t 3 ) = O ( Δ t 3 ) \begin{aligned} \boldsymbol{e}_{i+1} &= x_{i} + \frac{\Delta t}{2}\left[ f(t_i,x_i) + f(t_{i+1},x_{i+1})\right] - \mathbf{x}(t_{i+1}) \\ & = x_{i} + \frac{\Delta t}{2}[\mathbf{x}^{\prime}(t_i) + \mathbf{x}^{\prime}(t_i) + \Delta t \mathbf{x}^{\prime\prime}(t_i) + \mathbf{O}(\Delta t^2)] - \mathbf{x}(t_{i})+\Delta t \mathbf{x}^{\prime}(t_{i}) + \frac{\Delta t^2}{2!} \mathbf{x}^{\prime\prime}(t_{i}) + \mathbf{O}(\Delta t^3) \\ & = \mathbf{O}(\Delta t^3) \end{aligned} ei+1=xi+2Δt[f(ti,xi)+f(ti+1,xi+1)]x(ti+1)=xi+2Δt[x(ti)+x(ti)+Δtx(ti)+O(Δt2)]x(ti)+Δtx(ti)+2!Δt2x(ti)+O(Δt3)=O(Δt3)
根据[常微分方程的数值解法系列一] 常微分方程文中局部截断误差定义得
改进欧拉公式具有二阶精度(二阶解法)

上面求解会用到二元函数的泰勒展开,这里给出三阶二元函数的泰勒展开公式 f ( x + Δ x , y + Δ y ) = f ( x , y ) + Δ x f x ′ ( x , y ) + Δ y f y ′ ( x , y ) + 1 2 ! Δ x f x x ′ ′ ( x , y ) + 1 2 ! Δ x Δ y f x y ′ ′ ( x , y ) + 1 2 ! Δ x Δ y f y x ′ ′ ( x , y ) + 1 2 ! Δ y f y y ′ ′ ( x , y ) + o 3 \begin{aligned} f(x+\Delta x, y + \Delta y) = & f(x, y) +\Delta xf_x^{\prime}(x,y) + \Delta yf_y^{\prime}(x,y) \\ &+ \frac{1}{2!}\Delta xf_{xx}^{\prime \prime}(x,y) + \frac{1}{2!}\Delta x \Delta yf_{xy}^{\prime \prime}(x,y) + \frac{1}{2!}\Delta x \Delta yf_{yx}^{\prime \prime}(x,y) + \frac{1}{2!}\Delta yf_{yy}^{\prime \prime}(x,y) + o^3 \end{aligned} f(x+Δx,y+Δy)=f(x,y)+Δxfx(x,y)+Δyfy(x,y)+2!1Δxfxx(x,y)+2!1ΔxΔyfxy(x,y)+2!1ΔxΔyfyx(x,y)+2!1Δyfyy(x,y)+o3

例子

分布利用向前欧拉法和改进欧拉法求解初值问题
{ x ′ ( t ) = x − 2 t x , 0 ≤ t ≤ 1 x ( t 0 ) = 1 \begin{cases} \mathbf{x}^{\prime}(t)=x - \frac{2t}{x}, \quad 0 \leq t \leq 1 \\ \mathbf{x}({t_0}) = 1 \end{cases} {x(t)=xx2t,0t1x(t0)=1
x ( t = 1 ) \mathbf{x}(t=1) x(t=1)的近似值,步长 Δ t = 0.1 \Delta t = 0.1 Δt=0.1

这里原函数为 x ( t ) = 1 + 2 t \mathbf{x}(t) =\sqrt{1+2t} x(t)=1+2t ,用于后面验证结果

解:
向前欧拉公式
{ x i + 1 = x i + 0.1 ( x i − 2 t i x i ) = 1.1 x i − 0.2 t i x i x 0 = 1 \begin{cases} x_{i+1}=x_{i} + 0.1(x_i-\frac{2t_i}{x_i}) = 1.1x_i-\frac{0.2t_i}{x_i} \\ x_0 = 1 \end{cases} {xi+1=xi+0.1(xixi2ti)=1.1xixi0.2tix0=1
改进欧拉公式
{ x ^ i + 1 = x i + 0.1 ( x i − 2 t i x i ) = 1.1 x i − 0.2 t i x i x i + 1 = x i + 0.1 2 [ x i − 2 t i x i + x ^ i + 1 − 2 t i + 1 x ^ i + 1 ) ] x 0 = 1 \begin{cases} \hat{x}_{i+1} = x_{i} + 0.1(x_i-\frac{2t_i}{x_i}) = 1.1x_i-\frac{0.2t_i}{x_i} \\ x_{i+1}=x_{i} +\frac{0.1}{2}\left[ x_i-\frac{2t_i}{x_i} + \hat{x}_{i+1} - \frac{2t_{i+1}}{\hat{x}_{i+1}})\right]\\ x_0 = 1 \end{cases} x^i+1=xi+0.1(xixi2ti)=1.1xixi0.2tixi+1=xi+20.1[xixi2ti+x^i+1x^i+12ti+1)]x0=1
计算得:

i i i t i t_i ti向前 x i x_i xi改进 x i x_i xi x ( t i ) \mathbf{x}(t_i) x(ti)
00110
10.11.11.0959091.095445
20.21.1918181.1840971.183216
30.31.2771381.2662011.264911
40.41.3582131.3433601.341641
50.51.4351331.4164021.414214
60.61.5089661.4859661.483240
70.71.5803381.5525141.549193
80.81.6497831.6164751.612452
90.91.7177791.6781661.673320
101.01.7847701.7378671.732051

绘制如下图所示
红色: x ( t i ) \mathbf{x}(t_i) x(ti)
绿色:向前 x i x_i xi
蓝色:改进 x i x_i xi
明显改进欧拉法误差要小于向前欧拉法!!!
在这里插入图片描述

  • 14
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 欧拉法是一种最简单的数值解法,它是通过对常微分方程积分一次求出离散点的值,来近似求解常微分方程改进欧拉法是在欧拉法的基础上,把求解函数的右端的函数由原来的一次函数改进为高阶函数,从而改善了欧拉法的精度。龙格-库塔是一种常微分方程解法,它采用多项式拟合的方求解常微分方程,能够求出比欧拉法更高精度的解。拉格朗日插值是一种数值解法,它是通过在离散点上构造拉格朗日插值多项式,用这个多项式代替原函数,从而求解常微分方程。 ### 回答2: 常微分方程是描述自然现象中随时间变化的数学方程。数值解法是用数值求解常微分方程的逼近解。下面将详细介绍四种常用的数值解法欧拉法改进欧拉法,龙格-库塔,拉格朗日插值。 1. 欧拉法(Euler Method)是最简单的显式数值解法之一。欧拉法基于微分方程中的一阶泰勒展开式,通过计算函数在当前点上的斜率,来逼近下一点的函数值。具体步骤为:首先给定初值,然后根据微分方程计算斜率,以此斜率进行一步近似,不断迭代直到求得所需点的函数值。 2. 改进欧拉法(Improved Euler Method)是对欧拉法改进。在改进欧拉法中,我们在一个步长内进行两次斜率计算,然后对这两个斜率的平均值进行一步近似。通过这样的平均值,改进欧拉法可以更准确地逼近下一点的函数值。 3. 龙格-库塔(Runge-Kutta Method)是一类非常流行的显式数值解法。RK4方是其中最常用的一种方。在龙格-库塔中,我们根据微分方程中的高阶泰勒展开式来计算斜率。RK4方的基本步骤为:首先计算中间点上的斜率,然后根据这个斜率计算出一个斜率的平均值,然后将这个平均值用于计算下一点的函数值。 4. 拉格朗日插值(Lagrange Interpolation)是对数值解法的另一种方。它利用已知的数据点来构造一个多项式函数,然后使用该多项式函数来逼近目标函数的值。拉格朗日插值的基本思想是通过已知数据点在目标区间上定义一个插值多项式,然后利用这个多项式来求目标函数在其他点上的近似值。 以上是常微分方程数值解法中的欧拉法改进欧拉法,龙格-库塔,拉格朗日插值的详细介绍。每种方都有其适用范围和优缺点,根据实际问题的需求选择合适的方来进行数值求解。 ### 回答3: 欧拉法常微分方程数值解法中最简单的一种方。它通过将微分方程转化为差分方程,基于初始条件依次计算出下一个点的值。具体方是将微分方程在当前点的切线作为下一个点的近似解值,即通过迭代来逼近真实解。欧拉法的计算简单,但精度较低,容易累积误差。 改进欧拉法是对欧拉法的一种改进。它通过计算下一个点的切线斜率的平均值,来更准确地估计下一个点的值。改进欧拉法通过减小误差项的贡献,提高了数值解的精度。相比于欧拉法改进欧拉法的计算复杂度略高,但精度也有所提升。 龙格-库塔是一种常用的高阶精度数值解法,主要包括二阶和四阶方。它通过计算多个切线斜率的加权平均值,来估计下一个点的值。具体来说,四阶龙格-库塔计算过程中需要进行四次迭代,每一步都通过加权平均值来更新近似解。龙格-库塔相对于欧拉法改进欧拉法具有更高的精度和更少的误差。但同时,也需要更多的计算量。 拉格朗日插值数值常微分方程时常用的一种插值方。它通过连接已知的若干个点,构造一个多项式函数,利用这个多项式函数来估计未知点的值。拉格朗日插值基于拉格朗日插值多项式的构造原理,不断减小误差,可以较好地逼近真实解。但需要注意的是,拉格朗日插值的误差随插值节点的数量增加而增加,且容易在边界处产生振荡现象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值