無駄と文化

実用的ブログ

二重数を使って2階微分を計算する方法 と 超二重数への発展

二重数という数があります。「その数自体は0でないのに2乗すると0になる数」のことを二重数と呼びます。


x \ne 0\ \land\ x^2 = 0

実数の範囲で  x^2 = 0 を満たす  x x = 0 のみなので、 x \ne 0 でかつ  x^2 = 0 となるような数があるならばそれは 実数ではない ということになります。
そのような実数ではない数  \varepsilon の存在を認めて、実数と  \varepsilon の線型結合  a + b \varepsilon の形で書いた数が二重数と定義されます。

二重数にはいろいろとおもしろい性質があるのですが、それについては色々な人が記事を書いているのでそちらを参照してみてください。私のおすすめはこれ↓↓↓です。

www.ajimatics.com

kamino.hatenablog.com

この記事では二重数の応用の一つである関数の自動微分について取り上げます。

 

関数に二重数を与えると微分係数が求まる

突然ですが関数  f(x) = x^4 + x^2 の微分について考えてみましょう。ひとまず  x = 1 における微分係数を求めるところから始めます。

高校数学の知識で関数  f(x) = x^4 + x^2 x = 1 における微分係数は、  f(x) を微分して導関数  f'(x) を求めてから  x = 1 を代入すればいいとわかります。

 \begin{align}
f(x)&=x^4 + x^2 \\\
f'(x)&=4x^3 + 2x \\\
f'(1)&=4+2 \\\
&=6
\end{align}

というわけで求める微分係数は  6 なんですが。二重数を使えば導関数を求めずにこれを計算できるという面白い性質があります。

具体的には  f(x) x = 1 + \varepsilon を代入して、

 \begin{align}
f(1 + \varepsilon) &= (1 + \varepsilon)^4 + (1 + \varepsilon)^2 \\\
&= (1 + 4\varepsilon + 6\varepsilon ^2 + 4\varepsilon ^3 + \varepsilon ^4) + (1 + 2\varepsilon + \varepsilon ^2)
\end{align}

ここで  \varepsilon は2乗すると  0 になるような数だったことを思い出すと上記の式を大幅に整理できます。なんせ2以上の累乗の項は消えてしまうからです。

 \begin{align}
f(1 + \varepsilon) &= (1 + \varepsilon)^4 + (1 + \varepsilon)^2 \\\
&= (1 + 4\varepsilon + 6\varepsilon ^2 + 4\varepsilon ^3 + \varepsilon ^4) + (1 + 2\varepsilon + \varepsilon ^2) \\\
&= (1 + 4\varepsilon) + (1 + 2\varepsilon) \\\
&= 2 + 6\varepsilon
\end{align}

さてこれにて  x = 1 における微分係数がもとまりました。上記の式で  6\varepsilon の項に注目してください。 \varepsilon の係数になっている  6 x = 1 における  f(x) の微分係数です。

...何もかも唐突ですね。
これは

 \begin{align}
f(x_0 + \varepsilon) = f(x_0) + f'(x_0)\varepsilon
\end{align}

という二重数の性質を応用して  f(x) の微分係数を求めたのです。上記の式では  f(x) x = x_0 + \varepsilon を代入して整理した後、 \varepsilon のついた項の係数が  f'(x_0) に等しいと云っています。

 

なんとも不思議ですが、ともかく  f(x) x = x_0 + \varepsilon を代入して式を整理するだけで微分係数  f'(x_0) が機械的に計算できてしまうのです。

 

微分係数と云わず導関数を求めた方が納得感があるかもしれない

さきほどの例で、二重数を使って関数  f(x) = x^4 + x^2 x = 1 における微分係数を求めてみました。たったの1例ということもあって、初見ではなかなか納得しづらいんじゃないかと思います。同じ方法で導関数を導出してみると納得感があるんじゃないでしょうか。

さきほどは  f(x) x = 1 + \varepsilon を代入しましたが、今度は  x = t + \varepsilon を代入してみます。

 \begin{align}
