古典制御理論 2

古典制御理論について考えます。
I制御です。

ほとんど場合において説明されもしないI制御。

昔の人は考えた(と思う)

「P制御だけで上手くいかないなら、偏差の総和も使えば定常偏差を無くすことができるのではないか。」

目標値を10として、P制御のみで、ずっと長い間8のまま推移する場合、偏差はざっくり2です。積分はある単位時間あたり2ずつ増え続けます。これを使って、P制御に上乗せすれば、10に近付くという発想はとても自然です。

P制御と一緒に使うときは、PI制御と言います。

昔の頭の良い人は定常偏差を消し去りたいと考えた(と思う)

「P制御だけで上手くいかないなら、偏差の総和も使えば定常偏差を無くすことができるのではないか。」

目標値を10として、P制御のみで、ずっと長い間8のまま推移する場合、偏差はざっくり2です。積分はある単位時間あたり2ずつ増え続けます。
最初からずっと積分し続けます。
偏差の積分に対する係数が小さいとすると、徐々に目標値に近づく出力となるはずです。

あるとき、いよいよ目標値に接近したとき、行き過ぎるかもしれないし、行き過ぎることなく目標値と一致して一致した状態が続くかもしれません。

行き過ぎたとすると、(目標値)-(入力)=(負の値)となり、行き過ぎているときの積分の値も負の値となります。これにより、多少Huntingがあっても目標値を保ちつづけることができます。外乱の変化にも対応できます。

P制御は誰が考えても基本形は1つと思いますが、I制御は設計方法はいくつも考えることができると思います。ですが、一番の基本となるのは最初からの積分を使って係数を掛ける、ということになるでしょう。

定常偏差に落ち着く以前の積分の値が大きいようであれば、Kiを小さくして対応すれば、とりあえず自動化できます。

I制御

Iは、Integral、のIです。積分制御です。

入力に対して、今までの偏差の総和に一定の値(=係数)を掛け算して出力にします。目標値に向かわせることができます。

Let’s Python Simulator

超簡易シミュレーターを実装します。

i_controller.py

import sys
from collections import deque
import numpy as np
import matplotlib.pyplot as pyplot

x = np.arange( 1, 2000, 1 )
y = []

argv = sys.argv
COEFF = float( argv[1] )
TARGET = 10
COLD = 1

input = 0
## q : FIFO queue depth
# q = int( argv[2] )
q = 10000
output = deque([])

counter = 0
for i in np.arange( 1, 2000, 1 ):
    y.append(input)
    diff = TARGET - input
    ## with a heater
    if counter < q:
        output.append( diff )
    else:
        output.append( diff )
        output.popleft()
    ## It's cold outside.
    input += (sum( output ) * COEFF) - COLD
    counter += 1

pyplot.plot( x,y )

y = np.full( 1999, TARGET )
pyplot.plot( x,y, color='r' )

pyplot.xlabel("x")
pyplot.ylabel("y", rotation=0)

pyplot.xlim(0, 200)
pyplot.ylim(-50, 50)

pyplot.savefig('i.png')

queueを使って、ある程度過去より前を捨てることが出来るような実装をしています。
本稿においては余計な実装です。

TARGET – inputが、よくあるr-yです。
rが目標値で、yがセンサーで読み取った現在値です。
COEFFが、よくあるKiです。
outputが、よくあるuです。

使い方です。


> python3.9  i_controller.py  0.1

Ki = 0.1

001

Ki = 0.5

002

まとめ

ここで例としている出力した熱がある程度は保存される場合、最初から目標値に届くまでの全ての積分を持ち続けているので、初期値から目標値に辿り着いたあとに、(目標値)-(初期値)だけ値を進めてしまう動作になります。

input += sum(output)*Kiと表すような場合ではなくて、input = sum(output)*Kiと表すような場合はうまくいきます。

部屋で暖房を動かすような場合はI制御のみは合わないと思います。

広告

IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』
さくらのレンタルサーバ
ムームードメイン
Oisix(おいしっくす)
らでぃっしゅぼーや
Cheesecake HOLIC
海鮮・肉グルメの高級ギフト【築地わだつみ】

コメントを残すために、Twitter OAuthを必要としています。ご了承ねがいます。
コメントは、Twitterに影響しません。

Twitter OAuth