外積(クロス積)の定義と応用をわかりやすく解説

外積(クロス積、cross product)は、3次元ベクトルに対して定義される演算で、2つのベクトルに直交する新しいベクトルを生成します。内積がスカラーを返すのに対し、外積はベクトルを返すという大きな違いがあります。

外積は物理学(力のモーメント、ローレンツ力、角運動量)や幾何学(平面の法線ベクトル、面積の計算)で頻繁に使われる重要な概念です。

本記事の内容

  • 外積の定義と計算方法
  • 幾何学的な意味
  • 外積の重要な性質
  • 物理学での応用例
  • Pythonでの計算と可視化

前提知識

この記事を読む前に、以下の概念を理解しておくと理解が深まります。

  • ベクトルの内積
  • 行列式の計算

外積の定義

成分表示による定義

3次元ベクトル $\bm{a} = (a_1, a_2, a_3)$ と $\bm{b} = (b_1, b_2, b_3)$ の外積 $\bm{a} \times \bm{b}$ は次のように定義されます。

$$ \bm{a} \times \bm{b} = \begin{pmatrix} a_2 b_3 – a_3 b_2 \\ a_3 b_1 – a_1 b_3 \\ a_1 b_2 – a_2 b_1 \end{pmatrix} $$

行列式を用いた表現

外積は行列式を使って簡潔に書けます。$\bm{e}_1, \bm{e}_2, \bm{e}_3$ を標準基底ベクトルとすると、

$$ \bm{a} \times \bm{b} = \begin{vmatrix} \bm{e}_1 & \bm{e}_2 & \bm{e}_3 \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \end{vmatrix} $$

第1行に沿って余因子展開すると、

$$ \bm{a} \times \bm{b} = \bm{e}_1(a_2 b_3 – a_3 b_2) – \bm{e}_2(a_1 b_3 – a_3 b_1) + \bm{e}_3(a_1 b_2 – a_2 b_1) $$

これは成分表示の定義と一致します。

幾何学的な意味

方向

$\bm{a} \times \bm{b}$ は $\bm{a}$ と $\bm{b}$ の両方に直交します。方向は右手の法則で決まります。右手で $\bm{a}$ から $\bm{b}$ へ指を曲げたとき、親指が指す方向が $\bm{a} \times \bm{b}$ の方向です。

大きさ

$$ \|\bm{a} \times \bm{b}\| = \|\bm{a}\| \|\bm{b}\| \sin\theta $$

ここで $\theta$ は $\bm{a}$ と $\bm{b}$ のなす角です。

この大きさは、$\bm{a}$ と $\bm{b}$ が作る平行四辺形の面積に等しいです。

三角形の面積

$\bm{a}$ と $\bm{b}$ が作る三角形の面積は、

$$ S = \frac{1}{2}\|\bm{a} \times \bm{b}\| $$

です。

外積の性質

反交換性

$$ \bm{a} \times \bm{b} = -(\bm{b} \times \bm{a}) $$

内積と異なり、外積は交換法則を満たしません。順番を入れ替えると符号が反転します。

分配法則

$$ \bm{a} \times (\bm{b} + \bm{c}) = \bm{a} \times \bm{b} + \bm{a} \times \bm{c} $$

スカラー倍との関係

$$ (k\bm{a}) \times \bm{b} = \bm{a} \times (k\bm{b}) = k(\bm{a} \times \bm{b}) $$

自分自身との外積

$$ \bm{a} \times \bm{a} = \bm{0} $$

これは $\sin 0 = 0$ からも明らかです。

スカラー三重積

$$ \bm{a} \cdot (\bm{b} \times \bm{c}) = \det \begin{pmatrix} a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \\ c_1 & c_2 & c_3 \end{pmatrix} $$

スカラー三重積の絶対値は、3つのベクトルが作る平行六面体の体積に等しいです。

ベクトル三重積

$$ \bm{a} \times (\bm{b} \times \bm{c}) = \bm{b}(\bm{a} \cdot \bm{c}) – \bm{c}(\bm{a} \cdot \bm{b}) $$

この公式はBAC-CAB公式と呼ばれます。

具体例

例1: 基本的な外積の計算

$\bm{a} = (1, 2, 3)$, $\bm{b} = (4, 5, 6)$ のとき、

$$ \bm{a} \times \bm{b} = \begin{pmatrix} 2 \cdot 6 – 3 \cdot 5 \\ 3 \cdot 4 – 1 \cdot 6 \\ 1 \cdot 5 – 2 \cdot 4 \end{pmatrix} = \begin{pmatrix} -3 \\ 6 \\ -3 \end{pmatrix} $$

例2: 平面の法線ベクトル

