1階線形常微分方程式の解法 — 積分因子法をわかりやすく解説

1階線形常微分方程式は、物理学・工学で最も頻繁に登場する微分方程式の1つです。RC回路の過渡応答、放射性崩壊、ニュートンの冷却法則、薬物動態モデルなど、「ある量の変化率が、その量自体と外部からの入力に比例する」現象はすべてこの形式で記述されます。

本記事では、1階線形常微分方程式の一般的な解法である 積分因子法(integrating factor method) を、動機づけから導出まで省略せずに解説します。さらに、具体的な物理応用とPython実装を通じて理解を深めます。

本記事の内容

  • 1階線形ODEの標準形と分類
  • 積分因子の動機づけと導出
  • 一般解の公式の証明
  • 定数係数・変数係数の具体例
  • RC回路の過渡応答とニュートンの冷却法則への応用
  • Pythonによる解析解と数値解の比較

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

前提記事では、微分方程式の基本概念(階数、線形性、一般解と特殊解、初期値問題)と変数分離形の解法を扱いました。本記事ではそれらの知識を前提として、より一般的な1階線形ODEの解法に進みます。

1階線形ODEの標準形

1階線形常微分方程式の 標準形 は次のように書かれます。

$$ \frac{dy}{dx} + P(x)\,y = Q(x) $$

ここで、$P(x)$ と $Q(x)$ は $x$ の既知の関数(連続関数を仮定)であり、未知関数 $y(x)$ とその1階導関数 $dy/dx$ が1次の項としてのみ現れています。このことが「線形」と呼ばれる理由です。

いくつかの例を見てみましょう。

方程式 $P(x)$ $Q(x)$ 備考
$\dfrac{dy}{dx} + 2y = 6$ $2$ $6$ 定数係数
$\dfrac{dy}{dx} + \dfrac{1}{x}y = x^2$ $\dfrac{1}{x}$ $x^2$ 変数係数
$\dfrac{dy}{dx} – 3y = e^x$ $-3$ $e^x$ 定数係数、非斉次

$Q(x) = 0$ の場合を 斉次(homogeneous) 方程式、$Q(x) \neq 0$ の場合を 非斉次(nonhomogeneous) 方程式と呼びます。斉次の場合は変数分離法で解けますが、非斉次の場合は一般に変数分離法だけでは解けません。ここで登場するのが 積分因子法 です。

積分因子の動機づけ — なぜ積分因子が必要か

標準形の方程式

$$ \frac{dy}{dx} + P(x)\,y = Q(x) $$

の左辺をよく見てみましょう。もしこの左辺が何かの関数の微分(全微分)の形に書けたら、両辺を積分するだけで解が求まるはずです。

ここで思い出したいのが 積の微分法則 です。

$$ \frac{d}{dx}\bigl[\mu(x)\,y\bigr] = \mu(x)\,\frac{dy}{dx} + \mu'(x)\,y $$

もし適切な関数 $\mu(x)$ を見つけて、元の方程式の両辺に $\mu(x)$ を掛けたとき、左辺がちょうど $\dfrac{d}{dx}\bigl[\mu(x)\,y\bigr]$ の形になれば、解が簡単に求まります。このような $\mu(x)$ を 積分因子(integrating factor) と呼びます。

具体的に、元の方程式の両辺に $\mu(x)$ を掛けると

$$ \mu(x)\,\frac{dy}{dx} + \mu(x)\,P(x)\,y = \mu(x)\,Q(x) $$

となります。左辺が $\dfrac{d}{dx}\bigl[\mu(x)\,y\bigr]$ に等しくなるためには、積の微分法則と比較して

$$ \mu(x)\,\frac{dy}{dx} + \mu'(x)\,y = \mu(x)\,\frac{dy}{dx} + \mu(x)\,P(x)\,y $$

が成り立つ必要があります。両辺から $\mu(x)\,\dfrac{dy}{dx}$ を消去すると

$$ \mu'(x) = \mu(x)\,P(x) $$