f(t + \varepsilon) &= (t + \varepsilon)^4 + (t + \varepsilon)^2 \\\
&= (t^4 + 4t^3\varepsilon + 6t^2\varepsilon ^2 + 4t\varepsilon ^3 + \varepsilon ^4) + (t^2 + 2t\varepsilon + \varepsilon ^2) \\\
&= (t^4 + 4t^3\varepsilon) + (t^2 + 2t\varepsilon) \\\
&= (t^4 + t^2) + (4t^3 + 2t)\varepsilon
\end{align}

ここで右辺に着目し  \varepsilon を含んでいない項を  g_0(t) \varepsilon を含む項の係数部分を  g_1(t) として抽出してみましょう。

 \begin{align}
f(t + \varepsilon) &= g_0(t) + g_1(t) \varepsilon \\\
\\\
g_0(t) &= t^4 + t^2 \\\
g_1(t) &= 4t^3 + 2t
\end{align}

ここで  g_0(x),  g_1(x) t についての関数とみなしましょう。変数を置き換えても関数自体は変わらないので変数  t を変数  x に置き換えてみます。

 \begin{align}
g_0(x) &= x^4 + x^2 \\\
g_1(x) &= 4x^3 + 2x
\end{align}

はい、鋭いかたはお気付きでしょう。上記の  g_0(x),  g_1(x) はそれぞれ  f(x),  f'(x) に等しくなっていますね。

 \begin{align}
g_0(x) &= x^4 + x^2 = f(x)\\\
g_1(x) &= 4x^3 + 2x = f'(x)
\end{align}

このことから、

 \begin{align}
f(x + \varepsilon) = f(x) + f'(x)\varepsilon
\end{align}

という性質に納得感が出てきたんではないでしょうか。

 

2階微分を求めたい

さて二重数をつかって微分係数や導関数が求まることがわかりました。
が、先ほどまで見た例は 1階の 微分係数や 1階の 導関数でしたね。もし2階微分を求めたくなったら、二重数をつかって計算をすることは可能でしょうか?

答えは 条件付きの Yes です。

二重数というアイデアはそのままつかえますが 2階の二重数 を持ち出す必要があります。

2階の二重数とは先ほどまでの  \varepsilon とは別の基底  \varepsilon\,_1,  \varepsilon\,_2 を用いて、

 \begin{align}
a + b\varepsilon\,_1 + c\varepsilon\,_2
\end{align}

の形で書ける数です。

具体的な計算を見せる前に二重数の基底になる  1,  \varepsilon\,_1,  \varepsilon\,_2 の積について見ていきます。

 1  \varepsilon\,_1  \varepsilon\,_2
 1  1  \varepsilon\,_1  \varepsilon\,_2
 \varepsilon\,_1  \varepsilon\,_1  2\varepsilon\,_2  0
 \varepsilon\,_2  \varepsilon\,_2  0  0

縦軸と横軸の重なる部分が積算の結果になっています。例えば  \varepsilon\,_1 \cdot \varepsilon\,_1 = 2\varepsilon\,_2,  \varepsilon\,_1 \cdot \varepsilon\,_2 = 0 です。

 

2階の二重数を導入したので、先ほどと同じ要領で関数  f(x) = x^4 + x^2 の2階微分を求めていきましょう。
さきほどは  x = t + \varepsilon を代入して整理してから  t = x と変数変換しましたが、まぁ正直煩わしいので最初から  f(x + \varepsilon) を展開整理して計算を進めていきます。ちなみに、ここで云う  \varepsilon \varepsilon\,_1 のことです。

 \begin{align}
f(x + \varepsilon\,_1) &= (x + \varepsilon\,_1)^4 + (x + \varepsilon\,_1)^2 \\\
&= (x^4 + 4x^3\varepsilon\,_1 + 6x^2\varepsilon\,_1 ^2 + 4x\varepsilon\,_1 ^3 + \varepsilon\,_1 ^4) + (x^2 + 2x\varepsilon\,_1 + \varepsilon\,_1 ^2)
\end{align}

