完全微分方程式の判定条件と解法

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)$ の形が使える条件がある

次のステップとして、以下の記事も参考にしてください。