伝達関数の定義と求め方をわかりやすく解説

スピーカーに電気信号を入力すると音が出ます。エアコンの設定温度を変えると、しばらくして部屋の温度が変わります。自動車のアクセルペダルを踏むと、車が加速します。こうした「入力を与えると、何らかの出力が返ってくる」システムは、私たちの身の回りにあふれています。

では、この入力と出力の関係を、どうすれば数学的に簡潔に記述できるのでしょうか? 微分方程式を毎回解くのは大変ですし、複数のシステムを組み合わせたときの振る舞いを予測するのも容易ではありません。こうした悩みを一気に解決してくれるのが、伝達関数(transfer function)です。

伝達関数を理解すると、以下のような幅広い応用が可能になります。

  • ロボットの制御設計: ロボットアームのモーターに対して「どのような指令を出せば、狙い通りの位置に素早く到達するか」を数学的に設計できます
  • 電子回路のフィルタ設計: オーディオ機器やセンサ回路で「どの周波数帯の信号を通し、どの帯域をカットするか」を定量的に決定できます
  • 航空機の自動操縦: 機体の姿勢変動に対するフィードバック制御系の安定性を、紙と鉛筆で解析できるようになります
  • 化学プラントのプロセス制御: 温度や圧力の応答特性をモデル化し、安全で効率的な運転条件を見つけることができます

本記事の内容

  • 伝達関数の直感的なイメージと数学的定義
  • ラプラス変換を使った伝達関数の導出(1次系・2次系)
  • 基本要素の伝達関数の一覧と物理的意味
  • 極と零点の概念と安定性への影響
  • ブロック線図の等価変換(直列・並列・フィードバック)
  • Pythonでのステップ応答・極零点マップ・ボード線図の可視化と考察

前提知識

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

伝達関数とは — ブラックボックスの「中身」を数式にする

入力と出力をつなぐ関数

まず、伝達関数の直感的なイメージから始めましょう。あるシステムに入力 $u(t)$ を加えると、出力 $y(t)$ が返ってくる状況を考えます。たとえば、スピーカーに電圧信号(入力)を加えると、音圧(出力)が生じます。このとき、入力から出力への変換を行っている「中身」は、スピーカーのコイルやコーン(振動板)の物理特性によって決まります。

この「中身」がどのような変換を行うかを、私たちは通常ブラックボックスとして扱います。箱の中がどんなに複雑でも、入力と出力の関係さえわかれば、システムの振る舞いを予測できるからです。伝達関数とは、まさにこのブラックボックスの入出力関係を $s$ の関数で表現したものです。

$$ u(t) \xrightarrow{\quad G(s) \quad} y(t) $$

入力 $u(t)$ がブラックボックス $G(s)$ を通って出力 $y(t)$ になる — このシンプルな構図が、制御工学のあらゆる議論の出発点となります。

数学的定義

ここで、伝達関数の厳密な数学的定義を述べましょう。伝達関数 $G(s)$ は、初期値をすべてゼロとしたときの、出力のラプラス変換 $Y(s)$ と入力のラプラス変換 $U(s)$ の比として定義されます。

$$ \begin{equation} G(s) = \frac{Y(s)}{U(s)} \end{equation} $$

この定義には重要なポイントが3つあります。

  1. 初期値ゼロの仮定: システムが「静止状態」から始まることを前提としています。これにより、初期条件に由来する項が消え、入力と出力だけの純粋な関係が取り出せます
  2. ラプラス変換の利用: 時間領域の微分・積分が、$s$ 領域では単なる掛け算・割り算に変わります。これが伝達関数の最大の強みです
  3. 線形時不変(LTI)システムが対象: 伝達関数は、重ね合わせの原理が成り立ち、かつシステムの特性が時間によって変化しないシステムに対してのみ定義されます

イメージとしては、ラプラス変換が「微分方程式を代数方程式に翻訳する魔法の辞書」だとすると、伝達関数はその辞書を使って書かれた「システムの名刺」のようなものです。名刺を見れば、そのシステムがどんな応答をするか(速いか遅いか、振動するかしないか、安定かどうか)がひと目でわかります。

なぜ伝達関数が便利なのか

伝達関数が制御工学で中心的な役割を果たす理由を、もう少し具体的に見てみましょう。

理由1: 微分方程式を解かなくてよい。たとえば、2次の微分方程式の一般解を求めるには、特性方程式を解き、任意定数を初期条件から決定する必要があります。しかし伝達関数を使えば、入力 $U(s)$ に $G(s)$ を掛けるだけで出力 $Y(s)$ が得られます。

理由2: システムの直列接続が掛け算になる。2つのシステム $G_1(s)$ と $G_2(s)$ を直列に接続した場合、全体の伝達関数は単に $G_1(s) \cdot G_2(s)$ です。微分方程式を2つ連立して解く必要はありません。

理由3: 安定性が一目でわかる。伝達関数の分母を $0$ にする $s$ の値(極)を調べるだけで、システムが安定かどうかを判定できます。

ここまでで伝達関数の定義とその便利さを押さえました。では、実際の物理システムから伝達関数をどうやって求めるのでしょうか? 次のセクションでは、ラプラス変換を使って微分方程式から伝達関数を導出する手順を、1次系と2次系の具体例で見ていきます。

ラプラス変換からの導出

ラプラス変換の役割 — 微分方程式を代数方程式に変える

物理システムの挙動は通常、微分方程式で記述されます。しかし、微分方程式をそのまま扱うのは、掛け算や足し算に比べてはるかに難しい作業です。ここでラプラス変換が登場します。

ラプラス変換の核心的な性質は、時間微分が $s$ との掛け算に変わることです。

$$ \begin{equation} \mathcal{L}\left[\frac{dy}{dt}\right] = sY(s) – y(0) \end{equation} $$

$$ \begin{equation} \mathcal{L}\left[\frac{d^2y}{dt^2}\right] = s^2Y(s) – sy(0) – y'(0) \end{equation} $$

