機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

「任意軸回りの回転が回転行列である」ことと「回転行列の積は回転行列である」ことの確認

はじめに

「任意軸回りの回転が回転行列である」ことと「回転行列の積は回転行列である」こと、この2つのことを当たり前のように使っていたけど、
確認してなかったなとおもったので計算することで確認しました。

回転行列の必要十分条件

参考文献によると、回転行列の必要十分条件は、以下のようです。

回転行列であるための必要十分条件

行列 {\bf R}\in{\mathbb R}^{3\times 3} が回転行列であるための必要準条件は、以下のようになる。

\begin{eqnarray}
{\bf R}^\top{\bf R}={\bf I},\ \ \ |{\bf R}|=1\tag{1}
\end{eqnarray}

任意軸回りの回転が回転行列であるかの確認

先に、任意軸回りの回転が回転行列であるかの確認をします。
回転軸を表す単位ベクトルを {\bf a}\in{\mathbb R}^{3\times 3} とし、回転角を \theta\in{\mathbb R} とすると、回転行列 {\bf M}_{\bf a}(\theta) は以下のようになります。

\begin{eqnarray}
{\bf M}_{\bf a}(\theta)=
\begin{pmatrix}
\cos\theta+a_x^2(1-\cos\theta) & a_xa_y(1-\cos\theta)-a_z\sin\theta & a_xa_z(1-\cos\theta)+a_y\sin\theta\\
a_xa_y(1-\cos\theta)+a_z\sin\theta & \cos\theta+a_y^2(1-\cos\theta) & a_ya_z(1-\cos\theta)-a_x\sin\theta\\
a_xa_z(1-\cos\theta)-a_y\sin\theta & a_ya_z(1-\cos\theta)+a_x\sin\theta & \cos\theta+a_z^2(1-\cos\theta)
\end{pmatrix}\tag{2}
\end{eqnarray}

{\bf M}_{\bf a}(\theta) が式 (1) を満たすことを確認すればよいことになります。

手計算ではなくSymPyを使って計算しました。

from sympy import *
init_printing()
var('theta,a_x,a_y,a_z')
c = cos(theta)
s = sin(theta)
M = Matrix([
    [c + a_x ** 2 * (1 - c), a_x * a_y *(1 - c) - a_z * s, a_x * a_z * (1 - c) + a_y * s ],
    [a_x * a_y *(1 - c) + a_z * s, c + a_y ** 2 * (1 - c), a_y * a_z * (1 - c) - a_x * s ],
    [a_x * a_z * (1 - c) - a_y * s, a_y * a_z * (1 - c) + a_x * s, c + a_z ** 2 * (1 - c) ],
])
display(M)
Mdet = my_simplify(M.det())
display(Mdet)
MMT = my_simplify(M.transpose() * M)
display(MMT)

def my_simplify(m):
    subs = [
        (a_x ** 2 + a_y ** 2 + a_z ** 2, 1),
        (a_x ** 2, 1 - (a_y ** 2 + a_z ** 2)),
        (a_y ** 2, 1 - (a_z ** 2 + a_x ** 2)),
        (a_z ** 2, 1 - (a_x ** 2 + a_y ** 2)),
        (cos(theta) ** 2 + sin(theta) ** 2, 1),
    ]
    m = expand(m)
    m = m.subs(subs)
    m = simplify(m)
    m = m.subs(subs)
    m = expand(m)
    return m

プログラムの実行結果

以上より、{\bf M}_{\bf a}(\theta) が式 (1) を満たすので、任意軸回りの回転が回転行列であることがわかりました。

回転行列の積は回転行列なのか確認

さて、本丸の回転行列同士の積が回転かどうかの確認です。
もう1つ回転行列を用意します。
回転軸を表す単位ベクトルを {\bf b}\in{\mathbb R}^{3\times 3} とし、回転角を \phi\in{\mathbb R} とすると、回転行列 {\bf N}_{\bf b}(\phi) とします。
このとき、上記の議論より、{\bf N}_{\bf b}(\phi) も式 (1) を満たします。
見やすくするため、{\bf M}={\bf M}_{\bf a}(\theta),{\bf N}={\bf N}_{\bf b}(\phi) とおきます。

|{\bf MN}| を計算します。

\begin{eqnarray}
 |{\bf MN}|=|{\bf M}|\cdot|{\bf N}|=1\cdot 1 = 1\tag{3}
\end{eqnarray}

({\bf MN})^\top{\bf MN} を計算します。

\begin{eqnarray}
({\bf MN})^\top{\bf MN}={\bf N}^\top{\bf M}^\top{\bf MN}={\bf N}^\top{\bf N}={\bf I}\tag{4}
\end{eqnarray}

(3),(4) より、回転行列の積 {\bf M}{\bf N} が式 (1) を満たすので、回転行列の積は回転行列であることが示せました。

参考文献

3次元回転 パラメータ計算とリー代数による最適化 p9

目次へ戻る