先ほど示した演算表を見ながら 2乗, 3乗, 4乗の項を整理していきましょう。

 \begin{align}
f(x + \varepsilon\,_1) &= (x + \varepsilon\,_1)^4 + (x + \varepsilon\,_1)^2 \\\
&= (x^4 + 4x^3\varepsilon\,_1 + 6x^2\varepsilon\,_1 ^2 + 4x\varepsilon\,_1 ^3 + \varepsilon\,_1 ^4) + (x^2 + 2x\varepsilon\,_1 + \varepsilon\,_1 ^2) \\\
&= (x^4 + 4x^3\varepsilon\,_1 + 6x^2 \cdot 2\varepsilon\,_2) + (x^2 + 2x\varepsilon\,_1 + 2\varepsilon\,_2) \\\
&= (x^4 + x^2)  + (4x^3 + 2x)\varepsilon\,_1 + (12x^2 + 2)\varepsilon\,_2
\end{align}

最終行に注目してください。それぞれの項の係数が、

 \begin{align}
f(x) &= x^4 + x^2 \\\
f'(x) &= 4x^3 + 2x \\\
f''(x) &= 12x^2 + 2
\end{align}

となっていますね。

というわけで2階の二重数を使って2階微分を求められました。

 

では3階微分は?

さてここで歩みを止めずに3階微分へと進みましょう。2階の二重数を使って3階微分は求まるでしょうか?
先ほどの同じアイデアで可能ですが、(お察しの通り) 3階の二重数を持ち出す必要があります。

2階の二重数とは基底  \varepsilon\,_1,  \varepsilon\,_2,  \varepsilon\,_3 を用いて、

 \begin{align}
a + b\varepsilon\,_1 + c\varepsilon\,_2 + d\varepsilon\,_3
\end{align}

の形で書ける数です。

再び積の演算表をお見せします。

 1  \varepsilon\,_1  \varepsilon\,_2  \varepsilon\,_3
 1  1  \varepsilon\,_1  \varepsilon\,_2  \varepsilon\,_3
 \varepsilon\,_1  \varepsilon\,_1  2\varepsilon\,_2  3\varepsilon\,_3  0
 \varepsilon\,_2  \varepsilon\,_2  3\varepsilon\,_3  0  0
 \varepsilon\,_3  \varepsilon\,_3  0  0  0

さて、3階の二重数の導入が済んだら先ほどと同じように  f(x + \varepsilon\,_1) を展開整理します。

 \begin{align}
f(x + \varepsilon\,_1) &= (x + \varepsilon\,_1)^4 + (x + \varepsilon\,_1)^2 \\\
&= (x^4 + 4x^3\varepsilon\,_1 + 6x^2\varepsilon\,_1 ^2 + 4x\varepsilon\,_1 ^3 + \varepsilon\,_1 ^4) + (x^2 + 2x\varepsilon\,_1 + \varepsilon\,_1 ^2) \\\
&= (x^4 + 4x^3\varepsilon\,_1 + 6x^2 \cdot 2\varepsilon\,_2 4x \cdot 6\varepsilon\,_3) + (x^2 + 2x\varepsilon\,_1 + 2\varepsilon\,_2) \\\
&= (x^4 + x^2)  + (4x^3 + 2x)\varepsilon\,_1 + (12x^2 + 2)\varepsilon\,_2 + 24x\varepsilon\,_3
\end{align}

そして各基底の係数を並べて眺めます。

 \begin{align}
f(x) &= x^4 + x^2 \\\
f'(x) &= 4x^3 + 2x \\\
f''(x) &= 12x^2 + 2 \\\
f'''(x) &= 24x
\end{align}

簡単ですね?

 

n階の二重数

ここまでの話を見ていて「さっさとn階の二重数を導入したほうが早いな」と思った読者も多いでしょう。
実際、4階の二重数, 5階の二重数, ... と拡張していくことは簡単です。積の演算表だけさっと示しましょう。

