【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

四元数による回転を実行列表現で考える

四元数への作用の左右を区別して実行列で表現すれば、見慣れた回転行列が現れます。

目次

概要

四元数への作用の左右を区別した上で、ベクトルに左から作用する行列として表現します。

この表現によって、四元数の左右から挟む作用を1つの行列にまとめて表現できます。

回転をまとめると見慣れた回転行列が現れます。

行列表現

四元数の積を、作用する側と作用される側に分離して考えます。

作用される側を4次元のベクトルとして表現します。

a+bi+cj+dk\ \mapsto\ \begin{pmatrix}a\\b\\c\\d\end{pmatrix}\quad(a,b,c,d∈\mathbb R)

作用する側は、左からと右からに分けて考えます。

左からの作用

虚数単位ごとに左からの作用を調べます。

\begin{alignedat}{3} i(a+bi+cj+dk)&=ai-b+ck-dj&&=-b+ai-dj+ck \\ j(a+bi+cj+dk)&=aj-bk-c+di&&=-c+di+aj-bk \\ k(a+bi+cj+dk)&=ak+bj-ci-d&&=-d-ci+bj+ak \end{alignedat}

ベクトルへの作用として考えると、次のようになります。

\begin{pmatrix}a\\b\\c\\d\end{pmatrix} \xrightarrow{I_L} \begin{pmatrix}-b\\\;\;\;a\\-d\\\;\;\;c\end{pmatrix}, \begin{pmatrix}a\\b\\c\\d\end{pmatrix} \xrightarrow{J_L} \begin{pmatrix}-c\\\;\;\;d\\\;\;\;a\\-b\end{pmatrix}, \begin{pmatrix}a\\b\\c\\d\end{pmatrix} \xrightarrow{K_L} \begin{pmatrix}-d\\-c\\\;\;\;b\\\;\;\;a\end{pmatrix}

この作用を行列で表現します。

\begin{alignedat}{3} I_L\begin{pmatrix}a\\b\\c\\d\end{pmatrix} &=\begin{pmatrix}0&-1&0&0\\1&0&0&0\\0&0&0&-1\\0&0&1&0\end{pmatrix} \begin{pmatrix}a\\b\\c\\d\end{pmatrix}& &=\begin{pmatrix}-b\\\;\;\;a\\-d\\\;\;\;c\end{pmatrix} \\ J_L\begin{pmatrix}a\\b\\c\\d\end{pmatrix} &=\begin{pmatrix}0&0&-1&0\\0&0&0&1\\1&0&0&0\\0&-1&0&0\end{pmatrix} \begin{pmatrix}a\\b\\c\\d\end{pmatrix}& &=\begin{pmatrix}-c\\\;\;\;d\\\;\;\;a\\-b\end{pmatrix} \\ K_L\begin{pmatrix}a\\b\\c\\d\end{pmatrix} &=\begin{pmatrix}0&0&0&-1\\0&0&-1&0\\0&1&0&0\\1&0&0&0\end{pmatrix} \begin{pmatrix}a\\b\\c\\d\end{pmatrix}& &=\begin{pmatrix}-d\\-c\\\;\;\;b\\\;\;\;a\end{pmatrix} \end{alignedat}

右からの作用

虚数単位ごとに右からの作用を調べます。

\begin{alignedat}{4} &(a+bi+cj+dk)i&&=ai-b-ck+dj&&=-b+ai+dj-ck \\ &(a+bi+cj+dk)j&&=aj+bk-c-di&&=-c-di+aj+bk \\ &(a+bi+cj+dk)k&&=ak-bj+ci-d&&=-d+ci-bj+ak \end{alignedat}

ベクトルへの作用として考えると、次のようになります。

