状態空間モデルの定義と構成を理解する

天気予報を考えてみましょう。明日の天気を予測するには、今日の気温、気圧、湿度、風速など、大気の「状態」を知る必要があります。これらの状態変数が時間とともにどう変化するかの法則(気象モデル)がわかれば、将来の天気を予測できます。

制御工学における状態空間モデル(state-space model)は、まさにこのアイデアを数学的に定式化したものです。システムの「状態」を表す変数の組(状態ベクトル)を定義し、状態の時間発展と出力の関係を行列方程式で記述します。古典制御の伝達関数が入出力関係のみを記述するのに対し、状態空間モデルはシステムの内部の動きまで記述できるのが大きな特長です。

状態空間モデルを理解すると、以下のような応用が開けます。

  • 多入力多出力(MIMO)系の統一的な扱い: 伝達関数では複雑になるMIMO系を行列で簡潔に表現できる
  • 最適制御: LQR制御やカルマンフィルタなど、現代制御理論の全てが状態空間モデルに基づいている
  • 数値シミュレーション: コンピュータでのシステムシミュレーションは状態空間モデルが最も扱いやすい
  • 非線形システムへの拡張: 線形化を通じて非線形システムの解析にも適用できる

本記事の内容

  • 状態変数と状態空間の直感的理解
  • 状態空間モデルの数学的定義
  • 伝達関数との相互変換
  • 状態方程式の解(行列指数関数)
  • Pythonでの実装と可視化

前提知識

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

状態変数とは — システムの「今」を完全に記述する変数

直感的な理解

「状態」とは、「システムの将来の振る舞いを予測するために必要な、現在の情報の最小集合」です。

この定義を日常の例で考えてみましょう。ビリヤードのボールが衝突した瞬間の写真を1枚見ただけでは、ボールが次にどこへ行くか予測できません。ボールの「位置」はわかりますが、「速度」(方向と速さ)がわからないからです。動画のもう1フレームがあれば速度がわかり、将来の軌道を予測できます。つまり、ビリヤードボール1つの状態は「位置」と「速度」の2つの変数で完全に記述されます。

たとえば、ボールを投げたとき、将来の軌道を予測するには「現在の位置」と「現在の速度」が必要です。加速度は重力から計算できるので、状態変数には含めなくてよいです。つまり状態ベクトルは $\bm{x} = [x, \dot{x}, y, \dot{y}]^T$ です。

ここで重要なのは、状態変数の選び方には自由度があるということです。たとえば、位置 $x$ と速度 $\dot{x}$ の代わりに、位置 $x$ と運動量 $p = m\dot{x}$ を選んでも構いません。どちらの選び方でもシステムの将来を完全に予測できます。ただし、一般に「エネルギーを蓄える要素に対応する変数」が自然な状態変数となることが多いです。

もう一つの例として、RLC回路を考えます。コンデンサの電圧 $v_C$ とインダクタの電流 $i_L$ を知っていれば、回路の将来の振る舞いが完全に決まります。なぜなら、コンデンサに蓄えられたエネルギー $\frac{1}{2}Cv_C^2$ とインダクタに蓄えられたエネルギー $\frac{1}{2}Li_L^2$ がシステムの全エネルギーを表すからです。抵抗はエネルギーを蓄えずに散逸させるだけなので、抵抗に関する変数は状態変数に含める必要がありません。

一般に、状態変数の個数はシステムの「独立なエネルギー蓄積要素の数」に等しくなります。機械系ではばね(ポテンシャルエネルギー)と質量(運動エネルギー)、電気回路ではコンデンサ(電場エネルギー)とインダクタ(磁場エネルギー)がそれぞれ1つの状態変数に対応します。

数学的定義

状態ベクトル $\bm{x}(t) \in \mathbb{R}^n$: システムの状態を表す $n$ 個の変数の列ベクトル。$n$ をシステムの次数(order)または状態の次元と呼びます。

入力ベクトル $\bm{u}(t) \in \mathbb{R}^m$: システムへの $m$ 個の入力。

出力ベクトル $\bm{y}(t) \in \mathbb{R}^p$: システムの $p$ 個の出力。

