特性方程式と一般解の求め方

特性方程式は、定数係数線形常微分方程式を代数方程式に帰着させる強力な手法です。微分方程式を解く問題が多項式の根を求める問題に変換され、体系的に一般解を構成できます。

前の記事では2階の場合を扱いましたが、本記事では特性方程式の理論をより深く理解し、高階への拡張と重根の場合の処理を含めて解説します。

本記事の内容

  • 特性方程式の理論的背景
  • 高階定数係数ODEへの拡張
  • 重根の場合の独立解の構成
  • 具体的な計算例
  • Pythonによる解の可視化

前提知識

特性方程式の理論的背景

$n$ 階定数係数線形斉次ODEの一般形は、

$$ a_n y^{(n)} + a_{n-1} y^{(n-1)} + \cdots + a_1 y’ + a_0 y = 0 $$

です。$y = e^{\lambda x}$ を代入すると $y^{(k)} = \lambda^k e^{\lambda x}$ なので、

$$ \left(a_n \lambda^n + a_{n-1} \lambda^{n-1} + \cdots + a_1 \lambda + a_0\right) e^{\lambda x} = 0 $$

$e^{\lambda x} \neq 0$ より、特性方程式が得られます。

$$ \boxed{P(\lambda) = a_n \lambda^n + a_{n-1} \lambda^{n-1} + \cdots + a_1 \lambda + a_0 = 0} $$

代数学の基本定理より、$n$ 次多項式は(重複を込めて)$n$ 個の根を持ちます。

根の種類と対応する解

単根($\lambda_k$ が1重の実根)

$$ y_k = e^{\lambda_k x} $$

$m$ 重の実根 $\lambda$

重根 $\lambda$ の重複度が $m$ のとき、$m$ 個の独立解は

$$ e^{\lambda x}, \; xe^{\lambda x}, \; x^2 e^{\lambda x}, \; \dots, \; x^{m-1} e^{\lambda x} $$

$x^j e^{\lambda x}$($j = 0, 1, \dots, m-1$)が解であることは、$P(\lambda)$ を $(\lambda – \lambda_0)^m$ で因数分解して確認できます。

複素共役根 $\alpha \pm i\beta$(1重)

$$ e^{\alpha x} \cos \beta x, \quad e^{\alpha x} \sin \beta x $$

複素共役根 $\alpha \pm i\beta$($m$ 重)

$$ x^j e^{\alpha x} \cos \beta x, \quad x^j e^{\alpha x} \sin \beta x \quad (j = 0, 1, \dots, m-1) $$

一般解の構成

$n$ 個の独立解 $y_1, y_2, \dots, y_n$ が得られたら、一般解は線形結合です。

$$ y = C_1 y_1 + C_2 y_2 + \cdots + C_n y_n $$

具体例

例1: 3階ODE $y”’ – 6y” + 11y’ – 6y = 0$

特性方程式: $\lambda^3 – 6\lambda^2 + 11\lambda – 6 = 0$

因数分解: $(\lambda-1)(\lambda-2)(\lambda-3) = 0$

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

例2: 4階ODE $y^{(4)} + 2y” + y = 0$

特性方程式: $\lambda^4 + 2\lambda^2 + 1 = (\lambda^2 + 1)^2 = 0$

$\lambda = \pm i$(各2重)。$\alpha = 0, \beta = 1$ なので、

$$ y = (C_1 + C_2 x)\cos x + (C_3 + C_4 x)\sin x $$

例3: $y”’ – 3y” + 3y’ – y = 0$

特性方程式: $\lambda^3 – 3\lambda^2 + 3\lambda – 1 = (\lambda – 1)^3 = 0$

$\lambda = 1$(3重根)なので、

$$ y = (C_1 + C_2 x + C_3 x^2) e^x $$

Pythonでの実装

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

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

# 例1: y''' - 6y'' + 11y' - 6y = 0, y(0)=1, y'(0)=0, y''(0)=0
def ode1(t, y):
    return [y[1], y[2], 6*y[2] - 11*y[1] + 6*y[0]]

sol1 = solve_ivp(ode1, [0, 5], [1, 0, 0], t_eval=x, max_step=0.01)

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

sol2 = solve_ivp(ode2, [0, 15], [1, 0, 0, 0], t_eval=np.linspace(0, 15, 500))

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

sol3 = solve_ivp(ode3, [0, 4], [1, 1, 1], t_eval=np.linspace(0, 4, 300))

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

axes[0].plot(sol1.t, sol1.y[0], 'b-', linewidth=2)
axes[0].set_title("$y''' - 6y'' + 11y' - 6y = 0$\n(異なる3実根)")
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
axes[0].grid(True, alpha=0.3)

axes[1].plot(sol2.t, sol2.y[0], 'b-', linewidth=2)
axes[1].set_title("$y^{(4)} + 2y'' + y = 0$\n(2重複素根)")
axes[1].set_xlabel('x')
axes[1].set_ylabel('y')
axes[1].grid(True, alpha=0.3)

axes[2].plot(sol3.t, sol3.y[0], 'b-', linewidth=2)
axes[2].set_title("$y''' - 3y'' + 3y' - y = 0$\n(3重根 $\\lambda=1$)")
axes[2].set_xlabel('x')
axes[2].set_ylabel('y')
axes[2].grid(True, alpha=0.3)

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

まとめ

  • 特性方程式は $n$ 階定数係数線形ODEを $n$ 次代数方程式に帰着させる
  • 単根 $\lambda$ → $e^{\lambda x}$、$m$ 重根 → $x^j e^{\lambda x}$ ($j=0,\dots,m-1$)
  • 複素根 $\alpha \pm i\beta$ → $e^{\alpha x}\cos\beta x$ と $e^{\alpha x}\sin\beta x$
  • $n$ 個の独立解の線形結合が一般解

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