4階の二重数の積の演算表

 1  \varepsilon\,_1  \varepsilon\,_2  \varepsilon\,_3  \varepsilon\,_4
 1  1  \varepsilon\,_1  \varepsilon\,_2  \varepsilon\,_3  \varepsilon\,_4
 \varepsilon\,_1  \varepsilon\,_1  2\varepsilon\,_2  3\varepsilon\,_3  4\varepsilon\,_4  0
 \varepsilon\,_2  \varepsilon\,_2  3\varepsilon\,_3  6\varepsilon\,_4  0  0
 \varepsilon\,_3  \varepsilon\,_3  4\varepsilon\,_4  0  0  0
 \varepsilon\,_4  \varepsilon\,_4  0  0  0  0

 

5階の二重数の積の演算表

 1  \varepsilon\,_1  \varepsilon\,_2  \varepsilon\,_3  \varepsilon\,_4  \varepsilon\,_5
 1  1  \varepsilon\,_1  \varepsilon\,_2  \varepsilon\,_3  \varepsilon\,_4  \varepsilon\,_5
 \varepsilon\,_1  \varepsilon\,_1  2\varepsilon\,_2  3\varepsilon\,_3  4\varepsilon\,_4  5\varepsilon\,_5  0
 \varepsilon\,_2  \varepsilon\,_2  3\varepsilon\,_3  6\varepsilon\,_4  10\varepsilon\,_5  0  0
 \varepsilon\,_3  \varepsilon\,_3  4\varepsilon\,_4  10\varepsilon\,_5  0  0  0
 \varepsilon\,_4  \varepsilon\,_4  5\varepsilon\,_5  0  0  0  0
 \varepsilon\,_5  \varepsilon\,_5  0  0  0  0  0

 

そして4階の二重数を使えば4階までの微分が求まる、5階の二重数を使えば5階までの微分が求まるというところも予想を裏切りません。
なんだか逆に退屈ですね。というわけで 超二重数 に話を進めましょう。

 

超二重数

超二重数は無限個の基底  1,  \varepsilon\,_1,  \varepsilon\,_2,  \varepsilon\,_3, ... の線形結合よって表現される無限次元線型空間です。

積の演算表を示します。

 1  \varepsilon\,_1  \varepsilon\,_2  \varepsilon\,_3  \varepsilon\,_4  \varepsilon\,_5
 1  1  \varepsilon\,_1  \varepsilon\,_2  \varepsilon\,_3  \varepsilon\,_4  \varepsilon\,_5
 \varepsilon\,_1  \varepsilon\,_1  2\varepsilon\,_2  3\varepsilon\,_3  4\varepsilon\,_4  5\varepsilon\,_5  6\varepsilon\,_6
 \varepsilon\,_2  \varepsilon\,_2  3\varepsilon\,_3  6\varepsilon\,_4  10\varepsilon\,_5  15\varepsilon\,_6  21\varepsilon\,_7
 \varepsilon\,_3  \varepsilon\,_3  4\varepsilon\,_4  10\varepsilon\,_5  20\varepsilon\,_6  35\varepsilon\,_7  56\varepsilon\,_8
 \varepsilon\,_4  \varepsilon\,_4  5\varepsilon\,_5  15\varepsilon\,_6  35\varepsilon\,_7  70\varepsilon\,_8  126\varepsilon\,_9
 \varepsilon\,_5  \varepsilon\,_5  6\varepsilon\,_6  21\varepsilon\,_7  56\varepsilon\,_8  126\varepsilon\,_9  252\varepsilon\,_10

無限個の基底があるので全てを示すことはできませんが、簡単な規則性があります。
二項係数  \binom{n}{k} = {}_n C_{k} = \frac{n!}{(n-k)!k!} を使って  \varepsilon\,_m,  \varepsilon\,_n の積を

 \begin{align}
\varepsilon\,_m \cdot \varepsilon\,_n = \binom{m + n - 1}{m - 1} \varepsilon\,_{m+n}
\end{align}

と表せます。