という $\mu(x)$ に関する条件式が得られます。これが積分因子の満たすべき微分方程式です。

積分因子 $\mu(x)$ の導出

$\mu(x)$ が満たすべき方程式

$$ \frac{d\mu}{dx} = \mu(x)\,P(x) $$

は、実は $\mu$ に関する 変数分離形 の微分方程式です。前提記事で学んだ変数分離法を使って解きましょう。

ステップ1: 変数を分離します。

$$ \frac{d\mu}{\mu} = P(x)\,dx $$

ステップ2: 両辺を積分します。

$$ \int \frac{d\mu}{\mu} = \int P(x)\,dx $$

ステップ3: 左辺を計算します。

$$ \ln|\mu| = \int P(x)\,dx $$

ここで積分定数は、後で見るように最終結果に影響しないため省略できます(理由は後述)。

ステップ4: 両辺の指数関数を取ります。

$$ |\mu| = \exp\!\left(\int P(x)\,dx\right) $$

$\mu(x)$ は方程式の両辺に掛ける因子なので、正の値を取れば十分です。したがって

$$ \boxed{\mu(x) = \exp\!\left(\int P(x)\,dx\right)} $$

これが 積分因子 の公式です。

積分定数を省略できる理由: 仮に積分定数 $C_0$ を含めると $\mu(x) = e^{C_0}\exp\!\left(\int P(x)\,dx\right)$ となりますが、この $e^{C_0}$ は方程式の両辺に共通して掛かるだけなので、最終的な解には影響しません。したがって $C_0 = 0$ として問題ありません。

一般解の公式の導出

積分因子 $\mu(x) = \exp\!\left(\int P(x)\,dx\right)$ を用いて、1階線形ODEの一般解を導出します。

ステップ1: 元の方程式の両辺に $\mu(x)$ を掛けます。

$$ \mu(x)\,\frac{dy}{dx} + \mu(x)\,P(x)\,y = \mu(x)\,Q(x) $$

ステップ2: 左辺は、積分因子の定義から積の微分に書き換えられます。

$$ \frac{d}{dx}\bigl[\mu(x)\,y\bigr] = \mu(x)\,Q(x) $$

ステップ3: 両辺を $x$ で積分します。

$$ \mu(x)\,y = \int \mu(x)\,Q(x)\,dx + C $$

ここで $C$ は積分定数(任意定数)です。

ステップ4: 両辺を $\mu(x)$ で割ります。$\mu(x) = e^{\int P(x)\,dx} > 0$ なので常に割れます。

$$ \boxed{y = \frac{1}{\mu(x)}\left[\int \mu(x)\,Q(x)\,dx + C\right]} $$

これが1階線形常微分方程式の 一般解 です。$\mu(x) = \exp\!\left(\int P(x)\,dx\right)$ を代入すれば

$$ y = e^{-\int P(x)\,dx}\left[\int e^{\int P(x)\,dx}\,Q(x)\,dx + C\right] $$

と書くこともできます。1階のODEなので任意定数は1つ($C$)であり、初期条件 $y(x_0) = y_0$ を1つ与えれば特殊解が確定します。

具体例1: 定数係数の場合

次の初期値問題を解きます。

$$ \frac{dy}{dx} + 2y = 6, \quad y(0) = 1 $$

ステップ1: 標準形との対応を確認します。

$$ P(x) = 2, \quad Q(x) = 6 $$

ステップ2: 積分因子を計算します。

$$ \mu(x) = \exp\!\left(\int 2\,dx\right) = \exp(2x) = e^{2x} $$

ステップ3: 両辺に $\mu(x) = e^{2x}$ を掛けます。

$$ e^{2x}\,\frac{dy}{dx} + 2e^{2x}\,y = 6e^{2x} $$

ステップ4: 左辺を積の微分にまとめます。

$$ \frac{d}{dx}\bigl[e^{2x}\,y\bigr] = 6e^{2x} $$

ステップ5: 両辺を積分します。