3点 $P = (1, 0, 0)$, $Q = (0, 1, 0)$, $R = (0, 0, 1)$ を通る平面の法線ベクトルを求めます。

$$ \bm{PQ} = (-1, 1, 0), \quad \bm{PR} = (-1, 0, 1) $$

$$ \bm{PQ} \times \bm{PR} = \begin{pmatrix} 1 \cdot 1 – 0 \cdot 0 \\ 0 \cdot (-1) – (-1) \cdot 1 \\ (-1) \cdot 0 – 1 \cdot (-1) \end{pmatrix} = \begin{pmatrix} 1 \\ 1 \\ 1 \end{pmatrix} $$

法線ベクトルは $(1, 1, 1)$ で、平面の方程式は $x + y + z = 1$ です。

Pythonでの計算と可視化

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 外積の計算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.cross(a, b)

print(f"a = {a}")
print(f"b = {b}")
print(f"a x b = {c}")

# 直交性の確認
print(f"(a x b) . a = {np.dot(c, a)}")  # 0
print(f"(a x b) . b = {np.dot(c, b)}")  # 0

# 平行四辺形の面積
area = np.linalg.norm(c)
print(f"平行四辺形の面積 = {area:.4f}")

# 3次元可視化
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

origin = np.zeros(3)

# ベクトルa, b, a x b を描画
colors = ['red', 'blue', 'green']
labels = ['$\\mathbf{a}$', '$\\mathbf{b}$', '$\\mathbf{a} \\times \\mathbf{b}$']
vectors = [a, b, c]

for v, color, label in zip(vectors, colors, labels):
    ax.quiver(*origin, *v, color=color, arrow_length_ratio=0.08, linewidth=2.5)
    ax.text(*(v * 1.1), label, fontsize=14, color=color)

# 平行四辺形を描画
parallelogram = np.array([origin, a, a + b, b, origin])
ax.plot_trisurf([0, a[0], a[0]+b[0]], [0, a[1], a[1]+b[1]], [0, a[2], a[2]+b[2]],
                alpha=0.2, color='orange')
ax.plot_trisurf([0, b[0], a[0]+b[0]], [0, b[1], a[1]+b[1]], [0, b[2], a[2]+b[2]],
                alpha=0.2, color='orange')

ax.set_xlabel('$x$')
ax.set_ylabel('$y$')
ax.set_zlabel('$z$')
ax.set_title('Cross Product: $\\mathbf{a} \\times \\mathbf{b}$')

# 軸の範囲を調整
max_val = max(np.max(np.abs(v)) for v in vectors) * 1.2
ax.set_xlim([-max_val, max_val])
ax.set_ylim([-max_val, max_val])
ax.set_zlim([-max_val, max_val])

plt.tight_layout()
plt.savefig('cross_product_3d.png', dpi=150, bbox_inches='tight')
plt.show()

外積の大きさとなす角の関係

import numpy as np
import matplotlib.pyplot as plt

theta = np.linspace(0, 2 * np.pi, 300)
sin_theta = np.abs(np.sin(theta))

fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(theta, sin_theta, 'b-', linewidth=2)
ax.set_xlabel(r'$\theta$ (rad)')
ax.set_ylabel(r'$\|\mathbf{a} \times \mathbf{b}\| / (\|\mathbf{a}\| \|\mathbf{b}\|)$')
ax.set_title(r'$\|\mathbf{a} \times \mathbf{b}\| = \|\mathbf{a}\| \|\mathbf{b}\| |\sin\theta|$')
ax.set_xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
ax.set_xticklabels(['0', '$\\pi/2$', '$\\pi$', '$3\\pi/2$', '$2\\pi$'])
ax.grid(True, alpha=0.3)
ax.axhline(y=0, color='k', linewidth=0.5)

plt.tight_layout()
plt.savefig('cross_product_magnitude.png', dpi=150, bbox_inches='tight')
plt.show()

$\theta = \pi/2$(直交)のとき外積の大きさが最大になり、$\theta = 0$ または $\pi$(平行)のとき外積は零ベクトルになることがわかります。

まとめ

本記事では、外積(クロス積)の定義と応用について解説しました。

  • 外積の定義: 行列式で簡潔に表現でき、2つのベクトルに直交するベクトルを生成する
  • 大きさ: $\|\bm{a}\| \|\bm{b}\| \sin\theta$ — 平行四辺形の面積に等しい
  • 方向: 右手の法則に従う
  • 反交換性: $\bm{a} \times \bm{b} = -\bm{b} \times \bm{a}$
  • 応用: 法線ベクトルの計算、面積・体積の計算、力のモーメント

次のステップとして、以下の記事も参考にしてください。