特に  \varepsilon\,_1 の累乗については

 \begin{align}
\varepsilon\,_1 ^1 &= \varepsilon\,_1 \\\
\varepsilon\,_1 ^2 &= 2\varepsilon\,_2 \\\
\varepsilon\,_1 ^3 &= 6\varepsilon\,_3 \\\
\cdots \\\
\varepsilon\,_1 ^n &= n! \cdot \varepsilon\,_n \\\
\end{align}

という規則があります。

 

そしてこの超二重数を使うと、任意の多項式関数について  f(x + \varepsilon\,_1) を展開整理するだけで任意の階数の微分が求まるというわけですね。簡単便利。

 

この超二重数は "二重数" なのか?

最初に二重数を導入したときのことを思い出しましょう。「2乗すると0になる数  \varepsilon」を認めるところから二重数を考え始めたのでした。

ところで超二重数の積の法則を見てください。

 \begin{align}
\varepsilon\,_m \cdot \varepsilon\,_n = \binom{m + n - 1}{m - 1} \varepsilon\,_{m+n}
\end{align}

ここから

 \begin{align}
\varepsilon\,_n^2 = \binom{2n-1}{n-1} \varepsilon\,_{2n}
\end{align}

となります。

あれ、どの  \varepsilon\,_n も「2乗すると0になる数」ではない...。

いったい2乗すると0になる性質はどこに消えてしまったのでしょうか?不思議ですね。

 

そもそも1階の二重数は2階の二重数のサブセットではない

もう一つサラッと流したけど違和感のある理論展開がありました。
2階の二重数とは基底  \varepsilon\,_1,  \varepsilon\,_2 を用いて  a + b\varepsilon\,_1 + c\varepsilon\,_2 と書ける数と定義しました。このとき1階の二重数は2階の二重数の特別な場合 ( c = 0 の場合) と明言しませんでした。

それもそのはず1階の二重数における  \varepsilon と2階の二重数における  \varepsilon\,_1 は演算規則が異なるからです。 1階の二重数において  \varepsilon ^2 = 0 です。一方で  \varepsilon\,_1 ^2 = 2\varepsilon\,_2 \ne 0 です。

n階の二重数や超二重数は、二重数の自然な拡張なのでしょうか?

 

超二重数にプランク距離を定めるとn階の二重数が (そして実数が) 出る

ここから先の話はポエムでありオカルトです。超二重数からn階の二重数を導出してみます。

そもそも二重数の基底  \varepsilon は実数に比べて非常に小さい数というイメージがあります。例えば実数の  0.1 を2乗すると  0.01 になってより小さくなってしまうように、非常に小さい数を2乗すると 0と区別できないくらい 小さくなってしまうのです。

この点においては2階以上の二重数でも同じイメージで語れます。2階の二重数における  \varepsilon\,_1,  \varepsilon\,_2 はどちらも非常に小さい数で。くわえて  \varepsilon\,_1 に比べて  \varepsilon\,_2 はさらに小さいとイメージできます。 \varepsilon\,_1^2 = 2\varepsilon\,_2 より、仮に  \varepsilon\,_1 = 0.1 くらいとすると  \varepsilon\,_2 = 0.005 くらい?

さて、二重数の基底に小ささのレベルが存在すると思うと。 1階の二重数と2階の二重数を統一的風に解釈できます。
1階の二重数の演算表にも  \varepsilon\,_2 が現れているのですが、小さすぎて  0 と区別できないために  \varepsilon\,_1^2 = 0 と捉えるしかないのです。

(なんかポエムを連ねるのがしんどくなったのでこの記事はここで終わります)

 

まとめ

いかがでしたか?みなさまも実数を適当に拡張して遊んでみてはいかがでしょうか?
実際、n階の二重数は微分計算ために便利なのでそのうち Rust で実装して遊んでみようと思います。

 

 

私からは以上です。

 

おまけ

Rust のデータ型としてn階の二重数を実装している例はすでに在って。たとえばこれ↓↓↓です。

zenn.dev