ベクトル場に「渦」があるかどうかを判定し、その回転の強さを定量化するのが回転(rotation/curl)です。流体の渦、電磁誘導(変動磁場が電場を生む)、保存力場の判定など、物理学の重要な概念と深く結びついています。
本記事では、回転の定義、物理的意味、そして保存場との関係を解説します。
本記事の内容
- 回転の定義(行列式表現)
- 物理的意味(渦の強さ)
- 保存場の条件(rot F = 0)
- 具体例とPythonでの可視化
前提知識
回転の定義
ベクトル場 $\bm{F} = (F_x, F_y, F_z)$ の回転は次で定義されます。
$$ \boxed{\text{rot} \, \bm{F} = \nabla \times \bm{F} = \begin{vmatrix} \bm{e}_x & \bm{e}_y & \bm{e}_z \\ \frac{\partial}{\partial x} & \frac{\partial}{\partial y} & \frac{\partial}{\partial z} \\ F_x & F_y & F_z \end{vmatrix}} $$
成分で書くと、
$$ \nabla \times \bm{F} = \left(\frac{\partial F_z}{\partial y} – \frac{\partial F_y}{\partial z}, \; \frac{\partial F_x}{\partial z} – \frac{\partial F_z}{\partial x}, \; \frac{\partial F_y}{\partial x} – \frac{\partial F_x}{\partial y}\right) $$
回転はベクトル場からベクトル場を生成する演算です。
物理的意味
$\nabla \times \bm{F}$ は、ベクトル場 $\bm{F}$ の各点における局所的な回転(渦)の強さと向きを表します。
微小な閉曲線に沿った循環(line integral)を面積で割った極限値が、その法線方向の回転成分です。
$$ (\nabla \times \bm{F}) \cdot \hat{\bm{n}} = \lim_{\Delta A \to 0} \frac{1}{\Delta A} \oint_{\partial A} \bm{F} \cdot d\bm{r} $$
2次元の場合
$\bm{F} = (F_x(x,y), F_y(x,y), 0)$ のとき、回転の $z$ 成分のみが非ゼロです。
$$ (\nabla \times \bm{F})_z = \frac{\partial F_y}{\partial x} – \frac{\partial F_x}{\partial y} $$
保存場との関係
定理: $\nabla \times \bm{F} = \bm{0}$ ⇔ $\bm{F}$ は保存場(ポテンシャル $\phi$ が存在して $\bm{F} = \nabla\phi$)
これは「渦なし場は勾配場である」ことを意味します。
ベクトル恒等式: 任意のスカラー場 $\phi$ に対して
$$ \nabla \times (\nabla \phi) = \bm{0} $$
これは「勾配の回転は常にゼロ」という恒等式です。
また、任意のベクトル場 $\bm{F}$ に対して
$$ \nabla \cdot (\nabla \times \bm{F}) = 0 $$
「回転の発散は常にゼロ」です。
具体例
例1: $\bm{F} = (-y, x, 0)$(剛体回転)
$$ \nabla \times \bm{F} = \left(0, 0, \frac{\partial x}{\partial x} – \frac{\partial(-y)}{\partial y}\right) = (0, 0, 2) $$
一様な渦度を持つ回転場です。
例2: $\bm{F} = (yz, xz, xy)$
$$ \nabla \times \bm{F} = (x-x, y-y, z-z) = (0, 0, 0) $$
渦なし → ポテンシャル $\phi = xyz$ が存在し、$\bm{F} = \nabla(xyz)$。
例3: $\bm{F} = (y^2, 2xy+z, y)$
$$ \nabla \times \bm{F} = (1-1, 0-0, 2y-2y) = (0, 0, 0) $$
渦なし。ポテンシャル $\phi = xy^2 + yz$ が存在。
Pythonでの実装
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-3, 3, 20)
y = np.linspace(-3, 3, 20)
X, Y = np.meshgrid(x, y)
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# 例1: F=(-y,x) — rot = 2 (渦あり)
Fx1, Fy1 = -Y, X
curl_z1 = np.full_like(X, 2.0)
im1 = axes[0].pcolormesh(X, Y, curl_z1, cmap='coolwarm', shading='auto', vmin=-3, vmax=3)
axes[0].quiver(X, Y, Fx1, Fy1, alpha=0.6, color='k')
axes[0].set_title('$\\mathbf{F}=(-y,x)$\n$(\\nabla\\times\\mathbf{F})_z = 2$')
axes[0].set_aspect('equal')
plt.colorbar(im1, ax=axes[0], label='curl$_z$')
# 例2: F=(y,-x) — rot = -2 (逆渦)
Fx2, Fy2 = Y, -X
curl_z2 = np.full_like(X, -2.0)
im2 = axes[1].pcolormesh(X, Y, curl_z2, cmap='coolwarm', shading='auto', vmin=-3, vmax=3)
axes[1].quiver(X, Y, Fx2, Fy2, alpha=0.6, color='k')
axes[1].set_title('$\\mathbf{F}=(y,-x)$\n$(\\nabla\\times\\mathbf{F})_z = -2$')
axes[1].set_aspect('equal')
plt.colorbar(im2, ax=axes[1], label='curl$_z$')
# 例3: F=(x,y) — rot = 0 (保存場)
Fx3, Fy3 = X, Y
curl_z3 = np.zeros_like(X)
im3 = axes[2].pcolormesh(X, Y, curl_z3, cmap='coolwarm', shading='auto', vmin=-3, vmax=3)
axes[2].quiver(X, Y, Fx3, Fy3, alpha=0.6, color='k')
axes[2].set_title('$\\mathbf{F}=(x,y)$\n$(\\nabla\\times\\mathbf{F})_z = 0$(保存場)')
axes[2].set_aspect('equal')
plt.colorbar(im3, ax=axes[2], label='curl$_z$')
for ax in axes:
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.tight_layout()
plt.savefig('curl_vector.png', dpi=150, bbox_inches='tight')
plt.show()
まとめ
- 回転 $\nabla \times \bm{F}$ は渦の強さと方向を表すベクトル量
- 行列式表現で体系的に計算できる
- $\nabla \times \bm{F} = \bm{0}$ ⇔ 保存場(ポテンシャル存在)
- $\nabla \times (\nabla\phi) = \bm{0}$、$\nabla \cdot (\nabla \times \bm{F}) = 0$ は重要な恒等式
次のステップとして、以下の記事も参考にしてください。