システムとモデリング

modelica, Julia, Design Structure Matrix, SysML, 他モデリング全般について。

JuliaでPIDのオートチューニング その2進捗状況

この記事中のプログラムコードには誤りがあります。
詳細は下記記事を御覧ください。

otepipi.hatenablog.com

前回からの続きです。今回は前回のオートチューニングで得られたパラメーターを当てはめてPIDしてみます。 前回は↓

otepipi.hatenablog.com

得られたパラメーターを以下に再掲致します。

Kp=0.02382
Ti=202.0
Td=50.5

これを用いて以下のようにプログラムを作成します。

using Plots

tm = 1000 #シミュレーション時間
ie = 0 #誤差積分値初期値

function PID(err,prerr)
    kp = 0.02382 #比例ゲイン
    Ti=202.0 #積分時間
    Td=50.5 #微分時間
    ki = kp/Ti #積分ゲイン
    kd = kp*Td #微分ゲイン
    global ie = err + ie 
    ⊿err = err - prerr
    kp * err + ki * ie + kd * ⊿err
end

#目標値の変更
function setpoint(simtime)
  if simtime < 100
      return 10
  elseif simtime < 300
      return 50
    else
      return 80
    end
end

function Plant(simtime,input)
   td = 100 #Delay
   T0 = 0 #温度初期値(℃)
   temp_max = 100 #温度最大値
   temp_min = 0 #温度最小値
   u = max(input,temp_min)
   u = min(u,temp_max)
   print(u)
    if simtime < td
        return 0
    else
        return  (T0 - u) * exp(-0.005*(simtime-td)) + u
    end
end

# 空の配列の作成
u = zeros(tm + 1)
y = zeros(tm + 1)
r = zeros(tm + 1)
er = zeros(tm + 1)

for  t in 1:tm
      prer = r[t] - y[t]
      y[t+1] = Plant(t,u[t])
      r[t+1] = setpoint(t)
      er[t+1] = r[t+1] - y[t+1]
      u[t+1] = PID(er[t+1],prer)            
end

p = plot([0:tm],[y,r],title="kp=0.24 Ti=202 Td=50.5",label=["y","setpoint"])
display(p)

これを実行すると以下のようなグラフが得られます。

f:id:Otepipi:20190407222607p:plain

完全に発散してしまっています。 次に、パラメーターを大幅に変更してみます。

f:id:Otepipi:20190407222904p:plain

多少はましになりました。 オートチューニングのSTEP応答は精度があまり良くないのでしょうか? もしくはプログラムが良くない可能性もありますので ベンチマークリファクタリングを繰り返しながら様子を見たいと思います。

今回は以上になります。