Tanuki_Bayashin’s diary

電子工作を趣味としています。最近はラズベリーパイPicoというマイコンを使って楽しんでいます

3点微分について(習作)

※なにか気になる点がありましたらコメント欄にご記入ください。

【目次】

1.はじめに

数値計算と呼ばれる分野で、与えられた数値から信号の微分値を求める方法に、3点微分というものがあります。簡潔に精度を上げて計算できるということで、ロボットの制御などで応用されているようです。
(唐突に話が始まる、など)

今回は数式を久しぶりに書いてみたいというのもある感じで進めていきます。

2.GPT氏に聞いてみた

ChatGPTに3点微分の公式を聞いてみたところ、

 \dfrac {df(x)}{dx} = \dfrac {f(x+h)-f(x-h)}{2h}   (1)

という式を提示してくれました。この式は以下の式

 \dfrac {df(x)}{dx} = \dfrac {f(x)-f(x-2h)}{2h}   (2)

と似ていますが、実は計算の精度の点で違いがあります。まずはその点から見ていきます。

まずf(x+h)についてテイラー展開をすると、

f(x+h) = f(x) + hf'(x) + \dfrac{1}{2!} h^2 f''(x) + \dfrac{1}{3!} h^3 f'''(x) + \cdot\cdot\cdot


となります。h^3以上の項は以下ではo(h^3)と表すことにします。すなわち、

f(x+h) = f(x) + hf'(x) + \dfrac{1}{2!} h^2 f''(x) + o(h^3)


とします。(o(h^3)hを0に近づけていくと、この項がh^3のオーダーで0に近づいていくことを意味します)

また f'(x)はxの1階微分 f''(x)はxの2階微分を意味しています。(3階微分も同じ)

f(x-h)も同様にテイラー展開して(1)式の分母に代入すると、