初期値をゼロ($y(0) = 0$, $y'(0) = 0$)とすると、微分は単に $s$ を掛けるだけの操作になります。これが「微分方程式の問題を代数方程式の問題に変換する」というラプラス変換の威力です。

この道具を使って、具体的な物理システムから伝達関数を導出してみましょう。まずは最もシンプルな1次系から始めます。

例1: 1次系(RC回路)の伝達関数

物理的な設定

抵抗 $R$ とキャパシタ $C$ が直列に接続されたRC回路を考えます。入力を印加電圧 $u(t)$、出力をキャパシタ両端の電圧 $y(t)$ とすると、キルヒホッフの電圧則から次の微分方程式が成り立ちます。

$$ \begin{equation} RC\frac{dy}{dt} + y = u \end{equation} $$

ここで $\tau = RC$ は時定数と呼ばれ、回路の応答速度を特徴づけるパラメータです。時定数が大きいほど、出力が最終値に達するまでに時間がかかります。これは直感的にも理解できます。キャパシタの容量 $C$ が大きければ「たくさんの電荷を蓄えるのに時間がかかる」、抵抗 $R$ が大きければ「電流が流れにくいので充電に時間がかかる」からです。

一般的に書くと、ゲイン $K$、時定数 $\tau$ を用いて次のようになります。

$$ \begin{equation} \tau \frac{dy}{dt} + y = Ku \end{equation} $$

ラプラス変換による導出

この微分方程式の両辺をラプラス変換しましょう。初期値はゼロ($y(0) = 0$)とします。

まず、ラプラス変換の微分性質 $\mathcal{L}[dy/dt] = sY(s) – y(0) = sY(s)$ を適用します。

$$ \tau \, sY(s) + Y(s) = KU(s) $$

左辺で $Y(s)$ をくくり出すと、次のようになります。

$$ (\tau s + 1)\, Y(s) = KU(s) $$

両辺を $(\tau s + 1)$ で割って、$Y(s)/U(s)$ の形にすると、1次遅れ系の伝達関数が得られます。

$$ \begin{equation} G(s) = \frac{Y(s)}{U(s)} = \frac{K}{\tau s + 1} \end{equation} $$

この結果は非常に重要です。伝達関数 $K/(\tau s + 1)$ は、たった2つのパラメータ $K$(定常ゲイン)と $\tau$(時定数)でシステムの特性を完全に記述しています。$K$ はステップ入力に対する最終的な出力値を決め、$\tau$ はそこに到達するまでの速さを決めます。1次遅れ系の応答の記事で、この伝達関数からステップ応答やインパルス応答を求める方法を詳しく解説しています。

1次系は最もシンプルなモデルですが、実際の物理システムには振動や減衰が伴うことが多くあります。次に、そうした振動現象を記述できる2次系の伝達関数を導出しましょう。

例2: 2次系(質量-バネ-ダンパ系)の伝達関数

物理的な設定

質量 $m$ の物体が、バネ定数 $k$ のバネとダンパ係数 $c$ のダンパで支持されている状況を考えます。この系は、自動車のサスペンションや建物の免震装置など、振動を制御する場面で頻繁に現れます。

外力 $f(t)$ を加えたときの物体の変位 $y(t)$ は、ニュートンの第二法則から次の2次微分方程式で記述されます。

$$ \begin{equation} m\ddot{y} + c\dot{y} + ky = f(t) \end{equation} $$

ここで、$m\ddot{y}$ は慣性力、$c\dot{y}$ は粘性減衰力(速度に比例する抵抗力)、$ky$ はバネの復元力です。これら3つの力のバランスによって、系の応答が決まります。

ラプラス変換による導出

初期値ゼロ($y(0) = 0$, $\dot{y}(0) = 0$)のもとでラプラス変換すると、$\ddot{y}$ は $s^2 Y(s)$ に、$\dot{y}$ は $s Y(s)$ に変換されます。

$$ ms^2Y(s) + csY(s) + kY(s) = F(s) $$

左辺で $Y(s)$ をくくり出します。

$$ (ms^2 + cs + k)\,Y(s) = F(s) $$

$Y(s)/F(s)$ の形に整理すると、2次系の伝達関数が得られます。

$$ \begin{equation} G(s) = \frac{Y(s)}{F(s)} = \frac{1}{ms^2 + cs + k} \end{equation} $$

標準形への変換

この伝達関数をより汎用的な形に書き換えましょう。固有角振動数 $\omega_n$ と減衰比 $\zeta$ という2つの無次元パラメータを導入します。

$$ \omega_n = \sqrt{\frac{k}{m}}, \quad \zeta = \frac{c}{2\sqrt{mk}} $$

$\omega_n$ はバネと質量だけで決まる「系が自然に振動しようとする周波数」であり、$\zeta$ は「その振動をどれだけ抑えるか」を表す指標です。

分母の各項を $m$ で割ります。

$$ \frac{1}{m}\left(ms^2 + cs + k\right) = s^2 + \frac{c}{m}s + \frac{k}{m} $$

ここで $k/m = \omega_n^2$ および $c/m = 2\zeta\omega_n$($\zeta$ の定義から導かれます)を代入すると、分母は次の標準形になります。

$$ s^2 + 2\zeta\omega_n s + \omega_n^2 $$

分子も $\omega_n^2/m \cdot m = \omega_n^2$ に揃えるため、$1/m$ を $\omega_n^2/(k) = \omega_n^2/(\omega_n^2 m) = 1/m$ と読み替えれば、最終的に2次系の標準形が得られます。

$$ \begin{equation} G(s) = \frac{\omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2} \end{equation} $$

この標準形の素晴らしい点は、$\omega_n$ と $\zeta$ の2つのパラメータだけで、あらゆる2次系の動的特性を表現できることです。$\zeta < 1$ なら振動的(欠減衰)、$\zeta = 1$ なら臨界減衰、$\zeta > 1$ なら過減衰となります。2次遅れ系の応答の記事で、これらの応答特性の違いを詳しく扱っています。

ここまでで、1次系と2次系という代表的なシステムの伝達関数を導出しました。実際のシステムはもっと多様ですが、多くの場合、いくつかの「基本要素」の組み合わせとして理解できます。次のセクションでは、制御工学で頻出する基本要素とそれぞれの伝達関数をまとめましょう。

基本要素の伝達関数

制御工学では、複雑なシステムを理解するために、いくつかの基本的な構成要素に分解して考えます。ちょうど化学で物質を元素に分解するように、どんな複雑な制御系も以下の基本要素の組み合わせで表現できます。

要素 伝達関数 物理的な例 特徴
比例要素 $K$ アンプ、てこ 入力をそのまま定数倍して出力する
積分要素 $\dfrac{1}{s}$ 水槽への注水、積分回路 入力を時間で積分する。過去の履歴が蓄積される
微分要素 $s$ 速度センサ、微分回路 入力の変化率に応答する。変化が大きいほど出力が大きい
1次遅れ要素 $\dfrac{K}{\tau s + 1}$ RC回路、温度応答 指数関数的に最終値に近づく
2次遅れ要素 $\dfrac{\omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2}$ バネ-ダンパ系、RLC回路 減衰比に応じて振動的にも非振動的にもなる
むだ時間要素 $e^{-Ls}$ ベルトコンベア、パイプ内の流れ 入力がそのまま時間 $L$ だけ遅れて出力される

各要素の直感的理解

比例要素はもっとも単純な要素です。音量つまみを回すと、入力信号がそのまま増幅されて出力されるイメージです。周波数によらず一定のゲイン $K$ で信号を増幅します。

積分要素は「蓄積」のイメージです。蛇口から水槽に水を注ぐとき、水の流量(入力)を時間で積分したものが水位(出力)になります。一定の流量で水を注ぎ続けると、水位は直線的に上昇し続けます。これは伝達関数 $1/s$ で表現されます。

微分要素は「変化を検出する」要素です。自動車の速度計は位置の時間微分(速度)を表示しています。急加速すると大きな値を示し、等速運動では一定値を示します。伝達関数は $s$ です。

1次遅れ要素は日常生活で最もよく出会うシステムです。お湯を冷ますとき、最初は急速に温度が下がりますが、室温に近づくにつれて温度変化は緩やかになります。この「指数関数的に最終値に近づく」振る舞いが1次遅れの特徴です。

2次遅れ要素は振動現象を記述できる点で1次系より表現力が豊かです。車の段差通過時の上下動や、ギターの弦の振動がこれに該当します。減衰比 $\zeta$ の値によって、振動しながら収束する($\zeta < 1$)か、振動せずにゆっくり収束する($\zeta \geq 1$)かが決まります。

むだ時間要素は少し特殊です。ベルトコンベアで荷物を運ぶとき、コンベアの一端に荷物を置いてから反対側に届くまでに一定の遅れがあります。信号の形は変わらず、純粋に時間だけずれる点が、1次遅れや2次遅れとは本質的に異なります。なお、$e^{-Ls}$ は有理式ではないため、厳密には「伝達関数」の範疇には入りませんが、実用上は制御系設計で頻繁に扱われます。

これらの基本要素を理解しておくと、複雑な伝達関数を「この部分は1次遅れ、この部分は積分」と分解して読み解くことができるようになります。そして、伝達関数の特性をさらに深く理解するための鍵となるのが、次に扱う「極と零点」の概念です。

極と零点 — システムの性格を決める特別な点

極と零点とは

伝達関数を分子と分母の多項式の比として書いたとき、

$$ \begin{equation} G(s) = \frac{N(s)}{D(s)} = \frac{b_m s^m + b_{m-1}s^{m-1} + \cdots + b_0}{a_n s^n + a_{n-1}s^{n-1} + \cdots + a_0} \end{equation} $$

この分子と分母を $0$ にする $s$ の値は、システムの振る舞いを理解するうえで特別な意味を持ちます。

  • 零点(zero): 分子 $N(s) = 0$ の根。$s$ がこの値をとるとき、伝達関数の値がゼロになります。物理的には、その周波数成分の信号がシステムを通過できない(出力がゼロになる)ことを意味します。ノッチフィルタはこの性質を積極的に利用した回路です
  • 極(pole): 分母 $D(s) = 0$ の根。$s$ がこの値をとるとき、伝達関数の値が(形式的に)無限大になります。極はシステムの固有モードを決定し、応答の速さや振動の有無、そして安定性を支配します

たとえば、1次遅れ系 $G(s) = K/(\tau s + 1)$ の場合を考えましょう。分母 $\tau s + 1 = 0$ を解くと、極は $s = -1/\tau$ です。この極が実軸上の負の位置にあることが、出力が指数関数的に減衰して最終値に落ち着くことの数学的な理由です。$\tau$ が小さい(極が原点から遠い)ほど、減衰が速いこともわかります。

$s$ 平面と安定性

極と零点を複素 $s$ 平面上にプロットすると、システムの性質が視覚的に把握できます。ここで決定的に重要なのが、安定性と極の位置の関係です。

LTIシステムの安定性は、次のシンプルな規則で判定できます。

$$ \text{すべての極の実部が負} \quad \Longleftrightarrow \quad \text{システムは安定} $$

すなわち、すべての極が $s$ 平面の左半面にあるならばシステムは安定です。これは直感的にも理解できます。時間応答は極の位置に対応する指数関数 $e^{s_i t}$ の和で表されますが、$\text{Re}(s_i) < 0$ ならば $e^{s_i t}$ は $t \to \infty$ で $0$ に収束し、$\text{Re}(s_i) > 0$ ならば発散します。

具体的に、極の位置による応答の違いをまとめると次のようになります。

極の位置 応答の特徴
実軸上の負の値(例: $s = -2$) 指数減衰 $e^{-2t}$(安定、非振動)
負の実部を持つ複素共役対(例: $s = -1 \pm 2j$) 減衰振動 $e^{-t}\sin(2t)$(安定、振動的)
虚軸上(例: $s = \pm 2j$) 持続振動 $\sin(2t)$(安定限界)
正の実部(例: $s = 1$) 指数発散 $e^{t}$(不安定)

零点の役割

零点は安定性には直接影響しませんが、過渡応答の形状に大きく影響します。特に、右半面に零点がある場合(非最小位相系)、ステップ応答の初期に「逆方向に動く」という直感に反する振る舞い(逆応答)が現れます。

たとえば、伝達関数 $G(s) = (s – 2)/((s+1)(s+3))$ は右半面に零点 $s = 2$ を持ちます。ステップ入力を加えると、出力は最初に負の方向に動いてから、最終的に正の定常値に到達します。このような系の制御は、通常の系に比べて格段に難しくなります。

極と零点の概念を理解すると、ラウス・フルヴィッツの安定判別根軌跡法といった、より高度な解析手法への入り口が開けます。

ここまでで、個々のシステムの伝達関数とその特性について学びました。しかし実際の制御系は、複数のシステムが組み合わさって構成されています。次に、こうした複合システムを効率的に扱うための「ブロック線図の等価変換」を見ていきましょう。

ブロック線図の等価変換 — 複雑な系を整理する技術

ブロック線図とは

ブロック線図は、制御系の構造を視覚的に表現するための図です。各ブロックが伝達関数を持ち、ブロック間を信号線がつなぎます。電子回路の回路図が素子と配線で構成されるように、ブロック線図はシステムと信号の流れで構成されます。

複雑なブロック線図を1つの等価な伝達関数にまとめる操作を等価変換と呼びます。この操作は、複雑な電気回路の合成抵抗を求める操作に似ています。直列接続された抵抗は和になり、並列接続は逆数の和の逆数になるのと同様に、ブロック線図にも基本的な結合規則があります。

直列結合(縦続接続)

2つのシステム $G_1(s)$ と $G_2(s)$ が直列に接続されている場合、入力が $G_1$ を通り、その出力が $G_2$ の入力になります。最初のブロックの出力は $G_1(s)U(s)$ であり、これが次のブロックの入力となるので、最終出力は $G_2(s) \cdot G_1(s) \cdot U(s)$ です。

したがって、全体の伝達関数は各伝達関数のになります。

$$ \begin{equation} G(s) = G_1(s) \cdot G_2(s) \end{equation} $$

これは伝達関数を使う最大のメリットの一つです。微分方程式のまま扱うと、2つの系を連立して解く必要がありますが、伝達関数なら掛け算をするだけです。

直列結合の具体例として、1次遅れ系2つの直列接続を考えましょう。$G_1(s) = 1/(\tau_1 s + 1)$ と $G_2(s) = 1/(\tau_2 s + 1)$ の直列結合は次のようになります。

$$ G(s) = \frac{1}{(\tau_1 s + 1)(\tau_2 s + 1)} $$

分母を展開すると2次の多項式になるため、直列結合した1次系は2次系として振る舞いますが、$\zeta \geq 1$ の過減衰系に限定されます(2つの極がともに実数の負の値になるため)。

並列結合

2つのシステムに同じ入力が加えられ、それぞれの出力が加算される構成です。信号が2つの経路に分岐して合流するイメージです。

$$ \begin{equation} G(s) = G_1(s) + G_2(s) \end{equation} $$

並列結合は、たとえば比例制御と積分制御を組み合わせた PI 制御器で現れます。比例要素 $K_p$ と積分要素 $K_i/s$ の並列結合は $K_p + K_i/s = (K_p s + K_i)/s$ となり、PID制御の基本構造を形成します。

フィードバック結合

フィードバック結合は制御工学の核心です。出力の一部をセンサで測定し、目標値との誤差に基づいて入力を修正する — これがフィードバック制御の基本です。

負帰還(ネガティブフィードバック)の場合、前向き伝達関数 $G_1(s)$ とフィードバック伝達関数 $G_2(s)$ から、閉ループ伝達関数は次のように求まります。

入力を $R(s)$、出力を $Y(s)$ とすると、誤差信号は $E(s) = R(s) – G_2(s)Y(s)$ です。一方、$Y(s) = G_1(s)E(s)$ なので、$E(s)$ を消去します。

$Y(s) = G_1(s)\{R(s) – G_2(s)Y(s)\}$ を展開すると、次のようになります。

$$ Y(s) = G_1(s)R(s) – G_1(s)G_2(s)Y(s) $$

$Y(s)$ を含む項を左辺に集めて整理します。

$$ Y(s) + G_1(s)G_2(s)Y(s) = G_1(s)R(s) $$

$Y(s)$ をくくり出し、$Y(s)/R(s)$ を求めると、フィードバック系の閉ループ伝達関数が得られます。

$$ \begin{equation} G(s) = \frac{G_1(s)}{1 + G_1(s)G_2(s)} \end{equation} $$

分母の $1 + G_1(s)G_2(s)$ は特性多項式と呼ばれ、閉ループ系の安定性を決定する最も重要な式です。この多項式の根(閉ループの極)がすべて左半面にあれば、フィードバック系は安定に動作します。ゲイン余裕と位相余裕では、この安定性をどの程度の「余裕」をもって確保しているかを定量的に評価する方法を学びます。

なお、正帰還(ポジティブフィードバック)の場合は、分母の符号が変わって $1 – G_1(s)G_2(s)$ になります。

等価変換のまとめ

3つの基本的な結合規則をまとめます。

結合方式 等価伝達関数 覚え方
直列 $G_1 \cdot G_2$ 掛け算
並列 $G_1 + G_2$ 足し算
負帰還 $\dfrac{G_1}{1 + G_1 G_2}$ 「1 + 一巡伝達関数」で割る

これら3つの規則を繰り返し適用することで、どんなに複雑なブロック線図でも1つの伝達関数にまとめることができます。これは、複雑な回路の合成インピーダンスを直列・並列の規則で求めるのとまったく同じ発想です。

ここまでで、伝達関数の理論的な基盤を一通り押さえました。次のセクションでは、Pythonを使ってこれらの理論を実際に可視化し、グラフから物理的な意味を読み取る作業に進みましょう。

伝達関数と周波数応答の関係

伝達関数のもう一つの重要な側面は、周波数応答との直接的なつながりです。伝達関数 $G(s)$ に $s = j\omega$ を代入すると、周波数応答関数 $G(j\omega)$ が得られます。

$$ \begin{equation} G(j\omega) = |G(j\omega)|\, e^{j\angle G(j\omega)} \end{equation} $$

ここで $|G(j\omega)|$ はゲイン(振幅比)、$\angle G(j\omega)$ は位相差です。これは、正弦波入力 $u(t) = A\sin(\omega t)$ をLTIシステムに加えたとき、定常状態の出力が次のようになることを意味します。

$$ y(t) = A\, |G(j\omega)|\sin\!\left(\omega t + \angle G(j\omega)\right) $$

つまり、伝達関数が分かれば、あらゆる周波数の正弦波に対するシステムの応答が完全に予測できるのです。

この関係を視覚化したものがボード線図ナイキスト線図です。ボード線図はゲインと位相を周波数の関数として対数スケールでプロットしたもので、フィルタ設計やフィードバック系の安定性解析に欠かせないツールです。

1次遅れ系の周波数応答

具体例として、1次遅れ系 $G(s) = 1/(\tau s + 1)$ の周波数応答を見てみましょう。$s = j\omega$ を代入します。

$$ G(j\omega) = \frac{1}{j\omega\tau + 1} $$

ゲインと位相はそれぞれ次のようになります。

$$ |G(j\omega)| = \frac{1}{\sqrt{1 + (\omega\tau)^2}}, \quad \angle G(j\omega) = -\arctan(\omega\tau) $$

低周波($\omega \ll 1/\tau$)ではゲインがほぼ $1$($0$ dB)で信号がそのまま通過し、高周波($\omega \gg 1/\tau$)ではゲインが $1/(\omega\tau)$ に比例して減少します。折れ点周波数 $\omega = 1/\tau$ でゲインが $-3$ dB(約 $0.707$ 倍)になり、ここがローパスフィルタとしてのカットオフ周波数に対応します。

このように、伝達関数は時間領域(ステップ応答、インパルス応答)と周波数領域(ボード線図、ナイキスト線図)の両面からシステムを解析する統一的な枠組みを提供しています。ステップ応答とインパルス応答も合わせて学ぶと、時間領域と周波数領域の対応関係がより深く理解できるでしょう。

では、ここまでの理論をPythonで実装し、実際にグラフを描いて確認してみましょう。

Pythonでの実装と可視化

1次系のステップ応答 — 時定数の影響を可視化する

まず、1次遅れ系 $G(s) = K/(\tau s + 1)$ のステップ応答を、時定数 $\tau$ を変えながらプロットし、時定数がシステムの応答速度にどのような影響を与えるかを確認します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# 1次系のステップ応答(時定数の影響)
fig, ax = plt.subplots(figsize=(10, 6))
t = np.linspace(0, 15, 500)

for tau, color in [(0.5, '#e74c3c'), (1.0, '#3498db'),
                   (2.0, '#2ecc71'), (5.0, '#9b59b6')]:
    K = 1.0
    sys = signal.TransferFunction([K], [tau, 1])
    t_out, y_out = signal.step(sys, T=t)
    ax.plot(t_out, y_out, linewidth=2, color=color, label=f'τ={tau}')
    # 時定数の位置に点を打つ(63.2%到達点)
    idx = np.argmin(np.abs(t_out - tau))
    ax.plot(tau, y_out[idx], 'o', color=color, markersize=8)

ax.axhline(y=1.0, color='k', linestyle='--', alpha=0.3, label='定常値 K=1')
ax.axhline(y=0.632, color='gray', linestyle=':', alpha=0.5, label='63.2% ライン')
ax.set_xlabel('Time [s]', fontsize=13)
ax.set_ylabel('Output y(t)', fontsize=13)
ax.set_title('First-Order Step Response: Effect of Time Constant τ', fontsize=14)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
ax.set_xlim([0, 15])
ax.set_ylim([0, 1.15])
plt.tight_layout()
plt.show()

このグラフから、いくつかの重要な性質が読み取れます。

  1. 時定数 $\tau$ が小さいほど、出力は素早く最終値に到達します。$\tau = 0.5$ の系は約 $2$ 秒で定常値にほぼ達しますが、$\tau = 5.0$ の系は $15$ 秒経ってもまだ最終値に届いていません。各曲線上の丸印は $t = \tau$ の時点を表しており、この時点で出力が定常値の $63.2\%$ に達することが確認できます。

  2. すべての曲線がオーバーシュートなく単調に増加しています。これは1次系の本質的な特徴で、微分方程式が1階であるため振動解が存在しないことに対応しています。「滑らかに、ゆっくりと」最終値に近づく振る舞いは、RC回路の充電曲線や、コーヒーが冷める温度変化とまったく同じです。

  3. 理論的に、$t = 3\tau$ で約 $95\%$、$t = 5\tau$ で約 $99\%$ に到達します。実務では「$5\tau$ で整定」という目安がよく使われます。

2次系のステップ応答 — 減衰比の影響を可視化する

次に、2次系の標準形 $G(s) = \omega_n^2 / (s^2 + 2\zeta\omega_n s + \omega_n^2)$ のステップ応答を、減衰比 $\zeta$ を変えながらプロットします。

# 2次系のステップ応答(減衰比の影響)
fig, ax = plt.subplots(figsize=(10, 6))
t = np.linspace(0, 10, 500)
omega_n = 2.0

zeta_values = [0.1, 0.3, 0.5, 0.7, 1.0, 2.0]
colors = ['#e74c3c', '#e67e22', '#f1c40f', '#2ecc71', '#3498db', '#9b59b6']

for zeta, color in zip(zeta_values, colors):
    sys = signal.TransferFunction([omega_n**2],
                                  [1, 2*zeta*omega_n, omega_n**2])
    t_out, y_out = signal.step(sys, T=t)
    ax.plot(t_out, y_out, linewidth=2, color=color, label=f'ζ={zeta}')

ax.axhline(y=1.0, color='k', linestyle='--', alpha=0.3)
ax.set_xlabel('Time [s]', fontsize=13)
ax.set_ylabel('Output y(t)', fontsize=13)
ax.set_title(f'Second-Order Step Response (ωn={omega_n} rad/s)', fontsize=14)
ax.legend(fontsize=10, loc='upper right')
ax.grid(True, alpha=0.3)
ax.set_xlim([0, 10])
plt.tight_layout()
plt.show()

このグラフからは、減衰比 $\zeta$ がシステムの応答にどれほど劇的な影響を与えるかが一目瞭然です。

  1. $\zeta = 0.1$(小さな減衰比)では、大きなオーバーシュートと長時間の振動が見られます。これは、振動を抑える力(減衰力)が弱いことを意味しており、バネの振動がなかなか収まらない状況に対応します。制御系でこのような応答が起きると、出力が目標値の周りを何度も行き来するため、精密な制御が困難になります。

  2. $\zeta$ を $0.3$、$0.5$、$0.7$ と大きくするにつれて、オーバーシュートは減少し、振動の収束も速くなります。特に $\zeta = 0.7$ 前後は制御工学で「黄金の減衰比」と呼ばれ、応答の速さと振動の抑制のバランスが優れているとされます。

  3. $\zeta = 1.0$(臨界減衰)では振動が完全に消え、$\zeta = 2.0$(過減衰)では振動なしにゆっくりと最終値に近づきます。過減衰の場合、振動は起きませんが応答が遅くなるというトレードオフがあります。エレベーターのドアや精密天秤など、振動を絶対に許容できないシステムでは $\zeta \geq 1$ が選ばれることがあります。

極零点マップ — $s$ 平面上のシステムの性格

極と零点を $s$ 平面上にプロットし、システムの安定性と応答特性を視覚的に確認します。ここでは $G(s) = (s+3)/(s^2+2s+5)$ を例にとります。

# 極零点マップ
fig, ax = plt.subplots(figsize=(8, 8))

# 伝達関数: G(s) = (s+3) / (s^2 + 2s + 5)
sys_example = signal.TransferFunction([1, 3], [1, 2, 5])
poles = np.roots([1, 2, 5])
zeros = np.roots([1, 3])

# 左半面(安定領域)を色付け
ax.axvspan(-5, 0, alpha=0.05, color='green', label='安定領域 (Re < 0)')
ax.axvspan(0, 5, alpha=0.05, color='red', label='不安定領域 (Re > 0)')

# 極と零点をプロット
ax.plot(np.real(poles), np.imag(poles), 'rx', markersize=15,
        markeredgewidth=3, label=f'Poles: {poles[0]:.2f}, {poles[1]:.2f}')
ax.plot(np.real(zeros), np.imag(zeros), 'bo', markersize=15,
        markeredgewidth=2, fillstyle='none', label=f'Zero: {zeros[0]:.2f}')

ax.axhline(y=0, color='k', linewidth=0.5)
ax.axvline(x=0, color='k', linewidth=0.8)
ax.set_xlabel('Real Part', fontsize=13)
ax.set_ylabel('Imaginary Part', fontsize=13)
ax.set_title('Pole-Zero Map: G(s) = (s+3)/(s²+2s+5)', fontsize=14)
ax.legend(fontsize=10, loc='upper left')
ax.grid(True, alpha=0.3)
ax.set_aspect('equal')
ax.set_xlim([-5, 3])
ax.set_ylim([-4, 4])
plt.tight_layout()
plt.show()

print(f"極: {poles}")
print(f"零点: {zeros}")
print(f"極の実部: {np.real(poles)}")
print(f"すべての極の実部 < 0: {np.all(np.real(poles) < 0)} → 安定")

この極零点マップから、次のことが読み取れます。

  1. 2つの極(赤い×印)は $s = -1 \pm 2j$ であり、ともに左半面(緑色の領域)にあります。したがって、このシステムは安定です。極が複素共役対であることから、ステップ応答は減衰振動を示すことが予測できます。実部 $-1$ が減衰の速さを、虚部 $\pm 2$ が振動の角周波数を決めています。

  2. 零点(青い丸印)は $s = -3$ であり、実軸上の負の位置にあります。これは左半面にあるので「最小位相系」です。零点が極よりも原点から遠い位置にあるため、過渡応答への影響は比較的小さいと予測できます。

  3. 極の位置から、減衰比 $\zeta$ と固有角振動数 $\omega_n$ を逆算できます。$\omega_n = |s_{\text{pole}}| = \sqrt{1^2 + 2^2} = \sqrt{5} \approx 2.24$ rad/s、$\zeta = -\text{Re}(s_{\text{pole}})/\omega_n = 1/\sqrt{5} \approx 0.45$ です。

ボード線図 — 周波数領域でのシステム解析

1次遅れ系 $G(s) = 1/(s+1)$(すなわち $\tau = 1$ の場合)のボード線図を描きます。ボード線図はゲイン特性と位相特性を同時に表示することで、システムの周波数応答を一目で把握できるようにしたものです。

# ボード線図(ゲインと位相の両方)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), sharex=True)

omega = np.logspace(-2, 2, 500)
sys_bode = signal.TransferFunction([1], [1, 1])  # G(s) = 1/(s+1)
w, mag, phase = signal.bode(sys_bode, w=omega)

# ゲイン特性
ax1.semilogx(w, mag, 'b-', linewidth=2, label='G(s) = 1/(s+1)')
ax1.axhline(y=-3, color='r', linestyle='--', alpha=0.5, label='-3 dB line')
ax1.axvline(x=1.0, color='gray', linestyle=':', alpha=0.5, label='ω = 1/τ = 1 rad/s')
ax1.set_ylabel('Magnitude [dB]', fontsize=13)
ax1.set_title('Bode Plot: G(s) = 1/(s+1)', fontsize=14)
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3, which='both')
ax1.set_ylim([-45, 5])

