ベクトル積(外積)

ベクトル積(外積)

 

ベクトル積(外積)

ベクトル積の定義

 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 本のベクトルから新しいベクトルを生成する演算です。上の定義式では覚えにくいですが、次のように各成分を交差させると、簡単にベクトル積をつくることができます。

 ベクトル積 (vector product) の作り方

 ベクトル積は行列式の形で
 
\[\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}\]
で与えられます。

 [Python] ベクトル積 (cross product) の長さ

 $\sin\theta$ の符号を考慮すると、$\boldsymbol{u}\times\boldsymbol{v}$ の方向は、$\boldsymbol{u}$ を(少ないほうの角度で)回転させて $\boldsymbol{v}$ に重ねるときに右ネジの進む方向に一致します。
 

numpy.cross()

 ベクトル積(外積)は numpy.cross() を使って求めることができます。以前の記事 で作成したリストSLA009-2 と リストSLA010-2 の coordinate_3d() と visual_vector_3d() を使って、3 次元座標にベクトル積を表示してみます。

# リストSLA015

from scipy.linalg import norm

# 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

 [matplotlib] numpy.cross() でベクトルの外積を描画