今回の講座では外積(ベクトル積)について学びます。内積 は計算結果がスカラー(実数)でしたが、外積は計算結果がベクトルとなる演算として定義されます。
ベクトル積(外積)
3 次元空間のベクトル
\[\boldsymbol{u}=\begin{bmatrix}u_1 \\ u_2 \\ u_3\end{bmatrix},\quad
\boldsymbol{v}=\begin{bmatrix}v_1 \\ v_2 \\ v_3\end{bmatrix}\]
に対して ベクトル積(外積)を
\[\boldsymbol{u}\times\boldsymbol{v}
=\begin{bmatrix}u_2v_3-u_3v_2 \\ u_3v_1-u_1v_3 \\ u_1v_2-u_2v_1\end{bmatrix}\tag{1}\]
のように定義します。英語では vector product または cross product とよばれます。後述するように、NumPy には numpy.cross() という名称でベクトル積関数が実装されています。簡単な形で $n$ 次元に一般化できない(その次元で乗法が定義できるかなど難しい条件が付く)ので、線型代数の理論構築にベクトル積が登場する機会は少ないですが、モーメントや磁場の中における荷電粒子の運動の記述に用いるなど、物理学や工学の分野ではベクトル積が頻繁に登場します。
ベクトル積の計算法
内積 $\boldsymbol{u}\cdot\boldsymbol{v}$ が 2 本のベクトルからスカラーを生成する演算であったのに対して、ベクトル積 $\boldsymbol{u}\times\boldsymbol{v}$ は 2 本のベクトルから新しいベクトルを生成する演算です。上の定義式では覚えにくいですが、次のように各成分を交差させると、簡単にベクトル積をつくることができます。
ベクトル積は行列式の形で
\[\boldsymbol{u}\times\boldsymbol{v}=\begin{vmatrix}\boldsymbol{i} & \boldsymbol{j} & \boldsymbol{k}\\
u_1 & u_2 & u_3\\v_1 & v_2 & v_3\end{vmatrix}\tag{2}\]
と表すこともできます。ここで $\boldsymbol{i},\ \boldsymbol{j},\ \boldsymbol{k}$ は、それぞれ
\[\boldsymbol{i}=\begin{bmatrix}1\\0\\0\end{bmatrix},\ \quad
\boldsymbol{j}=\begin{bmatrix}0\\1\\0\end{bmatrix},\ \quad\boldsymbol{k}=\begin{bmatrix}0\\0\\1\end{bmatrix}\]
によって定義される単位ベクトルです。(2) を展開して
\[\boldsymbol{u}\times\boldsymbol{v}=\boldsymbol{i}\begin{vmatrix}
u_2 & u_3 \\ v_2 & v_3\end{vmatrix}+\boldsymbol{j}\begin{vmatrix}
u_1 & u_3 \\ v_1 & v_3\end{vmatrix}+\boldsymbol{k}\begin{vmatrix}
u_1 & u_2 \\ v_1 & v_2\end{vmatrix}\]
のようにしてベクトル積を求めることができます。
$\boldsymbol{u}\times\boldsymbol{v}$ は $\boldsymbol{u}$ と $\boldsymbol{v}$ の両方に対して垂直です。すなわち、 $\boldsymbol{u}$ と $\boldsymbol{v}$ が張る平面に対して垂直です。これは $\boldsymbol{u}$ もしくは $\boldsymbol{v}$ と $\boldsymbol{u}\times\boldsymbol{v}$ の内積をとって確認できます。
\[\boldsymbol{u}\cdot(\boldsymbol{u}\times\boldsymbol{v})
=u_1(u_2v_3-u_3v_2)+u_2(u_3v_1-u_1v_3)+u_3(u_1v_2-u_2v_1)=0\]
同様の計算で $\boldsymbol{v}\cdot(\boldsymbol{u}\times\boldsymbol{v})=0$ となります。2 本のベクトルが張る平面に垂直な方向は 2 通りありますが、以下に示すようにベクトルの大きさを調べることによって確定できます。
証明は省略しますが、ベクトル積 $\boldsymbol{u}\times\boldsymbol{v}$ の大きさ(ノルム)は、$\boldsymbol{u}$ と $\boldsymbol{v}$ がつくる平行四辺形の面積に等しいことが知られています。すなわち、2 本のベクトルのなす角度を $\theta$ とすると、ベクトル積の大きさは
\[\parallel \boldsymbol{u} \times \boldsymbol{v} \parallel
=\parallel \boldsymbol{u} \parallel \parallel \boldsymbol{v} \parallel \sin \theta \tag{3}\]
で与えられます。
$\sin\theta$ の符号を考慮すると、$\boldsymbol{u}\times\boldsymbol{v}$ の方向は、$\boldsymbol{u}$ を(少ないほうの角度で)回転させて $\boldsymbol{v}$ に重ねるときに右ネジの進む方向に一致します。
numpy.cross()
ベクトル積(外積)は numpy.cross() を使って求めることができます。コードライブラリ にある coordinate_3d() と visual_vector_3d() を使って、3 次元座標にベクトル積を表示してみます。
# python_vector_cross
# In[1]
import numpy as np
from scipy.linalg import norm
import matplotlib.pyplot as plt
# ここにcoordinate_3d()を実装
# ここにvisual_vector_3d()を実装
# FigureとAxes
fig = plt.figure(figsize = (6, 6))
ax = fig.add_subplot(111, projection='3d')
# 3D座標を設定
coordinate_3d(ax, [-5, 5], [-5, 5], [-5, 10], grid = True)
# 始点を設定
loc = [0, 0, 0]
# ベクトルu,vを定義
u = [3, 1, 0]
v = [2, 5, 1]
# uとvのベクトル積w
w = np.cross(u, v)
# wの大きさ(ノルム)を計算
w_norm = norm(w)
# ベクトルu,v,wを配置
visual_vector_3d(ax, loc, u, "red")
visual_vector_3d(ax, loc, v, "blue")
visual_vector_3d(ax, loc, w, "green")
print("w : {}".format(w))
print("|w| : {:.3f}".format(w_norm))
w : [ 1 -3 13] |w| : 13.379
コメントを書く