# 位相特性
ax2.semilogx(w, phase, 'r-', linewidth=2)
ax2.axhline(y=-45, color='gray', linestyle=':', alpha=0.5)
ax2.axhline(y=-90, color='gray', linestyle='--', alpha=0.3)
ax2.axvline(x=1.0, color='gray', linestyle=':', alpha=0.5)
ax2.set_xlabel('Frequency [rad/s]', fontsize=13)
ax2.set_ylabel('Phase [deg]', fontsize=13)
ax2.grid(True, alpha=0.3, which='both')
ax2.set_ylim([-100, 5])

plt.tight_layout()
plt.show()

ボード線図から、以下の重要な情報を読み取ることができます。

  1. ゲイン特性(上段)を見ると、低周波域($\omega \ll 1$ rad/s)ではゲインがほぼ $0$ dB であり、入力信号がそのまま通過しています。一方、高周波域($\omega \gg 1$ rad/s)ではゲインが $-20$ dB/dec の傾きで直線的に減少しており、これが1次系のローパスフィルタ特性です。折れ点周波数 $\omega = 1/\tau = 1$ rad/s において、ゲインはちょうど $-3$ dB になっています。

  2. 位相特性(下段)を見ると、低周波域では位相遅れがほぼゼロですが、周波数の増加とともに位相が遅れていき、最終的に $-90°$ に漸近します。折れ点周波数 $\omega = 1$ rad/s でちょうど $-45°$ です。この位相遅れは、高周波の入力ほど出力の応答が遅れることを物理的に意味しています。

  3. ゲイン特性の直線的な減少($-20$ dB/dec)は「1次のロールオフ」と呼ばれます。2次系の場合は $-40$ dB/dec のロールオフになります。この傾きの違いから、ボード線図を見ただけでシステムの次数を推定することができます。

