古典制御理論について考えます。
最初はP制御です。
偏差
古典制御理論における偏差とは、目標値と測定値の差の値のことです。
下記で示す例では、エアコンのように目標値として設定温度を設定できるものとして、温度計の情報を測定値とします。
「暖房にとって最も適切な室内の温度(実数)を取得する。」ことは不可能と思いますので、測定値に完璧を求めても仕方がないと思います。
P制御
Pは、Proportional、のPです。比例制御です。
入力に対して、一定の値を掛け算して出力にします。目標値に向かわせることができます。
移動式温度調節機を考えます。
暖房を考えます。
入力を偏差とします。
出力は熱とします。
目標値を10とします。
偏差に応じて出力が比例的に変わるとします。なにかしらの係数の値で示します。
こんな感じ
Let’s Python Simulator
超簡易シミュレーターを実装します。
p_controller.py
import sys
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
for i in np.arange( 1, 2000, 1 ):
y.append(input)
diff = TARGET - input
## with a heater
output = diff * COEFF
## It's cold outside.
input += output - COLD
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(0, 20)
pyplot.savefig('p.png')
TARGET – inputが、よくあるr-yです。
rが目標値で、yがセンサーで読み取った現在値です。
COEFFが、よくあるKpです。
outputが、よくあるuです。(下記のような狡いことを考えているのでほぼyです。)
ある程度は温度を保つことができる部屋のようなものを想定しています。そして暖房の出力がそのまま温度上昇と同じになることを考えます。(1を入力すると、1が出力されるブロックがuの後段にある、と考える。)
暖房がKpにより暖める量outputを変えて、外気温で強制的にCOLD分だけ冷える場合を考えると上のソースコードで表すことができます。
使い方です。
> python3 p_controller.py 0.9
ざっくりの温度の変化の遷移を示します。
Kp = 0.4
Kp = 0.9
Kp = 1.2
下記について断言して良さそうです。
- 係数が大きくても小さくても駄目。(COEFFの値を変える。)
- 外部の状況が変わったら、係数の変更が必要。(COLDの値が変わったら、COEFFも変える。)
- 係数が適切でないとHuntingする。(当たり前。)
よくあるP制御の説明ですね。
P制御でどうしても残る偏差を定常偏差と呼びます。
この場合、COLD=1が大きすぎるのでしょう。
flyball governor
1788年、James Wattが、flyball governorを設計しました。
1868年、Maxwellが論文を書きました。定常偏差を無くすために、I制御が必要であることを示したらしいです。
まとめ
Huntingを、昔の人が日本語にしたら、ハンチングになります。
シーデー(CD)とか、デーブイデー(DVD)とか言わない時代になったのだから見直せばいいのに、と思います。
目標値を追いかける動作になってしまうだけなのに、「ハンチングが発生する」と言うと、制御理論にだけ特有の何か特別な事象が起きているように誤解してしまいます。
参考
広告
IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』さくらのレンタルサーバ
ムームードメイン
Oisix(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト