[常微分方程的数值解法系列四] 中值法

在惯性导航以及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 ⋅ f ( t i + 1 2 , x i + 1 2 ) x_{i+1}=x_{i} + \Delta t \cdot f(t_{i+\frac{1}{2}}, x_{i+\frac{1}{2}}) xi+1=xi+Δtf(ti+21,xi+21)

具体步骤

利用向前(显式)欧拉公式预估一个 x ( t i + 1 2 ) \mathbf{x}(t_{i+\frac{1}{2}}) x(ti+21)的近似值
x i + 1 2 = x i + 1 2 Δ t ⋅ f ( t i , x i ) , (1) x_{i+\frac{1}{2}} = x_{i} + \frac{1}{2} \Delta t \cdot f(t_{i}, x_{i}), \tag{1} xi+21=xi+21Δtf(ti,xi),(1)
利用中点公式求得最终的估计值
x i + 1 = x i + Δ t ⋅ f ( t i + 1 2 , x i + 1 2 ) , (2) x_{i+1}=x_{i} + \Delta t \cdot f(t_{i+\frac{1}{2}}, x_{i+\frac{1}{2}}), \tag{2} xi+1=xi+Δtf(ti+21,xi+21),(2)
公式 ( 1 ) (1) (1)和公式 ( 2 ) (2) (2)就叫做中值法,也会叫做变形欧拉公式

截断误差

[常微分方程的数值解法系列一] 常微分方程文中公式 ( 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 ⋅ f ( t i + 1 2 , x i + 1 2 ) − x ( t i + 1 ) , (5) \boldsymbol{e}_{i+1} = x_{i} + \Delta t \cdot f(t_{i+\frac{1}{2}}, x_{i+\frac{1}{2}}) - \mathbf{x}(t_{i+1}), \tag{5} ei+1=xi+Δtf(ti+21,xi+21)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 2 , x i + 1 2 ) = f ( t i + 1 2 Δ t , x i + 1 2 Δ t ⋅ f ( t i , x i ) ) = f ( t i , x i ) + 1 2 Δ t f t ′ ( t i , x i ) + ( 1 2 Δ t ⋅ f ( t i , x i ) ) ⋅ f x ′ ( t i , x i ) + O ( Δ t 2 ) = x ′ ( t i ) + 1 2 Δ 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+\frac{1}{2}}, x_{i+\frac{1}{2}}) &= f(t_i + \frac{1}{2}\Delta t, x_{i} + \frac{1}{2} \Delta t \cdot f(t_{i}, x_{i})) \\ &= f(t_i,x_i) + \frac{1}{2}\Delta t f_t^{\prime}(t_i,x_i) + (\frac{1}{2}\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) + \frac{1}{2}\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+21,xi+21)x(ti+1)=f(ti+21Δt,xi+21Δtf(ti,xi))=f(ti,xi)+21Δtft(ti,xi)+(21Δtf(ti,xi))fx(ti,xi)+O(Δt2)=x(ti)+21Δ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 ⋅ f ( t i + 1 2 , x i + 1 2 ) − x ( t i + 1 ) = x i + Δ t ( x ′ ( t i ) + 1 2 Δ t x ′ ′ ( t i ) + O ( Δ t 3 ) ) − 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} + \Delta t \cdot f(t_{i+\frac{1}{2}}, x_{i+\frac{1}{2}}) - \mathbf{x}(t_{i+1}) \\ & = x_{i} + \Delta t(\mathbf{x}^{\prime}(t_i) + \frac{1}{2}\Delta t \mathbf{x}^{\prime\prime}(t_i) + \mathbf{O}(\Delta t^3)) - \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+Δtf(ti+21,xi+21)x(ti+1)=xi+Δt(x(ti)+21Δtx(ti)+O(Δt3))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 2 = x i + 0.1 2 ( x i − 2 t i x i ) = 1.05 x i − 0.1 t i x i x i + 1 = x i + 0.1 ( x i + 1 2 − 2 t i + 1 2 x i + 1 2 ) x 0 = 1 \begin{cases} x_{i+\frac{1}{2}} = x_{i} +\frac{0.1}{2}(x_i-\frac{2t_i}{x_i}) = 1.05x_i-\frac{0.1t_i}{x_i} \\ x_{i+1}=x_{i} +0.1(x_{i+\frac{1}{2}} - \frac{2t_{i+\frac{1}{2}}}{x_{i+\frac{1}{2}}}) \\ x_0 = 1 \end{cases} xi+21=xi+20.1(xixi2ti)=1.05xixi0.1tixi+1=xi+0.1(xi+21xi+212ti+21)x0=1
计算得:

i i i t i t_i ti向前 x i x_i xi改进 x i x_i xi中值 x i x_i xi x ( t i ) \mathbf{x}(t_i) x(ti)
001110
10.11.11.0959091.0954761.095445
20.21.1918181.1840971.1832981.183216
30.31.2771381.2662011.2650561.264911
40.41.3582131.3433601.3418591.341641
50.51.4351331.4164021.4145161.414214
60.61.5089661.4859661.4836381.483240
70.71.5803381.5525141.5497021.549193
80.81.6497831.6164751.6130881.612452
90.91.7177791.6781661.6741061.673320
101.01.7847701.7378671.7330121.732051

绘制如下图所示
红色: x ( t i ) \mathbf{x}(t_i) x(ti)
绿色:向前 x i x_i xi
蓝色:改进 x i x_i xi
金色:中值 x i x_i xi
在本例中,中值法比改进欧拉法还要好一些,几乎和真值重叠!!!
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值