線形代数でn次元アレルギーを克服する話

　はじめまして、東北大の大学院生の[りょーつ](https://twitter.com/Gomachan_2021)といいます。高専卒業後、東北大学に編入学し、現在に至ります。中学生の頃から大学生までロボコンをやっており、主な担当分野は機構設計でした。高専卒業後は制御工学にも興味が湧き、年1くらいのペースで倒立振子を作っています。

# 目次
[1.はじめに](#1-はじめに)
[2.ベクトルは矢印なのか](#2-ベクトルは矢印なのか)
[3.ベクトルで表現してみる](#3-ベクトルで表現してみる)
[4.ベクトルの写像](#4-ベクトルの写像)
[5.おわりに](#5-おわりに)

# 1. はじめに
　この記事は線形代数を学び始めたばかりの高専4年生や工学系の大学1年生に向けたものです。この記事が線形代数を学ぶわずかなモチベになってくれることを期待しています。
　ところで、皆さんが線形代数を学ぶときに、先生や教科書が
 
 「$n$次元のベクトル$\boldsymbol{p}$$\in$$R^n$を考える」
 
 とか言い出したらどう思いますか？きっとやり場のない怒りで満たされることでしょう。「ベクトルって矢印やんね？4次元以上の矢印なんてどうやって書くねん！」「$n$次元の理論とかそもそも何に使うねん！」「$x$、$y$、$z$で完結させろや！」と、不満は無限に湧いてくると思います。
　いきなり$n$次元の話をされても難しいし、面白くないし、なんせ使い道がよく分からないと思います。そこで本記事では、$n$次元ベクトルと工学の結びつきについて分かりやすい例を交えて紹介し、線形代数の授業に$n$次元の話が出てきたとしても穏やかな気持ちで入れるようにすることを目的とします。厳密性には欠けるかもしれませんが軽い気持ちで読んでみてもらえると嬉しいです(^^)
 
# 2. ベクトルは矢印なのか
　まず「$n$次元空間の$n$次元ベクトル」という文章の理解を妨げているのは「イメージしづらい」ということだと思います。ベクトルは「大きさと向きを持つ矢印」なので、4次元以上のベクトル(矢印)がどんな形をしてて、どこに生えているのか分からんというのは当然です。
　イメージしづらいのは良くないので、いったん「ベクトル＝矢印」という前提をなかったことにしてみましょう。例えば以下のような3次元のベクトル$\boldsymbol{p}$を考えてみましょう。
```math
\boldsymbol{p} = 
\begin{pmatrix}
 2 \\
 3 \\
 5 \\
\end{pmatrix}
\tag{1}
```
このベクトルを矢印として考えるのであれば、原点から$x = 2$、$y = 3$、$z = 5$の点に向かって伸びる矢印が想像できます。ただし、「ベクトル=矢印」という前提が4次元以上の理解を妨げているので、この前提をなくして以下のように考えてみるのはどうでしょうか？

「3次元ベクトルは3つの情報を入れることができるただの箱である」

こう考えると(1)式の3次元ベクトルは「上から順に2、3、5という3つの数字が入った箱」と解釈できます。
　同じノリで4次元を考えてみましょう。
```math
\boldsymbol{q} = 
\begin{pmatrix}
 2 \\
 3 \\
 5 \\
 7 \\
\end{pmatrix}
\tag{2}
```
矢印というイメージを取っ払うだけで格段にわかりやすくなったのではないでしょうか？4次元ベクトル$\boldsymbol{q}$は「上から順に2、3、5、7という4つの数字が入った箱」と考えることができます。矢印の時は4次元の理解にあれだけ苦しんだのに、箱と思ってしまえばただ収納力があがっただけにすぎません。ではこんなベクトルはどうでしょう？
```math
\boldsymbol{r} = 
\begin{pmatrix}
 a \\
 b \\
 c \\
 d \\
\end{pmatrix}
\tag{3}
```
ちょっとややこしいですが、4次元ベクトル$\boldsymbol{r}$は「上から順に$a$、$b$、$c$、$d$という4つの変数が入った箱」と考えることができます。矢印を考えるよりは分かりやすいと思います！

# 3. ベクトルで表現してみる
　高次元ベクトルのイメージが湧いてきたところで、今度はベクトルを実践的に使ってみたいと思います。例えば図1に示す、平行な2つの関節を持つロボットアームを考えてみましょう。各関節の角度をそれぞれ$\theta_1$、$\theta_2$とします。すると、このロボットアームの関節情報は以下のベクトルにまとめることができます！
```math
\boldsymbol{z} = 
\begin{pmatrix}
 \theta_1 \\
 \theta_2 \\
\end{pmatrix}
\tag{4}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031572/0ca367f8-cae3-d2b1-7824-64a0aa5e971b.png)
図1　2関節のロボットアーム

ちなみに文章で書くと、2次元ベクトル$\boldsymbol{z}$は「上から順に、1つ目の関節の角度と2つ目の関節の角度という2つの情報が入った箱」となります。では同じノリで4つの関節を持つロボットアームを考えてみましょう(^^)
```math
\boldsymbol{z} = 
\begin{pmatrix}
 \theta_1 \\
 \theta_2 \\
 \theta_3 \\
 \theta_4 \\
\end{pmatrix}
\tag{5}
```
関節角度を突っ込むだけなので簡単ですね。
　じゃあ$n$個の関節があるロボットアームだとどうなるのでしょう？そうです、$n$次元ベクトルになっちゃうんです。
```math
\boldsymbol{z} = 
\begin{pmatrix}
 \theta_1 \\
 \theta_2 \\
 \vdots \\
 \theta_n \\
\end{pmatrix}
\tag{6}
```
しれっと$n$次元のベクトルを書きましたが、読者の皆様の逆鱗に触れることはなかったのではないでしょうか？それは少しずつ$n$次元耐性が付き始めている証拠だと思います。いきなり$n$次元といわれるとムカつきますが、「ロボットアームの関節を増やしてたら$n$次元になっちゃった」といわれるとなんだか許してあげたくなっちゃいますよね(^^)

# 4. ベクトルの写像
　ただ関節角度の情報を脳死でベクトルに突っ込んだだけでは面白くないので、ベクトルを使って少しロボット工学っぽいことをやってみます。ロボットアームからは(4)~(6)式のような関節角度の情報だけではなく、他にもさまざまな情報を得ることができます。分かりやすい例として、ロボットアームの先端について考えてみましょう。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031572/e330e516-0acf-a39e-4ece-b3084449536c.png)
図2　ロボットアームの先端情報
 
　図2に示すように、ロボットアームの先端の姿勢情報は、位置情報$x$、$y$と、先端の向き情報$\phi$という合計3つの情報で記述できます。3つの情報を持つということは、先端情報は3次元ベクトルを使って書けそうですね！
```math
\boldsymbol{x} = 
\begin{pmatrix}
 x \\
 y \\
 \phi \\
\end{pmatrix}
\tag{7}
```
実際に書くとこんなかんじになると思います。ではここで、ロボットアームの関節角度の情報と先端の姿勢情報の関係性について考えてみます。図3に示す2関節のロボットアームを考えてみましょう。アームの各部の長さを定数$l_1$、$l_2$とします。すると、幾何的に以下の3つの関係が成り立ちますね。
```math
x = l_1 \cos{\theta_1} + l_2 \cos{(\theta_1 + \theta_2)}
\tag{8}
```
```math
y = l_1 \sin{\theta_1} + l_2 \sin{(\theta_1 + \theta_2)}
\tag{9}
```
```math
\phi = \theta_1 + \theta_2
\tag{10}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031572/22142404-05cf-feb5-c22d-ff42c5cc101d.png)
図3　2関節のロボットアームのパラメータ

少し長い式が出てきましたが、落ち着いて考えれば納得できると思います。
　ところでロボット工学では(8)~(10)の3つの式を、まとめて「順運動学」と呼びます。見やすいように(8)~(10)の順運動学を改めてベクトルにまとめてみましょう。
```math
\boldsymbol{x} = 
\begin{pmatrix}
 x \\
 y \\
 \phi \\
\end{pmatrix}
=
\begin{pmatrix}
 l_1 \cos{\theta_1} + l_2 \cos{(\theta_1 + \theta_2)} \\
 l_1 \sin{\theta_1} + l_2 \sin{(\theta_1 + \theta_2)} \\
 \theta_1 + \theta_2 \\
\end{pmatrix}
\tag{11}
```
(11)式は(8)~(10)式をベクトルに突っ込んだだけに見えますが、これには重要な意味があります。文章でかくと「ベクトル$\boldsymbol{x}$は先端の$x$、$y$、$\phi$という3つの姿勢情報が入った箱であり、それらの情報は右辺の計算式を用いて各関節の角度情報$\theta_1$、$\theta_2$を基に計算できる」と解釈できるのです。
　もう少し抽象的に順運動学を解釈してみましょう。この場合、順運動学は「関節情報$\theta1$、$\theta_2$を持った2次元ベクトルを与えると先端情報$x$、$y$、$\phi$が出力される操作」と捉えることができます。図4に分かりやすい図を貼っておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031572/71f21c88-ca5b-ffda-9e2f-2bc311093d0a.png)
図4　順運動学の図的イメージ

　実はこれ、結構面白いことなんです！冷静に考えると「順運動学」というよくわかんない操作に「2次元ベクトル」を食わせると「3次元ベクトル」が吐き出されるって凄くないですか!?
　ここで紹介した「順運動学」のように、「ベクトルを食わせるとなんらかのベクトルが吐き出される操作」は線形代数の授業では写像と呼ばれたりします。今回の例では2次元から3次元への写像ですね。では関節数が$n$個になるとどうなるでしょうか？そうです、順運動学は$n$次元から3次元への写像となるのです(^^)
　写像とかの詳しい話はまた別の機会で記事にできたらいいなと思っています!

# 5. おわりに
　本記事ではベクトルから矢印という固定概念を取っ払うとともに、$n$個の関節を持つロボットアームの例を使って、$n$次元ベクトルについてフワッと考えてみました。工学分野にはロボットアームをはじめ、いろんなところに$n$次元が潜んでいます。慣れない計算や抽象的な定義が多くて苦しいかもしれませんが、線形代数とは仲良くしておくと2年後くらいに幸せになれると思います(^^)