複数のシステムの比較 — ブロック線図の等価変換の検証

最後に、ブロック線図の等価変換をPythonで検証しましょう。直列結合、並列結合、フィードバック結合のそれぞれについて、等価変換の結果が正しいことをステップ応答で確認します。

# ブロック線図の等価変換の検証
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
t = np.linspace(0, 10, 500)

# --- 直列結合の検証 ---
G1 = signal.TransferFunction([1], [1, 1])      # 1/(s+1)
G2 = signal.TransferFunction([2], [0.5, 1])    # 2/(0.5s+1)
# 等価伝達関数: 2 / ((s+1)(0.5s+1)) = 2 / (0.5s^2 + 1.5s + 1)
G_series = signal.TransferFunction([2], [0.5, 1.5, 1])

t1, y1 = signal.step(G_series, T=t)
axes[0].plot(t1, y1, 'b-', linewidth=2, label='G1·G2 (直列)')
axes[0].set_title('Series Connection', fontsize=13)
axes[0].set_xlabel('Time [s]', fontsize=11)
axes[0].set_ylabel('Output', fontsize=11)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)
axes[0].axhline(y=2.0, color='k', linestyle='--', alpha=0.3, label='定常値=2')

# --- 並列結合の検証 ---
# G1 + G2 = 1/(s+1) + 2/(0.5s+1)
# 通分: (0.5s+1 + 2(s+1)) / ((s+1)(0.5s+1))
#      = (2.5s + 3) / (0.5s^2 + 1.5s + 1)
G_parallel = signal.TransferFunction([2.5, 3], [0.5, 1.5, 1])