連続時間線形時不変システムの状態空間モデルは、次の2つの方程式で定義されます。

状態方程式: $$ \begin{equation} \dot{\bm{x}}(t) = \bm{A}\bm{x}(t) + \bm{B}\bm{u}(t) \end{equation} $$

出力方程式: $$ \begin{equation} \bm{y}(t) = \bm{C}\bm{x}(t) + \bm{D}\bm{u}(t) \end{equation} $$

ここで

  • $\bm{A} \in \mathbb{R}^{n \times n}$: システム行列(状態行列)
  • $\bm{B} \in \mathbb{R}^{n \times m}$: 入力行列
  • $\bm{C} \in \mathbb{R}^{p \times n}$: 出力行列
  • $\bm{D} \in \mathbb{R}^{p \times m}$: 直達行列(多くの物理システムで $\bm{D} = \bm{0}$)

この4つの行列 $(\bm{A}, \bm{B}, \bm{C}, \bm{D})$ がシステムを完全に特徴づけます。

各行列の物理的意味を丁寧に確認しましょう。

システム行列 $\bm{A}$ はシステムの内部構造を記述する最も重要な行列です。入力がない場合、$\dot{\bm{x}} = \bm{A}\bm{x}$ となり、$\bm{A}$ だけでシステムの自由応答が決まります。$\bm{A}$ の固有値がすべて負の実部を持てばシステムは安定(状態がゼロに収束)であり、正の実部を持つ固有値があればシステムは不安定(状態が発散)です。また、固有値の虚部は振動の角周波数に対応します。たとえば、固有値が $-1 \pm 2i$ であれば、減衰定数1で角周波数2の減衰振動が起きます。

入力行列 $\bm{B}$ は、外部入力がどのように各状態変数に影響するかを記述します。$\bm{B}$ のある行がゼロであれば、対応する状態変数は入力から直接的な影響を受けないということです。

出力行列 $\bm{C}$ は、どの状態変数の組み合わせが出力として観測されるかを記述します。たとえば $\bm{C} = [1, 0]$ であれば、第1状態変数(位置)のみが出力されるという意味です。

直達行列 $\bm{D}$ は、入力が出力に直接(状態を経由せずに)影響する場合に使われます。多くの物理システムではこのような直接的なパスは存在しないため $\bm{D} = \bm{0}$ とされますが、回路のフィードスルーやセンサーの直達特性がある場合にはゼロでない値を取ります。

古典制御との対比

古典制御では、システムの特性を伝達関数 $G(s) = Y(s)/U(s)$ で記述します。これは入力と出力の関係のみを表しており、システムの「内部の状態」は見えません。たとえるなら、伝達関数はシステムを「ブラックボックス」として扱っているのです。

一方、状態空間モデルはシステムの「内部構造」まで記述します。これは「ブラックボックス」の蓋を開けて、内部の歯車がどのように噛み合っているかを見るようなものです。この内部構造が見えることで、古典制御では扱えなかった問題 — 多入力多出力(MIMO)系の設計、最適制御、オブザーバの設計など — が可能になります。

状態空間モデルの基本構造を理解したところで、次に伝達関数との間の数学的な変換関係を導出しましょう。

伝達関数との関係

状態空間モデルから伝達関数への変換

状態空間モデルと伝達関数は同じシステムの異なる表現方法です。ここでは、状態空間表現 $(\bm{A}, \bm{B}, \bm{C}, \bm{D})$ から伝達関数 $\bm{G}(s)$ を導出する手順を、一歩ずつ追っていきます。

状態方程式のラプラス変換を取ると(初期値ゼロ)

$$ s\bm{X}(s) = \bm{A}\bm{X}(s) + \bm{B}\bm{U}(s) $$

$\bm{X}(s)$ について解くと

$$ (s\bm{I} – \bm{A})\bm{X}(s) = \bm{B}\bm{U}(s) $$

$$ \bm{X}(s) = (s\bm{I} – \bm{A})^{-1}\bm{B}\bm{U}(s) $$

出力方程式から

$$ \bm{Y}(s) = \bm{C}\bm{X}(s) + \bm{D}\bm{U}(s) = [\bm{C}(s\bm{I} – \bm{A})^{-1}\bm{B} + \bm{D}]\bm{U}(s) $$

