古典制御理論について考えます。
PD制御です。
PD制御
偏差を微分して、傾きを得て、次を予測します。
Let’s Python Simulator
超簡易シミュレーターを実装します。
pd_controller.py
import sys
import numpy as np
import matplotlib.pyplot as pyplot
x = np.arange( 1, 2000, 1 )
y = []
argv = sys.argv
kp = float( argv[1] )
kd = float( argv[2] )
TARGET = 10
COLD = 1
input = 0
prev_diff = 0
curr_diff = 0
## delta t
dt = 1
for i in np.arange( 1, 2000, 1 ):
y.append(input)
diff = TARGET - input
curr_diff = diff
## with a heater
output = (diff * kp) + (((curr_diff - prev_diff) / dt) * kd)
prev_diff = curr_diff
## 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('pd.png')
ディジタル制御なので、((今の偏差)-(前回の偏差))/((今の時刻)-(前回の時刻))を微分の値とします。
簡便のため、(今の時刻)-(前回の時刻)を1と決めてしまいます。
使い方です。
> python3.9 pd_controller.py 0.3 0.4
Kp = 1.2 / Kd = 0
Kp = 1.2 / Kd = 0.1
まとめ
基本中の基本としては、今の時刻の偏差に対する微分に係数を掛けただけのものをD制御としましょう、でいいと思います。
I制御も同様で、最初から今までの総和に係数を掛けただけのものをI制御としています。
例を部屋と暖房としていますが、PD制御とは合いません。
倒立振子などでは合うと思います。
急に寒くなったり暑くなったりする環境の部屋には合うと思いますが、それをソースコードで再現させるくらいなら倒立振子をやります。
広告
IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』![](https://www12.a8.net/0.gif?a8mat=356SUU+1823JM+407E+5YJRM)
さくらのレンタルサーバ
![](https://www19.a8.net/0.gif?a8mat=2ZN7UA+4P34KY+D8Y+67RK2)
ムームードメイン
![](https://www16.a8.net/0.gif?a8mat=2ZN7UA+4UG10Y+348+1BNBJM)
Oisix(おいしっくす)
![](https://www17.a8.net/0.gif?a8mat=35H9RO+40OCS2+3RK+2T8BZM)
らでぃっしゅぼーや
![](https://www17.a8.net/0.gif?a8mat=35H9RT+5I9D82+1YGO+1ZIL6Q)
珈琲きゃろっと
![](https://www13.a8.net/0.gif?a8mat=3T0BIX+5TKLPU+2CG0+5YJRM)
エプソムソルト
![](https://www13.a8.net/0.gif?a8mat=3T4CGA+8AA6UQ+R12+609HU)