$$ e^{2x}\,y = \int 6e^{2x}\,dx = 6 \cdot \frac{e^{2x}}{2} + C = 3e^{2x} + C $$

ステップ6: 両辺を $e^{2x}$ で割ります。

$$ y = 3 + Ce^{-2x} $$

ステップ7: 初期条件 $y(0) = 1$ を適用します。

$$ 1 = 3 + C \cdot e^{0} = 3 + C $$

$$ C = -2 $$

したがって、特殊解は

$$ \boxed{y(x) = 3 – 2e^{-2x}} $$

です。$x \to \infty$ で $y \to 3$ に収束することが分かります。これは 定常解(斉次でない部分の特殊解 $y_p = 3$)に向かって指数関数的に近づく過渡応答です。

具体例2: 変数係数の場合

次の方程式を解きます。

$$ \frac{dy}{dx} + \frac{1}{x}\,y = x^2, \quad (x > 0) $$

ステップ1: 標準形との対応を確認します。

$$ P(x) = \frac{1}{x}, \quad Q(x) = x^2 $$

ステップ2: 積分因子を計算します。

$$ \mu(x) = \exp\!\left(\int \frac{1}{x}\,dx\right) = \exp(\ln x) = x $$

ここで $x > 0$ を仮定しているため、$\ln|x| = \ln x$ です。

ステップ3: 両辺に $\mu(x) = x$ を掛けます。

$$ x\,\frac{dy}{dx} + y = x^3 $$

ステップ4: 左辺を積の微分にまとめます。

$$ \frac{d}{dx}[x\,y] = x^3 $$

実際に左辺を確認すると $\dfrac{d}{dx}[xy] = x\dfrac{dy}{dx} + y$ であり、確かに一致しています。

ステップ5: 両辺を積分します。

$$ x\,y = \int x^3\,dx = \frac{x^4}{4} + C $$

ステップ6: 両辺を $x$ で割ります。

$$ \boxed{y = \frac{x^3}{4} + \frac{C}{x}} $$

これが一般解です。$C/x$ の項は $x \to 0^+$ で発散するため、初期条件の値によって解の振る舞いが大きく変わります。

物理への応用1: RC回路の過渡応答

抵抗 $R$ とキャパシタ $C_{\text{cap}}$ が直列に接続された回路に、時刻 $t = 0$ で一定電圧 $V_0$ を印加する場合を考えます。キルヒホッフの電圧則(KVL)から

$$ R\,i(t) + \frac{1}{C_{\text{cap}}}\int_0^t i(\tau)\,d\tau = V_0 $$

が成り立ちます。キャパシタ両端の電圧 $v(t) = \dfrac{1}{C_{\text{cap}}}\displaystyle\int_0^t i(\tau)\,d\tau$ と置き、$i(t) = C_{\text{cap}}\,\dfrac{dv}{dt}$ を代入すると

$$ RC_{\text{cap}}\,\frac{dv}{dt} + v = V_0 $$

が得られます。時定数 $\tau = RC_{\text{cap}}$ を用いて書き直すと

$$ \frac{dv}{dt} + \frac{1}{\tau}\,v = \frac{V_0}{\tau} $$

これは標準形であり、$P(t) = 1/\tau$、$Q(t) = V_0/\tau$ です。

積分因子の計算:

$$ \mu(t) = \exp\!\left(\int \frac{1}{\tau}\,dt\right) = e^{t/\tau} $$

方程式の両辺に $\mu(t)$ を掛ける:

$$ \frac{d}{dt}\bigl[e^{t/\tau}\,v\bigr] = \frac{V_0}{\tau}\,e^{t/\tau} $$

両辺を積分:

$$ e^{t/\tau}\,v = \frac{V_0}{\tau} \cdot \tau\,e^{t/\tau} + C = V_0\,e^{t/\tau} + C $$

$e^{t/\tau}$ で割る:

$$ v(t) = V_0 + Ce^{-t/\tau} $$

初期条件 $v(0) = 0$(キャパシタが初期放電状態)を適用:

