2槽タンクの式に、どうやって制御器をつなぐのか
今回は「制御を含む微分方程式の形」を整理する回です。
前回の物質収支までは追えたのよ。上槽と下槽で式が2本になる、というのも分かった。でも、ここから制御が入ると言われると、急に別の科目が始まる感じがして、少し身構えちゃうんだよね。
その感覚は自然たい。でも、土台は同じばい。タンクの側は液位がどう動くかを書く。制御器の側は、その液位を見て入力を決める。役割を分けて見れば、急に全部が変わるわけやなか。
なるほどね……式が入れ替わるんじゃなくて、外側にもう一枚つながる感じなのかな。
そうたい。その見方ができれば、かなり整理しやすくなるばい。
前回は、2槽タンクの液位挙動を物質収支から導き、$h_1(t)$ と $h_2(t)$ を状態変数とする2本の常微分方程式を得ました。今回はその式に、P制御、PI制御、PID制御をどう組み込むかを整理します。
ここでの狙いは、応答の良し悪しを感覚で語ることではありません。あくまで、制御器を入れると微分方程式の形がどう変わるかを見通しよく理解することです。
とくに PI 制御では積分状態を導入するので、「状態が1つ増える」という見方が自然に出てきます。この記事では、まず一般形を示し、そのあとで2槽タンクとしての具体形へ下ろしていきます。
まず、前回の2槽モデルを短く再確認する
今回の制御器は、このプラント方程式の外側につながります。
前回の基本モデルは、上槽液位 $h_1$ と下槽液位 $h_2$ を状態変数とする2本の常微分方程式でした。断面積を $A_1, A_2$、流入・流出をそれぞれ $q_{in}, q_{12}, q_{out}$ とすると、物質収支は
$$A_1 \frac{dh_1}{dt} = q_{in} – q_{12}$$
$$A_2 \frac{dh_2}{dt} = q_{12} – q_{out}$$
と書けます。ここでは、まだ制御器は入っていません。つまり「ある流量が与えられたとき、液位がどう動くか」を表す、自然挙動のモデルです。
ここまではプラントの式たい。タンクそのものが持っとる動きを書いとるだけやね。
ということは、今の時点では「どう動かしたいか」はまだ入っていないんだよね。あくまで、放っておいたらどうなるか、という式なのかな。
その通りたい。そこへ「どう入力を与えるか」を決める制御器が後からつながるばい。
その理解で大丈夫です。制御器は、液位そのものを直接書き換えるわけではありません。偏差を見て、バルブ開度やそれに対応する入力 $u(t)$ を決め、その入力がプラント方程式へ入ります。
制御対象・目標値・偏差・操作量を定義する
ここを曖昧にしないと、P・I・D がどこに入るかが見えやすくなります。
今回は、下槽液位 $h_2(t)$ を制御対象にします。つまり「下槽の液位を、ある目標値に近づけたい」という設定です。
目標値を $h_{set}$ とし、偏差を
$$e(t) = h_{set} – h_2(t)$$
で定義します。ここで偏差 $e(t)$ は、「いまの液位が目標値からどれだけずれているか」を表します。
そして、制御器が決める量を操作量 $u(t)$ とします。これはバルブ開度そのものでもよいし、バルブ開度に比例する入力信号でもよいです。この記事では、一般性を保つために $u(t)$ という入力として扱います。
目標値:$h_{set}$
偏差:$e(t)=h_{set}-h_2(t)$
操作量:$u(t)$
ここで少し迷うのよね。偏差は分かるんだけど、操作量 $u(t)$ が「どこに入るのか」がまだ頭の中でふわっとしてるのよ。上から入る流量を動かすのか、途中のバルブを動かすのかで、イメージが違って見えてしまって。
そこは最初から一つに決め打ちせんでもよかたい。一般形では「$u(t)$ は流量に効く入力」とだけ思っておけば十分ばい。どこへ効くかは、あとで具体形にしたときに流量式へ入れてやればよか。
あ、なるほどね。最初は「入力がある」という骨格だけ見て、効く場所の細かい話は後で具体化すればいいんだ。
まず、制御を含む微分方程式を一般形で書く
最初に骨格を押さえてから、2槽タンクの具体形へ下ろします。
制御器を接続した系は、まず一般形として
$$\frac{dh_1}{dt} = f_1(h_1,h_2,u)$$
$$\frac{dh_2}{dt} = f_2(h_1,h_2,u)$$
と書けます。ここで $f_1, f_2$ は、物質収支と流量式をまとめた関数です。
この形の意味ははっきりしています。プラントは入力 $u(t)$ を受け取って液位を変える側であり、制御器は偏差 $e(t)$ から $u(t)$ を作る側です。
$f_1$ と $f_2$ って書かれると、急に抽象的になって少し怖く見えるのよね……。分からないものをまとめて押し込んだ感じに見えちゃうというか。
そこは身構えんでよかたい。$f(\cdot)$ は、正体不明の箱やなくて、「物質収支と流量式をいったんまとめて書いとる」というだけばい。中身を消したんやなくて、あとで開けやすいように名前を付けとる感じたい。
なるほどね。「まだ決めていない」のではなくて、「いったんまとめて見ている」だけなんだ。
ただし、この記事では一般形だけで終わらせません。2槽タンクとして具体的に見ると、たとえば入力 $u(t)$ が上槽への流入流量そのものだとすれば、
$$A_1 \frac{dh_1}{dt} = u – q_{12}(h_1,h_2)$$
$$A_2 \frac{dh_2}{dt} = q_{12}(h_1,h_2) – q_{out}(h_2)$$
と書けます。したがってこの場合は、
$$f_1(h_1,h_2,u)=\frac{1}{A_1}\Bigl(u-q_{12}(h_1,h_2)\Bigr)$$
$$f_2(h_1,h_2,u)=\frac{1}{A_2}\Bigl(q_{12}(h_1,h_2)-q_{out}(h_2)\Bigr)$$
です。
あ、ここで急に安心したのよ。ちゃんと中身が見えると、「さっきの $f_1, f_2$ はこのことを言ってたんだ」ってつながるね。
そうたい。抽象形と具体形は別物やなくて、同じものを違う距離から見とるだけばい。
つまり、$f(\cdot)$ という書き方は抽象化ではありますが、中身のない記号ではありません。2槽タンクでは、結局は物質収支から出てきた具体的な式をまとめて書いているだけです。
P制御を組み込む
最初は、偏差に比例して操作量を決める最も単純な形です。
P制御では、操作量を偏差に比例させて
$$u(t) = K_p e(t) = K_p \bigl(h_{set} – h_2(t)\bigr)$$
と置きます。ここで $K_p$ は比例ゲインです。
この $u(t)$ を一般形へ代入すれば、P制御を含む系は
$$\frac{dh_1}{dt} = f_1\!\left(h_1, h_2, K_p(h_{set}-h_2)\right)$$
$$\frac{dh_2}{dt} = f_2\!\left(h_1, h_2, K_p(h_{set}-h_2)\right)$$
と書けます。
さらに、入力 $u$ が上槽流入そのものだとすれば、具体形は
$$A_1 \frac{dh_1}{dt} = K_p(h_{set}-h_2) – q_{12}(h_1,h_2)$$
$$A_2 \frac{dh_2}{dt} = q_{12}(h_1,h_2) – q_{out}(h_2)$$
です。P 制御では、新しい状態変数は増えません。$u(t)$ はその時点の偏差から即座に決まる代数量です。
ここは比較的追いやすいのよ。偏差を見て、そのまま $u(t)$ が決まる。だから「式が増える」というより、「入力の決め方が入る」という感じなんだね。
そうたい。P制御では、その瞬間のズレだけで入力が決まるけん、状態そのものは増えんばい。
PI制御を組み込む
積分項を入れるときは、積分状態を1つ導入すると整理しやすくなります。
PI制御では、操作量を
$$u(t) = K_p e(t) + K_i \int_0^t e(\tau)\,d\tau$$
と書けます。ただし、このままだと積分記号が入っていて、常微分方程式系として扱うには少し不便です。そこで積分状態 $z(t)$ を
$$z(t)=\int_0^t e(\tau)\,d\tau$$
と定義します。すると、微分して
$$\frac{dz}{dt}=e(t)=h_{set}-h_2(t)$$
となります。これで PI 制御の操作量は
$$u(t)=K_p(h_{set}-h_2)+K_i z(t)$$
と書き直せます。
ここで少し止まりたくなるのよね。積分項が入る、までは分かるんだけど、どうして急に $z(t)$ みたいな新しい文字を置くのかが、最初は飛躍に見えてしまって。
そこは大事な引っかかりたい。積分をそのまま抱えたままだと、微分方程式の形として扱いにくか。やけん「積分された量そのもの」を $z(t)$ と置いて、時間変化を持つ状態として見るばい。
あ、なるほどね。積分記号を消したいから置く、というより、過去の偏差がたまった量をちゃんと状態として持つために置くんだ。
そうたい。だから PI になると、$h_1, h_2$ に加えて $z$ も追うことになるばい。
したがって、一般形では PI 制御を含む系は
$$\frac{dh_1}{dt}=f_1\!\left(h_1,h_2,K_p(h_{set}-h_2)+K_i z\right)$$
$$\frac{dh_2}{dt}=f_2\!\left(h_1,h_2,K_p(h_{set}-h_2)+K_i z\right)$$
$$\frac{dz}{dt}=h_{set}-h_2$$
と書けます。
さらに、入力 $u$ が上槽流入そのものだとすれば、具体形は
$$A_1 \frac{dh_1}{dt}=K_p(h_{set}-h_2)+K_i z-q_{12}(h_1,h_2)$$
$$A_2 \frac{dh_2}{dt}=q_{12}(h_1,h_2)-q_{out}(h_2)$$
$$\frac{dz}{dt}=h_{set}-h_2$$
となります。ここで、連立常微分方程式が2本から3本へ増えていることがはっきり見えます。
PID制御を組み込む
P と I に加えて、偏差の時間変化も使う形です。
PID制御では、操作量を
$$u(t)=K_p e(t)+K_i z(t)+K_d \frac{de}{dt}$$
と書きます。ここで
$$e(t)=h_{set}-h_2(t)$$
なので、目標値 $h_{set}$ が一定であれば
$$\frac{de}{dt}=-\frac{dh_2}{dt}$$
です。したがって PID 制御の操作量は
$$u(t)=K_p(h_{set}-h_2)+K_i z+K_d \frac{de}{dt}$$
と書けます。
よって、一般形では
$$\frac{dh_1}{dt}=f_1\!\left(h_1,h_2,K_p(h_{set}-h_2)+K_i z+K_d\frac{de}{dt}\right)$$
$$\frac{dh_2}{dt}=f_2\!\left(h_1,h_2,K_p(h_{set}-h_2)+K_i z+K_d\frac{de}{dt}\right)$$
$$\frac{dz}{dt}=h_{set}-h_2$$
と表せます。
さらに、入力 $u$ が上槽流入そのものだとすれば、具体形は
$$A_1 \frac{dh_1}{dt}=K_p(h_{set}-h_2)+K_i z+K_d\frac{de}{dt}-q_{12}(h_1,h_2)$$
$$A_2 \frac{dh_2}{dt}=q_{12}(h_1,h_2)-q_{out}(h_2)$$
$$\frac{dz}{dt}=h_{set}-h_2$$
となります。
ここも少し慎重に見たいのよ。P は「いまのズレ」、I は「たまったズレ」って見えてきたんだけど、D は急に「変化の速さ」を見ると言われて、頭の切り替えがいる感じがするんだよね。
そこは無理に一気に飲み込まんでよかたい。D は「いまどれだけズレているか」ではなく、「そのズレが今どう変わりつつあるか」を見る項ばい。見ている対象が少し違うけん、引っかかるのは自然たい。
なるほどね。P・I と同じ「偏差を見る仲間」ではあるけど、D だけは偏差そのものじゃなくて、その変わり方を見ているんだ。
この回では、D 項の実装上の細かい扱いには深入りしません。大事なのは、PID では P 項・I 項・D 項を合わせて操作量 $u(t)$ を決め、それがプラント方程式へ入るという構造が見えることです。
P / PI / PID を並べて見比べる
どの制御でも「偏差から操作量を作ってプラントへ戻す」という骨格は同じです。
ここまでの形をまとめると、P・PI・PID は次のように整理できます。
P制御
$$u=K_p(h_{set}-h_2)$$
$$\frac{dh_1}{dt}=f_1(h_1,h_2,u),\qquad \frac{dh_2}{dt}=f_2(h_1,h_2,u)$$
PI制御
$$u=K_p(h_{set}-h_2)+K_i z,\qquad \frac{dz}{dt}=h_{set}-h_2$$
$$\frac{dh_1}{dt}=f_1(h_1,h_2,u),\qquad \frac{dh_2}{dt}=f_2(h_1,h_2,u)$$
PID制御
$$u=K_p(h_{set}-h_2)+K_i z+K_d \frac{de}{dt},\qquad \frac{dz}{dt}=h_{set}-h_2$$
$$\frac{dh_1}{dt}=f_1(h_1,h_2,u),\qquad \frac{dh_2}{dt}=f_2(h_1,h_2,u)$$
こうして並べると、少し落ち着いて見えるのよね。全部ばらばらの話に見えていたけど、実は「偏差から $u$ を決めて、それをプラントへ入れる」という骨格はずっと同じなんだ。
そうたい。違いは、偏差のどこまでを見るかと、状態が増えるかどうかたい。骨格が同じと見えれば、だいぶ整理しやすかばい。
この比較から見えるのは、P 制御では偏差だけを見て操作量を決めること、PI 制御では積分状態 $z$ が加わること、PID 制御ではさらに偏差の時間変化まで入ることです。
一方で、どの場合もプラントそのものが別世界へ変わるわけではありません。プラントはあくまで $h_1, h_2$ の液位ダイナミクスで、制御器がその外側から $u(t)$ を与える構造は共通です。
ここでは数式まで、挙動の実感は最後に軽く触れる
この回は「効き方の直感」より「式の置き場所」を優先します。
だいぶ見えてきたのよ。でも正直に言うと、まだ「I が入るとどう感じるのか」「D が入ると何が変わるのか」までは、式だけだと少し掴みきれていない感じもあるんだよね。
それで十分たい。この回はまず、P・I・D がどこに入るかを見失わんようにする回やけんね。式の位置が見えれば、あとで時間応答を見たときに話がつながりやすか。
なるほどね。今日は「完全に実感する」より、「構造を見失わない」が目標なんだ。
その通りです。数式としては、ここまでで P・PI・PID を含む微分方程式の形は整理できています。特に重要なのは、PI 制御で積分状態 $z$ が増えること、そして P・PI・PID のどれもが最終的には「操作量 $u(t)$ を通じてプラントへ入る」という共通構造を持つことです。
最後に:この式は数値シミュレーションへそのままつながる
ここで整理した意味は、連立常微分方程式としてそのまま扱えることにあります。
ここまでで、2槽タンクに対して P・PI・PID を含む微分方程式の形は整理できました。P 制御では偏差から直接操作量を決め、PI 制御では積分状態が増え、PID 制御では偏差の時間変化まで操作量へ入ります。
この形まで整理できていれば、あとは連立常微分方程式として時間発展を追うことができます。つまり、どの制御がどのような応答を生むかは、数値シミュレーションによって具体的に確かめられるわけです。
こうした連立常微分方程式は Python でも解けますが、この回で本当に大事なのは、実装言語より先に、式の構造そのものが見えていることです。