したがって伝達関数行列は

$$ \begin{equation} \bm{G}(s) = \bm{C}(s\bm{I} – \bm{A})^{-1}\bm{B} + \bm{D} \end{equation} $$

SISO(単入力単出力)の場合、これはスカラーの伝達関数になります。

$(s\bm{I} – \bm{A})^{-1}$ の分母は $\det(s\bm{I} – \bm{A})$ であり、これは $\bm{A}$ の特性多項式です。特性多項式の根は $\bm{A}$ の固有値であり、システムの極に対応します。

この導出において、$s\bm{I} – \bm{A}$ が正則(逆行列が存在する)であるためには、$s$ が $\bm{A}$ の固有値でない必要があります。$s$ が固有値に等しいとき、$\det(s\bm{I} – \bm{A}) = 0$ となり、伝達関数は極(ポール)を持ちます。

具体例: ばね-マス-ダンパ系

理論の式だけでは抽象的なので、具体的な力学系を例にとって状態空間モデルを構築してみましょう。ばね-マス-ダンパ系は制御工学における最も基本的な例題であり、自動車のサスペンション、ビルの制振装置、スピーカーの振動板など、あらゆる振動系のモデルです。

質量 $m$、ばね定数 $k$、減衰係数 $c$ のシステムで、入力を外力 $F$、出力を変位 $x$ とします。

運動方程式はニュートンの第2法則から

$$ m\ddot{x} + c\dot{x} + kx = F $$

です。この2階微分方程式を1階微分方程式の連立系に書き換えるために、状態変数 $x_1 = x$(位置), $x_2 = \dot{x}$(速度)を導入します。すると $\dot{x}_1 = x_2$(位置の時間微分は速度)であり、運動方程式から $\dot{x}_2 = \ddot{x} = (F – c\dot{x} – kx)/m = -kx_1/m – cx_2/m + F/m$ が得られます。

行列形式で書くと

$$ \begin{bmatrix} \dot{x}_1 \\ \dot{x}_2 \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ -k/m & -c/m \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} + \begin{bmatrix} 0 \\ 1/m \end{bmatrix} F $$

$$ y = \begin{bmatrix} 1 & 0 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} $$

ここから伝達関数を求めてみましょう。$\bm{A}$ の特性多項式は

$$ \det(s\bm{I} – \bm{A}) = \det\begin{bmatrix} s & -1 \\ k/m & s + c/m \end{bmatrix} = s(s + c/m) + k/m = s^2 + \frac{c}{m}s + \frac{k}{m} $$

これをクラメルの公式を用いて $(s\bm{I} – \bm{A})^{-1}$ を計算し、$\bm{G}(s) = \bm{C}(s\bm{I} – \bm{A})^{-1}\bm{B}$ に代入すると

$$ G(s) = \frac{1/m}{s^2 + (c/m)s + k/m} $$

これは2次系の標準的な伝達関数形式 $G(s) = \omega_n^2/(s^2 + 2\zeta\omega_n s + \omega_n^2)$ と比較すると、固有角振動数 $\omega_n = \sqrt{k/m}$、減衰比 $\zeta = c/(2\sqrt{mk})$ であることがわかります。

伝達関数から状態空間モデルへの変換

逆方向の変換、すなわち伝達関数から状態空間モデルへの変換も重要です。伝達関数

$$ G(s) = \frac{b_1 s + b_0}{s^2 + a_1 s + a_0} $$

が与えられたとき、可制御標準形として次の状態空間表現が得られます。

$$ \bm{A} = \begin{bmatrix} 0 & 1 \\ -a_0 & -a_1 \end{bmatrix}, \quad \bm{B} = \begin{bmatrix} 0 \\ 1 \end{bmatrix} $$

$$ \bm{C} = \begin{bmatrix} b_0 & b_1 \end{bmatrix}, \quad \bm{D} = [0] $$

重要なのは、同じ伝達関数に対して状態空間表現は一意ではないということです。状態変数の選び方(座標変換)によって異なる $(\bm{A}, \bm{B}, \bm{C}, \bm{D})$ が得られますが、入出力関係(伝達関数)は同じです。可制御標準形のほかに、可観測標準形、対角標準形(モード分解)などがあり、目的に応じて使い分けます。

