2017年4月27日 | ブログ記事

合同変換及び運動について【新歓ブログリレー2017 24日目】

hatasa-y

こんにちは。理学院数学系2年のhatasa-yです。

traPでは最近までtiteQuestのプログラムを担当させていただいていまして完成となりました。

前回書いた記事は自分では完全にもの足りない結果と感じているので、また同じような内容で書こうと思います。

というわけで線形代数についてなるべく新入生にも分かるように書こうと思います。(ほんまか)

合同変換

合同変換の定義は、空間の点の変換で、二点間の距離を変えないもののことです。(ここでは、空間はユークリッド平面またはユークリッド空間のことを指します)

下の図のようにPQをP’Q’と変換させるのは合同変換となります。

これより先は空間座標について考えますが、まず線形変換の定義について説明します。

線形変換

線形写像

定義

K上の線型空間VからK 上の線型空間V'への写像 TT が次の二条件を満たすとき、 TT をVからV'への線型写像と言う。 T(x+y)=Tx+Ty,T(ax)=aTxT(x+y) = Tx + Ty , \quad T(ax) = aTx

線形変換

定義

VからV自身への線型写像をVの線型変換と言う。

補足

K上の線型空間Vが何のことか分からない場合は線形代数の教科書を見てください。

今回議論しようとしている R2\mathbb{R}^2R3\mathbb{R}^3R\mathbb{R} 上の線型空間です。

写像 T:R3R3T \colon \mathbb{R}^3 \to \mathbb{R}^3 が線形写像であれば、写像 TT は線形変換となります。

空間の合同変換

まず空間について原点OがO自身に移るような合同変換 T0T_0 について考えます。 T0T_0 が線形変換であることを示します。

まず3点O,P,Qが一直線上にあり、2点P,Qを合同変換させて点P',Q'に移ったときについて考えます。

OP=x,OQ=cx\vec{OP}=x, \vec{OQ}=cx とおくと OP=T0x,OQ=T0(cx)\vec{OP'}=T_0x, \vec{OQ'}=T_0(cx) であります。

OQ=OP+PQであり原点OはO自身に移ることでOQ'=OP'+P'Q'が成り立つので、

O,P',Q'が一直線上にあることを示しています。

よって OQ/OP=OQ/OP=c\lvert \vec{OQ'} \rvert / \lvert \vec{OP'} \rvert = \lvert \vec{OQ} \rvert / \lvert \vec{OP} \rvert = c より

OQ=cOP=cTox\vec{OQ'}=c\vec{OP'}=cT_ox であるので T0(cx)=cT0xT_0(cx)=cT_0x が成り立ちます。

次に4点O,P,Q,Rが OR=OP+OQ\vec{OR}=\vec{OP}+\vec{OQ} を満たすものについて考えます。

