ナブラ演算子とgrad, div, rotを理解する

電磁気学や流体力学を学んでいると、$\nabla$(ナブラ)という記号が頻繁に登場します。ナブラ演算子は、勾配(grad)、発散(div)、回転(rot / curl)という3つの微分演算を統一的に表現するための道具です。

本記事では、ナブラ演算子の定義から3つの演算の意味と計算方法、そしてPythonでの可視化まで解説します。

本記事の内容

  • ナブラ演算子の定義
  • 勾配(grad): スカラー場 $\to$ ベクトル場
  • 発散(div): ベクトル場 $\to$ スカラー場
  • 回転(rot / curl): ベクトル場 $\to$ ベクトル場
  • 重要な恒等式
  • Pythonでの可視化

ナブラ演算子の定義

ナブラ演算子 $\nabla$ は、3次元の場合、次のように定義される微分演算子のベクトルです。

$$ \nabla = \begin{pmatrix} \frac{\partial}{\partial x} \\ \frac{\partial}{\partial y} \\ \frac{\partial}{\partial z} \end{pmatrix} $$

ナブラ自体は演算子であり、単独では意味を持ちません。スカラー場やベクトル場に作用させることで、勾配・発散・回転という3つの演算が生まれます。

勾配(gradient)

定義

スカラー場 $\phi(x, y, z)$ の勾配は、ナブラ演算子をスカラー場に作用させた結果です。

$$ \text{grad} \, \phi = \nabla \phi = \begin{pmatrix} \frac{\partial \phi}{\partial x} \\ \frac{\partial \phi}{\partial y} \\ \frac{\partial \phi}{\partial z} \end{pmatrix} $$

勾配はスカラー場からベクトル場への演算です。

物理的意味

$\nabla \phi$ は、スカラー場 $\phi$ が最も急激に増加する方向を向き、その大きさは増加率の最大値を表します。

イメージとしては、地形の高さ $\phi(x, y)$ に対して、$\nabla \phi$ は「最も急な上り坂の方向」を指すベクトルです。

具体例

$\phi(x, y, z) = x^2 + y^2 + z^2$ の勾配は、

$$ \nabla \phi = \begin{pmatrix} 2x \\ 2y \\ 2z \end{pmatrix} = 2\bm{r} $$

原点から外向きに放射状のベクトル場になります。

発散(divergence)

定義

ベクトル場 $\bm{F} = (F_x, F_y, F_z)$ の発散は、ナブラ演算子との内積です。

$$ \text{div} \, \bm{F} = \nabla \cdot \bm{F} = \frac{\partial F_x}{\partial x} + \frac{\partial F_y}{\partial y} + \frac{\partial F_z}{\partial z} $$

発散はベクトル場からスカラー場への演算です。

物理的意味

$\nabla \cdot \bm{F}$ は、ある点における「流れの湧き出し」の強さを表します。

  • $\nabla \cdot \bm{F} > 0$: その点から流れが湧き出している
  • $\nabla \cdot \bm{F} < 0$: その点に流れが吸い込まれている
  • $\nabla \cdot \bm{F} = 0$: 湧き出しも吸い込みもない(ソレノイダル場)

具体例

$\bm{F} = (x, y, z)$ の発散は、

$$ \nabla \cdot \bm{F} = 1 + 1 + 1 = 3 $$

どの点でも一定の湧き出しがあります。

回転(rotation / curl)

定義

ベクトル場 $\bm{F} = (F_x, F_y, F_z)$ の回転は、ナブラ演算子との外積です。

$$ \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} = \begin{pmatrix} \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} \end{pmatrix} $$

回転はベクトル場からベクトル場への演算です。

物理的意味

$\nabla \times \bm{F}$ は、ある点における「渦」の強さと回転軸の方向を表します。

  • $|\nabla \times \bm{F}| > 0$: その点で流れが渦を巻いている
  • $\nabla \times \bm{F} = \bm{0}$: 渦がない(渦なし場、ポテンシャル場)

具体例

$\bm{F} = (-y, x, 0)$ の回転は、

$$ \nabla \times \bm{F} = \begin{pmatrix} 0 – 0 \\ 0 – 0 \\ 1 – (-1) \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \\ 2 \end{pmatrix} $$

$z$ 軸方向に一様な回転(渦)があります。

重要な恒等式

勾配の回転はゼロ

$$ \nabla \times (\nabla \phi) = \bm{0} $$

スカラー場の勾配は必ず渦なし場になります。

回転の発散はゼロ

$$ \nabla \cdot (\nabla \times \bm{F}) = 0 $$

回転で得られるベクトル場は必ずソレノイダル場になります。

ラプラシアン

$$ \nabla^2 \phi = \nabla \cdot (\nabla \phi) = \frac{\partial^2 \phi}{\partial x^2} + \frac{\partial^2 \phi}{\partial y^2} + \frac{\partial^2 \phi}{\partial z^2} $$

