ベクトル空間(vector space)は線形代数の最も基本的な概念です。高校までは「ベクトル=矢印」というイメージで扱いますが、大学数学ではベクトル空間を公理的に定義します。この抽象化により、矢印に限らず関数や行列なども「ベクトル」として統一的に扱えるようになります。
本記事では、ベクトル空間の定義を8つの公理とともに丁寧に解説し、具体例を通じて理解を深めます。
本記事の内容
- ベクトル空間の8つの公理
- 具体的なベクトル空間の例
- 部分空間の定義と判定
- Pythonでの可視化
前提知識
この記事を読む前に、以下の概念を理解しておくと理解が深まります。
- 集合の基本概念
- 実数の四則演算の性質
ベクトル空間の定義
直感的な理解
ベクトル空間とは、大雑把に言うと「足し算とスカラー倍ができる集合」です。足し算の結果やスカラー倍の結果がまた同じ集合に入る(閉じている)ことが重要です。
公理的な定義
体 $\mathbb{F}$(通常は実数 $\mathbb{R}$ または複素数 $\mathbb{C}$)上のベクトル空間 $V$ とは、集合 $V$ に2つの演算が定義されたものです。
- 加法: $V \times V \to V$, $(\bm{u}, \bm{v}) \mapsto \bm{u} + \bm{v}$
- スカラー倍: $\mathbb{F} \times V \to V$, $(\alpha, \bm{v}) \mapsto \alpha \bm{v}$
これらが以下の8つの公理を満たすとき、$V$ をベクトル空間と呼びます。
加法に関する4つの公理
任意の $\bm{u}, \bm{v}, \bm{w} \in V$ に対して、
(V1) 交換法則:
$$ \bm{u} + \bm{v} = \bm{v} + \bm{u} $$
(V2) 結合法則:
$$ (\bm{u} + \bm{v}) + \bm{w} = \bm{u} + (\bm{v} + \bm{w}) $$
(V3) 零ベクトルの存在: ある $\bm{0} \in V$ が存在して、
$$ \bm{v} + \bm{0} = \bm{v} \quad \forall \bm{v} \in V $$
(V4) 逆元の存在: 任意の $\bm{v} \in V$ に対して $-\bm{v} \in V$ が存在して、
$$ \bm{v} + (-\bm{v}) = \bm{0} $$
スカラー倍に関する4つの公理
任意の $\alpha, \beta \in \mathbb{F}$, $\bm{u}, \bm{v} \in V$ に対して、
(V5) 分配法則1:
$$ \alpha(\bm{u} + \bm{v}) = \alpha\bm{u} + \alpha\bm{v} $$
(V6) 分配法則2:
$$ (\alpha + \beta)\bm{v} = \alpha\bm{v} + \beta\bm{v} $$
(V7) 結合法則:
$$ \alpha(\beta\bm{v}) = (\alpha\beta)\bm{v} $$
(V8) 単位元:
$$ 1 \cdot \bm{v} = \bm{v} $$
具体的なベクトル空間の例
例1: $\mathbb{R}^n$
$n$ 次元実数ベクトル全体の集合 $\mathbb{R}^n$ は最も標準的なベクトル空間です。加法とスカラー倍は成分ごとに行います。
$$ (x_1, \dots, x_n) + (y_1, \dots, y_n) = (x_1 + y_1, \dots, x_n + y_n) $$
$$ \alpha(x_1, \dots, x_n) = (\alpha x_1, \dots, \alpha x_n) $$
例2: 多項式の空間
次数が $n$ 以下の多項式全体の集合 $P_n$ もベクトル空間です。
$$ P_n = \{a_0 + a_1 x + a_2 x^2 + \cdots + a_n x^n \mid a_i \in \mathbb{R}\} $$
零ベクトルは零多項式 $0$、加法は多項式の足し算、スカラー倍は係数の定数倍です。
例3: 行列の空間
$m \times n$ 行列全体の集合 $M_{m \times n}(\mathbb{R})$ もベクトル空間です。
例4: 関数の空間
区間 $[a, b]$ 上の連続関数全体の集合 $C[a, b]$ もベクトル空間です。この場合のベクトルは関数であり、加法は関数の足し算 $(f + g)(x) = f(x) + g(x)$、スカラー倍は $(\alpha f)(x) = \alpha f(x)$ です。
ベクトル空間でない例
$\mathbb{R}^2$ の第1象限 $\{(x, y) \mid x \geq 0, y \geq 0\}$ はベクトル空間ではありません。逆元の公理(V4)を満たさないからです。例えば $(1, 1)$ の逆元 $(-1, -1)$ は第1象限に含まれません。
部分空間
定義
ベクトル空間 $V$ の部分集合 $W \subseteq V$ が部分空間(subspace)であるとは、$W$ 自身が $V$ と同じ演算に関してベクトル空間になることです。
部分空間の判定条件
$W \subseteq V$ が部分空間であるための必要十分条件は次の3つです。
- $\bm{0} \in W$(零ベクトルを含む)
- $\bm{u}, \bm{v} \in W \Rightarrow \bm{u} + \bm{v} \in W$(加法について閉じている)
- $\alpha \in \mathbb{F}, \bm{v} \in W \Rightarrow \alpha\bm{v} \in W$(スカラー倍について閉じている)
条件2と3をまとめて、$\alpha\bm{u} + \beta\bm{v} \in W$(線形結合について閉じている)と1つの条件にすることもできます。
部分空間の例
$\mathbb{R}^3$ の部分空間の例:
- $\{\bm{0}\}$: 零ベクトルだけの集合(自明な部分空間)
- 原点を通る直線: $\{t\bm{v} \mid t \in \mathbb{R}\}$(1次元部分空間)
- 原点を通る平面: $\{s\bm{u} + t\bm{v} \mid s, t \in \mathbb{R}\}$(2次元部分空間)
- $\mathbb{R}^3$ 全体(自明な部分空間)
線形結合と生成系
ベクトル $\bm{v}_1, \dots, \bm{v}_k$ の線形結合は、
$$ \alpha_1 \bm{v}_1 + \alpha_2 \bm{v}_2 + \cdots + \alpha_k \bm{v}_k $$
です。すべての線形結合の集合を生成される部分空間(span)と呼び、
$$ \mathrm{span}\{\bm{v}_1, \dots, \bm{v}_k\} = \left\{\sum_{i=1}^{k} \alpha_i \bm{v}_i \mid \alpha_i \in \mathbb{F}\right\} $$
と表します。
Pythonでの可視化
$\mathbb{R}^3$ の部分空間の可視化
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(15, 5))
# (1) 1次元部分空間(直線)
ax1 = fig.add_subplot(131, projection='3d')
v = np.array([1, 2, 1])
t = np.linspace(-2, 2, 100)
line = np.outer(t, v)
ax1.plot(line[:, 0], line[:, 1], line[:, 2], 'b-', linewidth=2)
ax1.quiver(0, 0, 0, *v, color='r', arrow_length_ratio=0.1, linewidth=2)
ax1.set_title('1D subspace (line)')
ax1.set_xlabel('$x$')
ax1.set_ylabel('$y$')
ax1.set_zlabel('$z$')
# (2) 2次元部分空間(平面)
ax2 = fig.add_subplot(132, projection='3d')
u = np.array([1, 0, 1])
w = np.array([0, 1, 1])
s = np.linspace(-2, 2, 20)
S, T = np.meshgrid(s, s)
X = S * u[0] + T * w[0]
Y = S * u[1] + T * w[1]
Z = S * u[2] + T * w[2]
ax2.plot_surface(X, Y, Z, alpha=0.3, color='cyan')
ax2.quiver(0, 0, 0, *u, color='r', arrow_length_ratio=0.1, linewidth=2)
ax2.quiver(0, 0, 0, *w, color='g', arrow_length_ratio=0.1, linewidth=2)
ax2.set_title('2D subspace (plane)')
ax2.set_xlabel('$x$')
ax2.set_ylabel('$y$')
ax2.set_zlabel('$z$')
# (3) ベクトル空間でない例(半直線)
ax3 = fig.add_subplot(133, projection='3d')
v = np.array([1, 1, 1])
t_pos = np.linspace(0, 2, 50)
t_neg = np.linspace(-2, 0, 50)
line_pos = np.outer(t_pos, v)
line_neg = np.outer(t_neg, v)
ax3.plot(line_pos[:, 0], line_pos[:, 1], line_pos[:, 2], 'b-', linewidth=2, label='included')
ax3.plot(line_neg[:, 0], line_neg[:, 1], line_neg[:, 2], 'r--', linewidth=2, label='not included')
ax3.set_title('NOT a subspace (half-line)')
ax3.set_xlabel('$x$')
ax3.set_ylabel('$y$')
ax3.set_zlabel('$z$')
ax3.legend(fontsize=8)
plt.tight_layout()
plt.savefig('subspaces.png', dpi=150, bbox_inches='tight')
plt.show()
spanの可視化
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 2次元での span
v1 = np.array([1, 2])
v2 = np.array([2, 1])
# span{v1} = 直線
ax = axes[0]
t = np.linspace(-3, 3, 100)
line = np.outer(t, v1)
ax.plot(line[:, 0], line[:, 1], 'b-', linewidth=2, label='span$\\{\\mathbf{v}_1\\}$')
ax.quiver(0, 0, *v1, angles='xy', scale_units='xy', scale=1, color='r', width=0.015)
ax.text(v1[0] + 0.1, v1[1] + 0.1, '$\\mathbf{v}_1$', fontsize=14, color='r')
ax.set_xlim(-4, 4)
ax.set_ylim(-4, 4)
ax.set_aspect('equal')
ax.set_title('span$\\{\\mathbf{v}_1\\}$: 1D subspace')
ax.grid(True, alpha=0.3)
ax.legend()
ax.axhline(y=0, color='k', linewidth=0.5)
ax.axvline(x=0, color='k', linewidth=0.5)
# span{v1, v2} = R^2 全体(一次独立な場合)
ax = axes[1]
# ランダムな線形結合をプロット
np.random.seed(42)
coeffs = np.random.uniform(-2, 2, (500, 2))
points = coeffs @ np.array([v1, v2])
ax.scatter(points[:, 0], points[:, 1], alpha=0.3, s=10, c='blue')
ax.quiver(0, 0, *v1, angles='xy', scale_units='xy', scale=1, color='r', width=0.015, zorder=5)
ax.quiver(0, 0, *v2, angles='xy', scale_units='xy', scale=1, color='g', width=0.015, zorder=5)
ax.text(v1[0] + 0.1, v1[1] + 0.1, '$\\mathbf{v}_1$', fontsize=14, color='r')
ax.text(v2[0] + 0.1, v2[1] + 0.1, '$\\mathbf{v}_2$', fontsize=14, color='g')
ax.set_xlim(-4, 4)
ax.set_ylim(-4, 4)
ax.set_aspect('equal')
ax.set_title('span$\\{\\mathbf{v}_1, \\mathbf{v}_2\\} = \\mathbb{R}^2$')
ax.grid(True, alpha=0.3)
ax.axhline(y=0, color='k', linewidth=0.5)
ax.axvline(x=0, color='k', linewidth=0.5)
plt.tight_layout()
plt.savefig('span_visualization.png', dpi=150, bbox_inches='tight')
plt.show()
まとめ
本記事では、ベクトル空間の定義と公理について解説しました。
- ベクトル空間: 加法とスカラー倍が定義された集合で、8つの公理を満たすもの
- 具体例: $\mathbb{R}^n$、多項式の空間、行列の空間、関数の空間
- 部分空間: 零ベクトルを含み、加法とスカラー倍について閉じた部分集合
- span: ベクトルの線形結合全体で生成される部分空間
ベクトル空間の概念を理解したら、次は基底と次元の概念に進みましょう。