MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

常微分方程式における数値積分の基礎とPythonサンプルコード

目次

はじめに

ロボティクスで使われる技術では、

しばしば数値積分を実施する必要があります。

 

例えば、ロボットの運動モデルが下記の式のように

ある微分方程式で得られる場合、

f:id:meison_amsl:20170630040518p:plain

そのロボットの将来の動きを予測するために

上記の微分方程式を数値積分して予測を実現します。

 

この数値積分は、未来を予測するモデル予測制御や、

myenigma.hatenablog.com

位置計測手法である推測航法(Dead Reckoning)などでしばしば利用されます。

myenigma.hatenablog.com

 

上記の微分方程式の数値積分には、

いくつか代表的な手法がありますが、

今回はそれらの概要と

簡単なPythonサンプルコードによる比較結果を

を紹介したいと思います。

 

Euler 法 (オイラー法)

オイラー法は数値積分の手法の中で、

最もシンプルな手法です。

 

前述の微分方程式が与えられた時に、

各時刻tのxの値は、x(0)の初期値情報を使って、

下記のような漸化式で計算できるようになります。

f:id:meison_amsl:20170630061153p:plain

 

オイラー法における刻み距離の影響

前述のオイラー法は非常に簡単に

積分計算を実装することができます。

よって、最も広く使われている数値積分手法であるといえます。

 

しかし、このオイラー法は、

刻み時間が大きいと積分の精度が悪くなるという問題があります。

 

下記の図は、Sin関数を各刻み距離でオイラー法を使って

積分した結果です。

f:id:meison_amsl:20170629145126p:plain

dx = 0.1の時は比較的、真値に近い積分結果が得られていますが、

dx = 1.0の場合は

大きな積分誤差が発生してしまっていることがわかります。

 

このようにオイラー法では、

サンプリング距離が大きいと積分誤差が大きくなってしまいます。

サンプリング距離を小さくすれば、精度は向上できますが、

その分、積分回数が多くなってしまい、

計算コストが大きくなってしまうという問題があります。

 

Runge-Kutta法(4次)

前述の通り、オイラー法は

サンプリング幅を大きくすると精度が下がり、

サンプリング幅を小さくすると計算コストが大きくなります。

 

オイラー法がサンプリング幅が大きい時に

精度が悪くなってしまうのは

次のサンプリング点を計算する時に、

一つ前のサンプリング点の傾きのみから計算しているため、

サンプリング間の途中で、

傾きが変化する場合にうまく推定することができず、

積分誤差が蓄積してしまうからでです。

 

上記の問題を解決するために提案されたのが、

ルンゲクッタ法( Runge-Kutta法)です。

ルンゲクッタ法は、勾配を推定するサンプリング点をいくつ利用するかによって、

具体的な計算方法がかわりますが、

今回は最も広く使われている4次のルンゲクッタ法について述べます。

 

4次のルンゲクッタ法は4つのサンプリング点でそれぞれ勾配を計算し、

その重み付き足し算により、勾配を推定し積分を実施する手法です。

具体的には下記の式で計算されます。

f:id:meison_amsl:20170630064237p:plain

f:id:meison_amsl:20170630064251p:plain

4つのサンプリング点は、

区間の初め(オイラー法と同じ)と、

区間の終わり、

そして区間の中間点に二点サンプリングします。

中間点のサンプリングは、

区間の初めの勾配から計算されたサンプリング点と、

中間点の一つ目のサンプリング点の勾配から計算された

サンプリング点の二点が抽出されます。

それらを1:1:2:2で重み付き足し算し、

平均を取ったものを勾配とします。

 

Runge-Kutta法における刻み距離の影響

下記の図は、前述のオイラー法の比較と同様、

sin関数を使って、

Runge-Kutta法を使って数値積分を実施した結果です。

f:id:meison_amsl:20170629145154p:plain

オイラー法では、刻み距離dxを大きくすると精度が低下していましたが、

Runge - Kutta法では刻み距離を大きくしても、

非常に高精度に数値積分できていることがわかります。

 

比較用コード(Jupyter Notebook)

下記のすべての数値積分の計算は下記のJupyter Notebookで実行されています。

Numerical Integration Sample

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com

数値解析 (共立講座 数学探検)

数値解析 (共立講座 数学探検)