t2, y2 = signal.step(G_parallel, T=t)
axes[1].plot(t2, y2, 'r-', linewidth=2, label='G1+G2 (並列)')
axes[1].set_title('Parallel Connection', fontsize=13)
axes[1].set_xlabel('Time [s]', fontsize=11)
axes[1].set_ylabel('Output', fontsize=11)
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)
axes[1].axhline(y=3.0, color='k', linestyle='--', alpha=0.3, label='定常値=3')

# --- フィードバック結合の検証 ---
# G1/(1+G1·G2) where G1=1/(s+1), G2=2/(0.5s+1)
# 分子: 1/(s+1) → 0.5s+1
# 分母: (s+1)(0.5s+1) + 2 = 0.5s^2+1.5s+1+2 = 0.5s^2+1.5s+3
G_feedback = signal.TransferFunction([0.5, 1], [0.5, 1.5, 3])

t3, y3 = signal.step(G_feedback, T=t)
axes[2].plot(t3, y3, 'g-', linewidth=2, label='G1/(1+G1·G2) (負帰還)')
axes[2].set_title('Negative Feedback', fontsize=13)
axes[2].set_xlabel('Time [s]', fontsize=11)
axes[2].set_ylabel('Output', fontsize=11)
axes[2].legend(fontsize=10)
axes[2].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# 定常値の理論計算
print("=== 定常値の理論計算(最終値定理: lim s→0 の sG(s)·1/s = G(0))===")
print(f"直列: G(0) = 2 / (0 + 0 + 1) = {2/1:.2f}")
print(f"並列: G(0) = (0 + 3) / (0 + 0 + 1) = {3/1:.2f}")
print(f"負帰還: G(0) = (0 + 1) / (0 + 0 + 3) = {1/3:.4f}")

