LQGサーボコントローラ

f:id:seinzumtode:20200912222145p:plain

clear; close all; clc;

A = [0 1 0;0 0 1;1 0 0];    
B = [0.3 1;0 1;-0.3 0.9];
C = [1.9 1.3 1];  
D = [0.53 -0.61];
sys = ss(A,B,C,D);

nx = 3;    %Number of states
ny = 1;    %Number of outputs
Qn = [4 2 0; 2 1 0; 0 0 1];
Rn = 0.7;
R = [1 0;0 2]
QXU = blkdiag(0.1*eye(nx),R);
QWV = blkdiag(Qn,Rn);
QI = eye(ny);
 
KLQG = lqg(sys,QXU,QWV)

KLQG1 = lqg(sys,QXU,QWV,QI,'1dof');
KLQG2 = lqg(sys,QXU,QWV,QI,'2dof');

G = tf(sys);
G1=G(1);
G2=G(2);

KLQG_TF1=tf(KLQG1);
C1 = KLQG_TF1(1);
step(feedback(C1*G1,1));
title('状態1のステップ応答(1自由度)');
figure();
C2 = KLQG_TF1(2);
step(feedback(C2*G2,1));
title('状態2のステップ応答(1自由度)');

figure();
KLQG_TF2 = tf(KLQG2);
Cr = KLQG_TF2(1,1);
Cy = KLQG_TF2(1,2);
T1 = G1*Cr/(1-G1*Cy); %closed loop TFcn
step(T1);
title('状態1のステップ応答(2自由度)');

figure();
KLQG_TF2 = tf(KLQG2);
Cr = KLQG_TF2(2,1);
Cy = KLQG_TF2(2,2);
T2 = G2*Cr/(1-G2*Cy); %closed loop TFcn
step(T2);
title('状態2のステップ応答(2自由度)');

f:id:seinzumtode:20200912220542p:plain
状態2に関して2自由度の方がオーバーシュートが小さくなっているので好ましい。