車輪型倒立振子の制御 その4 rscaleを使って目標値をスケール

定常偏差はなくなるが、オーバーシュートが大きすぎる

clear; close all; clc;

A = [0 1 0
    131.91 -1.27E-04 50.27
    -168.29 1.63E-04 -136.55];
B = [0;-56.15;152.52];
C = [1 0 0];
D = 0;
states = {'theta','theta_dot','phi_dot'};
inputs = {'u'};
outputs = {'theta'};

sys = ss(A,B,C,D,'statename',states,'inputname',inputs,'outputname',outputs);
poles = eig(A)

R = 1;
Q = C'*C;
K=lqr(A,B,Q,R)

Nbar = rscale(sys,K);
syscl = ss(A-B*K,B*Nbar,C,D);
step(syscl);
DCgain=dcgain(syscl)

f:id:seinzumtode:20200915171654p:plain

折返し法を使って速く収束させようとしたら逆にオーバーシュートが大きくなった

clear; close all; clc;

A = [0 1 0
    131.91 -1.27E-04 50.27
    -168.29 1.63E-04 -136.55];
B = [0;-56.15;152.52];
C = [1 0 0];
D = 0;
states = {'theta','theta_dot','phi_dot'};
inputs = {'u'};
outputs = {'theta'};

sys = ss(A,B,C,D,'statename',states,'inputname',inputs,'outputname',outputs);
poles = eig(A)

R = 1;
Q = C'*C;
alpha = 8;
K=lqr(A+alpha*eye(3),B,Q,R)

Nbar = rscale(sys,K);
syscl = ss(A-B*K,B*Nbar,C,D);
step(syscl);
DCgain=dcgain(syscl)

f:id:seinzumtode:20200915171922p:plain