\begin{pmatrix}a\\b\\c\\d\end{pmatrix} \xrightarrow{I_R} \begin{pmatrix}-b\\\;\;\;a\\\;\;\;d\\-c\end{pmatrix}, \begin{pmatrix}a\\b\\c\\d\end{pmatrix} \xrightarrow{J_R} \begin{pmatrix}-c\\-d\\\;\;\;a\\\;\;\;b\end{pmatrix}, \begin{pmatrix}a\\b\\c\\d\end{pmatrix} \xrightarrow{K_R} \begin{pmatrix}-d\\\;\;\;c\\-b\\\;\;\;a\end{pmatrix}

四元数では右から作用しますが、縦ベクトルへの作用となるため行列は左から作用させます。

\begin{alignedat}{3} I_R\begin{pmatrix}a\\b\\c\\d\end{pmatrix} &=\begin{pmatrix}0&-1&0&0\\1&0&0&0\\0&0&0&1\\0&0&-1&0\end{pmatrix} \begin{pmatrix}a\\b\\c\\d\end{pmatrix}& &=\begin{pmatrix}-b\\\;\;\;a\\\;\;\;d\\-c\end{pmatrix} \\ J_R\begin{pmatrix}a\\b\\c\\d\end{pmatrix} &=\begin{pmatrix}0&0&-1&0\\0&0&0&-1\\1&0&0&0\\0&1&0&0\end{pmatrix} \begin{pmatrix}a\\b\\c\\d\end{pmatrix}& &=\begin{pmatrix}-c\\-d\\\;\;\;a\\\;\;\;b\end{pmatrix} \\ K_R\begin{pmatrix}a\\b\\c\\d\end{pmatrix} &=\begin{pmatrix}0&0&0&-1\\0&0&1&0\\0&-1&0&0\\1&0&0&0\end{pmatrix} \begin{pmatrix}a\\b\\c\\d\end{pmatrix}& &=\begin{pmatrix}-d\\\;\;\;c\\-b\\\;\;\;a\end{pmatrix} \end{alignedat}

可換性

同じ方向からの作用は非可換です。

\begin{aligned} I_LJ_L&=-J_LI_L,&J_LK_L&=-K_LJ_L,&K_LI_L&=-I_LK_L \\ I_RJ_R&=-J_RI_R,&J_RK_R&=-K_RJ_R,&K_RI_R&=-I_RK_R \end{aligned}

異なる方向からの作用は可換です。これは結合則に対応します。

\begin{aligned} I_RI_L&=I_LI_R,&J_RI_L&=I_LJ_R,&K_RI_L&=I_LK_R \\ (i⋅)i&=i(⋅i),&(i⋅)j&=i(⋅j),&(i⋅)k&=i(⋅k) \end{aligned}

回転

四元数の虚部で 3 次元のベクトルを表現して、$i$ を回転軸とする $2θ$ 回転は以下のようになります。

\exp(θi)(xi+yj+zk)\exp(-θi)

$\exp(θi)$ の $i$ は四元数ですが、複素数と同様にオイラーの公式が使えます。

\exp(θi)=\cosθ+\sinθi

四元数を計算すると、右から作用する $\sinθi$ を左に寄せる過程で、可換な $i$ と非可換な $j,k$ とで振る舞いを変えます。

\begin{aligned} &\exp(θi)(xi+yj+zk)\exp(-θi) \\ &=(\cosθ+\sinθi)(xi+yj+zk)(\cosθ-\sinθi) \\ &=(\cosθ+\sinθi)\{(\cosθ-\sinθi)xi+(\cosθ+\sinθi)(yj+zk)\} \\ &=(\cos^2θ+\sin^2θ)xi+(\cosθ+\sinθi)^2(yj+zk) \\ &=xi+(\cos2θ+\sin2θi)(yj+zk) \\ &=xi+(y\cos2θ-z\sin2θ)j+(y\sin2θ+z\cos2θ)k \end{aligned}

これを行列で書き直します。指数関数の $i$ は左右を区別して $I _ L,I _ R$ に置き換えます。$I$ は単位行列です。

