同次元状態オブザーバを使って出力フィードバック形式のコントローラを組む

C=[0 0 1 0]よりx3のみ観測しているので、誤差は(初期を除いて)生じていない。

M1=0.5; M2=1;
k = 2; mu=1;

A = [0 1 0 0
    -k/M1 -mu/M1 k/M1 mu/M1
    0 0 0 1
    k/M2 mu/M2 -k/M2 -mu/M2
    ];

B = [0
    1/M1
    0
    0];

C = [0 0 1 0];

p = [-2+2j -2-2j -2+j -2-j];

K = -acker(A,B,p)

M0 = [A B
      C 0];

H = [-K 1]*inv(M0)*[zeros(4,1);1]

disp('eigen A+B*K')
eig(A+B*K)


q=[-4+4j -4-4j -4+2j -4-2j];

L = -acker(A',C',q)'
disp('eigen A+L*C')
eig(A+L*C)

Acl = [ A B*K
        -L*C A+B*K+L*C
        ];
    
disp('eigen Acl');
eig(Acl)
N = input('N=');
M1v = N*M1;
M2v=N*M2;

Av = [0 1 0 0
      -k/M1v -mu/M1v k/M1v mu/M1v
      0 0 0 1
      k/M2v mu/M2v -k/M2v -mu/M2v
      ];
  
Bv = [0 1/M1v 0 0]';

x0 = [-0.5 0 0.5 0]';
close all;

subplot(4,1,1)
hold on;
plot(t,x(:,1))
plot(t,x_hat(:,1))

subplot(4,1,2)
hold on;
plot(t,x(:,2))
plot(t,x_hat(:,2))

subplot(4,1,3)
hold on;
plot(t,x(:,3))
plot(t,x_hat(:,3))

subplot(4,1,4)
hold on;
plot(t,x(:,4))
plot(t,x_hat(:,4))