【超初学者向け】MATLABで学ぶ制御工学の基礎 〜制御とは？伝達関数とは？〜

こんにちは！この記事では、制御工学を全く知らない方向けに、基本的な概念からMATLABを使った実践までをわかりやすく解説します。大学で制御工学の講義が始まったばかりの学生や、これから研究室に配属される方の助けになれば幸いです。

注意点
この記事は一学生である私の中での理解をまとめたものになります。
情報の正確さおよび式については間違っている可能性があるのでご注意ください。

## 目次
1. [制御とは何か？](#制御とは何か)
2. [身近な制御の例](#身近な制御の例)
3. [制御システムの基本構成](#制御システムの基本構成)
4. [数学モデルの必要性](#数学モデルの必要性)
5. [ラプラス変換とは？](#ラプラス変換とは)
6. [伝達関数とは？](#伝達関数とは)
7. [システムの応答と時定数](#システムの応答と時定数)
8. [一次遅れ系と二次系](#一次遅れ系と二次系)
9. [MATLABで伝達関数を扱ってみよう](#matlabで伝達関数を扱ってみよう)
10. [簡単な例：温度制御システム](#簡単な例温度制御システム)
11. [まとめと次のステップ](#まとめと次のステップ)

## 制御とは何か？

**制御**とは、システムの出力を望ましい状態に保つために、入力を適切に調整することです。簡単に言えば、「何かを思い通りに動かす技術」と考えることができます。

例えばエアコンでは、部屋の温度（出力）を設定温度に保つために、コンプレッサーの動作（入力）を調整しています。この「調整」の部分を工学的に実現するのが制御工学の役割です。


## 身近な制御の例

制御工学は私たちの身の回りにあふれています。日常生活で見かける制御の例をいくつか挙げてみましょう：

- **スマートフォンのカメラ**：手ブレを検知して画像を安定させる（手ブレ補正）
- **自動車のクルーズコントロール**：設定した速度を維持する
- **電子レンジ**：設定した時間で加熱を停止する
- **トースター**：パンを焦がさないように加熱を制御する
- **自動ドア**：人を検知したら開き、一定時間後に閉じる

これらはすべて、センサーで状態を測定し、目標との差（誤差）に基づいて何らかの動作を調整しています。

## 制御システムの基本構成

制御システムは一般的に以下の要素で構成されています：

1. **制御対象（プラント）**：制御したいモノ（エアコンなら部屋の温度環境）
2. **センサー**：出力を測定する装置（温度センサー）
3. **コントローラ**：測定値と目標値を比較し、どう動かすか決める部分（エアコンの制御回路）
4. **アクチュエータ**：実際に動かす部分（コンプレッサーなど）
5. **目標値（参照入力）**：あるべき状態（設定温度）



制御システムは大きく分けて以下の2つのタイプがあります：

1. **オープンループ制御（開ループ制御）**：
   - 出力を測定せず、あらかじめ定めた入力のみで制御
   - 例：タイマー式のトースター（時間だけで制御、パンの状態は見ない）
   - 特徴：構造が単純、外乱に弱い

2. **クローズドループ制御（閉ループ制御、フィードバック制御）**：
   - 出力を測定し、目標値との差に基づいて入力を調整
   - 例：温度センサー付きのオーブン（パンの温度に応じて加熱を調整）
   - 特徴：外乱に強い、安定性を確保しやすい、構造が複雑

## 数学モデルの必要性

制御システムを設計するためには、制御対象の振る舞いを数学的に表現する必要があります。なぜでしょうか？

1. **予測可能性**：システムの未来の挙動を予測できる
2. **設計の容易さ**：数式があれば計算やシミュレーションができる
3. **安定性の検証**：システムが暴走しないことを数学的に証明できる
4. **最適化**：より良い制御パラメータを理論的に導出できる

例えば、空気抵抗のある環境で落下する物体の運動は、微分方程式で表すことができます：

$$m\frac{d^2x}{dt^2} = mg - c\frac{dx}{dt}$$

ここで、$m$は質量、$g$は重力加速度、$c$は空気抵抗係数、$x$は位置です。

また、電気回路（RLC回路）も微分方程式で表現できます：

$$L\frac{d^2q}{dt^2} + R\frac{dq}{dt} + \frac{1}{C}q = v(t)$$

ここで、$L$はインダクタンス、$R$は抵抗、$C$はキャパシタンス、$q$は電荷、$v(t)$は入力電圧です。

このような微分方程式は複雑になることが多いため、制御工学では「ラプラス変換」という手法を用いて解析を簡単にします。

## ラプラス変換とは？

**ラプラス変換**は、時間領域の関数を周波数領域（複素周波数領域）の関数に変換する数学的な手法です。微分方程式を代数方程式に変換できるため、制御工学では非常によく使われます。

### ラプラス変換の定義

時間関数 $f(t)$ のラプラス変換 $F(s)$ は以下のように定義されます：

$$F(s) = \mathcal{L}\{f(t)\} = \int_{0}^{\infty} f(t)e^{-st}dt$$

ここで、$s$ は複素変数（$s = \sigma + j\omega$）です。

### ラプラス変換の性質

ラプラス変換にはいくつかの重要な性質があります：

1. **線形性**：$\mathcal{L}\{af(t) + bg(t)\} = aF(s) + bG(s)$
2. **微分**：$\mathcal{L}\{\frac{df(t)}{dt}\} = sF(s) - f(0)$
3. **二階微分**：$\mathcal{L}\{\frac{d^2f(t)}{dt^2}\} = s^2F(s) - sf(0) - f'(0)$
4. **積分**：$\mathcal{L}\{\int_{0}^{t} f(\tau)d\tau\} = \frac{F(s)}{s}$

特に微分の性質は、微分方程式を代数方程式に変換する際に非常に重要です。

### 基本的なラプラス変換対

よく使われるラプラス変換の例を挙げます：

| 時間関数 $f(t)$ | ラプラス変換 $F(s)$ |
|---------------|-------------------|
| ステップ関数 $1(t)$ | $\frac{1}{s}$ |
| 指数関数 $e^{-at}$ | $\frac{1}{s+a}$ |
| 正弦波 $\sin(\omega t)$ | $\frac{\omega}{s^2 + \omega^2}$ |
| 余弦波 $\cos(\omega t)$ | $\frac{s}{s^2 + \omega^2}$ |
| インパルス関数 $\delta(t)$ | $1$ |

## 伝達関数とは？

**伝達関数**とは、システムの入力と出力の関係を表す数学的な関数です。具体的には、出力のラプラス変換を入力のラプラス変換で割ったものとして定義されます：

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

ここで、$Y(s)$ は出力のラプラス変換、$U(s)$ は入力のラプラス変換です。

### 伝達関数の例

電気回路、機械系、熱系など、多くの物理システムは伝達関数で表現できます。例えば：
これは2次遅れ系の典型的な例

1. **バネ-マス-ダンパー系**：
   - 入力：外力 $F(t)$
   - 出力：質量の位置 $x(t)$
   - 微分方程式：$m\frac{d^2x(t)}{dt^2} + c\frac{dx(t)}{dt} + kx(t) = F(t)$
   - ラプラス変換して整理すると：
   - 伝達関数：$G(s) = \frac{X(s)}{F(s)} = \frac{1}{ms^2 + cs + k}$


### 伝達関数の利点

伝達関数を使うメリットはいくつかあります：

1. **微分方程式が代数方程式になる**：解析が簡単になる
2. **システムの組み合わせが容易**：
   - 直列接続：$G_{total}(s) = G_1(s) \cdot G_2(s)$
   - 並列接続：$G_{total}(s) = G_1(s) + G_2(s)$
 
3. **周波数応答の解析が直感的**：$s = j\omega$ とすることで周波数特性を調べられる
4. **安定性の判定が容易**：極の位置から判断できる

## システムの応答と時定数

システムに入力を与えたとき、出力がどのように変化するかを「応答」といいます。特に、ステップ入力（突然に一定値になる入力）に対する応答は、システムの特性を理解する上で重要です。

### 時定数

**時定数**（Time constant）は、システムの応答速度を表す重要な指標です。一次遅れ系では、伝達関数に含まれる時間の次元を持つパラメータです。

例えば、伝達関数 $G(s) = \frac{K}{Ts + 1}$ における $T$ が時定数です。時定数は、ステップ応答において出力が最終値の約63.2%（正確には $1-e^{-1} \approx 0.632$）に達するまでの時間を表します。


## 一次遅れ系と二次系

### 一次遅れ系とは

**一次遅れ系**（First-order system）は、入力に対して緩やかに応答する最も基本的なシステムです。伝達関数は次の形で表されます：

$$G(s) = \frac{K}{Ts + 1}$$

ここで：
- $K$ はゲイン（定常ゲイン）：入力に対する出力の最終的な比率
- $T$ は時定数：応答の速さを表すパラメータ

一次遅れ系の例：
- RC回路
- 熱系（部屋の温度など）
- 簡単な化学反応系

一次遅れ系のステップ応答は、指数関数的に最終値に近づきます：

$$y(t) = K(1 - e^{-t/T})$$

この応答には以下の特徴があります：
- 最初は急速に上昇し、徐々に上昇速度が遅くなる
- 理論上は無限時間後に最終値に達する

### 二次系とは

**二次系**（Second-order system）は、一次遅れ系よりも複雑な動特性を持ち、振動的な挙動を示すことがあります。標準形の伝達関数は次の形で表されます：

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

ここで：
- $\omega_n$ は固有角周波数（natural frequency）：システム固有の振動数
- $\zeta$ は減衰比（damping ratio）：振動の減衰度合い

二次系の例：
- バネ-マス-ダンパー系
- RLC回路
- 機械的な振動系

減衰比 $\zeta$ によって二次系の挙動は大きく異なります：

1. **過減衰**（$\zeta > 1$）：振動せず、ゆっくりと最終値に近づく
2. **臨界減衰**（$\zeta = 1$）：最も速く、振動なしに最終値に近づく
3. **不足減衰**（$0 < \zeta < 1$）：振動しながら最終値に近づく
4. **無減衰**（$\zeta = 0$）：減衰なしで永久に振動する

制御工学では、不足減衰系の応答パラメータとして以下がよく使われます：
- 立ち上がり時間（Rise time）：出力が最終値の10%から90%に達するまでの時間
- 整定時間（Settling time）：出力が最終値の±5%（または±2%）の範囲内に収まるまでの時間
- オーバーシュート（Overshoot）：出力が最終値をどれだけ超えるかの割合
- ピークタイム（Peak time）：最初のピークに達するまでの時間

## MATLABで伝達関数を扱ってみよう

MATLABでは、Control System Toolboxを使って伝達関数を簡単に扱うことができます。以下に基本的な使い方を示します：

### 1. 伝達関数の定義

```matlab
% MATLABで伝達関数を定義する方法
% 方法1: tf関数を使う(一般的)
num = [1];     % 分子の係数 (s^0の係数)
den = [1, 1];  % 分母の係数 (s^1, s^0の係数)
G1 = tf(num, den);  % G(s) = 1/(s+1)

% 方法2: sをシンボリック変数として使う
s = tf('s');
G2 = 1 / (s + 1);  % 同じ伝達関数

% 伝達関数の表示
disp('伝達関数 G1:');
G1
disp('伝達関数 G2:');
G2
```

### 2. 一次遅れ系のステップ応答

```matlab
% 一次遅れ系の伝達関数
K = 2;    % ゲイン
T = 5;    % 時定数
G_first = K / (T*s + 1);  % G(s) = 2/(5s+1)

% ステップ応答をプロット
figure;
step(G_first);
grid on;
title('一次遅れ系のステップ応答');
xlabel('時間 [s]');
ylabel('出力');

% 時定数を変えた場合の比較
T_values = [1, 5, 10];
G_compare = zeros(3, 1, 'tf');  % 伝達関数の配列

figure;
for i = 1:length(T_values)
    G_compare(i) = K / (T_values(i)*s + 1);
    step(G_compare(i));
    hold on;
end
grid on;
title('時定数による一次遅れ系の応答の違い');
xlabel('時間 [s]');
ylabel('出力');
legend('T = 1', 'T = 5', 'T = 10');
```

### 3. 二次系のステップ応答

```matlab
% 二次系の伝達関数
wn = 1;    % 固有角周波数

% 減衰比を変えた場合の比較
zeta_values = [0.1, 0.5, 1.0, 2.0];
G_second = zeros(4, 1, 'tf');  % 伝達関数の配列

figure;
for i = 1:length(zeta_values)
    zeta = zeta_values(i);
    G_second(i) = wn^2 / (s^2 + 2*zeta*wn*s + wn^2);
    step(G_second(i));
    hold on;
end
grid on;
title('減衰比による二次系の応答の違い');
xlabel('時間 [s]');
ylabel('出力');
legend('\zeta = 0.1', '\zeta = 0.5', '\zeta = 1.0', '\zeta = 2.0');
```

### 4. 伝達関数の情報を取得

```matlab
% 減衰比0.5の二次系
G_info = wn^2 / (s^2 + 2*0.5*wn*s + wn^2);

% 極とゼロ点を取得
poles = pole(G_info);
zeros = zero(G_info);

disp('極:');
disp(poles);
disp('ゼロ点:');
disp(zeros);

% ステップ応答の特性を計算
stepinfo_result = stepinfo(G_info);
disp('ステップ応答の特性:');
disp(stepinfo_result);
```

## 簡単な例：温度制御システム

それでは、実際の例として温度制御システムを考えてみましょう。部屋の温度を制御するシンプルなモデルです。

```matlab
% 温度制御システムのモデル
K_room = 2;    % ヒーターの効き（定常ゲイン）
T_room = 15;   % 部屋の熱容量に関係する時定数（分）
G_room = K_room / (T_room*s + 1);  % 部屋の伝達関数（一次遅れ系）

% オープンループ（フィードバックなし）での応答
figure;
step(G_room);
hold on;

% 目標値を20℃上昇させると仮定
target = 20;
step(target * G_room);

grid on;
title('部屋の温度応答（フィードバックなし）');
xlabel('時間 [分]');
ylabel('温度上昇 [℃]');
legend('単位ステップ応答', '目標：20℃上昇');

% フィードバック制御を追加
Kp = 0.5;  % 比例ゲイン
G_control = feedback(Kp * G_room, 1);  % フィードバック系の伝達関数

figure;
step(target * G_control);
grid on;
title('部屋の温度応答（フィードバック制御あり）');
xlabel('時間 [分]');
ylabel('温度上昇 [℃]');

% 比例ゲインを変えた場合の比較
Kp_values = [0.1, 0.5, 1.0, 2.0];
G_compare = zeros(4, 1, 'tf');  % 伝達関数の配列

figure;
for i = 1:length(Kp_values)
    G_compare(i) = feedback(Kp_values(i) * G_room, 1);
    step(target * G_compare(i));
    hold on;
end
grid on;
title('比例ゲインによる応答の違い');
xlabel('時間 [分]');
ylabel('温度上昇 [℃]');
legend('Kp = 0.1', 'Kp = 0.5', 'Kp = 1.0', 'Kp = 2.0');

% 応答の解析
response_info = stepinfo(target * G_control);
disp('フィードバック制御の応答特性:');
disp(response_info);
```

上記のコードでは、部屋の温度変化を一次遅れ系でモデル化し、オープンループとクローズドループ（フィードバック制御）の応答を比較しています。また、比例ゲインを変えた場合の応答の違いも確認しています。

### 結果の解釈

1. オープンループでは、最終的に目標値に達しますが、時間がかかります
2. フィードバック制御を加えると、応答特性が変わります。比例ゲイン（Kp）を適切に選ぶことで、応答速度や安定性を調整できます。
3. ただし、単純な比例制御では、一般に定常偏差（最終的な誤差）が残ります。これを解消するためには、積分（I）制御を追加するなどの対策が必要です。

## まとめと次のステップ

この記事では、制御工学の基礎概念と伝達関数について学びました：

1. 制御とは、システムの出力を望ましい状態に保つための技術
2. 身の回りには多くの制御システムが存在する
3. 制御システムは、プラント、センサー、コントローラなどで構成される
4. ラプラス変換は微分方程式を代数方程式に変換する強力なツール
5. 伝達関数は、システムの入出力関係を表す便利な数学モデル
6. 一次遅れ系と二次系は、多くの物理システムを表現できる基本的なモデル
7. MATLABを使って伝達関数を扱い、システムの応答を解析できる

次のステップとしては：

- PID制御など、より高度な制御手法について学ぶ
- ボード線図や根軌跡など、周波数領域での解析手法を学ぶ
- 状態空間表現という別の数学モデルについて学ぶ
- Simulinkを使ってより複雑なシステムをシミュレーションする

制御工学は奥が深い学問ですが、基本概念をしっかり理解していれば、複雑な理論も少しずつ理解できるようになります。まずは身近なシステムを題材に、少しずつ実践してみてください！

## 参考文献・リソース

- [MATLABによる制御工学](https://jp.mathworks.com/help/control/)
- [太田快人, 制御工学の基礎](https://www.amazon.co.jp/dp/4339032212)
- [藤田政之, フィードバック制御入門](https://www.amazon.co.jp/dp/4339033219)
- [足立修一, MATLABによる制御工学](https://www.amazon.co.jp/dp/4339032689)
- [佐藤 和也,平元 和彦,平田 研二 初めてのはじめての制御工学](https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E5%88%B6%E5%BE%A1%E5%B7%A5%E5%AD%A6-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-KS%E7%90%86%E5%B7%A5%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E4%BD%90%E8%97%A4-%E5%92%8C%E4%B9%9F/dp/4065137470/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=QA92YZGO81UW&dib=eyJ2IjoiMSJ9.OG7O8iSL2sADuR2yDA-GxwZMeQMfQVx9u2SdUW1LFM73XuZD3WCDyMywb59d1_BCFeI9oU0JR5n19HXlZC7fnYHXiQ85ngF-wDZZM27jMuyZq9qb9HFmx6I6TX1x-g__e2sMBGCSy_G4TW61SS2tFleh7-Msi_TVtIWLeNyW8xilvw0VuHhLY_ZpzRdW409WyB3gDR4axRSp4s7Tqn0cP5oEajmyrGdDdEOLm3WlDqk.jCW6XWic9j7NMTqWTqR3WxpEr-ItYDnYetE4G0rwd34&dib_tag=se&keywords=%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E5%88%B6%E5%BE%A1%E5%B7%A5%E5%AD%A6&qid=1743572226&s=books&sprefix=%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E5%88%B6%E5%BE%A1%E5%B7%A5%E5%AD%A6%2Cstripbooks%2C178&sr=1-1)

---