1階常微分方程式の中には、あるスカラー関数 $F(x,y)$ の全微分 $dF = 0$ として表せるものがあります。これが完全微分方程式です。完全微分方程式であれば $F(x,y) = C$(定数)として解が直接得られます。
本記事では、完全微分方程式の判定条件とその証明、具体的な解法手順を解説します。さらに、完全微分でない方程式を積分因子で変換する方法を紹介します。
本記事の内容
- 全微分の復習
- 完全微分方程式の定義
- 判定条件 $\partial M/\partial y = \partial N/\partial x$ の証明
- 解法手順(具体例つき)
- 積分因子による非完全微分方程式の変換
- Pythonでの可視化
前提知識
全微分の復習
2変数関数 $F(x, y)$ の全微分は:
$$ dF = \frac{\partial F}{\partial x}dx + \frac{\partial F}{\partial y}dy $$
$dF = 0$ とおくと:
$$ \frac{\partial F}{\partial x}dx + \frac{\partial F}{\partial y}dy = 0 $$
この形は $F(x, y) = C$(定数)を意味します。つまり、解曲線は $F$ の等高線です。
完全微分方程式の定義
微分方程式:
$$ M(x, y)\,dx + N(x, y)\,dy = 0 $$
が完全微分方程式であるとは、ある関数 $F(x, y)$ が存在して:
$$ \frac{\partial F}{\partial x} = M, \quad \frac{\partial F}{\partial y} = N $$
を満たすことを言います。このとき一般解は:
$$ \boxed{F(x, y) = C} $$
判定条件
定理
$M(x,y)$, $N(x,y)$ が単連結領域で連続な偏導関数を持つとき、$M\,dx + N\,dy = 0$ が完全微分方程式であるための必要十分条件は:
$$ \boxed{\frac{\partial M}{\partial y} = \frac{\partial N}{\partial x}} $$
必要性の証明
$F$ が存在すると仮定します。$M = \frac{\partial F}{\partial x}$, $N = \frac{\partial F}{\partial y}$ なので:
$$ \frac{\partial M}{\partial y} = \frac{\partial}{\partial y}\frac{\partial F}{\partial x} = \frac{\partial^2 F}{\partial y\partial x} $$
$$ \frac{\partial N}{\partial x} = \frac{\partial}{\partial x}\frac{\partial F}{\partial y} = \frac{\partial^2 F}{\partial x\partial y} $$
$F$ が2回連続微分可能ならば、偏微分の順序交換(シュワルツの定理)により:
$$ \frac{\partial^2 F}{\partial y\partial x} = \frac{\partial^2 F}{\partial x\partial y} $$
したがって $\frac{\partial M}{\partial y} = \frac{\partial N}{\partial x}$ が成り立ちます。
十分性の証明
$\frac{\partial M}{\partial y} = \frac{\partial N}{\partial x}$ が成り立つとき、$F$ を構成的に求めます。
$\frac{\partial F}{\partial x} = M$ を $x$ で積分すると:
$$ F(x, y) = \int M(x, y)\,dx + g(y) $$
ここで $g(y)$ は $x$ に依存しない未知関数です。これが $\frac{\partial F}{\partial y} = N$ も満たすことを確認します:
$$ \frac{\partial F}{\partial y} = \frac{\partial}{\partial y}\int M(x, y)\,dx + g'(y) = N(x, y) $$
$$ g'(y) = N(x, y) – \frac{\partial}{\partial y}\int M(x, y)\,dx $$
この右辺が本当に $y$ のみの関数であることを確認します。右辺を $x$ で微分すると:
$$ \frac{\partial N}{\partial x} – \frac{\partial M}{\partial y} = 0 $$
仮定より $\frac{\partial M}{\partial y} = \frac{\partial N}{\partial x}$ なので確かにゼロです。よって $g'(y)$ は $x$ に依存せず、$g(y)$ は $y$ の積分で求まります。
解法手順
ステップ1: 完全性の確認
$\frac{\partial M}{\partial y}$ と $\frac{\partial N}{\partial x}$ を計算し、等しいか確認します。
ステップ2: $F$ の $x$ 積分
$$ F(x, y) = \int M(x, y)\,dx + g(y) $$
ステップ3: $g(y)$ の決定
$\frac{\partial F}{\partial y} = N$ から $g'(y)$ を求め、$y$ で積分します。
ステップ4: 一般解
$$ F(x, y) = C $$
具体例1
$$ (2xy + 3)\,dx + (x^2 + 4y)\,dy = 0 $$
ステップ1: $M = 2xy + 3$, $N = x^2 + 4y$ として:
$$ \frac{\partial M}{\partial y} = 2x, \quad \frac{\partial N}{\partial x} = 2x $$
等しいので完全微分方程式です。
ステップ2: $F = \int (2xy + 3)\,dx + g(y) = x^2 y + 3x + g(y)$
ステップ3: $\frac{\partial F}{\partial y} = x^2 + g'(y) = N = x^2 + 4y$ より:
$$ g'(y) = 4y \implies g(y) = 2y^2 $$
ステップ4: 一般解は:
$$ \boxed{x^2 y + 3x + 2y^2 = C} $$
具体例2
$$ (e^y + 2xy)\,dx + (xe^y + x^2 – 1)\,dy = 0 $$
ステップ1: $M = e^y + 2xy$, $N = xe^y + x^2 – 1$ として:
$$ \frac{\partial M}{\partial y} = e^y + 2x, \quad \frac{\partial N}{\partial x} = e^y + 2x $$
完全微分方程式です。
ステップ2: $F = \int (e^y + 2xy)\,dx + g(y) = xe^y + x^2 y + g(y)$
ステップ3: $\frac{\partial F}{\partial y} = xe^y + x^2 + g'(y) = xe^y + x^2 – 1$ より:
$$ g'(y) = -1 \implies g(y) = -y $$
ステップ4: 一般解は:
$$ \boxed{xe^y + x^2 y – y = C} $$
積分因子
非完全微分方程式の変換
$M\,dx + N\,dy = 0$ が完全でない($\frac{\partial M}{\partial y} \neq \frac{\partial N}{\partial x}$)場合、適切な積分因子 $\mu$ を掛けて完全微分方程式にできることがあります:
$$ \mu M\,dx + \mu N\,dy = 0 $$
が完全であるための条件は:
$$ \frac{\partial(\mu M)}{\partial y} = \frac{\partial(\mu N)}{\partial x} $$
$\mu = \mu(x)$ の場合
$\mu$ が $x$ のみに依存する場合、完全性の条件は:
$$ \mu\frac{\partial M}{\partial y} = \mu\frac{\partial N}{\partial x} + N\frac{d\mu}{dx} $$
$$ \frac{1}{\mu}\frac{d\mu}{dx} = \frac{\frac{\partial M}{\partial y} – \frac{\partial N}{\partial x}}{N} $$
右辺が $x$ のみの関数であれば、$\mu(x)$ が求まります:
$$ \boxed{\mu(x) = \exp\left(\int\frac{\frac{\partial M}{\partial y} – \frac{\partial N}{\partial x}}{N}\,dx\right)} $$
$\mu = \mu(y)$ の場合
同様に、$\mu$ が $y$ のみに依存する場合:
$$ \boxed{\mu(y) = \exp\left(\int\frac{\frac{\partial N}{\partial x} – \frac{\partial M}{\partial y}}{M}\,dy\right)} $$
右辺が $y$ のみの関数であれば使えます。
具体例3: 積分因子の適用
$$ (2y)\,dx + (x)\,dy = 0 $$
確認: $\frac{\partial M}{\partial y} = 2$, $\frac{\partial N}{\partial x} = 1$ なので完全ではありません。
$\mu(x)$ を試みます:
$$ \frac{\frac{\partial M}{\partial y} – \frac{\partial N}{\partial x}}{N} = \frac{2 – 1}{x} = \frac{1}{x} $$
$x$ のみの関数なので:
$$ \mu(x) = \exp\left(\int\frac{1}{x}\,dx\right) = e^{\ln x} = x $$
元の方程式に $\mu = x$ を掛けると:
$$ 2xy\,dx + x^2\,dy = 0 $$
$\frac{\partial(2xy)}{\partial y} = 2x = \frac{\partial(x^2)}{\partial x}$ となり、完全微分方程式です。
$F = \int 2xy\,dx + g(y) = x^2 y + g(y)$ とし、$\frac{\partial F}{\partial y} = x^2 + g'(y) = x^2$ より $g'(y) = 0$, $g(y) = 0$。
一般解は $x^2 y = C$ です。
Pythonでの可視化
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
# --- (1) 具体例1: x^2*y + 3x + 2y^2 = C の等高線 ---
x = np.linspace(-4, 4, 400)
y = np.linspace(-4, 4, 400)
X, Y = np.meshgrid(x, y)
F1 = X**2 * Y + 3*X + 2*Y**2
levels1 = np.linspace(-10, 10, 21)
c1 = axes[0].contour(X, Y, F1, levels=levels1, cmap='RdBu_r')
axes[0].clabel(c1, inline=True, fontsize=8)
axes[0].set_title('$x^2 y + 3x + 2y^2 = C$', fontsize=13)
axes[0].set_xlabel('$x$'); axes[0].set_ylabel('$y$')
axes[0].grid(True, alpha=0.3)
axes[0].set_aspect('equal')
# --- (2) 具体例2: x*e^y + x^2*y - y = C の等高線 ---
x2 = np.linspace(-3, 3, 400)
y2 = np.linspace(-2, 2, 400)
X2, Y2 = np.meshgrid(x2, y2)
F2 = X2 * np.exp(Y2) + X2**2 * Y2 - Y2
levels2 = np.linspace(-5, 10, 21)
c2 = axes[1].contour(X2, Y2, F2, levels=levels2, cmap='viridis')
axes[1].clabel(c2, inline=True, fontsize=8)
axes[1].set_title('$xe^y + x^2 y - y = C$', fontsize=13)
axes[1].set_xlabel('$x$'); axes[1].set_ylabel('$y$')
axes[1].grid(True, alpha=0.3)
# --- (3) 具体例3: x^2*y = C の等高線 ---
x3 = np.linspace(-3, 3, 400)
y3 = np.linspace(-3, 3, 400)
X3, Y3 = np.meshgrid(x3, y3)
F3 = X3**2 * Y3
levels3 = np.linspace(-5, 5, 21)
c3 = axes[2].contour(X3, Y3, F3, levels=levels3, cmap='coolwarm')
axes[2].clabel(c3, inline=True, fontsize=8)
axes[2].set_title('$x^2 y = C$ (with integrating factor)', fontsize=13)
axes[2].set_xlabel('$x$'); axes[2].set_ylabel('$y$')
axes[2].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('exact_differential_equation.png', dpi=150, bbox_inches='tight')
plt.show()
さらに、完全微分方程式のベクトル場を可視化して直感を深めます。
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 具体例1のベクトル場 (M, N) = (2xy+3, x^2+4y) と等高線 F = x^2y + 3x + 2y^2
x = np.linspace(-3, 3, 300)
y = np.linspace(-3, 3, 300)
X, Y = np.meshgrid(x, y)
M = 2*X*Y + 3
N = X**2 + 4*Y
F = X**2*Y + 3*X + 2*Y**2
# 等高線
axes[0].contour(X, Y, F, levels=20, cmap='gray', alpha=0.5)
# ベクトル場(間引き)
skip = 15
axes[0].quiver(X[::skip,::skip], Y[::skip,::skip],
M[::skip,::skip], N[::skip,::skip],
color='blue', alpha=0.7)
axes[0].set_title('Vector field $(M, N)$ and solution curves $F = C$', fontsize=12)
axes[0].set_xlabel('$x$'); axes[0].set_ylabel('$y$')
axes[0].grid(True, alpha=0.3)
axes[0].set_aspect('equal')
axes[0].set_xlim(-3, 3); axes[0].set_ylim(-3, 3)
# 完全 vs 非完全の比較
# 完全: ∂M/∂y = ∂N/∂x
dMdy = 2*X
dNdx = 2*X
diff_exact = dMdy - dNdx
# 非完全の例: (2y)dx + (x)dy = 0
M2 = 2*Y
N2 = X
dMdy2 = 2*np.ones_like(X)
dNdx2 = np.ones_like(X)
diff_nonexact = dMdy2 - dNdx2
c_diff = axes[1].contourf(X, Y, diff_nonexact, levels=20, cmap='RdBu_r')
plt.colorbar(c_diff, ax=axes[1])
axes[1].set_title(r'$\partial M/\partial y - \partial N/\partial x$ (non-exact: $2y\,dx + x\,dy = 0$)',
fontsize=11)
axes[1].set_xlabel('$x$'); axes[1].set_ylabel('$y$')
axes[1].grid(True, alpha=0.3)
axes[1].set_aspect('equal')
plt.tight_layout()
plt.savefig('exact_vs_nonexact.png', dpi=150, bbox_inches='tight')
plt.show()
まとめ
本記事では、完全微分方程式の判定条件と解法を解説しました。
- 完全微分方程式 $M\,dx + N\,dy = 0$ は $F(x,y) = C$ の形で解ける
- 判定条件: $\frac{\partial M}{\partial y} = \frac{\partial N}{\partial x}$(偏微分の交換可能性に帰着)
- 解法: $M$ を $x$ 積分して $F$ を求め、$\frac{\partial F}{\partial y} = N$ から未知関数を決定
- 非完全微分方程式は積分因子 $\mu$ を掛けて完全微分方程式に変換できる
- $\mu(x)$ や $\mu(y)$ の形が使える条件がある
次のステップとして、以下の記事も参考にしてください。