\begin{aligned} &\exp(θI_L) \exp(-θI_R) \begin{pmatrix}0\\x\\y\\z\end{pmatrix} \\ &=(\cosθI+\sinθI_L) (\cosθI-\sinθI_R) \begin{pmatrix}0\\x\\y\\z\end{pmatrix} \\ &=\begin{pmatrix}\cosθ&-\sinθ&0&0\\\sinθ&\;\;\;\cosθ&0&0\\0&0&\cosθ&-\sinθ\\0&0&\sinθ&\;\;\;\cosθ\end{pmatrix} \begin{pmatrix}\;\;\;\cosθ&\sinθ&0&0\\-\sinθ&\cosθ&0&0\\0&0&\cosθ&-\sinθ\\0&0&\sinθ&\;\;\;\cosθ\end{pmatrix} \begin{pmatrix}0\\x\\y\\z\end{pmatrix} \\ &=\begin{pmatrix}\cos^2θ+\sin^2θ&0&0&0\\0&\cos^2θ+\sin^2θ&0&0\\0&0&\cos^2θ-\sin^2θ&-2\cosθ\sinθ\\0&0&2\cosθ\sinθ&\cos^2θ-\sin^2θ\end{pmatrix} \begin{pmatrix}0\\x\\y\\z\end{pmatrix} \\ &=\begin{pmatrix}1&0&0&0\\0&1&0&0\\0&0&\cos2θ&-\sin2θ\\0&0&\sin2θ&\;\;\;\cos2θ\end{pmatrix} \begin{pmatrix}0\\x\\y\\z\end{pmatrix} \\ \end{aligned}

4 次元の2つの回転行列の積として 3 次元の回転行列が現れました。

ロドリゲスの回転公式

3 次元で回転軸 $n$ 回りの $θ$ 回転を考えます。$n$ は単位純虚四元数とします。

n=n_xi+n_yj+n_zk\quad(n^2=-1,\ n_x^2+n_y^2+n_z^2=1)
\exp\left(\fracθ2n\right)(xi+yj+zk)\exp\left(-\fracθ2n\right)

$n ^ 2 =-1$ より、虚数単位と同一視してオイラーの公式が適用できます。

\begin{aligned} \exp\left(\fracθ2n\right) &=\cos\fracθ2+\sin\fracθ2n \\ &=\cos\fracθ2+\sin\fracθ2(n_xi+n_yj+n_zk) \end{aligned}

行列で表現するには、回転軸の表現の左右を区別します。

\begin{aligned} N_L&=n_xI_L+n_yJ_L+n_zK_L =\begin{pmatrix} 0 & -n_x & -n_y & -n_z \\ n_x & 0 & -n_z & \;\;\;n_y \\ n_y & \;\;\;n_z & 0 & -n_x \\ n_z & -n_y & \;\;\;n_x & 0 \end{pmatrix} \\ N_R&=n_xI_R+n_yJ_R+n_zK_R =\begin{pmatrix} 0 & -n_x & -n_y & -n_z \\ n_x & 0 & \;\;\;n_z & -n_y \\ n_y & -n_z & 0 & \;\;\;n_x \\ n_z & \;\;\;n_y & -n_x & 0 \end{pmatrix} \end{aligned}
\begin{aligned} \exp\left(\fracθ2N_L\right) &=\cos\fracθ2I+\sin\fracθ2N_L \\ &=\begin{pmatrix} \cos\fracθ2 & -n_x \sin\fracθ2 & -n_y \sin\fracθ2 & -n_z \sin\fracθ2 \\ n_x \sin\fracθ2 & \cos\fracθ2 & -n_z \sin\fracθ2 & \;\;\;n_y \sin\fracθ2 \\ n_y \sin\fracθ2 & \;\;\;n_z \sin\fracθ2 & \cos\fracθ2 & -n_x \sin\fracθ2 \\ n_z \sin\fracθ2 & -n_y \sin\fracθ2 & \;\;\;n_x \sin\fracθ2 & \cos\fracθ2 \end{pmatrix} \\ \exp\left(-\fracθ2N_R\right) &=\cos\fracθ2I-\sin\fracθ2N_R \\ &=\begin{pmatrix} \cos\fracθ2 & \;\;\;n_x \sin\fracθ2 & \;\;\;n_y \sin\fracθ2 & \;\;\;n_z \sin\fracθ2 \\ -n_x \sin\fracθ2 & \cos\fracθ2 & -n_z \sin\fracθ2 & \;\;\;n_y \sin\fracθ2 \\ -n_y \sin\fracθ2 & \;\;\;n_z \sin\fracθ2 & \cos\fracθ2 & -n_x \sin\fracθ2 \\ -n_z \sin\fracθ2 & -n_y \sin\fracθ2 & \;\;\;n_x \sin\fracθ2 & \cos\fracθ2 \end{pmatrix} \\ \end{aligned}