伝達関数との相互変換を理解したところで、次は状態方程式の解を導出しましょう。スカラーの微分方程式 $\dot{x} = ax$ の解が $x(t) = e^{at}x(0)$ であるように、行列の微分方程式の解には行列指数関数が登場します。

状態方程式の解

行列指数関数

スカラーの微分方程式 $\dot{x} = ax$ の解が $x(t) = e^{at}x(0)$ であることは、指数関数の微分 $\frac{d}{dt}e^{at} = ae^{at}$ から容易に確認できます。この考え方をそのまま行列に拡張するのが行列指数関数です。

入力がない場合($\bm{u} = \bm{0}$)の状態方程式 $\dot{\bm{x}} = \bm{A}\bm{x}$ の解は

$$ \begin{equation} \bm{x}(t) = e^{\bm{A}t}\bm{x}(0) \end{equation} $$

ここで $e^{\bm{A}t}$ は行列指数関数(matrix exponential)であり、スカラーの指数関数のテイラー展開を行列に拡張する形で定義されます。

$$ e^{\bm{A}t} = \bm{I} + \bm{A}t + \frac{(\bm{A}t)^2}{2!} + \frac{(\bm{A}t)^3}{3!} + \cdots = \sum_{k=0}^{\infty} \frac{(\bm{A}t)^k}{k!} $$

この級数が収束することは、行列のノルムに関する評価 $\|e^{\bm{A}t}\| \leq e^{\|\bm{A}\|t}$ から保証されます。

$e^{\bm{A}t}$ は状態遷移行列(state transition matrix)$\bm{\Phi}(t)$ とも呼ばれ、以下の重要な性質を持ちます。

  • 初期条件: $e^{\bm{A} \cdot 0} = \bm{I}$($t = 0$ では状態は変化しない)
  • 群の性質: $e^{\bm{A}(t_1 + t_2)} = e^{\bm{A}t_1}e^{\bm{A}t_2}$(時間の加法性)
  • 逆行列: $(e^{\bm{A}t})^{-1} = e^{-\bm{A}t}$(時間を逆行させると元に戻る)
  • 微分: $\frac{d}{dt}e^{\bm{A}t} = \bm{A}e^{\bm{A}t} = e^{\bm{A}t}\bm{A}$

行列指数関数の計算方法はいくつかあります。$\bm{A}$ が対角化可能な場合($\bm{A} = \bm{P}\bm{\Lambda}\bm{P}^{-1}$、$\bm{\Lambda} = \text{diag}(\lambda_1, \ldots, \lambda_n)$)は

$$ e^{\bm{A}t} = \bm{P} \begin{bmatrix} e^{\lambda_1 t} & & \\ & \ddots & \\ & & e^{\lambda_n t} \end{bmatrix} \bm{P}^{-1} $$

と計算できます。各固有値 $\lambda_i$ に対応する成分 $e^{\lambda_i t}$ が時間とともにどう振る舞うかが、システムの動的特性を決めます。$\lambda_i$ の実部が負であれば $e^{\lambda_i t} \to 0$(減衰)、正であれば $e^{\lambda_i t} \to \infty$(発散)、虚部があれば振動します。

入力がある場合の一般解は、スカラーの場合と同様に「畳み込み積分」の形で表されます。

$$ \begin{equation} \bm{x}(t) = e^{\bm{A}t}\bm{x}(0) + \int_0^t e^{\bm{A}(t-\tau)}\bm{B}\bm{u}(\tau) \, d\tau \end{equation} $$

第1項は自由応答(初期値からの応答)であり、入力がなくても初期状態から自然に発展する部分です。第2項は強制応答(入力による応答)であり、各時刻 $\tau$ での入力 $\bm{u}(\tau)$ が、$\bm{B}$ を通じて状態に注入され、それが $t – \tau$ 秒間にわたって $e^{\bm{A}(t-\tau)}$ で発展した結果の累積です。この畳み込み構造は、線形システムの「因果性」と「時不変性」を反映しています。

