回転行列
回転行列の定義
ベクトルを $x$ 軸から反時計周りに角度 $\theta$ だけ 回転 (rotation) する表現行列は
\[R=\begin{bmatrix}\cos\theta&-\sin\theta\\
\sin\theta&\cos\theta\end{bmatrix}\tag{1}\]
で与えられます。行列 $R$ を単位ベクトル $\begin{bmatrix}1\\0\end{bmatrix}$ に乗じると、
\[\begin{bmatrix}\cos\theta&-\sin\theta\\
\sin\theta&\cos\theta\end{bmatrix}
\begin{bmatrix}1\\0\end{bmatrix}
=\begin{bmatrix}\cos\theta\\\sin\theta\end{bmatrix}\tag{2}\]
となりますが、この式は半径 $1$ の円周上の点を表しています。
Python で回転行列を定義して、単位ベクトル $\begin{bmatrix}1\\0\end{bmatrix}$ を反時計周りに $60^\circ$ 回転させてみます。予め 関数ライブラリ にある coordinate() と visual_vector() を実装しておいてください。
# SLA_023-1
import numpy as np
import matplotlib.pyplot as plt
def rotation(x, t, deg = False):
if deg == True:
t = np.deg2rad(t)
a = np.array([[np.cos(t), -np.sin(t)],
[np.sin(t), np.cos(t)]])
ax = np.dot(a, x)
return ax
# FigureとAxesを作成
fig, ax = plt.subplots(1, 1, figsize=(5, 5))
# 座標を設定
coordinate(ax, [-2, 2], [-2, 2])
# ベクトルの始点
loc = np.array([0, 0])
# ベクトルv0
v0 = np.array([1, 0])
# ベクトルv0を回転行列aで変換
v1 = rotation(v0, 60, deg = True)
# ベクトルv0,v1を表示
visual_vector(ax, loc, v0, color = "red")
visual_vector(ax, loc, v1, color = "blue")
plt.show()
新品価格 | ![]() |

回転行列による円のプロット
初期座標 $(1,0)$ に回転行列 $R$ を連続作用させて円を描いてみます。
# SLA_023-2
# FigureとAxesを作成
fig, ax = plt.subplots(1, 1, figsize=(5, 5))
# 座標を設定
coordinate(ax, [-2, 2], [-2, 2])
# ベクトルvの初期値
v = np.array([1, 0])
# ベクトルvを角度pi/12ずつ回転して一周させる
for i in range(24):
v = rotation(v, np.pi/12)
ax.scatter(v[0], v[1], color = "red")
plt.show()
放物線の回転
方程式で表された曲線も回転行列で任意の角度に回転させることができます。以下のコードは放物線 $P_0(x)=x^2$ を反時計回りに $90^\circ$ 回転させます。
# SLA_023-3
# FigureとAxesを作成
fig, ax = plt.subplots(1, 1, figsize=(5, 5))
# 座標を設定
coordinate(ax, [-2, 2], [-2, 2])
# 放物線のデータを作成
x = np.linspace(-2, 2, 33)
y = x ** 2
# xとyを縦軸方向に連結して行列を作成
p0 = np.vstack((x, y))
# 放物線p0を左に90°回転
p1 = rotation(p0, np.pi/2)
# p0とp1をAxesにプロット
ax.plot(p0[0], p0[1], label = "P0", color = "blue")
ax.plot(p1[0], p1[1], label = "P1", color = "darkorange")
# 凡例を表示
ax.legend(loc = "lower right")
plt.show()
コメントを書く