$\exp$ の積としてロドリゲスの回転公式が得られます。長くなるため $\mathrm{s}=\sinθ,\mathrm{c}=\cosθ$ と略記します。

\begin{aligned} &\exp\left(\fracθ2N_L\right)\exp\left(-\fracθ2N_R\right) \\ &=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \mathrm{c}+{n_x}^2(1-\mathrm{c}) & -n_z\mathrm{s}+n_xn_y(1-\mathrm{c}) & \;\;\;n_y\mathrm{s}+n_zn_x(1-\mathrm{c}) \\ 0 & \;\;\;n_z\mathrm{s}+n_xn_y(1-\mathrm{c}) & \mathrm{c}+{n_y}^2(1-\mathrm{c}) & -n_x\mathrm{s}+n_yn_z(1-\mathrm{c}) \\ 0 & -n_y\mathrm{s}+n_zn_x(1-\mathrm{c}) & \;\;\;n_x\mathrm{s}+n_yn_z(1-\mathrm{c}) & \mathrm{c}+{n_z}^2(1-\mathrm{c}) \end{pmatrix} \end{aligned}

これは任意の回転軸に対する回転行列です。例えば先ほど例に挙げた $i$ を回転軸とする回転を確認します。

\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & \cosθ & -\sinθ \\ 0 & 0 & \sinθ & \;\;\;\cosθ \end{pmatrix} \quad(n_x = 1,\ n_y = n_z = 0)

成分計算しない方法

成分計算をしないで、すっきりした形にまとめることができます。

$N _ L$ と $N _ R$ は可換なことから、指数法則が使えます。

\exp\left(\fracθ2N_L\right)\exp\left(-\fracθ2N_R\right) =\exp\left(\frac{θ(N_L-N_R)}2\right)

右辺に現れた $(N _ L - N _ R)/2$ を $N$ とおけば、反対称行列となります。

N:=\frac{N_L-N_R}2 =\begin{pmatrix} 0 & 0 & 0 & 0 \\ 0 & 0 & -n_z & \;\;\;n_y \\ 0 & \;\;\;n_z & 0 & -n_x \\ 0 & -n_y & \;\;\;n_x & 0 \end{pmatrix} \\

$N _ L, N _ R$ は回転軸を表す単位ベクトル $n$ の作用を行列化したものですが、$N$ はその作用から外積を抜き出したものです。

\begin{aligned} Nv &=\begin{pmatrix} 0 & 0 & 0 & 0 \\ 0 & 0 & -n_z & \;\;\;n_y \\ 0 & \;\;\;n_z & 0 & -n_x \\ 0 & -n_y & \;\;\;n_x & 0 \end{pmatrix} \begin{pmatrix} 0 \\ v_x \\ v_y \\ v_z \end{pmatrix} \\ &=\begin{pmatrix} 0 \\ n_y v_z - n_z v_y \\ n_z v_x - n_x v_z \\ n_x v_y - n_y v_x \end{pmatrix} \\ &=n \times v \end{aligned}

$N ^ 2$ と $N ^ 3$ を計算します。

\begin{aligned} N^2&=\frac{{N_L}^2-2N_LN_R+{N_R}^2}4=-\frac{I+N_LN_R}2 \\ N^3&=-\frac{N_L-N_R+N_LN_RN_L-N_LN_RN_R}4=-\frac{N_L-N_R}2=-N \end{aligned}

