2階線形常微分方程式(定数係数)の解法

2階線形常微分方程式は、振動現象、電気回路、制御系など、工学のあらゆる場面で登場する最も重要な微分方程式の一つです。特に係数が定数の場合、特性方程式を用いて体系的に解くことができます。

本記事では、定数係数2階線形斉次常微分方程式の解法を、特性方程式の判別式に基づく3つの場合に分けて丁寧に解説します。

本記事の内容

  • 2階定数係数線形ODEの標準形
  • 特性方程式の導出
  • 判別式による3つの場合分け(異なる実根、重根、複素根)
  • 初期条件の適用
  • Pythonでの数値解法と解析解の比較

前提知識

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

2階定数係数線形斉次ODEの標準形

次の形の微分方程式を考えます。

$$ ay” + by’ + cy = 0 $$

ここで $a, b, c$ は実定数($a \neq 0$)です。

特性方程式の導出

解を $y = e^{\lambda x}$ と仮定して方程式に代入します。

$$ \begin{align} y &= e^{\lambda x} \\ y’ &= \lambda e^{\lambda x} \\ y” &= \lambda^2 e^{\lambda x} \end{align} $$

代入すると、

$$ \begin{align} a\lambda^2 e^{\lambda x} + b\lambda e^{\lambda x} + ce^{\lambda x} &= 0 \\ (a\lambda^2 + b\lambda + c) e^{\lambda x} &= 0 \end{align} $$

$e^{\lambda x} \neq 0$ なので、

$$ \boxed{a\lambda^2 + b\lambda + c = 0} $$

これが特性方程式(characteristic equation)です。この2次方程式の解 $\lambda$ によって一般解の形が決まります。

判別式による場合分け

判別式 $D = b^2 – 4ac$ の符号により3つの場合があります。

Case 1: $D > 0$(異なる2つの実根)

$$ \lambda_1 = \frac{-b + \sqrt{D}}{2a}, \quad \lambda_2 = \frac{-b – \sqrt{D}}{2a} $$

一般解:

$$ \boxed{y = C_1 e^{\lambda_1 x} + C_2 e^{\lambda_2 x}} $$

: $y” + 3y’ + 2y = 0$

特性方程式 $\lambda^2 + 3\lambda + 2 = (\lambda+1)(\lambda+2) = 0$ より $\lambda_1 = -1, \lambda_2 = -2$

$$ y = C_1 e^{-x} + C_2 e^{-2x} $$

Case 2: $D = 0$(重根)

$$ \lambda_1 = \lambda_2 = \lambda = -\frac{b}{2a} $$

$e^{\lambda x}$ だけでは2つの独立解が得られないため、もう一つの解として $xe^{\lambda x}$ を取ります(階数低下法で導出可能)。

一般解:

$$ \boxed{y = (C_1 + C_2 x) e^{\lambda x}} $$

: $y” + 4y’ + 4y = 0$

特性方程式 $\lambda^2 + 4\lambda + 4 = (\lambda+2)^2 = 0$ より $\lambda = -2$

$$ y = (C_1 + C_2 x) e^{-2x} $$

Case 3: $D < 0$(複素共役根)

$$ \lambda = \alpha \pm i\beta, \quad \alpha = -\frac{b}{2a}, \quad \beta = \frac{\sqrt{|D|}}{2a} $$

オイラーの公式 $e^{i\theta} = \cos\theta + i\sin\theta$ を用いて実数形に変換します。

$$ \begin{align} y &= e^{\alpha x}(A e^{i\beta x} + B e^{-i\beta x}) \\ &= e^{\alpha x}(C_1 \cos\beta x + C_2 \sin\beta x) \end{align} $$

一般解:

$$ \boxed{y = e^{\alpha x}(C_1 \cos\beta x + C_2 \sin\beta x)} $$

これは 減衰($\alpha < 0$)または増大($\alpha > 0$)する振動 を表します。

: $y” + 2y’ + 5y = 0$

特性方程式 $\lambda^2 + 2\lambda + 5 = 0$ より $\lambda = -1 \pm 2i$($\alpha = -1, \beta = 2$)

