制御系のブロック線図を TikZ で描く
はじめに
制御系の説明で使うブロック線図 ── 伝達関数のブロック、加算点、分岐点、フィードバック経路 ── は、TikZ で素直に描けます。同じ TikZ で、確率モデルのグラフィカルモデルや圏論の可換図式も描けます。
準備とスタイル定義
専用パッケージは使わず、positioning(相対配置)、calc(座標計算)、arrows.meta(矢じり)だけで組みます。
\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, calc}
\tikzset{
>={Stealth[]},
block/.style = {draw, thick, minimum height=2.8em, minimum width=3.2em, align=center},
sum/.style = {draw, thick, circle, inner sep=0pt, minimum size=5mm},
branch/.style = {circle, fill, inner sep=1.3pt}, % 分岐点(黒丸)
}
block… 伝達関数を書く矩形sum… 加算点(小さい丸)branch… 信号を取り出す分岐点(塗り丸)
開ループ
まずは 1 ブロックだけ。\coordinate で入出力の端点を置き、node[above] で信号名を矢印に添えます。
\begin{tikzpicture}[node distance=1.7cm]
\coordinate (in);
\node[block, right=of in] (G) {$G(s)$};
\coordinate[right=of G] (out);
\draw[->] (in) -- node[above]{$U(s)$} (G);
\draw[->] (G) -- node[above]{$Y(s)$} (out);
\end{tikzpicture}
出力例:開ループ。$Y(s) = G(s)\,U(s)$。
単一フィードバックループ
閉ループの要点は 3 つです。
- 加算点
sumを置き、入力と帰還を集める - 出力線の途中に
branch(黒丸)を置いて信号を取り出す - 帰還経路を
-|(先に水平、次に垂直)や|-で直角に引き回し、加算点に戻す
\begin{tikzpicture}[node distance=1.7cm]
\coordinate (in);
\node[sum, right=1.2cm of in] (sum) {};
\node[block, right=1.4cm of sum] (C) {$C(s)$};
\node[block, right=of C] (P) {$P(s)$};
\coordinate[right=1.8cm of P] (out);
\node[branch] at ($(P)!0.55!(out)$) (pick) {};
\draw[->] (in) -- node[above]{$R(s)$} (sum);
\draw[->] (sum) -- node[above]{$E(s)$} (C);
\draw[->] (C) -- node[above]{$U(s)$} (P);
\draw[->] (P) -- node[above,pos=0.9]{$Y(s)$} (out);
\draw[->] (pick) -- ++(0,-1.25) -| (sum); % 分岐→下→左→加算点へ
\node at ($(sum)+(-0.33,0.30)$) {$+$};
\node at ($(sum)+(0.30,-0.33)$) {$-$};
\end{tikzpicture}
出力例:単一フィードバック系。開ループ伝達関数を $L = P C$ として、閉ループは $Y/R = L/(1+L)$。
ポイント:
($(P)!0.55!(out)$)はcalcの記法で「P と out を結ぶ線分の 55% の点」。分岐点をここに置く-- ++(0,-1.25) -| (sum)で「現在地から下へ 1.25、そこから加算点へ直角に」- 符号
$+$$-$は加算点の脇に\nodeで個別に置く(自動では付かない)
外乱を含む閉ループ
加算点をもう一つ足し、外乱 $D$ を上から入れます。
\begin{tikzpicture}[node distance=1.6cm]
\coordinate (in);
\node[sum, right=1.1cm of in] (s1) {};
\node[block, right=1.3cm of s1] (C) {$C(s)$};
\node[sum, right=1.3cm of C] (s2) {};
\node[block, right=1.3cm of s2] (P) {$P(s)$};
\coordinate[right=1.8cm of P] (out);
\node[branch] at ($(P)!0.55!(out)$) (pick) {};
\draw[->] (in) -- node[above]{$R$} (s1);
\draw[->] (s1) -- node[above]{$E$} (C);
\draw[->] (C) -- node[above,pos=0.4]{$U$} (s2);
\draw[->] (s2) -- (P);
\draw[->] (P) -- node[above,pos=0.9]{$Y$} (out);
\draw[->] ($(s2)+(0,1.3)$) -- node[right,pos=0.15]{$D$} (s2); % 外乱
\draw[->] (pick) -- ++(0,-1.3) -| (s1); % 負帰還
\node at ($(s1)+(-0.33,0.30)$) {$+$};
\node at ($(s1)+(0.30,-0.33)$) {$-$};
\node at ($(s2)+(-0.36,0.32)$) {$+$};
\node at ($(s2)+(0.33,0.20)$) {$+$};
\end{tikzpicture}
出力例:外乱 $D$ が制御対象の入力側に加わる系。$Y = \dfrac{PC}{1+PC}R + \dfrac{P}{1+PC}D$。
配線のコツ
- 直交で引く:信号線は水平・垂直だけにする。
-|と|-で曲がり方(先に横/先に縦)を選ぶ - 端点は
\coordinate:入出力やジャンクションは見えない点として置くと、線の起点・終点を指定しやすい - 分岐点は線の上:
calcの!割合!で線分上に黒丸を置く。分岐後の線は分岐点ノードから引く - 符号は手動:加算点の
+/-は自動で付かないので\nodeで配置する。位置は加算点中心からの相対で微調整 - ブロックの高さをそろえる:
minimum height/minimum widthを固定し、node distanceで間隔を管理する
他の選択肢
circuitikz… 回路図向けだが、\draw (0,0) to[...] ...の記法でブロックや加算器の部品も持つblox… ブロック線図専用のパッケージ。\bXInput,\bXComp(加算器)などのマクロで組む
決まった部品を多用するなら専用パッケージ、図ごとに配線や体裁を作り込むなら素の TikZ、という使い分けになります。
運用
図は standalone で 1 枚ずつ別ファイルにし、本文から \input します。ビルドは latexmk、環境固定は TeX Live 入りコンテナの記事にまとめてあります。この記事の図も、上のコードを standalone でコンパイルして dvisvgm で SVG 化したものです。
関連記事
- 確率的生成モデルのグラフィカル表現を TikZ で描く — ノードとプレートの描き方
- 圏論の可換図式を TikZ で描く — tikz-cd で矢印中心の図を組む
- 深層学習の代表的なモデル図を TikZ で描く —
\foreachと矩形ブロックで - 状態遷移図を TikZ で描く — automata ライブラリで状態と遷移を描く
- latexmk — TikZ を含む文書のビルドを回す
- TeX Live 入りコンテナと Makefile — 図のコンパイル環境を固定する
まとめ
block/sum/branchの 3 スタイルを定義すれば、たいていのブロック線図は書ける。- 配置は
positioningのright=of、配線は-|/|-の直交、分岐点はcalcの!割合!で線上に。 - 加算点の符号は自動で付かないので
\nodeで手動配置する。 - 定型部品が多いなら
bloxなどの専用パッケージも検討する。
信号の流れを追いながら「配置 → 配線 → 符号」の順に置いていけば、閉ループでも数行〜十数行で描けます。