$$ 0 = V_0 + C \implies C = -V_0 $$

したがって

$$ \boxed{v(t) = V_0\!\left(1 – e^{-t/\tau}\right)} $$

$t = \tau$ のとき $v(\tau) = V_0(1 – e^{-1}) \approx 0.632\,V_0$ であり、時定数 $\tau$ は電圧が最終値の約63.2%に達するまでの時間を表します。

物理への応用2: ニュートンの冷却法則

温度 $T(t)$ の物体が周囲温度 $T_{\text{env}}$ の環境に置かれたとき、ニュートンの冷却法則は

$$ \frac{dT}{dt} = -k(T – T_{\text{env}}) $$

と表されます。ここで $k > 0$ は冷却定数(物体の材質・形状・周囲の流体に依存)です。これを展開すると

$$ \frac{dT}{dt} + kT = kT_{\text{env}} $$

これも1階線形ODEの標準形であり、$P(t) = k$、$Q(t) = kT_{\text{env}}$ です。

積分因子の計算:

$$ \mu(t) = e^{kt} $$

一般解の導出:

$$ \frac{d}{dt}\bigl[e^{kt}\,T\bigr] = kT_{\text{env}}\,e^{kt} $$

$$ e^{kt}\,T = kT_{\text{env}} \cdot \frac{e^{kt}}{k} + C = T_{\text{env}}\,e^{kt} + C $$

$$ T(t) = T_{\text{env}} + Ce^{-kt} $$

初期条件 $T(0) = T_0$ を適用:

$$ T_0 = T_{\text{env}} + C \implies C = T_0 – T_{\text{env}} $$

したがって

$$ \boxed{T(t) = T_{\text{env}} + (T_0 – T_{\text{env}})\,e^{-kt}} $$

物体の温度は、初期温度 $T_0$ から周囲温度 $T_{\text{env}}$ に向かって指数関数的に近づきます。$T_0 > T_{\text{env}}$(物体が熱い)でも $T_0 < T_{\text{env}}$(物体が冷たい)でも同じ公式が使えます。

Python実装: RC回路の解析解と数値解の比較

RC回路の過渡応答を題材に、積分因子法で求めた解析解と scipy.integrate.solve_ivp による数値解を比較します。あわせて、ニュートンの冷却法則も可視化します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# ============================================================
# 1. RC回路の過渡応答
# ============================================================

# パラメータ
R = 1e3          # 抵抗 [Ω]
C_cap = 1e-3     # キャパシタ [F]
V0 = 5.0         # 印加電圧 [V]
tau = R * C_cap   # 時定数 [s]

# 微分方程式: dv/dt = (V0 - v) / tau
def rc_circuit(t, v):
    return (V0 - v[0]) / tau

# 時間の設定
t_span = (0, 5 * tau)  # 5τまで計算
t_eval = np.linspace(0, 5 * tau, 500)

# 数値解(solve_ivp)
sol_rc = solve_ivp(
    rc_circuit,
    t_span,
    [0.0],           # 初期条件 v(0) = 0
    t_eval=t_eval,
    method="RK45"
)

# 解析解
v_exact = V0 * (1 - np.exp(-t_eval / tau))

# ============================================================
# 2. ニュートンの冷却法則
# ============================================================

# パラメータ
T0 = 90.0         # 初期温度 [°C](熱いコーヒー)
T_env = 22.0      # 周囲温度 [°C]
k_cool = 0.1      # 冷却定数 [1/min]

# 微分方程式: dT/dt = -k(T - T_env)
def cooling_law(t, T):
    return -k_cool * (T[0] - T_env)

# 時間の設定
t_cool_span = (0, 60)  # 60分
t_cool_eval = np.linspace(0, 60, 500)

# 数値解
sol_cool = solve_ivp(
    cooling_law,
    t_cool_span,
    [T0],
    t_eval=t_cool_eval,
    method="RK45"
)

# 解析解
T_exact = T_env + (T0 - T_env) * np.exp(-k_cool * t_cool_eval)