$$ y = e^{-x}(C_1 \cos 2x + C_2 \sin 2x) $$

初期条件の適用

初期条件 $y(0) = y_0$, $y'(0) = v_0$ を用いて定数 $C_1, C_2$ を決定します。

: $y” + 2y’ + 5y = 0$, $y(0) = 1$, $y'(0) = 0$

一般解 $y = e^{-x}(C_1 \cos 2x + C_2 \sin 2x)$ より、

$y(0) = C_1 = 1$

$y’ = e^{-x}[(-C_1 + 2C_2)\cos 2x + (-C_2 – 2C_1)\sin 2x]$ なので、

$y'(0) = -C_1 + 2C_2 = -1 + 2C_2 = 0 \implies C_2 = 1/2$

$$ y = e^{-x}\left(\cos 2x + \frac{1}{2}\sin 2x\right) $$

Pythonでの実装

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

x = np.linspace(0, 5, 500)

# Case 1: y'' + 3y' + 2y = 0, y(0)=1, y'(0)=0
def case1(t, y):
    return [y[1], -3*y[1] - 2*y[0]]

sol1 = solve_ivp(case1, [0, 5], [1, 0], t_eval=x)
y_exact1 = 2*np.exp(-x) - np.exp(-2*x)  # 解析解

# Case 2: y'' + 4y' + 4y = 0, y(0)=1, y'(0)=0
def case2(t, y):
    return [y[1], -4*y[1] - 4*y[0]]

sol2 = solve_ivp(case2, [0, 5], [1, 0], t_eval=x)
y_exact2 = (1 + 2*x)*np.exp(-2*x)  # 解析解

# Case 3: y'' + 2y' + 5y = 0, y(0)=1, y'(0)=0
def case3(t, y):
    return [y[1], -2*y[1] - 5*y[0]]

sol3 = solve_ivp(case3, [0, 5], [1, 0], t_eval=x)
y_exact3 = np.exp(-x)*(np.cos(2*x) + 0.5*np.sin(2*x))  # 解析解

fig, axes = plt.subplots(1, 3, figsize=(15, 4))

axes[0].plot(sol1.t, sol1.y[0], 'b-', linewidth=2, label='数値解')
axes[0].plot(x, y_exact1, 'r--', label='解析解')
axes[0].set_title('Case 1: $D > 0$(過減衰)')
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
axes[0].legend()
axes[0].grid(True, alpha=0.3)

axes[1].plot(sol2.t, sol2.y[0], 'b-', linewidth=2, label='数値解')
axes[1].plot(x, y_exact2, 'r--', label='解析解')
axes[1].set_title('Case 2: $D = 0$(臨界減衰)')
axes[1].set_xlabel('x')
axes[1].set_ylabel('y')
axes[1].legend()
axes[1].grid(True, alpha=0.3)

axes[2].plot(sol3.t, sol3.y[0], 'b-', linewidth=2, label='数値解')
axes[2].plot(x, y_exact3, 'r--', label='解析解')
axes[2].set_title('Case 3: $D < 0$(不足減衰振動)')
axes[2].set_xlabel('x')
axes[2].set_ylabel('y')
axes[2].legend()
axes[2].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('second_order_ode.png', dpi=150, bbox_inches='tight')
plt.show()

3つのケースの違いが明確に可視化されます。Case 1 は単調減衰、Case 2 は臨界減衰(最速で0に近づく)、Case 3 は振動しながら減衰します。

まとめ

本記事では、2階定数係数線形斉次ODEの解法を解説しました。

  • 解を $y = e^{\lambda x}$ と仮定して特性方程式 $a\lambda^2 + b\lambda + c = 0$ を導出
  • 判別式 $D = b^2 - 4ac$ により3つの場合に分類:
  • $D > 0$: $y = C_1 e^{\lambda_1 x} + C_2 e^{\lambda_2 x}$
  • $D = 0$: $y = (C_1 + C_2 x)e^{\lambda x}$
  • $D < 0$: $y = e^{\alpha x}(C_1 \cos\beta x + C_2 \sin\beta x)$
  • 初期条件で2つの定数 $C_1, C_2$ を決定

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