在慣性導航以及VIO等實際問題中利用IMU求解位姿須要對IMU測量值進行積分獲得須要的位置和姿態,其中主要就是求解微分方程。但以前求解微分方程的解析方法主要是應用於一些簡單和特殊的微分方程求解中,對於通常形式的微分方程,通常很難用解析方法求出精確解,只能用數值方法求解。該系列主要介紹一些經常使用的常微分方程的數值解法,主要包括:html
- [常微分方程的數值解法系列一] 常微分方程
- [常微分方程的數值解法系列二] 歐拉法
- [常微分方程的數值解法系列三] 改進歐拉法(預估校訂法)
- [常微分方程的數值解法系列四] 中值法
- [常微分方程的數值解法系列五] 龍格-庫塔(RK4)法
這個系列後面文章會用到前面文章的理論和技術,因此建議按照順序查看。web
簡介
在以前常微分方程的數值解法系列中,已經介紹了歐拉法,改進歐拉法以及中值法等多種常微分方程的數值解法。可是以前講解的方法的局部截斷偏差相對來講比較大,精度有限,在某些狀況下須要更高精度的方法。
原本主要介紹的龍格-庫塔法,能夠提供更高精度的常微分方程的數值解法。並且龍格-庫塔法是常微分方程的數值解法的基本理論,後面講解的過程當中會發現,以前講解的多種方法均可以歸類到龍格-庫塔法的體系中。並且不考慮計算量的狀況下,理論上是能夠構造任意高階的龍格-庫塔公式,這裏階數能夠認爲和 [常微分方程的數值解法系列一] 常微分方程介紹的截斷偏差的階數概念是一致的,階數越高表明截斷偏差越小,精度越高。但比較經常使用的是四階龍格-庫塔公式,後面會給出具體詳細的講解。算法
基本思想
由微分中值定理可知,存在點 ξ \xi ξ使得
x ( t i + 1 ) − x ( t i ) Δ t = x ′ ( ξ ) , ξ ∈ ( t i , t i + 1 ) \frac{\mathbf{x}(t_{i+1})-\mathbf{x}(t_i)}{\Delta t} = \mathbf{x}^{\prime}(\xi), \quad \xi \in (t_i, t_{i+1}) Δtx(ti+1)−x(ti)=x′(ξ),ξ∈(ti,ti+1)
即
x ( t i + 1 ) = x ( t i ) + Δ t x ′ ( ξ ) = x ( t i ) + Δ t ⋅ f ( ξ , x ( ξ ) ) = x ( t i ) + Δ t k ˉ , (1) \mathbf{x}(t_{i+1}) = \mathbf{x}(t_i) + \Delta t \mathbf{x}^{\prime}(\xi) = \mathbf{x}(t_i) + \Delta t \cdot f(\xi, \mathbf{x}(\xi)) = \mathbf{x}(t_i) + \Delta t \bar{k}, \tag{1} x(ti+1)=x(ti)+Δtx′(ξ)=x(ti)+Δt⋅f(ξ,x(ξ))=x(ti)+Δtkˉ,(1)
其中 k ˉ = f ( ξ , x ( ξ ) ) \bar{k} = f(\xi, \mathbf{x}(\xi)) kˉ=f(ξ,x(ξ))稱爲 x ( t ) \mathbf{x}(t) x(t)在 [ t i , t i + 1 ] [t_i, t_{i+1}] [ti,ti+1]上的平均斜率。因此基於這點考慮,只要對平均斜率 k ˉ \bar{k} kˉ提供一種近似算法,那麼就能夠利用 x i x_i xi去遞推求解 x i + 1 x_{i+1} xi+1,這就是龍格-庫塔方法的基本思想。
固然不一樣的近似算法求解精度不一樣,像以前講解的向前歐拉法、改進歐拉法和中值法利用龍格-庫塔方法思想解釋就是分別利用 t i t_i ti點斜率、 t i t_i ti點和 t i + 1 t_{i+1} ti+1點斜率平均值和 t i t_i ti點和 t i + 1 t_{i+1} ti+1點間中點斜率來近似 k ˉ \bar{k} kˉ。app
具體方法
一階
以 x ( t ) \mathbf{x}(t) x(t)在 t i t_i ti點斜率做爲 x ( t ) \mathbf{x}(t) x(t)在 [ t i , t i + 1 ] [t_i, t_{i+1}] [ti,ti+1]上的平均斜率 k ˉ \bar{k} kˉ,並令 x i ≈ x ( t i ) x_{i} \approx \mathbf{x}(t_{i}) xi≈x(ti),可得
k ˉ = x ′ ( t i ) = f ( t i , x ( t i ) ) ≈ f ( t i , x i ) \bar{k} = \mathbf{x}^{\prime}(t_i) = f(t_i, \mathbf{x}(t_i)) \approx f(t_{i}, x_{i}) kˉ=x′(ti)=f(ti,x(ti))≈f(ti,xi)
因此
x i + 1 = x i + Δ t ⋅ f ( t i , x i ) , (2) x_{i+1}=x_{i} + \Delta t \cdot f(t_{i}, x_{i}), \tag{2} xi+1=xi+Δt⋅f(ti,xi),(2)
這就是[常微分方程的數值解法系列二] 歐拉法文中講解的向前歐拉法,也叫做一階龍格-庫塔方法。公式 ( 2 ) (2) (2)就是一階龍格-庫塔公式。svg
x i x_{i} xi是遞推過程當中 x ( t i ) \mathbf{x}(t_{i}) x(ti)的近似值,後面都用 x n x_n xn表示 x ( t n ) \mathbf{x}(t_n) x(tn)。函數
二階
在 [ t i , t i + 1 ] [t_i, t_{i+1}] [ti,ti+1]上取兩點 t i , t i + p ( 0 < p ≤ 1 ) t_i,t_{i+p}(0<p \leq 1) ti,ti+p(0<p≤1)的斜率值分別爲 k 1 , k 2 k_1,k_2 k1,k2,把它們的線性組合 λ 1 k 1 + λ 2 k 2 \lambda_1k_1+\lambda_2k_2 λ1k1+λ2k2做爲 k ˉ \bar{k} kˉ的近似值,其中 λ 1 , λ 2 , p \lambda_1,\lambda_2,p λ1,λ2,p都是待肯定常數,因此根據公式 ( 1 ) (1) (1)可得
x i + 1 = x i + Δ t ( λ 1 k 1 + λ 2 k 2 ) x_{i+1}=x_{i} + \Delta t (\lambda_1k_1+\lambda_2k_2) xi+1=xi+Δt(λ1k1+λ2k2)
其中 k 1 = f ( t i , x i ) k_1 = f(t_{i}, x_{i}) k1=f(ti,xi), k 2 k_2 k2是 ( t i , t i + 1 ] (t_i, t_{i+1}] (ti,ti+1]內任意一點 t i + p = t i + p Δ t ( 0 < p ≤ 1 ) t_{i+p} = t_i +p \Delta t (0<p \leq 1) ti+p=ti+pΔt(0<p≤1)的斜率 k 2 = f ( t i + p , x i + p ) k_2 = f(t_{i+p}, x_{i+p}) k2=f(ti+p,xi+p)。
但這裏在求解過程當中 x i + p x_{i+p} xi+p是未知量,因此須要先求解出,能夠仿照改進歐拉公式的思想,得
x i + p = x i + p Δ t f ( t i , x i ) = x i + p Δ t k 1 x_{i+p} = x_i + p\Delta t f(t_{i}, x_{i}) = x_i + p \Delta t k_1 xi+p=xi+pΔtf(ti,xi)=xi+pΔtk1
因此整理得
{ x i + 1 = x i + Δ t ( λ 1 k 1 + λ 2 k 2 ) k 1 = f ( t i , x i ) k 2 = f ( t i + p Δ t , x i + p Δ t k 1 ) (3) \begin{cases} x_{i+1}=x_{i} + \Delta t (\lambda_1k_1+\lambda_2k_2) \\ k_1 = f(t_{i}, x_{i}) \\ k_2 = f(t_i +p \Delta t, x_i + p \Delta t k_1) \end{cases} \tag{3} ⎩⎪⎨⎪⎧xi+1=xi+Δt(λ1k1+λ2k2)k1=f(ti,xi)k2=f(ti+pΔt,xi+pΔtk1)(3)
其中公式 ( 3 ) (3) (3)有三個待確認參數 λ 1 , λ 2 , p \lambda_1,\lambda_2,p λ1,λ2,p,利用泰勒展開選擇合適的參數使上訴公式具備二階精度,即局部截斷偏差爲 O ( Δ t 3 ) \mathbf{O}(\Delta t^3) O(Δt3),知足這類條件的公式 ( 3 ) (3) (3)就是二階龍格-庫塔公式。spa
求解參數
下面利用泰勒展開求解待確認參數 λ 1 , λ 2 , p \lambda_1,\lambda_2,p λ1,λ2,p,使公式 ( 3 ) (3) (3)的局部截斷偏差爲 O ( Δ t 3 ) \boldsymbol{O}(\Delta t^3) O(Δt3)。
分別對公式 3 3 3的 k 1 , k 2 k_1,k_2 k1,k2做泰勒展開爲
k 1 = f ( t i , x i ) = x ′ ( t i ) k 2 = f ( t i + p Δ t , x i + p Δ t k 1 ) = f ( t i + p Δ t , x i + p Δ t ⋅ f ( t i , x i ) ) = f ( t i , x i ) + p Δ t f t ′ ( t i , x i ) + ( p Δ t ⋅ f ( t i , x i ) ) ⋅ f x ′ ( t i , x i ) + O ( Δ t 2 ) = x ′ ( t i ) + p Δ t x ′ ′ ( t i ) + O ( Δ t 2 ) \begin{aligned} k_1 &= f(t_{i}, x_{i}) = \mathbf{x}^{\prime}(t_i) \\ k_2 & = f(t_i + p\Delta t, x_{i} + p \Delta t k_1) = f(t_i + p\Delta t, x_{i} + p \Delta t \cdot f(t_{i}, x_{i})) \\ &= f(t_i,x_i) + p \Delta t f_t^{\prime}(t_i,x_i) + (p\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) + p\Delta t \mathbf{x}^{\prime\prime}(t_i) + \mathbf{O}(\Delta t^2) \end{aligned} k1k2=f(ti,xi)=x′(ti)=f(ti+pΔt,xi+pΔtk1)=f(ti+pΔt,xi+pΔt⋅f(ti,xi))=f(ti,xi)+pΔtft′(ti,xi)+(pΔt⋅f(ti,xi))⋅fx′(ti,xi)+O(Δt2)=x′(ti)+pΔtx′′(ti)+O(Δt2)
因此可得
x i + 1 = x i + Δ t ( λ 1 k 1 + λ 2 k 2 ) = x i + Δ t ( λ 1 x ′ ( t i ) + λ 2 ( x ′ ( t i ) + p Δ t x ′ ′ ( t i ) + O ( Δ t 2 ) ) ) = x i + Δ t ( λ 1 + λ 2 ) x ′ ( t i ) + λ 2 p Δ t 2 x ′ ′ ( t i ) + O ( Δ t 3 ) , (4) \begin{aligned} x_{i+1} &=x_{i} + \Delta t (\lambda_1k_1+\lambda_2k_2) \\ &=x_{i} + \Delta t (\lambda_1\mathbf{x}^{\prime}(t_i)+\lambda_2(\mathbf{x}^{\prime}(t_i) + p\Delta t \mathbf{x}^{\prime\prime}(t_i) + \mathbf{O}(\Delta t^2))) \\ &=x_i + \Delta t(\lambda_1 + \lambda_2)\mathbf{x}^{\prime}(t_i) + \lambda_2p\Delta t^2\mathbf{x}^{\prime\prime}(t_i) + \mathbf{O}(\Delta t^3) \end{aligned}, \tag{4} xi+1=xi+Δt(λ1k1+λ2k2)=xi+Δt(λ1x′(ti)+λ2(x′(ti)+pΔtx′′(ti)+O(Δt2)))=xi+Δt(λ1+λ2)x′(ti)+λ2pΔt2x′′(ti)+O(Δt3),(4)
又 x ( t i + 1 ) \mathbf{x}(t_{i+1}) x(ti+1)的二階泰勒展開爲
x ( t i + 1 ) = x ( t i + Δ t ) = x ( t i ) + Δ t x ′ ( t i ) + Δ t 2 2 ! x ′ ′ ( t i ) + O ( Δ t 3 ) , (5) \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), \tag{5} x(ti+1)=x(ti+Δt)=x(ti)+Δtx′(ti)+2!Δt2x′′(ti)+O(Δt3),(5)
比較公式 ( 4 ) (4) (4)和公式 ( 5 ) (5) (5),若是要使公式 ( 3 ) (3) (3)的局部截斷偏差知足 x i + 1 − x ( t i + 1 ) = O ( Δ t 3 ) x_{i+1} - \mathbf{x}(t_{i+1}) = \mathbf{O}(\Delta t^3) xi+1−x(ti+1)=O(Δt3),即要求公式具備二階精度,須要 O ( Δ t 3 ) \mathbf{O}(\Delta t^3) O(Δt3)前面的項相等,即須要知足
{ λ 1 + λ 2 = 1 λ 2 p = 1 2 , (6) \begin{cases} \lambda_1 + \lambda_2 = 1 \\ \lambda_2p = \frac{1}{2} \end{cases}, \tag{6} {
λ1+λ2=1λ2p=21,(6)
知足上訴條件的公式 ( 3 ) (3) (3)統稱爲二階龍格-庫塔公式。.net
特殊二階
若是當 p = 1 , λ 1 = 1 2 , λ 2 = 1 2 p=1,\lambda_1=\frac{1}{2},\lambda_2=\frac{1}{2} p=1,λ1=21,λ2=21,二階龍格-庫塔公式就成了改進歐拉公式,具體詳解見[常微分方程的數值解法系列三] 改進歐拉法(預估校訂法)。簡單來講改進歐拉公式就是以 x \mathbf{x} x函數在 t i t_i ti點和 t i + 1 t_{i+1} ti+1點處的斜率 k 1 k_1 k1和 k 2 k_2 k2的算數平均值做爲 x \mathbf{x} x在 [ t i , t i + 1 ] [t_i, t_{i+1}] [ti,ti+1]上的平均斜率 k ˉ \bar{k} kˉ。
若是當 p = 1 2 , λ 1 = 0 , λ 2 = 1 p=\frac{1}{2},\lambda_1=0,\lambda_2=1 p=21,λ1=0,λ2=1,二階龍格-庫塔公式就成了變形歐拉公式,具體詳解見[常微分方程的數值解法系列四] 中值法。簡單來講變形歐拉公式或者說是中值法就是以 x \mathbf{x} x函數在 t i t_i ti點和 t i + 1 t_{i+1} ti+1中點處的斜率 k k k做爲 x \mathbf{x} x在 [ t i , t i + 1 ] [t_i, t_{i+1}] [ti,ti+1]上的平均斜率 k ˉ \bar{k} kˉ。xml
三階
在 [ t i , t i + 1 ] [t_i, t_{i+1}] [ti,ti+1]上取三點 t i , t i + p , t i + q ( 0 < p ≤ q ≤ 1 ) t_i,t_{i+p},t_{i+q}(0<p \leq q \leq 1) ti,ti+p,ti+q(0<p≤q≤1)的斜率值分別爲 k 1 , k 2 , k 3 k_1,k_2,k_3 k1,k2,k3,把它們的線性組合 λ 1 k 1 + λ 2 k 2 + λ 3 k 3 \lambda_1k_1+\lambda_2k_2 + \lambda_3k_3 λ1k1+λ2k2+λ3k3做爲 k ˉ \bar{k} kˉ的近似值,因此根據公式 ( 1 ) (1) (1)可得
x i + 1 = x i + Δ t ( λ 1 k 1 + λ 2 k 2 + λ 3 k 3 ) x_{i+1}=x_{i} + \Delta t (\lambda_1k_1+\lambda_2k_2+\lambda_3k_3) xi+1=xi+Δt(λ1k1+λ2k2+λ3k3)
其中
{ k 1 = f ( t i , x i ) k 2 = f ( t i + p Δ t , x i + p Δ t k 1 ) \begin{cases} k_1 = f(t_{i}, x_{i}) \\ k_2 = f(t_i +p \Delta t, x_i + p \Delta t k_1) \end{cases} {
k1=f(ti,xi)k2=f(ti+pΔt,xi+pΔtk1)
爲了求 x i + q x_{i+q} xi+q點的斜率 k 3 k_3 k3,最直接方法就是利用改進歐拉法進行預報得
k 3 = f ( t i + q , x ^ i + q ) = f ( t i + q Δ t , x i + q Δ t k 1 ) k_3 = f(t_{i+q}, \hat{x}_{i+q}) = f(t_i +q \Delta t, x_i + q \Delta t k_1) k3=f(ti+q,x^i+q)=f(ti+qΔt,xi+qΔtk1)
可是這樣作效率比較差,由於在區間 [ t i , t i + q ] [t_i,t_{i+q}] [ti,ti+q]區間內已經有 k 1 , k 2 k_1,k_2 k1,k2兩個斜率可使用了,因此能夠把 k 1 , k 2 k_1,k_2 k1,k2的線性組合當作 [ x i , x i + q ] [x_i,x_{i+q}] [xi,xi+q]上平均斜率的近似值,這確定比上面求 x ^ i + q \hat{x}_{i+q} x^i+q精度要好。由此,可得
x ^ i + q = x i + q Δ t ( μ 1 k 1 + μ 2 k 2 ) \hat{x}_{i+q} = x_{i} + q\Delta t (\mu_1k_1+\mu_2k_2) x^i+q=xi+qΔt(μ1k1+μ2k2)
因此
k 3 = f ( t i + q , x ^ i + q ) = f ( t i + q Δ t , x i + q Δ t ( μ 1 k 1 + μ 2 k 2 ) ) k_3 = f(t_{i+q}, \hat{x}_{i+q}) = f(t_i +q \Delta t, x_{i} + q\Delta t (\mu_1k_1+\mu_2k_2)) k3=f(ti+q,x^i+q)=f(ti+qΔt,xi+qΔt(μ1k1+μ2k2))
因此整理得
{ x i + 1 = x i + Δ t ( λ 1 k 1 + λ 2 k 2 + λ 3 k 3 ) k 1 = f ( t i , x i ) k 2 = f ( t i + p Δ t , x i + p Δ t k 1 ) k 3 = f ( t i + q Δ t , x i + q Δ t ( μ 1 k 1 + μ 2 k 2 ) ) , (7) \begin{cases} x_{i+1}=x_{i} + \Delta t (\lambda_1k_1+\lambda_2k_2+\lambda_3k_3) \\ k_1 = f(t_{i}, x_{i}) \\ k_2 = f(t_i +p \Delta t, x_i + p \Delta t k_1) \\ k_3 = f(t_i +q \Delta t, x_{i} + q\Delta t (\mu_1k_1+\mu_2k_2)) \end{cases}, \tag{7} ⎩⎪⎪⎪⎨⎪⎪⎪⎧xi+1=xi+Δt(λ1k1+λ2k2+λ3k3)k1=f(ti,xi)k2=f(ti+pΔt,xi+pΔtk1)k3=f(ti+qΔt,xi+qΔt(μ1k1+μ2k2)),(7)
其中公式 ( 7 ) (7) (7)有七個待確認參數 λ 1 , λ 2 , λ 3 , μ 1 , μ 2 , p , q \lambda_1,\lambda_2,\lambda_3,\mu_1,\mu_2,p,q λ1,λ2,λ3,μ1,μ2,p,q,相似前面的推導利用泰勒展開選擇合適的參數使上訴公式具備三階精度,即局部截斷偏差爲 O ( Δ t 4 ) \mathbf{O}(\Delta t^4) O(Δt4),知足這類條件的公式 ( 7 ) (7) (7)就是三階龍格-庫塔公式。
推導過程和二階相似,再此省略,只給出比較經常使用的一致形式
{ x i + 1 = x i + 1 6 Δ t ( k 1 + 4 k 2 + k 3 ) k 1 = f ( t i , x i ) k 2 = f ( t i + 1 2 Δ t , x i + 1 2 Δ t ⋅ k 1 ) k 3 = f ( t i + Δ t , x i − Δ t ⋅ k 1 + 2 Δ t ⋅ k 2 ) ) , (7) \begin{cases} x_{i+1}=x_{i} + \frac{1}{6}\Delta t (k_1+4k_2+k_3) \\ k_1 = f(t_{i}, x_{i}) \\ k_2 = f(t_i +\frac{1}{2} \Delta t, x_i + \frac{1}{2} \Delta t \cdot k_1) \\ k_3 = f(t_i + \Delta t, x_{i} - \Delta t \cdot k_1+ 2\Delta t \cdot k_2)) \end{cases}, \tag{7} ⎩⎪⎪⎪⎨⎪⎪⎪⎧xi+1=xi+61Δt(k1+4k2+k3)k1=f(ti,xi)k2=f(ti+21Δt,xi+21Δt⋅k1)k3=f(ti+Δt,xi−Δt⋅k1+2Δt⋅k2)),(7)htm
高階
爲了進一步提升精度,在 [ t i , t i + 1 ] [t_i, t_{i+1}] [ti,ti+1]上能夠選取更多點的,利用改進歐拉法中預報法,預報這些點的斜率值(以前在三階也討論過,爲了預報更準確,利用前面全部點的斜率來預報後面點的估計值進一步求得斜率,而不只僅只利用第一個點),而後對這些斜率值加權平均做爲做爲 x \mathbf{x} x在 [ t i , t i + 1 ] [t_i, t_{i+1}] [ti,ti+1]上的平均斜率 k ˉ \bar{k} kˉ。而後在利用泰勒展開,對比相應的係數,從而肯定在知足特定 n n n階精度下全部未知參數須要知足的條件。
前面也提到過,不考慮計算量的狀況下,理論上是能夠構造任意高階的龍格-庫塔公式。但在實際中發現,高於四階的龍格-庫塔公式,不但計算量很是大,並且精度進一步提高的有限。因此在實際使用中,四階的龍格-庫塔公式是精度和計算量都比較理想的公式。
推導過程和二階相似,再此省略,只給出最經典的四階的龍格-庫塔公式:
{ x i + 1 = x i + Δ t ( 1 6 k 1 + 1 3 k 2 + 1 3 k 3 + 1 6 k 4 ) = 1 6 Δ t ( k 1 + 2 k 2 + 2 k 3 + k 4 ) k 1 = f ( t i , x i ) k 2 = f ( t i + 1 2 Δ t , x i + 1 2 Δ t ⋅ k 1 ) k 3 = f ( t i + 1 2 Δ t , x i + 1 2 Δ t ⋅ k 2 ) k 4 = f ( t i + Δ t , x i + Δ t ⋅ k 3 ) , (8) \begin{cases} x_{i+1} = x_i + \Delta t (\frac{1}{6}k_1 + \frac{1}{3}k_2 + \frac{1}{3}k_3 + \frac{1}{6}k_4) = \frac{1}{6} \Delta t (k_1 + 2k_2 + 2k_3 + k_4) \\ k_1 = f(t_{i}, x_{i}) \\ k_2 = f(t_i + \frac{1}{2} \Delta t, x_i + \frac{1}{2} \Delta t \cdot k_1) \\ k_3 = f(t_i + \frac{1}{2} \Delta t, x_i + \frac{1}{2} \Delta t \cdot k_2) \\ k_4 = f(t_i + \Delta t, x_i + \Delta t \cdot k_3) \end{cases}, \tag{8} ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧xi+1=xi+Δt(61k1+31k2+31k3+61k4)=61Δt(k1+2k2+2k3+k4)k1=f(ti,xi)k2=f(ti+21Δt,xi+21Δt⋅k1)k3=f(ti+21Δt,xi+21Δt⋅k2)k4=f(ti+Δt,xi+Δt⋅k3),(8)
步長選擇
以前討論的全部的龍格-庫塔方法都是以 Δ t \Delta t Δt定步長來展開的,但從 x i ⇒ x i + 1 x_i \Rightarrow x_{i+1} xi⇒xi+1單步遞推過程來講,步長 Δ t \Delta t Δt越小,局部截斷偏差越小(方法肯定狀況下),可是隨着步長的縮小,不但會引發計算量的增長,並且也有可能引發舍入偏差的嚴重積累;但步長 Δ t \Delta t Δt太大又不能達到預期的精度要求,因此選擇合適的步長 Δ t \Delta t Δt,在實際計算中也是比較重要的。其實有時候在實際使用中步長並不須要算法肯定,而是須要根據數據幀率來肯定的,好比imu數據。
下面給出求解步長的步驟:
- 以步長 Δ t \Delta t Δt開始,利用龍格-庫塔公式計算 x i ⇒ x i + 1 x_i \Rightarrow x_{i+1} xi⇒xi+1獲得一個近似值 x i + 1 Δ t x_{i+1}^{\Delta t} xi+1Δt;
- 而後步長減半爲 Δ t / 2 \Delta t /2 Δt/2,利用龍格-庫塔公式分兩步計算 x i ⇒ x i + 1 2 ⇒ x i + 1 x_i \Rightarrow x_{i+\frac{1}{2}} \Rightarrow x_{i+1} xi⇒xi+21⇒xi+1獲得一個近似值 x i + 1 Δ t / 2 x_{i+1}^{\Delta t/2} xi+1Δt/2;
- 計算 ∣ x i + 1 Δ t / 2 − x i + 1 Δ t < ϵ ∣ |x_{i+1}^{\Delta t/2} - x_{i+1}^{\Delta t} < \epsilon| ∣xi+1Δt/2−xi+1Δt<ϵ∣是否成立,若是成立直接步長選擇 Δ t \Delta t Δt,不然繼續步長減半 Δ t / 4 \Delta t/4 Δt/4,重複上訴步驟直到知足精度要求。
例子
待續~~
本文同步分享在 博客「無比機智的永哥」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。