OP=x,OQ=y\vec{OP}=x, \vec{OQ}=y とおくと OR=x+y,OP=T0x,OQ=T0y,OR=T0(x+y)\vec{OR}=x+y, \vec{OP'}=T_0x, \vec{OQ'}=T_0y, \vec{OR'}=T_0(x+y) 三辺の長さを考えると、三角形は合同な三角形に移るので

OR=OP+OQ=T0x+T0y\vec{OR'}=\vec{OP'}+\vec{OQ'}=T_0x+T_0y よって T0(x+y)=T0x+T0yT_0(x+y)=T_0x+T_0y が成り立ちます。

これより合同変換 T0T_0 は線形変換となります。

また任意のxに対して T0x=x\lVert T_0 x \rVert = \lVert x \rVert が成り立ちます。

線形写像と行列表示

次の命題が成立する。(証明はしない)

命題

写像 f:RnRmf:\mathbb{R}^n \to \mathbb{R}^m に対し、次の同値関係が成立する。 ff が線形写像 1AMmn(R)xRns.t.f(x)=Ax\Leftrightarrow \exists 1 A \in M_{mn} (\mathbb{R}) \forall x \in \mathbb{R}^n s.t. f(x)= Ax

補足

1\exists 1 は存在して唯一という意味で、 MmnM_{mn} はm×n型の行列です。

私が言いたいこと

これより先ほどの T0T_0 は線形変換(写像)であったので3×3型の行列 AA を用いて T0x=AxT_0x=Ax と表すことができる。

また Ax=x\lVert A x \rVert=\lVert x \rVert が成立する。

直交行列

定義

n×n実行列 AA が、 tAA=AtA=E{}^t AA=A{}^tA=E を満たすとき、 AA を直交行列という。

次の命題が成り立つ。(証明はしない)

命題

n×n実行列 AA について次は同値である。

  1. tAA=AtA=E{}^t AA=A{}^tA=E (定義)
  2. tAA=E{}^t AA=E
  3. AtA=EA{}^tA=E
  4. AA の列ベクトル a1,,anRna_1, \cdots , a_n \in \mathbb{R}^nRn\mathbb{R}^n の実標準内積に関して正規直交基底
  5. AA の行ベクトルの転置 b1,,bnRnb_1, \cdots , b_n \in \mathbb{R}^nRn\mathbb{R}^n の実標準内積に関して正規直交基底
  6. 線形写像 ϕ:RnRn;xAx\phi \colon \mathbb{R}^n \to \mathbb{R}^n ; x \mapsto Ax は実標準内積について x,yRn[(ϕ(x),ϕ(y))=(x,y)]\forall x, y \in \mathbb{R}^n [( \phi (x) , \phi(y) )=(x,y)]
  7. 線形写像 ϕ:RnRn;xAx\phi \colon \mathbb{R}^n \to \mathbb{R}^n ; x \mapsto Ax は実標準内積について xRn[ϕ(x)=x]\forall x \in \mathbb{R}^n [\lVert \phi (x) \rVert = \lVert x \rVert]

私が言いたいこと

Ax=x\lVert A x \rVert= \lVert x \rVert が成立するので、上の7番が成立することになる。

これより行列 AA は直交行列となる。

空間の合同変換(続き)

平行移動

さて今までは原点OがO自身に移るような合同変換 T0T_0 について考えてきました。

まず初めに平行移動 T1T_1 を考えてみます。

原点OがO'に移るとして a=OOa=\vec{OO'} とおくと T1x=x+aT_1x = x + a が成り立つ。

一般の合同変換

合同変換 TT について考えます。

原点OがO'に移るとして a=OOa=\vec{OO'} とおく。 T11x=xaT^{-1}_1x=x-a とおくと、これは平行移動 T1T_1 の逆変換となる。 T0=T1TT_0=T^{-1} \circ T とおくと T0T_0 は合同変換であり、原点OをO自身に移すので T0x=AxT_0x = Ax となり Tx=(T1T0)x=T1(Ax)=Ax+aT x = (T_1 \circ T_0 ) x = T_1 (Ax) = Ax+a となります。

非斉次位置ベクトル

ここで次のベクトル x~=(x1)\tilde{x} = \begin{pmatrix} x \\ 1 \end{pmatrix} 及び行列 A~=(Aato1)\tilde{A} = \begin{pmatrix} A & a \\ {}^t o & 1 \end{pmatrix} を考える。( x~\tilde{x} を非斉次ベクトルと言う)

このとき A~x~=(Aato1)(x1)=(Ax+a1)\tilde{A} \tilde{x} = \begin{pmatrix} A & a \\ {}^t o & 1 \end{pmatrix} \begin{pmatrix} x \\ 1 \end{pmatrix}=\begin{pmatrix} Ax+a \\ 1 \end{pmatrix}

定理

以上のことをまとめると次の定理が言える。

空間の合同変換は、点の非斉次位置ベクトル x~\tilde{x} の変換と考えることができ、それは、 x~\tilde{x} に次の行列 A~\tilde{A} を左からかけることによって得られる。 A~=(Aato1)\tilde{A} = \begin{pmatrix} A & a \\ {}^t o & 1 \end{pmatrix} ただし AA は三次(平面の場合:二次)直交行列で aa は原点OがO'へと移る位置ベクトルである。

運動

合同変換 TT が、図形を裏返しにしないとき、 TT を運動という。

次の定理が成り立つ。(証明及び詳しい説明はしないことにする)

定理

