微分方程式は、未知関数とその導関数を含む方程式であり、自然科学や工学のあらゆる分野で現象を記述するために使われる最も重要な数学的ツールの一つです。ニュートンの運動方程式、熱伝導方程式、マクスウェル方程式、シュレーディンガー方程式など、物理学の根幹をなす方程式はすべて微分方程式です。
微分方程式を理解することは、物理現象の本質を数学的に捉え、さらにコンピュータでシミュレーションするための第一歩となります。本記事では、微分方程式の基本的な分類と概念を整理し、今後の学習の土台を築きます。
本記事の内容
- 微分方程式の定義
- 常微分方程式(ODE)と偏微分方程式(PDE)の違い
- 階数・線形性による分類
- 初期値問題と境界値問題
- 簡単な微分方程式のPython数値解法
微分方程式とは
微分方程式(differential equation)とは、未知関数 $y$ とその導関数 $y’, y”, \dots$ の間の関係を表す方程式です。
例えば、次のような方程式はすべて微分方程式です。
$$ \frac{dy}{dx} = ky \quad \text{(指数関数的増減)} $$
$$ m\frac{d^2x}{dt^2} = -kx \quad \text{(単振動)} $$
$$ \frac{\partial u}{\partial t} = \alpha \frac{\partial^2 u}{\partial x^2} \quad \text{(熱伝導方程式)} $$
微分方程式を「解く」とは、その方程式を満たす関数 $y(x)$ や $u(x, t)$ を見つけることです。
常微分方程式と偏微分方程式
微分方程式は、含まれる導関数の種類によって大きく2つに分類されます。
常微分方程式(ODE: Ordinary Differential Equation)
未知関数が1つの独立変数のみに依存する場合の微分方程式です。
$$ \frac{dy}{dx} = f(x, y) $$
$$ m\frac{d^2x}{dt^2} + c\frac{dx}{dt} + kx = F(t) $$
偏微分方程式(PDE: Partial Differential Equation)
未知関数が2つ以上の独立変数に依存する場合の微分方程式です。
$$ \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = 0 \quad \text{(ラプラス方程式)} $$
本記事シリーズでは、まず常微分方程式(ODE)を体系的に学びます。
階数による分類
微分方程式に含まれる最高階の導関数の階数を、その微分方程式の階数(order)と呼びます。
$$ \frac{dy}{dx} = xy \quad \text{(1階)} $$
$$ \frac{d^2y}{dx^2} + 3\frac{dy}{dx} + 2y = 0 \quad \text{(2階)} $$
$$ \frac{d^3y}{dx^3} – y = e^x \quad \text{(3階)} $$
一般に、$n$ 階の常微分方程式は次の形で書けます。
$$ F\left(x, y, y’, y”, \dots, y^{(n)}\right) = 0 $$
線形と非線形
線形微分方程式
未知関数 $y$ とその導関数が1次で現れ、互いの積を含まない方程式を線形微分方程式と呼びます。$n$ 階線形常微分方程式の一般形は次の通りです。
$$ a_n(x)y^{(n)} + a_{n-1}(x)y^{(n-1)} + \cdots + a_1(x)y’ + a_0(x)y = g(x) $$
ここで $a_0(x), a_1(x), \dots, a_n(x)$ と $g(x)$ は $x$ の既知の関数です。
- $g(x) = 0$ のとき:斉次(homogeneous)
- $g(x) \neq 0$ のとき:非斉次(nonhomogeneous)
非線形微分方程式
$y$ やその導関数が2次以上、あるいは互いの積として現れる場合は非線形です。
$$ \frac{dy}{dx} = y^2 \quad \text{(非線形:$y^2$が2次)} $$
$$ y\frac{d^2y}{dx^2} + \left(\frac{dy}{dx}\right)^2 = 0 \quad \text{(非線形:$y \cdot y”$の積)} $$
線形方程式は重ね合わせの原理が成り立つため、解析的に扱いやすいという重要な性質を持ちます。
一般解・特殊解・特異解
$n$ 階の常微分方程式の一般解は、$n$ 個の任意定数 $C_1, C_2, \dots, C_n$ を含みます。
$$ y = C_1 e^x + C_2 e^{-x} \quad \text{(2階ODEの一般解の例)} $$
特殊解(particular solution)は、初期条件や境界条件を適用して任意定数を決定した解です。
初期値問題と境界値問題
初期値問題(IVP: Initial Value Problem)
1つの点(通常 $x = x_0$)で関数値と導関数値が与えられる問題です。
$$ \frac{d^2y}{dx^2} + y = 0, \quad y(0) = 1, \quad y'(0) = 0 $$
時間発展を追う物理問題(運動方程式、回路方程式など)は初期値問題になります。
境界値問題(BVP: Boundary Value Problem)
2つ以上の異なる点で条件が与えられる問題です。
$$ \frac{d^2y}{dx^2} + y = 0, \quad y(0) = 0, \quad y(\pi) = 0 $$
構造力学(梁のたわみ)や定常状態の問題は境界値問題になります。
具体例
最も簡単な1階ODEの例を解いてみましょう。
$$ \frac{dy}{dx} = 2x, \quad y(0) = 1 $$
両辺を $x$ で積分すると、
$$ \begin{align} y &= \int 2x \, dx \\ &= x^2 + C \end{align} $$
初期条件 $y(0) = 1$ を代入すると、
$$ \begin{align} 1 &= 0^2 + C \\ C &= 1 \end{align} $$
よって、特殊解は $y = x^2 + 1$ です。
Pythonでの実装
微分方程式を数値的に解く基本的な方法を示します。scipy.integrate.solve_ivp を使って、1階ODEの初期値問題を解きます。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
# 例1: dy/dx = 2x, y(0) = 1
def ode_simple(x, y):
return 2 * x
sol1 = solve_ivp(ode_simple, [0, 3], [1], t_eval=np.linspace(0, 3, 100))
# 例2: dy/dx = -2y (指数減衰), y(0) = 5
def ode_decay(x, y):
return -2 * y
sol2 = solve_ivp(ode_decay, [0, 3], [5], t_eval=np.linspace(0, 3, 100))
# 例3: 単振動 x'' + ω²x = 0 → y1' = y2, y2' = -ω²y1
omega = 2 * np.pi # 角振動数
def ode_shm(t, y):
return [y[1], -omega**2 * y[0]]
sol3 = solve_ivp(ode_shm, [0, 3], [1, 0], t_eval=np.linspace(0, 3, 300))
# 可視化
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
axes[0].plot(sol1.t, sol1.y[0], 'b-', label='数値解')
axes[0].plot(sol1.t, sol1.t**2 + 1, 'r--', label='解析解 $y=x^2+1$')
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
axes[0].set_title("$y' = 2x$")
axes[0].legend()
axes[0].grid(True)
axes[1].plot(sol2.t, sol2.y[0], 'b-', label='数値解')
axes[1].plot(sol2.t, 5 * np.exp(-2 * sol2.t), 'r--', label='解析解 $y=5e^{-2x}$')
axes[1].set_xlabel('x')
axes[1].set_ylabel('y')
axes[1].set_title("$y' = -2y$(指数減衰)")
axes[1].legend()
axes[1].grid(True)
axes[2].plot(sol3.t, sol3.y[0], 'b-', label='変位 $x(t)$')
axes[2].plot(sol3.t, sol3.y[1] / omega, 'g-', alpha=0.7, label='速度 $v(t)/\\omega$')
axes[2].set_xlabel('t')
axes[2].set_ylabel('x')
axes[2].set_title("単振動 $x'' + \\omega^2 x = 0$")
axes[2].legend()
axes[2].grid(True)
plt.tight_layout()
plt.savefig('ode_examples.png', dpi=150, bbox_inches='tight')
plt.show()
このコードでは3つの代表的な微分方程式を数値的に解いています。1つ目は最も単純な $y’ = 2x$、2つ目は指数減衰 $y’ = -2y$(放射性崩壊やRC回路の放電)、3つ目は単振動 $x” + \omega^2 x = 0$(バネ-質点系)です。いずれも解析解と数値解がよく一致していることが確認できます。
まとめ
本記事では、微分方程式の基本的な分類と概念を解説しました。
- 微分方程式は未知関数とその導関数を含む方程式である
- 常微分方程式(ODE)は独立変数が1つ、偏微分方程式(PDE)は2つ以上
- 階数は最高階の導関数で決まる
- 線形方程式は重ね合わせの原理が成り立ち、扱いやすい
- 初期値問題は1点での条件、境界値問題は2点以上での条件が与えられる
- Pythonの
scipy.integrate.solve_ivpで数値的に解ける
次のステップとして、以下の記事も参考にしてください。