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;
実行結果
つまりIゲインを上げると・・・
Rise time:減少
Steady-state error:増加??
Settling time:増加
Overshoot:増加
Iゲインを上げるとSteady state errorが増加しているので何かおかしい。
Ki=1000のときのステップ応答
システムが不安定になっていた。
システムが安定な状態にとどまるときの積分ゲインIを根軌跡から求める。
C=K/sより、閉ループ伝達関数T=1/(1+CP)を変形すると、
あるオープンループ伝達関数H(s)に対する根軌跡はで分母がゼロになる条件を考えることから、に対してrlocusを実行すればよい
H=1/(s*(s^2+10*s+20)) rlocus(H);
だいたいゲインKi=190のときにRHPに極が移動しているので、ここが安定限界。
上記のプログラムをK=190までで実行してみる。
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;