ラプラス変換で微分方程式を代数方程式に変換した後、最終的な解を得るには $s$ 領域から時間領域への変換、すなわち逆ラプラス変換が必要です。
本記事では、逆ラプラス変換の主要な方法を解説し、2次系の応答計算への応用を示します。
本記事の内容
- 逆ラプラス変換の定義
- 方法1: 変換対応表を利用する方法
- 方法2: 部分分数分解
- 方法3: ヘビサイドの展開定理
- 応用: 2次系のステップ応答
- Pythonでの計算と可視化
前提知識
逆ラプラス変換の定義
$F(s)$ の逆ラプラス変換は複素積分(ブロムウィッチ積分)で定義されます:
$$ \boxed{f(t) = \mathcal{L}^{-1}[F(s)] = \frac{1}{2\pi i}\int_{\gamma – i\infty}^{\gamma + i\infty}F(s)e^{st}\,ds} $$
ここで $\gamma$ は $F(s)$ の全ての特異点の右側にある実数です。
実用上はこの複素積分を直接計算することは少なく、以下の方法を使います。
方法1: 変換対応表の利用
ラプラス変換の性質と基本変換対を組み合わせて、$F(s)$ を既知の形に帰着させます。
基本変換対
| $F(s)$ | $f(t)$ |
|---|---|
| $1/s$ | $1$ |
| $1/s^2$ | $t$ |
| $n!/s^{n+1}$ | $t^n$ |
| $1/(s-a)$ | $e^{at}$ |
| $\omega/(s^2+\omega^2)$ | $\sin\omega t$ |
| $s/(s^2+\omega^2)$ | $\cos\omega t$ |
| $\omega/((s-a)^2+\omega^2)$ | $e^{at}\sin\omega t$ |
| $(s-a)/((s-a)^2+\omega^2)$ | $e^{at}\cos\omega t$ |
具体例
$$ F(s) = \frac{5}{s^2 + 9} $$
$\frac{\omega}{s^2+\omega^2}$ の形に合わせます。$\omega = 3$ として:
$$ F(s) = \frac{5}{3}\cdot\frac{3}{s^2+9} $$
$$ f(t) = \frac{5}{3}\sin 3t $$
方法2: 部分分数分解
$F(s)$ が有理関数 $P(s)/Q(s)$ の場合、部分分数分解により既知の形の和に分解します。
場合1: $Q(s)$ が異なる1次因子の積
$$ F(s) = \frac{P(s)}{(s-a_1)(s-a_2)\cdots(s-a_n)} $$
のとき:
$$ F(s) = \frac{A_1}{s-a_1} + \frac{A_2}{s-a_2} + \cdots + \frac{A_n}{s-a_n} $$
係数は $A_k = \lim_{s\to a_k}(s-a_k)F(s)$ で求まります。
具体例
$$ F(s) = \frac{3s+1}{(s+1)(s-2)} $$
$$ A_1 = \lim_{s\to -1}(s+1)\cdot\frac{3s+1}{(s+1)(s-2)} = \frac{3(-1)+1}{-1-2} = \frac{-2}{-3} = \frac{2}{3} $$
$$ A_2 = \lim_{s\to 2}(s-2)\cdot\frac{3s+1}{(s+1)(s-2)} = \frac{3(2)+1}{2+1} = \frac{7}{3} $$
$$ F(s) = \frac{2/3}{s+1} + \frac{7/3}{s-2} $$
$$ \boxed{f(t) = \frac{2}{3}e^{-t} + \frac{7}{3}e^{2t}} $$
場合2: 重複する1次因子
$$ F(s) = \frac{P(s)}{(s-a)^m \cdot Q_1(s)} $$
のとき、$(s-a)^m$ に対応する部分は:
$$ \frac{B_1}{s-a} + \frac{B_2}{(s-a)^2} + \cdots + \frac{B_m}{(s-a)^m} $$
係数は:
$$ B_k = \frac{1}{(m-k)!}\lim_{s\to a}\frac{d^{m-k}}{ds^{m-k}}\left[(s-a)^m F(s)\right] $$
具体例
$$ F(s) = \frac{1}{s(s+1)^2} $$
$$ \frac{A}{s} + \frac{B_1}{s+1} + \frac{B_2}{(s+1)^2} $$
$A = \lim_{s\to 0} sF(s) = \frac{1}{(0+1)^2} = 1$
$B_2 = \lim_{s\to -1}(s+1)^2 F(s) = \frac{1}{-1} = -1$
$B_1 = \lim_{s\to -1}\frac{d}{ds}\left[(s+1)^2 F(s)\right] = \lim_{s\to -1}\frac{d}{ds}\left[\frac{1}{s}\right] = \lim_{s\to -1}\left(-\frac{1}{s^2}\right) = -1$
$$ F(s) = \frac{1}{s} – \frac{1}{s+1} – \frac{1}{(s+1)^2} $$
$\mathcal{L}^{-1}[1/(s+1)^2] = te^{-t}$ なので:
$$ \boxed{f(t) = 1 – e^{-t} – te^{-t}} $$
場合3: 複素共役極(2次因子)
$$ F(s) = \frac{P(s)}{(s^2 + 2\alpha s + \alpha^2 + \beta^2)\cdot Q_1(s)} $$
のとき、2次因子に対応する部分は:
$$ \frac{As + B}{s^2 + 2\alpha s + \alpha^2 + \beta^2} = \frac{A(s+\alpha) + (B – A\alpha)}{(s+\alpha)^2 + \beta^2} $$
第1推移定理を使って逆変換します:
$$ \mathcal{L}^{-1}\left[\frac{A(s+\alpha)}{(s+\alpha)^2+\beta^2}\right] = Ae^{-\alpha t}\cos\beta t $$
$$ \mathcal{L}^{-1}\left[\frac{B-A\alpha}{(s+\alpha)^2+\beta^2}\right] = \frac{B-A\alpha}{\beta}e^{-\alpha t}\sin\beta t $$
方法3: ヘビサイドの展開定理
定理(単純極の場合)
$F(s) = P(s)/Q(s)$ において、$Q(s)$ が $n$ 個の単純零点 $s_1, s_2, \ldots, s_n$ を持ち、$P(s)$ の次数が $Q(s)$ より低いとき:
$$ \boxed{f(t) = \mathcal{L}^{-1}\left[\frac{P(s)}{Q(s)}\right] = \sum_{k=1}^{n}\frac{P(s_k)}{Q'(s_k)}e^{s_k t}} $$
証明
部分分数分解により:
$$ \frac{P(s)}{Q(s)} = \sum_{k=1}^{n}\frac{A_k}{s – s_k} $$
各係数は:
$$ A_k = \lim_{s\to s_k}(s-s_k)\frac{P(s)}{Q(s)} $$
$Q(s_k) = 0$ なので、ロピタルの定理を適用します:
$$ A_k = \lim_{s\to s_k}\frac{(s-s_k)P(s)}{Q(s)} = \lim_{s\to s_k}\frac{P(s) + (s-s_k)P'(s)}{Q'(s)} = \frac{P(s_k)}{Q'(s_k)} $$
したがって:
$$ f(t) = \sum_{k=1}^{n}\frac{P(s_k)}{Q'(s_k)}e^{s_k t} $$
具体例
$$ F(s) = \frac{2s + 3}{s^2 + 3s + 2} = \frac{2s+3}{(s+1)(s+2)} $$
$P(s) = 2s+3$, $Q(s) = s^2+3s+2$, $Q'(s) = 2s+3$
$s_1 = -1$: $\frac{P(-1)}{Q'(-1)} = \frac{1}{1} = 1$
$s_2 = -2$: $\frac{P(-2)}{Q'(-2)} = \frac{-1}{-1} = 1$
$$ \boxed{f(t) = e^{-t} + e^{-2t}} $$
複素極への拡張
複素共役極 $s = -\alpha \pm i\beta$ の場合も同じ公式が使えます。複素指数関数をオイラーの公式で実数化すると $e^{-\alpha t}\cos\beta t$ と $e^{-\alpha t}\sin\beta t$ の組み合わせになります。
応用: 2次系のステップ応答
2次系の伝達関数
2次系(質量-ばね-ダンパ系など)の伝達関数は:
$$ G(s) = \frac{\omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2} $$
ここで $\omega_n$ は固有角振動数、$\zeta$ は減衰比です。
ステップ入力 $U(s) = 1/s$ に対する応答
$$ Y(s) = G(s)\cdot\frac{1}{s} = \frac{\omega_n^2}{s(s^2 + 2\zeta\omega_n s + \omega_n^2)} $$
不足減衰($0 < \zeta < 1$)の場合
分母の2次因子の根は $s = -\zeta\omega_n \pm i\omega_d$ です。ここで $\omega_d = \omega_n\sqrt{1-\zeta^2}$ は減衰固有角振動数です。
部分分数分解すると:
$$ Y(s) = \frac{1}{s} – \frac{s + 2\zeta\omega_n}{s^2 + 2\zeta\omega_n s + \omega_n^2} $$
$$ = \frac{1}{s} – \frac{(s+\zeta\omega_n)}{(s+\zeta\omega_n)^2 + \omega_d^2} – \frac{\zeta\omega_n}{(s+\zeta\omega_n)^2 + \omega_d^2} $$
$$ = \frac{1}{s} – \frac{(s+\zeta\omega_n)}{(s+\zeta\omega_n)^2 + \omega_d^2} – \frac{\zeta}{\sqrt{1-\zeta^2}}\cdot\frac{\omega_d}{(s+\zeta\omega_n)^2 + \omega_d^2} $$
逆変換すると:
$$ \boxed{y(t) = 1 – e^{-\zeta\omega_n t}\left(\cos\omega_d t + \frac{\zeta}{\sqrt{1-\zeta^2}}\sin\omega_d t\right)} $$
三角関数を合成すると、より簡潔な形になります:
$$ y(t) = 1 – \frac{1}{\sqrt{1-\zeta^2}}e^{-\zeta\omega_n t}\sin(\omega_d t + \phi) $$
ここで $\phi = \arctan\frac{\sqrt{1-\zeta^2}}{\zeta}$ です。
導出の詳細
部分分数分解のステップを示します。
$$ Y(s) = \frac{\omega_n^2}{s(s^2 + 2\zeta\omega_n s + \omega_n^2)} = \frac{A}{s} + \frac{Bs + C}{s^2 + 2\zeta\omega_n s + \omega_n^2} $$
分子を比較します:
$$ \omega_n^2 = A(s^2 + 2\zeta\omega_n s + \omega_n^2) + (Bs + C)s $$
$s = 0$: $\omega_n^2 = A\omega_n^2$ より $A = 1$
$s^2$ の係数: $0 = A + B$ より $B = -1$
$s$ の係数: $0 = 2\zeta\omega_n A + C$ より $C = -2\zeta\omega_n$
よって:
$$ Y(s) = \frac{1}{s} – \frac{s + 2\zeta\omega_n}{s^2 + 2\zeta\omega_n s + \omega_n^2} $$
第2項を平方完成します。$s^2 + 2\zeta\omega_n s + \omega_n^2 = (s+\zeta\omega_n)^2 + \omega_n^2(1-\zeta^2) = (s+\zeta\omega_n)^2 + \omega_d^2$
$$ \frac{s + 2\zeta\omega_n}{(s+\zeta\omega_n)^2 + \omega_d^2} = \frac{(s+\zeta\omega_n) + \zeta\omega_n}{(s+\zeta\omega_n)^2 + \omega_d^2} $$
$$ = \frac{s+\zeta\omega_n}{(s+\zeta\omega_n)^2 + \omega_d^2} + \frac{\zeta\omega_n}{\omega_d}\cdot\frac{\omega_d}{(s+\zeta\omega_n)^2 + \omega_d^2} $$
第1推移定理を用いて逆変換すると先の結果が得られます。
Pythonでの可視化
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 15, 1000)
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# --- (1) 部分分数分解の例: f(t) = (2/3)e^{-t} + (7/3)e^{2t} ---
# F(s) = (3s+1)/((s+1)(s-2))
f1 = (2/3)*np.exp(-t) + (7/3)*np.exp(2*t)
# t が大きいと発散するので制限
mask = f1 < 20
t_masked = t[mask]
f1_masked = f1[mask]
axes[0, 0].plot(t_masked, f1_masked, 'b-', lw=2)
axes[0, 0].set_title('$f(t) = \\frac{2}{3}e^{-t} + \\frac{7}{3}e^{2t}$', fontsize=13)
axes[0, 0].set_xlabel('$t$'); axes[0, 0].set_ylabel('$f(t)$')
axes[0, 0].grid(True, alpha=0.3)
axes[0, 0].set_ylim(-1, 20)
# --- (2) 重複極の例: f(t) = 1 - e^{-t} - t*e^{-t} ---
f2 = 1 - np.exp(-t) - t*np.exp(-t)
axes[0, 1].plot(t, f2, 'r-', lw=2)
axes[0, 1].axhline(1.0, color='gray', ls='--', alpha=0.5, label='$y=1$')
axes[0, 1].set_title('$f(t) = 1 - e^{-t} - te^{-t}$', fontsize=13)
axes[0, 1].set_xlabel('$t$'); axes[0, 1].set_ylabel('$f(t)$')
axes[0, 1].legend(fontsize=11)
axes[0, 1].grid(True, alpha=0.3)
# --- (3) ヘビサイドの展開定理の例 ---
f3 = np.exp(-t) + np.exp(-2*t)
axes[1, 0].plot(t, f3, 'g-', lw=2)
axes[1, 0].set_title('Heaviside: $f(t) = e^{-t} + e^{-2t}$', fontsize=13)
axes[1, 0].set_xlabel('$t$'); axes[1, 0].set_ylabel('$f(t)$')
axes[1, 0].grid(True, alpha=0.3)
# --- (4) 2次系のステップ応答(減衰比による比較) ---
omega_n = 1.0
zeta_list = [0.1, 0.3, 0.5, 0.7, 1.0, 1.5]
colors = plt.cm.viridis(np.linspace(0, 0.9, len(zeta_list)))
for zeta, color in zip(zeta_list, colors):
if zeta < 1.0:
omega_d = omega_n * np.sqrt(1 - zeta**2)
phi = np.arctan2(np.sqrt(1 - zeta**2), zeta)
y = 1 - (1/np.sqrt(1-zeta**2)) * np.exp(-zeta*omega_n*t) * np.sin(omega_d*t + phi)
elif zeta == 1.0:
# 臨界減衰
y = 1 - (1 + omega_n*t) * np.exp(-omega_n*t)
else:
# 過減衰
s1 = -zeta*omega_n + omega_n*np.sqrt(zeta**2 - 1)
s2 = -zeta*omega_n - omega_n*np.sqrt(zeta**2 - 1)
y = 1 + (s1*np.exp(s2*t) - s2*np.exp(s1*t)) / (omega_n**2 * (1/(s1) - 1/(s2)) * s1 * s2 / omega_n**2)
# 直接公式
r1 = omega_n * (-zeta + np.sqrt(zeta**2 - 1))
r2 = omega_n * (-zeta - np.sqrt(zeta**2 - 1))
y = 1 + (r1*np.exp(r2*t) - r2*np.exp(r1*t)) / (r2 - r1)
axes[1, 1].plot(t, y, lw=2, color=color, label=f'$\\zeta={zeta}$')
axes[1, 1].axhline(1.0, color='gray', ls='--', alpha=0.5)
axes[1, 1].set_title('Step response of 2nd-order system', fontsize=13)
axes[1, 1].set_xlabel('$t$'); axes[1, 1].set_ylabel('$y(t)$')
axes[1, 1].legend(fontsize=10, loc='lower right')
axes[1, 1].grid(True, alpha=0.3)
axes[1, 1].set_xlim(0, 15); axes[1, 1].set_ylim(-0.1, 1.8)
plt.tight_layout()
plt.savefig('inverse_laplace.png', dpi=150, bbox_inches='tight')
plt.show()
SymPyによる逆ラプラス変換の自動計算も確認しておきましょう。
import sympy as sp
s, t = sp.symbols('s t', positive=True)
# 例1: 部分分数分解
F1 = (3*s + 1) / ((s + 1)*(s - 2))
f1 = sp.inverse_laplace_transform(F1, s, t)
print("例1:", sp.simplify(f1))
# 例2: 重複極
F2 = 1 / (s * (s + 1)**2)
f2 = sp.inverse_laplace_transform(F2, s, t)
print("例2:", sp.simplify(f2))
# 例3: ヘビサイドの展開定理
F3 = (2*s + 3) / (s**2 + 3*s + 2)
f3 = sp.inverse_laplace_transform(F3, s, t)
print("例3:", sp.simplify(f3))
# 例4: 複素極
F4 = 1 / (s**2 + 2*s + 5)
f4 = sp.inverse_laplace_transform(F4, s, t)
print("例4:", sp.simplify(f4))
# 例5: 2次系ステップ応答(ζ=0.5, ωn=2)
omega_n, zeta = 2, sp.Rational(1, 2)
F5 = omega_n**2 / (s * (s**2 + 2*zeta*omega_n*s + omega_n**2))
f5 = sp.inverse_laplace_transform(F5, s, t)
print("例5:", sp.simplify(f5))
まとめ
本記事では、逆ラプラス変換の3つの方法を解説しました。
- 変換対応表: 基本変換対に帰着させる最もシンプルな方法
- 部分分数分解: 有理関数を単純な分数の和に分解(異なる実極、重複極、複素極に対応)
- ヘビサイドの展開定理: 単純極の場合に $f(t) = \sum P(s_k)/Q'(s_k) \cdot e^{s_k t}$ で直接計算
- 2次系のステップ応答: 減衰比 $\zeta$ によって不足減衰・臨界減衰・過減衰の3パターン
逆ラプラス変換の実行に困ったら、まず部分分数分解を試みるのが最も汎用的なアプローチです。
次のステップとして、以下の記事も参考にしてください。