理論的な解の形がわかったところで、Pythonで具体的にシステムの挙動を計算・可視化してみましょう。

Pythonでの実装と可視化

状態空間モデルの構築と応答

import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
from scipy.linalg import expm

# ばね-マス-ダンパ系
m, c, k = 1.0, 0.5, 4.0

A = np.array([[0, 1], [-k/m, -c/m]])
B = np.array([[0], [1/m]])
C = np.array([[1, 0]])
D = np.array([[0]])

sys_ss = ctrl.StateSpace(A, B, C, D)
sys_tf = ctrl.ss2tf(sys_ss)

print("=== 状態空間モデル ===")
print(f"A = {A}")
print(f"B = {B.flatten()}")
print(f"C = {C.flatten()}")
print(f"固有値: {np.linalg.eigvals(A)}")
print(f"\n=== 伝達関数 ===")
print(sys_tf)

# ステップ応答
t = np.linspace(0, 15, 500)
t_out, y_out = ctrl.step_response(sys_ss, T=t)

# 状態遷移行列の可視化
fig, axes = plt.subplots(2, 2, figsize=(14, 9))

# ステップ応答
ax = axes[0, 0]
ax.plot(t_out, y_out, linewidth=2.5, color="steelblue")
ax.axhline(1/k, color="red", linestyle="--", alpha=0.5,
           label=f"Steady state = 1/k = {1/k:.2f}")
ax.set_xlabel("Time [s]", fontsize=11)
ax.set_ylabel("Displacement x", fontsize=11)
ax.set_title("Step Response (State-space model)", fontsize=12)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# 状態空間の軌跡
ax = axes[0, 1]
# 初期値からの自由応答
x0_list = [
    np.array([1, 0]),
    np.array([0, 1]),
    np.array([-1, 0]),
    np.array([0.5, 0.5]),
]
for x0 in x0_list:
    x_traj = []
    for ti in t:
        x_t = expm(A * ti) @ x0
        x_traj.append(x_t)
    x_traj = np.array(x_traj)
    ax.plot(x_traj[:, 0], x_traj[:, 1], linewidth=1.5)
    ax.plot(x0[0], x0[1], "o", markersize=8)
    ax.plot(x_traj[-1, 0], x_traj[-1, 1], "x", markersize=8, color="red")

ax.set_xlabel("$x_1$ (position)", fontsize=11)
ax.set_ylabel("$x_2$ (velocity)", fontsize=11)
ax.set_title("State Trajectories (Free Response)", fontsize=12)
ax.grid(True, alpha=0.3)

# 行列指数関数の要素
ax = axes[1, 0]
phi_elements = np.zeros((len(t), 4))
for i, ti in enumerate(t):
    phi = expm(A * ti)
    phi_elements[i] = phi.flatten()