このコードでは、$G_1(s) = 1/(s+1)$ と $G_2(s) = 2/(0.5s+1)$ という2つの1次系について、3種類の結合方式のステップ応答を比較しています。結果から以下のことがわかります。

  1. 直列結合(左): 定常値は $G_1(0) \cdot G_2(0) = 1 \times 2 = 2$ です。応答は2次系のようにやや緩やかに立ち上がりますが、オーバーシュートは見られません。これは、先に述べたように、2つの実数極を持つ過減衰系になるためです。

  2. 並列結合(中央): 定常値は $G_1(0) + G_2(0) = 1 + 2 = 3$ です。2つの経路それぞれの応答が加算されるため、初期の応答速度は各経路の中で速い方(時定数が小さい方)に支配されます。

  3. 負帰還結合(右): 定常値は $G_1(0)/(1 + G_1(0)G_2(0)) = 1/(1 + 2) = 1/3 \approx 0.333$ です。フィードバックによって定常ゲインが元のシステムより大幅に小さくなっていますが、その代わり安定性やロバスト性が向上しています。これがフィードバック制御の本質的なトレードオフ — ゲインを犠牲にして安定性を得る — を数値的に示しています。

非最小位相系の逆応答

先ほど理論で触れた「右半面に零点がある場合の逆応答」も、Pythonで確認してみましょう。