ナブラを2回作用させるとラプラシアン(スカラーの2階微分演算子)になります。

Pythonでの可視化

grad, div, rot を2次元で可視化します。

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)

# 細かいグリッド(背景用)
xf = np.linspace(-3, 3, 100)
yf = np.linspace(-3, 3, 100)
Xf, Yf = np.meshgrid(xf, yf)

fig, axes = plt.subplots(1, 3, figsize=(16, 5))

# 左: 勾配(grad)
# スカラー場: phi = x^2 + y^2
phi = Xf**2 + Yf**2
grad_x = 2 * X
grad_y = 2 * Y

axes[0].contourf(Xf, Yf, phi, levels=20, cmap='viridis', alpha=0.7)
axes[0].quiver(X, Y, grad_x, grad_y, color='white', alpha=0.8)
axes[0].set_title('Gradient: $\\nabla(x^2+y^2)$')
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
axes[0].set_aspect('equal')

# 中: 発散(div)
# ベクトル場: F = (x, y)、div F = 2
Fx = X
Fy = Y
div_val = np.full_like(Xf, 2.0)

axes[1].contourf(Xf, Yf, div_val, levels=20, cmap='RdBu_r', alpha=0.7)
axes[1].quiver(X, Y, Fx, Fy, color='black', alpha=0.8)
axes[1].set_title('Divergence: $\\nabla \\cdot (x, y) = 2$')
axes[1].set_xlabel('x')
axes[1].set_ylabel('y')
axes[1].set_aspect('equal')

# 右: 回転(rot)
# ベクトル場: F = (-y, x)、rot F = 2 (z方向)
Fx_rot = -Y
Fy_rot = X
rot_val = np.full_like(Xf, 2.0)

axes[2].contourf(Xf, Yf, rot_val, levels=20, cmap='coolwarm', alpha=0.7)
axes[2].quiver(X, Y, Fx_rot, Fy_rot, color='black', alpha=0.8)
axes[2].set_title('Curl: $\\nabla \\times (-y, x, 0) = (0,0,2)$')
axes[2].set_xlabel('x')
axes[2].set_ylabel('y')
axes[2].set_aspect('equal')

plt.suptitle('Nabla Operator: grad, div, rot', fontsize=14)
plt.tight_layout()
plt.show()

# 恒等式の数値検証: rot(grad(phi)) = 0
dx = 0.01
x_test = np.linspace(-2, 2, 50)
y_test = np.linspace(-2, 2, 50)
Xt, Yt = np.meshgrid(x_test, y_test)

# phi = sin(x) * cos(y)
phi_func = lambda x, y: np.sin(x) * np.cos(y)

# 数値的に勾配を計算
grad_x_num = (phi_func(Xt + dx, Yt) - phi_func(Xt - dx, Yt)) / (2 * dx)
grad_y_num = (phi_func(Xt, Yt + dx) - phi_func(Xt, Yt - dx)) / (2 * dx)

# 数値的に回転のz成分を計算: d(grad_y)/dx - d(grad_x)/dy
rot_z = ((phi_func(Xt + dx, Yt + dx) - phi_func(Xt - dx, Yt + dx) -
          phi_func(Xt + dx, Yt - dx) + phi_func(Xt - dx, Yt - dx)) / (4*dx**2) -
         (phi_func(Xt + dx, Yt + dx) - phi_func(Xt + dx, Yt - dx) -
          phi_func(Xt - dx, Yt + dx) + phi_func(Xt - dx, Yt - dx)) / (4*dx**2))

print(f"rot(grad(phi)) の最大値: {np.max(np.abs(rot_z)):.2e}")
print("-> 数値誤差の範囲でゼロ(恒等式が成立)")

左のグラフでは、スカラー場 $\phi = x^2 + y^2$ の勾配が等高線に垂直で外向きになっています。中央のグラフでは、ベクトル場 $(x, y)$ が放射状に広がり発散が正であることが見えます。右のグラフでは、ベクトル場 $(-y, x)$ が反時計回りの渦を形成し回転が正であることが確認できます。

まとめ

本記事では、ナブラ演算子と grad, div, rot について解説しました。

  • ナブラ演算子 $\nabla$ は微分演算子のベクトルであり、3つの基本演算を統一的に表現する
  • 勾配 $\nabla\phi$ はスカラー場の最急増加方向、発散 $\nabla \cdot \bm{F}$ は湧き出しの強さ、回転 $\nabla \times \bm{F}$ は渦の強さを表す
  • $\nabla \times (\nabla\phi) = \bm{0}$ と $\nabla \cdot (\nabla \times \bm{F}) = 0$ は重要な恒等式である
  • これらの演算は、電磁気学のマクスウェル方程式や流体力学の基礎方程式で不可欠である