合同変換 TT が運動であるのは、 T0T_0 が回転である場合である。 T0T_0 が回転であるためには、行列 AA の行列式が1であることが必要十分条件である。

補足

(a11a12a21a22)\begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix} の行列式は a11a22a12a21a_{11}a_{22} - a_{12}a_{21} (a11a12a13a21a22a23a31a32a33)\begin{pmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{pmatrix} の行列式は a11a22a33+a12a23a31+a13a21a32a13a22a31a12a21a33a11a23a32a_{11}a_{22}a_{33}+a_{12}a_{23}a_{31} + a_{13}a_{21}a_{32} - a_{13}a_{22}a_{31}-a_{12}a_{21}a_{33}-a_{11}a_{23}a_{32}

平面の運動

2×2行列 AA が直交行列でかつ行列式が1となるものは θ\theta を用いて A=(cosθsinθsinθcosθ)A = \begin{pmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{pmatrix} として表すことができるので(証明は練習問題とする) A~=(cosθsinθasinθcosθb001)\tilde{A} = \begin{pmatrix} \cos \theta & - \sin \theta & a \\ \sin \theta & \cos \theta & b \\ 0 & 0 & 1 \end{pmatrix} となる。

幾何学的に関しては高校の数学でやったと思うのでここでは説明は省きます。

空間の運動

オイラー角

3×3行列で AA が直交行列でかつ行列式が1となるものは ψ,θ,ϕ\psi, \theta, \phi を用いて A=(cosθsinϕsinψ+cosϕcosψcosθsinϕcosψcosϕsinψsinθsinϕcosθcosϕsinψ+sinϕcosψcosθcosϕcosψsinϕsinψsinθcosϕsinθsinψsinθcosψcosθ)A= \begin{pmatrix} - \cos \theta \sin \phi \sin \psi + \cos \phi \cos \psi & - \cos \theta \sin \phi \cos \psi - \cos \phi \sin \psi & \sin \theta \sin \phi \\ \cos \theta \cos \phi \sin \psi + \sin \phi \cos \psi & \cos \theta \cos \phi \cos \psi - \sin \phi \sin \psi & -\sin \theta \cos \phi \\ \sin \theta \sin \psi & \sin \theta \cos \psi & \cos \theta \end{pmatrix} となります。

(証明には直交行列の固有値・固有ベクトル及び対角化の知識を持ってることが望ましい)

この ψ,θ,ϕ\psi , \theta , \phi をオイラー角といいます。幾何学的には下の図のようになります。

変換前の座標軸をX,Y,Zとし、変換後の座標軸をX',Y',Z'とすると θ\theta はZ軸とZ'軸とのなす角になり、 ψ\psi はZ軸,Z'軸を含む平面とX軸,Y軸を含む平面との交線ONがX軸とのなす角になります。また ϕ\phi はONがX'とのなす角になります。

ここでx軸のまわりの角 θ\theta の回転を XθX_{\theta} とし、z軸のまわりの角 ϕ,ψ\phi , \psi の回転をそれぞれ Zϕ,ZψZ_{\phi}, Z_{\psi} とすると、 Xθ=(1000cosθsinθ0sinθcosθ),Zϕ=(cosϕsinϕ0sinϕcosϕ0001),Zψ=(cosψsinψ0sinψcosψ0001)X_{\theta} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos \theta & - \sin \theta \\ 0 & \sin \theta & \cos \theta \end{pmatrix}, Z_{\phi} = \begin{pmatrix} \cos \phi & - \sin \phi & 0 \\ \sin \phi & \cos \phi & 0 \\ 0 & 0 & 1 \end{pmatrix}, Z_{\psi} = \begin{pmatrix} \cos \psi & - \sin \psi & 0 \\ \sin \psi & \cos \psi & 0 \\ 0 & 0 & 1 \end{pmatrix} であり(参考:平面の運動) A=ZϕXθZψA = Z_{\phi} X_{\theta} Z_{\psi} となります。(右辺を計算すれば上の式と一致します)

これより A=(ZϕXθZψato1)A'= \begin{pmatrix} Z_{\phi} X_{\theta} Z_{\psi} & a \\ {}^t o & 1 \end{pmatrix} となります。

以上より平面の運動および、空間の運動について行列で表すことが出来ました。パチパチ

しかし

空間の運動の行列表示難しくないですか?

私はこれを理解するのにかなり時間がかかりました。(私が馬鹿なだけですごめんなさい)

オイラー角は歳差運動を扱うには便利なものです。しかしそれ以外の回転だと難しくて(できないわけではない)、実際にプログラムでもめんどくさいです。その理由にはいくつかあって

  1. オイラー角の視覚化が難しい
  2. 思うような回転をするのに計算がいる
  3. 3つ行列の積の計算が大変
  4. Zϕ,Xθ,ZψZ_{\phi}, X_{\theta}, Z_{\psi} の計算が可換ではない

という訳で、プログラムではあんまり使いません。これよりも便利な回転があってプログラムではよくこちらの方を使います。

ロドリゲスの公式

オイラー角では3つの角を使って回転させるのに対して、ロドリゲスの公式は軸と軸のまわりの角度を使って回転をさせます。(ここは前回も書いたので同じような説明となります)

このような図を考えます。

ベクトル r\mathbf{r} を回転軸ベクトル n\mathbf{n} (ただし n=1\lVert \mathbf{n} \rVert = 1 )の回りに角 θ\theta 回転させたベクトルを r\mathbf{r'} とし、 OP=r,OQ=r\vec{OP}=\mathbf{r}, \vec{OQ}=\mathbf{r'} とします。 r=OM+MT+TQ\mathbf{r'}=\vec{OM}+\vec{MT}+\vec{TQ} であるので r=n(n,r)+(rn(n,r))cosθ(r×n)sinθ\mathbf{r'}=\mathbf{n}(\mathbf{n}, \mathbf{r})+(\mathbf{r}-\mathbf{n}(\mathbf{n}, \mathbf{r})) \cos \theta - (\mathbf{r} \times \mathbf{n}) \sin \theta となり r=rcosθ+n(n,r)(1cosθ)(r×n)sinθ\mathbf{r'}=\mathbf{r} \cos \theta +\mathbf{n}(\mathbf{n}, \mathbf{r})(1-\cos \theta) - (\mathbf{r} \times \mathbf{n}) \sin \theta r=(xyz),r=(xyz),n=(n1n2n3)\mathbf{r'}=\begin{pmatrix} x' \\ y'\\ z' \end{pmatrix}, \mathbf{r}=\begin{pmatrix} x \\ y \\ z \end{pmatrix}, \mathbf{n}=\begin{pmatrix} n_1 \\ n_2 \\ n_3 \end{pmatrix} (ただし n12+n22+n32=1n_1^2+n_2^2+n_3^2=1 )としてこれを計算すると、次のようになります。 (xyz)=(cosθ+n12(1cosθ)n1n2(1cosθ)n3sinθn1n3(1cosθ)+n2sinθn2n1(1cosθ)+n3sinθcosθ+n22(1cosθ)n2n3(1cosθ)n1sinθn3n1(1cosθ)n2sinθn3n2(1cosθ)+n1sinθcosθ+n32(1cosθ))(xyz)\begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = \begin{pmatrix} \cos \theta + n_1^2(1- \cos \theta ) & n_1 n_2 (1- \cos \theta ) - n_3 \sin \theta & n_1 n_3 (1- \cos \theta ) + n_2 \sin \theta \\ n_2 n_1 ( 1- \cos \theta) + n_3 \sin \theta & \cos \theta + n_2^2 (1- \cos \theta) & n_2 n_3 (1- \cos \theta ) -n_1 \sin \theta \\ n_3 n_1 (1- \cos \theta ) -n_2 \sin \theta & n_3 n_2 (1- \cos \theta ) + n_1 \sin \theta & \cos \theta + n_3^2 (1- \cos \theta ) \end{pmatrix} \begin{pmatrix} x \\ y \\ z \end{pmatrix} これより行列 (cosθ+n12(1cosθ)n1n2(1cosθ)n3sinθn1n3(1cosθ)+n2sinθn2n1(1cosθ)+n3sinθcosθ+n22(1cosθ)n2n3(1cosθ)n1sinθn3n1(1cosθ)n2sinθn3n2(1cosθ)+n1sinθcosθ+n32(1cosθ))\begin{pmatrix} \cos \theta + n_1^2(1- \cos \theta ) & n_1 n_2 (1- \cos \theta ) - n_3 \sin \theta & n_1 n_3 (1- \cos \theta ) + n_2 \sin \theta \\ n_2 n_1 ( 1- \cos \theta) + n_3 \sin \theta & \cos \theta + n_2^2 (1- \cos \theta) & n_2 n_3 (1- \cos \theta ) -n_1 \sin \theta \\ n_3 n_1 (1- \cos \theta ) -n_2 \sin \theta & n_3 n_2 (1- \cos \theta ) + n_1 \sin \theta & \cos \theta + n_3^2 (1- \cos \theta ) \end{pmatrix} を使えば任意軸回転をすることができます。

これはオイラー角よりも視覚化が回転で行列計算も(簡単ではないけど)難しい訳ではなくなりました。

応用

理論ばかりだとつまらないのでロドリゲスの公式の応用として、@sobaya007のshaderの作品を紹介しようと思います。(画像をクリックしてください)

見れば分かるように「ホモ」が回転しているわけですがプログラムの一部を紹介しようと思います。

vec3 eye = vec3(0, 0, 500.);
vec3 xvec = vec3(1., 0, 0);
vec3 yvec = vec3(0, 1., 0);
vec3 n = normalize(vec3(1., 1., 1.));
float angle = 1. * iGlobalTime;
float c = cos(angle);
float s = sin(angle);
mat4 matrix;
matrix[0][0] = n[0]*n[0]*(1.-c)+c;
matrix[0][1] = n[0]*n[1]*(1.-c)-n[2]*s;
matrix[0][2] = n[2]*n[0]*(1.-c)+n[1]*s;
matrix[1][0] = n[0]*n[1]*(1.-c)+n[2]*s;
matrix[1][1] = n[1]*n[1]*(1.-c)+c;
matrix[1][2] = n[1]*n[2]*(1.-c)-n[0]*s;
matrix[2][0] = n[2]*n[0]*(1.-c)-n[1]*s;
matrix[2][1] = n[1]*n[2]*(1.-c)+n[0]*s;
matrix[2][2] = n[2]*n[2]*(1.-c)+c;
eye = (matrix * vec4(eye, 1.)).xyz;
xvec = (matrix * vec4(xvec, 1.)).xyz;
yvec = (matrix * vec4(yvec, 1.)).xyz;

時間が進むとiGlobalTimeが増えてmatrixの成分が変化することで、3つの軸の向きが変化して回転するようになっています。(今回はShaderの説明ではなくこんなものが作れるよという紹介でした)

おわりに

合同変換から始まって線形写像や直交行列の話もしながら、運動について話を進めてきました。ここまで読んでいただきありがとうございました。

上の話では出てこなかったのですが、オイラー角やロドリゲスの公式以外にもロールピッチョー角による回転行列もあってz軸、y軸、x軸の順に周りに回転させる行列もあります。また行列ではなく四元数を用いて合同変換および運動を表現する方法もあります。(気になる方は調べてください)

明日は最終回で@to-hutohuの「入部おめでとうございます&これからも入部歓迎です」と@Hummingの「誰でもわかる!モンハンにおけるダメージ計算」です。お楽しみに~

参考文献

斎藤正彦.線形代数学入門.東京大学出版会,1966

ランダウ,リフシッツ.力学.東京図書株式会社,1974

この記事を書いた人
hatasa-y

数学をしています。最近はTeXで遊んでいたりしている。

この記事をシェア

このエントリーをはてなブックマークに追加

関連する記事

2017年4月20日
学部1年の数学、特にε-δ論法に殺されないために【新歓ブログリレー2017 17日目】
hihumi
2017年4月9日
Pythonで数学の課題を解こう【新歓ブログリレー2017 6日目】
hukuda222
2017年12月3日
素数判定をしてみよう!!
youjo_tape
2017年11月30日
Negative Thinking
phi16
2017年11月14日
IBIS2017参加報告
Keijan
2017年11月8日
数学と仲良くなりたい人へ
60

活動の紹介

カテゴリ

タグ