# 非最小位相系(右半面零点)の逆応答
fig, ax = plt.subplots(figsize=(10, 6))
t = np.linspace(0, 8, 500)

# 最小位相系: G(s) = (s+2) / ((s+1)(s+3))
sys_mp = signal.TransferFunction([1, 2], [1, 4, 3])
t_mp, y_mp = signal.step(sys_mp, T=t)
ax.plot(t_mp, y_mp, 'b-', linewidth=2, label='最小位相系: (s+2)/((s+1)(s+3))')

# 非最小位相系: G(s) = (-s+2) / ((s+1)(s+3))
sys_nmp = signal.TransferFunction([-1, 2], [1, 4, 3])
t_nmp, y_nmp = signal.step(sys_nmp, T=t)
ax.plot(t_nmp, y_nmp, 'r-', linewidth=2, label='非最小位相系: (-s+2)/((s+1)(s+3))')

ax.axhline(y=0, color='k', linewidth=0.5)
ax.set_xlabel('Time [s]', fontsize=13)
ax.set_ylabel('Output y(t)', fontsize=13)
ax.set_title('Minimum Phase vs Non-Minimum Phase System', fontsize=14)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

このグラフでは、最小位相系(青)と非最小位相系(赤)のステップ応答を比較しています。

  1. 最小位相系(青い線)は初期から正の方向にスムーズに立ち上がり、定常値に収束します。すべての零点が左半面にあるため、直感通りの応答を示します。

  2. 非最小位相系(赤い線)は、最初に負の方向に「一度沈み込んでから」正の定常値に向かって上昇します。これが「逆応答」であり、右半面の零点 $s = 2$ に起因しています。ステアリングを右に切ったのに車が一瞬左に動くような現象で、制御設計を著しく困難にします。

  3. 両方のシステムとも最終的には同じ定常値に収束しています。これは、極がすべて左半面にあるため(安定)、定常値は $G(0)$ で決まり、零点の位置は過渡特性にのみ影響するためです。