# ============================================================
# 3. 可視化
# ============================================================
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

# --- RC回路 ---
ax1 = axes[0]
ax1.plot(t_eval * 1000, v_exact, "-", linewidth=2.5, label="Analytical solution", color="royalblue")
ax1.plot(sol_rc.t * 1000, sol_rc.y[0], "o", markersize=3, label="Numerical (solve_ivp)", color="tomato", alpha=0.7)
ax1.axhline(y=V0, color="gray", linestyle="--", alpha=0.5, label=f"$V_0 = {V0}$ V")
ax1.axvline(x=tau * 1000, color="green", linestyle="--", alpha=0.5, label=f"$\\tau = {tau*1000:.0f}$ ms")
ax1.set_xlabel("Time [ms]", fontsize=12)
ax1.set_ylabel("Voltage $v(t)$ [V]", fontsize=12)
ax1.set_title("RC Circuit Transient Response", fontsize=13)
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
ax1.set_ylim(-0.3, V0 * 1.15)

# --- ニュートンの冷却法則 ---
ax2 = axes[1]
ax2.plot(t_cool_eval, T_exact, "-", linewidth=2.5, label="Analytical solution", color="royalblue")
ax2.plot(sol_cool.t, sol_cool.y[0], "o", markersize=3, label="Numerical (solve_ivp)", color="tomato", alpha=0.7)
ax2.axhline(y=T_env, color="gray", linestyle="--", alpha=0.5, label=f"$T_{{\\mathrm{{env}}}} = {T_env}$°C")
ax2.set_xlabel("Time [min]", fontsize=12)
ax2.set_ylabel("Temperature $T(t)$ [°C]", fontsize=12)
ax2.set_title("Newton's Law of Cooling", fontsize=13)
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig("first_order_linear_ode.png", dpi=150, bbox_inches="tight")
plt.show()

# 誤差の確認
print("=== 数値解と解析解の最大誤差 ===")
print(f"RC回路:         {np.max(np.abs(sol_rc.y[0] - v_exact)):.2e} V")
print(f"ニュートン冷却: {np.max(np.abs(sol_cool.y[0] - T_exact)):.2e} °C")

このコードを実行すると、左のグラフにRC回路のキャパシタ電圧の時間変化が、右のグラフにコーヒーの温度変化が描画されます。どちらのグラフでも、解析解(実線)と solve_ivp による数値解(マーカー)がほぼ完全に一致することが確認できます。

RC回路では時定数 $\tau = RC = 1\,\text{s}$ の約5倍の時間でほぼ定常状態 $V_0 = 5\,\text{V}$ に到達します。ニュートンの冷却法則では、90°Cのコーヒーが約60分で周囲温度22°Cに近づいていく様子が見て取れます。

まとめ

本記事では、1階線形常微分方程式の解法である 積分因子法 を解説しました。

  • 1階線形ODEの標準形は $\dfrac{dy}{dx} + P(x)\,y = Q(x)$ です。
  • 積分因子 $\mu(x) = \exp\!\left(\int P(x)\,dx\right)$ を掛けることで、左辺を $\dfrac{d}{dx}[\mu y]$ という積の微分の形にまとめられます。
  • 一般解は $y = \dfrac{1}{\mu(x)}\left[\displaystyle\int \mu(x)\,Q(x)\,dx + C\right]$ で与えられます。
  • 積分因子法は、RC回路の過渡応答やニュートンの冷却法則など、物理・工学の幅広い問題に適用できます。
  • 解析解は指数関数的な過渡応答の形を取り、定常値に向かって収束するパターンが共通して現れます。

積分因子法をマスターすれば、1階線形ODEは体系的に解くことができます。次のステップとして、以下のトピックに進んでいくとよいでしょう。

  • 変数分離形 — 非線形だが分離可能な微分方程式の解法
  • 2階定数係数線形ODE — 特性方程式を用いた解法(振動・減衰系の記述)
  • ラプラス変換 — 初期値問題を代数的に解くための強力な手法