ax.plot(t, phi_elements[:, 0], linewidth=2, label=r"$\Phi_{11}$")
ax.plot(t, phi_elements[:, 1], linewidth=2, label=r"$\Phi_{12}$")
ax.plot(t, phi_elements[:, 2], linewidth=2, label=r"$\Phi_{21}$")
ax.plot(t, phi_elements[:, 3], linewidth=2, label=r"$\Phi_{22}$")
ax.set_xlabel("Time [s]", fontsize=11)
ax.set_ylabel("Value", fontsize=11)
ax.set_title(r"State Transition Matrix $\Phi(t) = e^{At}$", fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# 伝達関数との一致確認
ax = axes[1, 1]
t_ss, y_ss = ctrl.step_response(sys_ss, T=t)
t_tf, y_tf = ctrl.step_response(sys_tf, T=t)
ax.plot(t_ss, y_ss, linewidth=2.5, color="steelblue", label="State-space")
ax.plot(t_tf, y_tf, linewidth=2, color="red", linestyle="--", label="Transfer function")
ax.set_xlabel("Time [s]", fontsize=11)
ax.set_ylabel("Output", fontsize=11)
ax.set_title("SS vs TF: Step Response Comparison", fontsize=12)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

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

この結果から、状態空間モデルの特性が包括的に理解できます。

  1. ステップ応答(左上): ばね-マス-ダンパ系の典型的な減衰振動応答です。初期には振動的にオーバーシュートしますが、減衰により定常値 $1/k = 0.25$ に収束しています。収束の速さは固有値の実部($-c/(2m) = -0.25$)で決まり、振動の周波数は虚部($\sqrt{k/m – (c/(2m))^2} \approx 1.97$ rad/s)で決まります。ステップ入力の大きさを変えても応答の形は相似的に変わるだけであり、これが線形システムの特徴です。

  2. 状態軌跡(右上): 異なる初期値(丸印)から出発した状態が、全て原点(平衡点)に収束する様子が渦巻き状の軌跡で表されています。渦巻きの形は固有値の実部(減衰)と虚部(振動)を反映しています。全ての軌跡が原点に向かうことから、このシステムが漸近安定であることが視覚的に確認できます。もし固有値の実部が正であれば、軌跡は原点から離れていく渦巻きになるでしょう。

  3. 状態遷移行列(左下): $e^{\bm{A}t}$ の各要素が時間とともに減衰振動する様子が見えます。全要素が $t \to \infty$ でゼロに収束することは、$\bm{A}$ の固有値の実部が全て負(安定)であることを意味します。$\Phi_{12}$ の要素は速度が位置に与える影響を表し、$\Phi_{21}$ は位置が速度に与える影響を表しています。

  4. SS vs TF(右下): 状態空間モデルと伝達関数で計算したステップ応答が完全に一致しています。青い実線(状態空間)と赤い破線(伝達関数)が完全に重なっており、両者が数学的に等価な表現であることが数値的にも確認できます。

具体的な計算例

状態空間モデルの理論を具体的な数値例で確認しましょう。手計算で行列指数関数を求めることで、理論の理解が深まります。

例1: 対角行列の行列指数関数

$\bm{A} = \begin{bmatrix} -1 & 0 \\ 0 & -3 \end{bmatrix}$ の場合、$\bm{A}$ は既に対角行列なので、行列指数関数は

$$ e^{\bm{A}t} = \begin{bmatrix} e^{-t} & 0 \\ 0 & e^{-3t} \end{bmatrix} $$

初期状態 $\bm{x}(0) = [1, 1]^T$ からの自由応答は

$$ \bm{x}(t) = \begin{bmatrix} e^{-t} & 0 \\ 0 & e^{-3t} \end{bmatrix}\begin{bmatrix} 1 \\ 1 \end{bmatrix} = \begin{bmatrix} e^{-t} \\ e^{-3t} \end{bmatrix} $$

$x_1$ は時定数1で減衰し、$x_2$ は時定数1/3で3倍速く減衰します。物理的には、システムに2つの独立な減衰モードがあり、速いモード($\lambda = -3$)が先に消えて、遅いモード($\lambda = -1$)が長時間の振る舞いを支配します。

例2: 非対角行列の行列指数関数

$\bm{A} = \begin{bmatrix} 0 & 1 \\ -2 & -3 \end{bmatrix}$ の場合を考えます。まず固有値を求めます。

$$ \det(s\bm{I} – \bm{A}) = s(s + 3) + 2 = s^2 + 3s + 2 = (s + 1)(s + 2) = 0 $$

固有値は $\lambda_1 = -1$, $\lambda_2 = -2$ です。

$\lambda_1 = -1$ に対する固有ベクトル:$(s\bm{I} – \bm{A})|_{s=-1}\bm{v} = \bm{0}$ より

$$ \begin{bmatrix} -1 & -1 \\ 2 & 2 \end{bmatrix}\bm{v} = \bm{0} \quad \Rightarrow \quad \bm{v}_1 = \begin{bmatrix} 1 \\ -1 \end{bmatrix} $$

$\lambda_2 = -2$ に対する固有ベクトル:同様に $\bm{v}_2 = \begin{bmatrix} 1 \\ -2 \end{bmatrix}$ です。

固有ベクトル行列とその逆行列は

$$ \bm{P} = \begin{bmatrix} 1 & 1 \\ -1 & -2 \end{bmatrix}, \quad \bm{P}^{-1} = \begin{bmatrix} 2 & 1 \\ -1 & -1 \end{bmatrix} $$

したがって行列指数関数は

$$ e^{\bm{A}t} = \bm{P}\begin{bmatrix} e^{-t} & 0 \\ 0 & e^{-2t} \end{bmatrix}\bm{P}^{-1} = \begin{bmatrix} 2e^{-t} – e^{-2t} & e^{-t} – e^{-2t} \\ -2e^{-t} + 2e^{-2t} & -e^{-t} + 2e^{-2t} \end{bmatrix} $$

$t = 0$ で $e^{\bm{A} \cdot 0} = \bm{I}$ となることを確認できます。$2 \cdot 1 – 1 = 1$, $1 – 1 = 0$, $-2 + 2 = 0$, $-1 + 2 = 1$ で確かに単位行列です。

例3: RLC回路の状態空間モデル

抵抗 $R = 2$ $\Omega$, インダクタ $L = 1$ H, コンデンサ $C = 0.5$ F の直列RLC回路に電圧源 $v(t)$ を接続する場合の状態空間モデルを構築します。

状態変数としてコンデンサの電圧 $v_C$ とインダクタの電流 $i_L$ を選びます。キルヒホッフの法則から

$$ L\frac{di_L}{dt} = v(t) – Ri_L – v_C $$

$$ C\frac{dv_C}{dt} = i_L $$

これを行列形式で書くと

$$ \begin{bmatrix} \dot{i}_L \\ \dot{v}_C \end{bmatrix} = \begin{bmatrix} -R/L & -1/L \\ 1/C & 0 \end{bmatrix}\begin{bmatrix} i_L \\ v_C \end{bmatrix} + \begin{bmatrix} 1/L \\ 0 \end{bmatrix}v(t) $$

数値を代入すると

$$ \bm{A} = \begin{bmatrix} -2 & -1 \\ 2 & 0 \end{bmatrix}, \quad \bm{B} = \begin{bmatrix} 1 \\ 0 \end{bmatrix} $$

$\bm{A}$ の固有値は $\det(s\bm{I} – \bm{A}) = s^2 + 2s + 2 = 0$ より $\lambda = -1 \pm i$ です。実部が $-1$(減衰)、虚部が $\pm 1$(振動)なので、このRLC回路は減衰振動を示します。振動の角周波数は1 rad/s(周波数 $1/(2\pi) \approx 0.16$ Hz)で、時定数は1秒です。

これらの計算例を通じて、状態空間モデルの構築方法と、固有値解析によるシステムの動的特性の予測が理解できたと思います。

まとめ

本記事では、状態空間モデルの定義と構成を、直感的な理解から数学的な定式化、さらに具体的な計算例まで体系的に解説しました。

  • 状態変数は「システムの将来を予測するために必要な現在の情報の最小集合」であり、一般にエネルギー蓄積要素(ばね、質量、コンデンサ、インダクタ)に対応します
  • 状態空間モデルは $\dot{\bm{x}} = \bm{A}\bm{x} + \bm{B}\bm{u}$, $\bm{y} = \bm{C}\bm{x} + \bm{D}\bm{u}$ の2つの方程式でシステムの内部構造まで記述します。古典制御の伝達関数(入出力のブラックボックス)とは異なり、内部の状態変数の動きが見えます
  • 4つの行列 $(\bm{A}, \bm{B}, \bm{C}, \bm{D})$ がシステムを完全に特徴づけ、特に $\bm{A}$ の固有値がシステムの安定性(実部の符号)と振動特性(虚部の値)を決定します
  • 伝達関数との関係: $\bm{G}(s) = \bm{C}(s\bm{I} – \bm{A})^{-1}\bm{B} + \bm{D}$ により相互変換が可能です。ただし、同じ伝達関数に対して状態空間表現は一意ではありません(座標変換の自由度)
  • 行列指数関数 $e^{\bm{A}t}$ が状態の時間発展を記述し、対角化により固有値ごとの独立なモードに分解して計算できます
  • 状態空間モデルはMIMO系、最適制御、数値シミュレーションに適しており、現代制御理論の基盤となっています

次のステップとして、可制御性と可観測性を学ぶことで、状態空間モデルの構造的な性質を理解できます。

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