発散(divergence, div)は、ベクトル場に対して定義されるベクトル解析の基本的な演算子です。ベクトル場の発散をとると、スカラー場が得られます。
発散は「ベクトル場のある点から、どれだけの量が湧き出しているか」を表す量であり、流体力学や電磁気学をはじめとする物理学の根幹に位置する概念です。例えば、流体の速度場の発散は流体の湧き出しや吸い込みを表し、電場の発散は電荷の分布と結びつきます。前回の記事で学んだ勾配(grad)がスカラー場からベクトル場を生み出す演算子であったのに対し、発散はベクトル場からスカラー場を生み出す演算子です。
本記事の内容
- 発散の直感的な理解(湧き出しと吸い込み)
- 発散の数学的な定義(偏微分表示とナブラ演算子)
- 体積積分による定義とガウスの発散定理
- 具体的な計算例
- 物理的な応用例(連続の方程式、ガウスの法則)
- Pythonでの可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
また、偏微分の基本的な計算と、ベクトルの内積の概念を前提とします。
発散の直感的な理解
湧き出しと吸い込み
発散の数式的な定義に入る前に、直感的なイメージをつかんでおきましょう。
ある空間内に流体が流れている場面を想像してください。空間の各点に速度ベクトルが割り当てられた速度場 $\bm{v}(x, y, z)$ が存在するとします。
ここで、ある点のまわりに微小な箱(閉領域)を考えます。この箱から流出する流体の量が流入する量を上回る場合、その点では流体が「湧き出している」と言います。逆に、流入が流出を上回る場合は「吸い込まれている」と言います。
- 発散が正($\operatorname{div} \bm{v} > 0$): その点で流体が湧き出している。矢印が外向きに広がるイメージです。
- 発散が負($\operatorname{div} \bm{v} < 0$): その点で流体が吸い込まれている。矢印が内向きに集まるイメージです。
- 発散がゼロ($\operatorname{div} \bm{v} = 0$): 流入と流出がちょうど釣り合っている。湧き出しも吸い込みもない状態です。
大雑把に言うと、発散とは「ベクトル場の各点が、周囲に対してどれだけ量を放出(または吸収)しているかの度合い」を定量化したものです。
2次元のイメージ
2次元で考えるとさらに分かりやすくなります。ある点のまわりに小さな円を描き、その円を通って出ていく矢印の「正味の流出量」が発散です。
例えば、原点から放射状に広がるベクトル場 $\bm{F}(x, y) = (x, y)^{\top}$ を考えると、原点付近のどの方向にも矢印が外向きに広がっているため、発散は正になります。一方、回転するベクトル場 $\bm{F}(x, y) = (-y, x)^{\top}$ は、矢印がぐるぐる回っているだけで外向きの広がりも内向きの収縮もないため、発散はゼロになります。
発散の数学的定義
直交座標系での定義
3次元空間のベクトル場 $\bm{F}(x, y, z)$ が次のように成分表示されているとします。
$$ \bm{F}(x, y, z) = \begin{pmatrix} F_x(x, y, z) \\ F_y(x, y, z) \\ F_z(x, y, z) \end{pmatrix} $$
このとき、$\bm{F}$ の発散(divergence)は次のように定義されます。
$$ \operatorname{div} \bm{F} = \frac{\partial F_x}{\partial x} + \frac{\partial F_y}{\partial y} + \frac{\partial F_z}{\partial z} $$
つまり、ベクトル場の各成分をそれに対応する変数で偏微分し、それらを足し合わせたものが発散です。
2次元の場合は次のようになります。
$$ \operatorname{div} \bm{F} = \frac{\partial F_x}{\partial x} + \frac{\partial F_y}{\partial y} $$
発散の重要な性質として、ベクトル場を入力として受け取り、スカラー場を出力するという点があります。
$$ \operatorname{div} : \bm{F}(\bm{r}) \in \mathbb{R}^3 \;\longrightarrow\; \operatorname{div} \bm{F}(\bm{r}) \in \mathbb{R} $$
これは勾配(grad)がスカラー場からベクトル場を生成する演算子であったのとちょうど逆の方向です。
ナブラ演算子を用いた表記($\nabla \cdot \bm{F}$)
勾配(grad)の記事で導入したナブラ演算子 $\nabla$ を思い出しましょう。
$$ \nabla = \begin{pmatrix} \dfrac{\partial}{\partial x} \\[8pt] \dfrac{\partial}{\partial y} \\[8pt] \dfrac{\partial}{\partial z} \end{pmatrix} $$
勾配はナブラ演算子をスカラー場に「掛ける」操作($\nabla f$)でしたが、発散はナブラ演算子とベクトル場の内積をとる操作に対応します。
$$ \nabla \cdot \bm{F} = \begin{pmatrix} \dfrac{\partial}{\partial x} \\[8pt] \dfrac{\partial}{\partial y} \\[8pt] \dfrac{\partial}{\partial z} \end{pmatrix} \cdot \begin{pmatrix} F_x \\ F_y \\ F_z \end{pmatrix} = \frac{\partial F_x}{\partial x} + \frac{\partial F_y}{\partial y} + \frac{\partial F_z}{\partial z} $$
したがって、
$$ \boxed{\operatorname{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}} $$
$\operatorname{div} \bm{F}$ と $\nabla \cdot \bm{F}$ は全く同じものを表す異なる記法です。物理学や工学の文献では $\nabla \cdot \bm{F}$ の表記が広く使われ、$\operatorname{div} \bm{F}$ はより古典的な記法です。
ナブラ演算子を使うと、ベクトル解析の3大演算子を統一的に記述できます。
| 演算子 | 記法 | 入力 | 出力 |
|---|---|---|---|
| 勾配 | $\nabla f$ | スカラー場 | ベクトル場 |
| 発散 | $\nabla \cdot \bm{F}$ | ベクトル場 | スカラー場 |
| 回転 | $\nabla \times \bm{F}$ | ベクトル場 | ベクトル場 |
体積積分による定義とガウスの発散定理
体積積分による発散の定義
発散にはもう1つの同値な定義があります。こちらはより物理的な「湧き出し」のイメージに直結した定義です。
ベクトル場 $\bm{F}$ の点 $\bm{r}_0$ における発散は、$\bm{r}_0$ を含む微小体積 $\Delta V$ とその閉曲面 $\Delta S$ を用いて、次のように定義されます。
$$ \operatorname{div} \bm{F}(\bm{r}_0) = \lim_{\Delta V \to 0} \frac{1}{\Delta V} \oint_{\Delta S} \bm{F} \cdot \bm{n} \, dS $$
ここで、$\bm{n}$ は閉曲面 $\Delta S$ の外向き単位法線ベクトルです。
この定義の意味を読み解きましょう。
- $\bm{F} \cdot \bm{n} \, dS$ は、微小面積要素 $dS$ を通って外向きに流出する $\bm{F}$ の量(フラックス)です。
- $\oint_{\Delta S} \bm{F} \cdot \bm{n} \, dS$ は、閉曲面全体を通る正味のフラックスです。流出が多ければ正、流入が多ければ負になります。
- これを体積 $\Delta V$ で割って、体積を $0$ に縮める極限をとると、単位体積あたりの湧き出し量が得られます。
つまり、発散とは「その点における単位体積あたりのフラックスの湧き出し密度」にほかなりません。
ガウスの発散定理
体積積分による定義を有限の領域に拡張すると、ガウスの発散定理(Gauss’s divergence theorem)が得られます。
体積 $V$ とその閉曲面(境界面)$S$ に対して、次の等式が成り立ちます。
$$ \boxed{\oint_{S} \bm{F} \cdot \bm{n} \, dS = \int_{V} \nabla \cdot \bm{F} \, dV} $$
左辺は閉曲面 $S$ を通る $\bm{F}$ の正味のフラックス、右辺は体積 $V$ 内での発散の総和です。
この定理は、「閉曲面を通って外に出る量の合計 = 内部の湧き出しの合計」ということを主張しています。直感的に考えれば当然のことです。内部に水源がある閉じた領域では、水源から湧き出した水は必ず境界面を通って外に出ていくはずです。
ガウスの発散定理は、面積分と体積積分を結びつける強力な道具であり、電磁気学や流体力学で頻繁に使われます。
具体的な計算例
例1: 放射状ベクトル場 $\bm{F} = (x, y, z)^{\top}$
最も基本的な例として、位置ベクトルと同じ方向を向くベクトル場を考えます。
$$ \bm{F}(x, y, z) = \begin{pmatrix} x \\ y \\ z \end{pmatrix} $$
発散を定義に従って計算します。
$$ \begin{align} \nabla \cdot \bm{F} &= \frac{\partial F_x}{\partial x} + \frac{\partial F_y}{\partial y} + \frac{\partial F_z}{\partial z} \\ &= \frac{\partial x}{\partial x} + \frac{\partial y}{\partial y} + \frac{\partial z}{\partial z} \\ &= 1 + 1 + 1 \\ &= 3 \end{align} $$
発散は定数 $3$ となりました。空間のどの点でも一様に発散が正であり、あらゆる場所から同じ強さで流体が湧き出していることを意味します。
例2: 回転ベクトル場 $\bm{F} = (-y, x, 0)^{\top}$
$z$ 軸まわりに回転するベクトル場を考えます。
$$ \bm{F}(x, y, z) = \begin{pmatrix} -y \\ x \\ 0 \end{pmatrix} $$
発散を計算します。
$$ \begin{align} \nabla \cdot \bm{F} &= \frac{\partial (-y)}{\partial x} + \frac{\partial x}{\partial y} + \frac{\partial 0}{\partial z} \\ &= 0 + 0 + 0 \\ &= 0 \end{align} $$
発散はゼロです。回転するベクトル場は「回っているだけ」であり、湧き出しも吸い込みもないことが数式からも確認できます。このように発散がゼロのベクトル場をソレノイダル場(solenoidal field)、あるいは非圧縮場と呼びます。
例3: 逆2乗ベクトル場 $\bm{F} = \dfrac{\bm{r}}{|\bm{r}|^3}$
点電荷が作る電場のような、原点から放射状に広がり距離の2乗で減衰するベクトル場を考えます。
$$ \bm{F}(x, y, z) = \frac{\bm{r}}{|\bm{r}|^3} = \frac{1}{(x^2 + y^2 + z^2)^{3/2}} \begin{pmatrix} x \\ y \\ z \end{pmatrix} $$
$r = |\bm{r}| = \sqrt{x^2 + y^2 + z^2}$ とおくと、$F_x = x / r^3$ です。$x$ 成分の偏微分を計算します。
まず $r$ の $x$ に関する偏微分を求めておきます。
$$ \frac{\partial r}{\partial x} = \frac{\partial}{\partial x}\sqrt{x^2 + y^2 + z^2} = \frac{x}{r} $$
次に、$F_x = x \cdot r^{-3}$ を $x$ で偏微分します。積の微分を用います。
$$ \begin{align} \frac{\partial F_x}{\partial x} &= \frac{\partial x}{\partial x} \cdot r^{-3} + x \cdot \frac{\partial}{\partial x}(r^{-3}) \\ &= r^{-3} + x \cdot (-3) r^{-4} \cdot \frac{\partial r}{\partial x} \\ &= r^{-3} – 3x \cdot r^{-4} \cdot \frac{x}{r} \\ &= \frac{1}{r^3} – \frac{3x^2}{r^5} \end{align} $$
同様に、$y$ 成分と $z$ 成分も計算すると、
$$ \frac{\partial F_y}{\partial y} = \frac{1}{r^3} – \frac{3y^2}{r^5}, \quad \frac{\partial F_z}{\partial z} = \frac{1}{r^3} – \frac{3z^2}{r^5} $$
これらを足し合わせます。
$$ \begin{align} \nabla \cdot \bm{F} &= \left(\frac{1}{r^3} – \frac{3x^2}{r^5}\right) + \left(\frac{1}{r^3} – \frac{3y^2}{r^5}\right) + \left(\frac{1}{r^3} – \frac{3z^2}{r^5}\right) \\ &= \frac{3}{r^3} – \frac{3(x^2 + y^2 + z^2)}{r^5} \\ &= \frac{3}{r^3} – \frac{3r^2}{r^5} \\ &= \frac{3}{r^3} – \frac{3}{r^3} \\ &= 0 \quad (r \neq 0) \end{align} $$
原点以外の場所では発散がゼロになります。これは非常に重要な結果です。原点から放射状に広がるベクトル場であっても、距離の2乗で減衰する場合には、広がりの効果と減衰の効果がちょうど打ち消し合って、発散がゼロになります。
ただし、原点 $r = 0$ では $\bm{F}$ 自体が定義されないため注意が必要です。原点を含む領域にガウスの発散定理を適用すると、$\nabla \cdot \bm{F} = 4\pi \delta(\bm{r})$($\delta$ はディラックのデルタ関数)という結果が得られます。これは電磁気学のガウスの法則と直接つながる話です。
物理的な応用例
連続の方程式(質量保存則)
流体力学における最も基本的な方程式の1つが連続の方程式(equation of continuity)です。これは質量保存則をベクトル解析で表現したものであり、発散が本質的な役割を果たします。
密度 $\rho(x, y, z, t)$ と速度場 $\bm{v}(x, y, z, t)$ を持つ流体に対して、質量保存則は次のように書けます。
$$ \frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \bm{v}) = 0 $$
この式の意味を考えます。
- $\dfrac{\partial \rho}{\partial t}$: ある点での密度の時間変化率
- $\nabla \cdot (\rho \bm{v})$: 質量フラックス $\rho \bm{v}$ の発散、すなわち単位体積あたりの質量の正味の流出量
両者の和がゼロということは、「密度の減少分 = 流出した質量」であり、質量が生成も消滅もしないことを表しています。
特に、非圧縮性流体($\rho$ が一定)の場合は、
$$ \nabla \cdot \bm{v} = 0 $$
となり、速度場の発散がゼロでなければなりません。これは非圧縮性流体ではどの点でも湧き出しや吸い込みがない、ということを意味しています。
電場のガウスの法則
電磁気学のマクスウェル方程式の1つであるガウスの法則は、電場の発散と電荷密度の関係を述べています。
$$ \nabla \cdot \bm{E} = \frac{\rho_e}{\epsilon_0} $$
ここで、$\bm{E}$ は電場、$\rho_e$ は電荷密度、$\epsilon_0$ は真空の誘電率です。
この式は、「電場の発散は電荷密度に比例する」ことを述べています。
- 正電荷がある場所($\rho_e > 0$)では電場の発散が正であり、電気力線が湧き出しています。
- 負電荷がある場所($\rho_e < 0$)では電場の発散が負であり、電気力線が吸い込まれています。
- 電荷がない場所($\rho_e = 0$)では $\nabla \cdot \bm{E} = 0$ であり、電気力線は湧き出しも吸い込みもなく、ただ通過するだけです。
ガウスの法則をガウスの発散定理を使って積分形にすると、
$$ \oint_{S} \bm{E} \cdot \bm{n} \, dS = \frac{1}{\epsilon_0} \int_{V} \rho_e \, dV = \frac{Q}{\epsilon_0} $$
となります。ここで $Q$ は閉曲面 $S$ 内の全電荷です。閉曲面を通過する電気力線の総本数(電束)は、内部の全電荷に比例するという、電磁気学の教科書でおなじみの結果が得られます。
Pythonによる可視化
2次元ベクトル場の発散を計算・可視化
ここでは、2次元のベクトル場の発散を数値的に計算し、ベクトル場と発散の分布を並べて可視化します。
import numpy as np
import matplotlib.pyplot as plt
# 格子点を生成
x = np.linspace(-3, 3, 200)
y = np.linspace(-3, 3, 200)
X, Y = np.meshgrid(x, y)
# ベクトル場: F(x, y) = (x, y) (放射状ベクトル場)
Fx = X
Fy = Y
# 発散を解析的に計算: div F = ∂Fx/∂x + ∂Fy/∂y = 1 + 1 = 2
div_F = np.full_like(X, 2.0)
# quiver用の粗い格子
x_q = np.linspace(-3, 3, 15)
y_q = np.linspace(-3, 3, 15)
XQ, YQ = np.meshgrid(x_q, y_q)
FxQ = XQ
FyQ = YQ
# 可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 左: ベクトル場
mag = np.sqrt(FxQ**2 + FyQ**2)
axes[0].quiver(XQ, YQ, FxQ, FyQ, mag, cmap="coolwarm", scale=50)
axes[0].set_xlabel("x", fontsize=14)
axes[0].set_ylabel("y", fontsize=14)
axes[0].set_title(r"Vector Field $\mathbf{F} = (x,\, y)$", fontsize=14)
axes[0].set_aspect("equal")
axes[0].grid(True, alpha=0.3)
# 右: 発散の分布
cf = axes[1].contourf(X, Y, div_F, levels=20, cmap="RdBu_r")
axes[1].set_xlabel("x", fontsize=14)
axes[1].set_ylabel("y", fontsize=14)
axes[1].set_title(r"$\nabla \cdot \mathbf{F} = 2$ (uniform)", fontsize=14)
axes[1].set_aspect("equal")
fig.colorbar(cf, ax=axes[1], label=r"$\nabla \cdot \mathbf{F}$")
plt.tight_layout()
plt.show()
放射状ベクトル場 $\bm{F} = (x, y)^{\top}$ は、空間のどの点でも発散が一定値 $2$ となることが確認できます。
発散が空間的に変化するベクトル場
次に、発散が空間的に変化する、より興味深い例を可視化してみましょう。
$$ \bm{F}(x, y) = \begin{pmatrix} x^2 \\ xy \end{pmatrix} $$
このベクトル場の発散は、
$$ \nabla \cdot \bm{F} = \frac{\partial (x^2)}{\partial x} + \frac{\partial (xy)}{\partial y} = 2x + x = 3x $$
$x > 0$ では発散が正(湧き出し)、$x < 0$ では発散が負(吸い込み)、$x = 0$ では発散がゼロとなります。
import numpy as np
import matplotlib.pyplot as plt
# 格子点を生成
x = np.linspace(-3, 3, 200)
y = np.linspace(-3, 3, 200)
X, Y = np.meshgrid(x, y)
# ベクトル場: F(x, y) = (x^2, xy)
Fx = X**2
Fy = X * Y
# 発散: div F = 2x + x = 3x
div_F = 3 * X
# quiver用の粗い格子
x_q = np.linspace(-3, 3, 15)
y_q = np.linspace(-3, 3, 15)
XQ, YQ = np.meshgrid(x_q, y_q)
FxQ = XQ**2
FyQ = XQ * YQ
# 可視化
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 左: ベクトル場
mag = np.sqrt(FxQ**2 + FyQ**2)
axes[0].quiver(XQ, YQ, FxQ, FyQ, mag, cmap="coolwarm", scale=150)
axes[0].set_xlabel("x", fontsize=14)
axes[0].set_ylabel("y", fontsize=14)
axes[0].set_title(r"Vector Field $\mathbf{F} = (x^2,\, xy)$", fontsize=14)
axes[0].set_aspect("equal")
axes[0].grid(True, alpha=0.3)
# 右: 発散の分布
cf = axes[1].contourf(X, Y, div_F, levels=30, cmap="RdBu_r")
contour = axes[1].contour(X, Y, div_F, levels=[0], colors="black", linewidths=2)
axes[1].clabel(contour, inline=True, fontsize=12, fmt="%.0f")
axes[1].set_xlabel("x", fontsize=14)
axes[1].set_ylabel("y", fontsize=14)
axes[1].set_title(r"$\nabla \cdot \mathbf{F} = 3x$", fontsize=14)
axes[1].set_aspect("equal")
fig.colorbar(cf, ax=axes[1], label=r"$\nabla \cdot \mathbf{F}$")
plt.tight_layout()
plt.show()
右の発散分布図を見ると、$x > 0$ の領域(赤色)で発散が正、$x < 0$ の領域(青色)で発散が負であることがわかります。黒い線は $\nabla \cdot \bm{F} = 0$ の等値線($x = 0$)であり、ここで湧き出しと吸い込みが切り替わっています。
数値微分による発散の計算
最後に、ベクトル場の成分が解析的に与えられていない場合を想定して、数値微分を使って発散を計算する方法も紹介します。numpy.gradient を使えば、格子上のデータから偏微分を数値的に近似できます。
import numpy as np
import matplotlib.pyplot as plt
# 格子点を生成
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)
dx = x[1] - x[0]
dy = y[1] - y[0]
# ベクトル場: F(x, y) = (sin(x) * y, cos(y) * x)
Fx = np.sin(X) * Y
Fy = np.cos(Y) * X
# 数値微分で発散を計算
# numpy.gradientは(行方向の微分, 列方向の微分)を返す
# Fxをxで偏微分、Fyをyで偏微分
dFx_dx = np.gradient(Fx, dx, axis=1) # axis=1 は x 方向
dFy_dy = np.gradient(Fy, dy, axis=0) # axis=0 は y 方向
div_F_numerical = dFx_dx + dFy_dy
# 解析解と比較: div F = cos(x)*y + (-sin(y))*x = y*cos(x) - x*sin(y)
div_F_analytical = Y * np.cos(X) - X * np.sin(Y)
# 可視化
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
# 左: ベクトル場
x_q = np.linspace(-3, 3, 15)
y_q = np.linspace(-3, 3, 15)
XQ, YQ = np.meshgrid(x_q, y_q)
FxQ = np.sin(XQ) * YQ
FyQ = np.cos(YQ) * XQ
mag = np.sqrt(FxQ**2 + FyQ**2)
axes[0].quiver(XQ, YQ, FxQ, FyQ, mag, cmap="coolwarm", scale=30)
axes[0].set_title("Vector Field", fontsize=14)
axes[0].set_xlabel("x", fontsize=12)
axes[0].set_ylabel("y", fontsize=12)
axes[0].set_aspect("equal")
axes[0].grid(True, alpha=0.3)
# 中央: 解析的な発散
cf1 = axes[1].contourf(X, Y, div_F_analytical, levels=30, cmap="RdBu_r")
axes[1].set_title("Analytical Divergence", fontsize=14)
axes[1].set_xlabel("x", fontsize=12)
axes[1].set_ylabel("y", fontsize=12)
axes[1].set_aspect("equal")
fig.colorbar(cf1, ax=axes[1], label=r"$\nabla \cdot \mathbf{F}$")
# 右: 数値的な発散
cf2 = axes[2].contourf(X, Y, div_F_numerical, levels=30, cmap="RdBu_r")
axes[2].set_title("Numerical Divergence", fontsize=14)
axes[2].set_xlabel("x", fontsize=12)
axes[2].set_ylabel("y", fontsize=12)
axes[2].set_aspect("equal")
fig.colorbar(cf2, ax=axes[2], label=r"$\nabla \cdot \mathbf{F}$")
plt.tight_layout()
plt.show()
# 数値解と解析解の誤差
error = np.max(np.abs(div_F_numerical - div_F_analytical))
print(f"最大絶対誤差: {error:.6f}")
解析的に計算した発散と数値的に計算した発散がほぼ一致することが確認できます。格子を細かくすれば誤差はさらに小さくなります。実際の工学シミュレーションでは、解析的に偏微分が求められない場合も多いため、このような数値微分の手法が重要になります。
まとめ
本記事では、ベクトル場の発散(divergence, div)について解説しました。
- 発散の直感的な意味: 発散はベクトル場の各点における「湧き出し」の度合いを表します。正なら湧き出し、負なら吸い込み、ゼロなら流入と流出が釣り合っています
- 数学的な定義: $\operatorname{div} \bm{F} = \nabla \cdot \bm{F} = \dfrac{\partial F_x}{\partial x} + \dfrac{\partial F_y}{\partial y} + \dfrac{\partial F_z}{\partial z}$
- ナブラ演算子との関係: 発散はナブラ演算子 $\nabla$ とベクトル場 $\bm{F}$ の内積 $\nabla \cdot \bm{F}$ として表されます
- 体積積分による定義: 微小体積の閉曲面を通るフラックスの極限として定義でき、ガウスの発散定理に自然に接続されます
- 物理的な応用: 連続の方程式(質量保存則)やガウスの法則(電場と電荷の関係)において、発散は中心的な役割を果たします
次のステップとして、ベクトル場に対するもう1つの重要な演算子である回転(rot / curl)について学びましょう。回転は、ベクトル場の「渦」を定量化する演算子です。