\begin{eqnarray}
\left((1)式の分子\right) &=& f(x) + hf'(x) + \dfrac{1}{2!} h^2 f''(x) + o(h^3) \\
&\quad&-\{f(x) - hf'(x) + \dfrac{1}{2!} h^2 f''(x) + o(h^3) \} \\
&=& 2hf'(x) + o(h^3)
\end{eqnarray}


うまくh^2の項が消えました。結果、

 (1式)=\dfrac{ 2hf'(x) + o(h^3) } {2h} = f'(x) + o(h^2)

( \because \dfrac{o(h^3)}{2h}=o(h^2))

となります。


一方(2)式について見てみると、


\begin{eqnarray}
 (2)式の分子 &=& f(x)-f(x-2h) \\
&=& f(x) - \{ f(x) -2hf'(x) + 4h^2  \dfrac{1}{2!} f''(x) + o(h^3)\} \\
&=& 2hf'(x) +2h^2f''(x) + o(h^3)
\end{eqnarray}


したがって


\begin{eqnarray}
 \dfrac {f(x)-f(x-2h)}{2h} &=&  \dfrac{2hf'(x) +2h^2f''(x) + o(h^3)}{2h}
&=& f'(x) + hf''(x) + o(h^2)
\end{eqnarray}

となります。結果としてhの項が残ってしまい、収束の度合いとしてはo(h)となることが分かります。

つまりChatGPTが示してくれた公式の方が誤差はo(h^2)なので、精度が高いと言えます。

3.リチャードソン外挿法

ここで一つ問題が現れます。
現時点で数値処理したいデータがそろっている場合なら問題はないのですが、ロボットなどようにリアルタイムで計算処理する場合、時刻tにおいて時刻t+hにおける関数f(t+h)の値は観測できません。

hだけ時間をずらしてもよさそうですが、それは2章の(2)式と同じになるので、精度はo(h)に落ちてしまいます。

そこで登場するのがリチャードソン外挿法です。リチャードソン外挿法とは、「異なる間隔h を用いた数値微分結果を組み合わせて、誤差を打ち消すことによって精度を向上させる手法」のことです。(ChatGPTより引用)

具体的に見ていきます。

 \dfrac {df(x)}{dx} = \alpha \dfrac {f(x)-f(x-h)}{h} + \beta \dfrac {f(x)-f(x-2h)}{2h}   (3)

といった具合に、時間幅h2hの異なる値を用いて微分値の近似値を計算するという訳です。式の中の\alpha\betaの値はこれから決めていきます。
(めんどくさい方は下の方をご覧ください)

(3)式の分母を2hと置き、分子をまとめて見ていきます。


\begin{eqnarray}
(3)式の分子 &=& 2\alpha \{f(x)-f(x-h)\} + \beta \{f(x)-f(x-2h)\} \\
&=& 2\alpha f(x) - 2\alpha f(x-h) + \beta f(x) - \beta f(x-2h) 
\end{eqnarray}

f(x-h)f(x-2h)テイラー展開すると、


\begin{eqnarray}
(3)式の分子 &=& 2\alpha f(x) - 2\alpha \{ f(x) - hf'(x) + \dfrac{1}{2!} h^2 f''(x) + o(h^3) \} \\
 &\quad&+ \beta f(x) - \beta \{  f(x) -2hf'(x) + 4h^2  \dfrac{1}{2!} f''(x) + o(h^3) \} \\
 &=& 2\alpha hf'(x)  - \alpha h^2 f''(x) + o(h^3) + 2\beta hf'(x) - 2\beta h^2 f''(x)  + o(h^3) \\
 &=& ( 2\alpha + 2\beta ) hf'(x) - ( \alpha + 2\beta ) h^2 f''(x) + o(h^3)
\end{eqnarray}


となります。

※ここで注意しておきますが、o(h)に関してですが(ここではhの1乗)、これは収束の度合いを含んだ誤差を意味しており、o(h)同士で足し算や引き算をしたり、一定の値(ゼロ以外)を掛けたとしても、誤差の値は変わるかとは思いますが、誤差なので正確な値を示す必要はなく、収束の度合い(オーダー)は変わらないので、o(h)という表記は変わらないです。

上の式より、分母が2hであることも考え合わせて、


\begin{eqnarray}
\left\{
\begin{array}{rcl}
2\alpha + 2\beta &=& 2 \\
\alpha + 2\beta  &=& 0
\end{array}
\right.
\end{eqnarray}

とすればよいことが分かります。これらを解いて、


\begin{eqnarray}
\left\{
\begin{array}{rcl}
\alpha  &=& 2 \\
\beta  &=& -1
\end{array}
\right.
\end{eqnarray}

が導かれます。これを(3)式に代入すると、


\begin{eqnarray}
 \dfrac {df(x)}{dx} &=& 2 \dfrac {f(x)-f(x-h)}{h} - \dfrac {f(x)-f(x-2h)}{2h}   (3) \\
&=& \dfrac{4f(x)-4f(x-h) - f(x) + f(x+2h)}{2h} \\
&=& \dfrac{3f(x)-4f(x-h) + f(x+2h)}{2h} 
\end{eqnarray}

これにより、f(x)f(x-h)f(x-2h)の値よりf(x)微分値の近似値を求めることができました。
精度的には分母はo(h^3)のオーダーなので、o(h^2)になります。

4.実用例

図1に実際に筆者が倒立振子で実験したときのようすをグラフで示します。

図1 数値微分の具体例

上のグラフがタイヤの回転角のグラフです。横軸は時間(秒)で縦軸は回転角度(degree)です。下のグラフは上のグラフを時間で微分した様子です。

そして、青が2章の(2)式から求めたもので、茶色が3章の(3)式から求めたものです。

見てみると大きな違いは分からないです。ノイズものっているので、数式上は精度が高いと出ても、実際に運用する場面ではこんなもんです。(あれれ)

とは言え、(3)式を用いても実用上問題なく使用できることが分かるかと思います。

(各所で値が飛んでいるところがありますが、これはマイコンからPCに値を取り込むときの通信エラーのようです)

5.まとめ

ChatGPTの力も借りて、リチャードソン外挿法の手法を取り入れて、精度の高い数値微分の公式を求めました。

しかし、この公式、実は筆者が学生だった頃に目にしており、別に大発見という訳では全然ないです。

けれども自分の力でこの式を導けたというのは、少しばかりうれしくもあり、記事に起こした次第です。

あと、今回の取り組みを発展させ、x-3hやそれ以上の前のデータを用いて、さらに精度の高い微分を計算する式を導くこともできそうです。

ただし、あまりに過去のデータを利用するのは、応答が遅くなるなどあまりいいことばかりではないようです。

でわこの辺で。



最後までお付き合い下さりありがとうございました。