伝達関数から制御設計へ

ここまでで学んだ伝達関数の知識は、実際の制御系設計の基盤となります。伝達関数がわかれば、制御対象の特性を定量的に把握できるため、「どのような制御器を設計すべきか」という問いに対して体系的にアプローチできるようになります。

たとえば、PID制御では、制御対象の伝達関数 $G_p(s)$ に基づいて、PID制御器の伝達関数 $G_c(s) = K_p + K_i/s + K_d s$ のパラメータを調整します。ブロック線図のフィードバック結合を使えば、閉ループ系全体の伝達関数が求まり、その極の位置から安定性や応答特性を予測できます。

また、周波数応答とボード線図を活用すれば、開ループ伝達関数のゲイン余裕・位相余裕から閉ループ系の安定余裕を評価でき、ナイキスト線図を使えばより一般的な安定性判別が可能になります。

伝達関数は古典制御の言語であり、ここで身につけた概念は、伝達関数と制御工学への接続で解説しているように、現代制御の状態空間表現へと発展していきます。

まとめ

本記事では、制御工学の根幹をなす伝達関数について、直感的なイメージから数学的定義、そしてPythonによる可視化までを一貫して解説しました。

  • 伝達関数の定義: $G(s) = Y(s)/U(s)$(初期値ゼロでの入出力のラプラス変換の比)。システムのブラックボックスとしての入出力特性を $s$ の有理式で表現する
  • ラプラス変換の役割: 微分方程式を代数方程式に変換し、微分が $s$ の掛け算、積分が $s$ の割り算になることで、伝達関数の導出が可能になる
  • 1次系: $G(s) = K/(\tau s + 1)$ — 時定数 $\tau$ が応答速度を決定し、オーバーシュートは発生しない
  • 2次系: $G(s) = \omega_n^2/(s^2 + 2\zeta\omega_n s + \omega_n^2)$ — 減衰比 $\zeta$ が振動の有無とオーバーシュート量を決定する($\zeta \approx 0.7$ が実用上の良い妥協点)
  • 極と零点: 極はシステムの安定性と応答モードを支配し、すべての極が $s$ 平面の左半面にあれば安定。零点は過渡応答の形状に影響する
  • ブロック線図の等価変換: 直列(積)、並列(和)、フィードバック($G_1/(1+G_1 G_2)$)の3規則で、複雑な制御系を1つの伝達関数に集約できる
  • 周波数応答: $G(j\omega)$ により、ゲインと位相の周波数依存性が得られ、ボード線図で可視化できる

伝達関数を使いこなせるようになると、制御工学の広大な世界が一気に開けます。次のステップとして、以下の記事も参考にしてください。