I制御器の影響

clear; close all; clc;
s = tf('s');
P = 1/(s^2 + 10*s + 20);
t = 0:0.01:2;
rs = [];
sts = [];
os = [];
ses = [];
Kps = [];
for Kp=1:1000
  C = pid(0,Kp,0);
  T = feedback(C*P,1);
  [y,~]=step(T,t);
  info = stepinfo(T);
  Kps = [Kps Kp];
  rs = [rs info.RiseTime];
  sts = [sts info.SettlingTime];
  os = [os info.Overshoot];
  ses = [ses abs(y(end)-1)];    
end

yyaxis left;
plot(Kps,rs,'or');
hold on;
plot(Kps,ses,'oc');
yyaxis right;
plot(Kps,sts,'ob');
plot(Kps,os,'og');

legend('Rise time','Stedy-state error', 'Settling time','Overshoot');
xlabel('Ki');
set(gca, 'XScale', 'log')
big;

実行結果
f:id:seinzumtode:20200902142621p:plain

つまりIゲインを上げると・・・
Rise time:減少
Steady-state error:増加??
Settling time:増加
Overshoot:増加

Iゲインを上げるとSteady state errorが増加しているので何かおかしい。
Ki=1000のときのステップ応答
f:id:seinzumtode:20200902143119p:plain
システムが不安定になっていた。

システムが安定な状態にとどまるときの積分ゲインIを根軌跡から求める。
C=K/sより、閉ループ伝達関数T=1/(1+CP)を変形すると、
 \dfrac{1}{1+K\dfrac{1}{s(s^2+10s+20)}}

あるオープンループ伝達関数H(s)に対する根軌跡は \dfrac{1}{1+KH(s)}で分母がゼロになる条件を考えることから、 H(s)=\dfrac{1}{s(s^2+10s+20)}に対してrlocusを実行すればよい

H=1/(s*(s^2+10*s+20))
rlocus(H);

f:id:seinzumtode:20200902143818p:plain
f:id:seinzumtode:20200902143900p:plain
だいたいゲインKi=190のときにRHPに極が移動しているので、ここが安定限界。

上記のプログラムをK=190までで実行してみる。
f:id:seinzumtode:20200902144517p:plain
steady state errorがやっぱり上昇してるようにみえると思ったら、steady state errorの計算方法がおかしかった。結局何かしらの積分ゲインがあれば、Steaddy state errorは微小になり、積分ゲインの大小はあまり関係ないということか。

clear; close all; clc;
s = tf('s');
P = 1/(s^2 + 10*s + 20);
t = 0:0.01:2;
rs = [];
sts = [];
os = [];
ses = [];
Kps = [];
maxk=190;
for Kp=1:maxk
  C = pid(0,Kp,0);
  T = feedback(C*P,1);
  [y,~]=step(T);
  info = stepinfo(T);
  Kps = [Kps Kp];
  rs = [rs info.RiseTime];
  sts = [sts info.SettlingTime];
  os = [os info.Overshoot];
  ses = [ses abs(y(end)-1)];    
end

subplot(221);
plot(Kps,rs,'or');
xlabel('Ki');
title('rise time');

subplot(222);
plot(Kps,ses,'oc');
set(gca, 'XScale','log');
hold on;
coef=polyfit(Kps,ses,1);
%x=0:maxk;
plot(Kps,polyval(coef,Kps));
xlabel('Ki');
title('steady-state error');

subplot(223);
plot(Kps,sts,'ob');
xlabel('Ki');
title('settling time');

subplot(224);
plot(Kps,os,'og');
xlabel('Ki');
title('overshoot');

set(gca, 'XScale', 'log')
big;

f:id:seinzumtode:20200902145424p:plain