同じ単位ベクトルとの外積を繰り返すと結果は 90 度ずつ回転するため、$N ^ 3 = -N$ は 3 回目の結果が 1 回目の反対向きになることを意味します。

\begin{aligned} N^3v&=-Nv \\ n \times (n \times (n \times v)) &= -n \times v \end{aligned}

$N _ L N _ R$ は $N ^ 2$ によって表せます。

N_LN_R=-(I+2N^2)

以上より、ロドリゲスの回転公式を計算します。成分表示であちこちに現れた $\sinθ$ や $(1-\cosθ)$ が、$N, N ^ 2$ によって整理されます。

\begin{aligned} \exp(θN) &=\exp\left(\fracθ2N_L\right)\exp\left(-\fracθ2N_R\right) \\ &=\left(\cos\fracθ2I+\sin\fracθ2N_L\right)\left(\cos\fracθ2I-\sin\fracθ2N_R\right) \\ &=\cos^2\fracθ2I+\sin\fracθ2\cos\fracθ2(N_L-N_R)-\sin^2\fracθ2N_LN_R \\ &=\cos^2\fracθ2I+\sin\fracθ2\cos\fracθ2(2N)+\sin^2\fracθ2(I+2N^2) \\ &=\left(\cos^2\fracθ2+\sin^2\fracθ2\right)I+\frac12\sinθ(2N)+\frac12(1-\cosθ)(2N^2) \\ &=I+(\sinθ)N+(1-\cosθ)N^2 \end{aligned}

これをベクトル $v$ に作用させます。

\begin{aligned} \exp(θN)v &=v+(\sinθ)Nv+(1-\cosθ)N^2v \\ &=v+(\sinθ)n \times v+(1-\cosθ)n \times (n \times v) \end{aligned}

以下に、この式を幾何学的に解釈した図が載っています。今回の記事での $n,N$ が、以下の記事での $k,K$ に相当します。

行列を使わずに四元数のまま計算する方法については以下の記事を参照してください。

級数展開

先ほどは四元数の振る舞いと比較するため $N _ L, N _ R$ を残して計算しましたが、行列指数関数の冪級数展開によって直接計算できます。

e^{X}=\sum _{{k=0}}^{\infty }{\frac {1}{k!}}X^{k}

$N _ L$ と $N$ の冪を比較します。

\begin{array}{c|ccccccc} &0&1&2&3&4&5&\cdots \\ \hline N_L & I & N_L & -I & -N_L & I & N_L & \cdots \\ N & I & N & N^2 & -N & -N^2 & N & \cdots \end{array}

奇数乗の振る舞いは同じです。2乗以降の偶数乗で、$I$ が $- N ^ 2$ に置き換わります。$N ^ 0$ を調整すればオイラーの公式が適用できます。

\begin{alignedat}{3} &\exp(θN_L)&&=(\cosθ)I&&+(\sinθ)N_L \\ &\exp(θN)-I+(-N^2)&&=(\cosθ)(-N^2)&&+(\sinθ)N \end{alignedat}

整理すればロドリゲスの回転公式が得られます。

\begin{aligned} \exp(θN) &=I+N^2-(\cosθ)N^2+(\sinθ)N \\ &=I+(\sinθ)N+(1-\cosθ)N^2 \end{aligned}

ロドリゲスの回転公式を得ることが目的であれば、この方法が一番簡単です。

関連記事

係数から行列の成分を直接作ります。左からの作用しか考えていません。

極座標の考え方で任意の軸周りの回転行列を生成して、その構造を調べます。

クリフォード代数で回転を扱います。四元数との比較を含みます。

参考

実行列表現を作る手法は次を参照しました。対象は八元数です。

八元数は非結合的なため、左からの作用と右からの作用とで表現行列を分ける手法があります。

  • Yongge Tian, Matrix Representations of Octonions and Their Applications (2000), arXiv:math/0003166v2