Tengo aquí esta función de transferencia continua:
$$ \ frac {Y (s)} {U (s)} = \ frac {s + 3} {s ^ 3 + 12 s ^ 2 + 39 s + 28} $$
Pasando este tf a domar discreto como este:
T = 0.01;
sys_discrete = c2d(sys, T);
Tengo esto:
$$ \ frac {Y (z)} {U (z)} = \ frac {4.853.10 ^ {- 5} z ^ 2 + 1.57.10 ^ {- 11} z - 4.57.10 ^ { -5}} {z ^ 3 - 2.883 z ^ 2 + 2.77 z - 0.8869} $$
Considerando esto:
$$ \ frac {Y (z)} {U (z)} = \ frac {a_0 z ^ 2 + a_1 z + a_2} {b_0 z ^ 3 + b_1 z ^ 2 + b_2 z + b_3} $ $
y haciendo la transformación Z inversa, obtuve esto:
$$ y (k) = \ frac {a_0} {b_3} u (k-2) + \ frac {a_1} {b_3} u (k-1) + \ frac {a_2} {b_3} u ( k) - \ frac {b_0} {b_3} y (k-3) - \ frac {b_1} {b_3} y (k-2) - \ frac {b_2} {b_3} y (k-1) \\ y (k) = \ begin {bmatrix} u (k-2) & u (k-1) & u (k) & y (k-3) & y (k-2) & y (k-1) \ end {bmatrix}. \ begin {bmatrix} a_0 / b_3 \\ a_1 / b_3 \\ a_2 / b_3 \\ -b_0 / b_3 \\ -b_1 / b_3 \\ -b_2 / b_3 \ end {bmatrix} $$
Renombrando a estos chicos:
$$ \ begin {bmatrix} a_0 / b_3 \\ a_1 / b_3 \\ a_2 / b_3 \\ -b_0 / b_3 \\ -b_1 / b_3 \\ -b_2 / b_3 \ end {bmatrix} = \ begin { bmatrix} c_1 \\ c_2 \\ c_3 \\ c_4 \\ c_5 \\ c_6 \ end {bmatrix} $$
Entonces, cuando encuentre este vector C, retrocederé de esta manera (simplemente reemplazándolo):
$$ \ frac {Y (z)} {U (z)} = \ frac {c_1 z ^ 2 + c_2 z + c_3} {- c_4 z ^ 3 -c_5 z ^ 2 -c_6 z + 1} $$
Entonces, lo que estoy intentando es encontrar C:
$$ Y = AC \\ A ^ TY = A ^ TAC \\ (A ^ TA) ^ {- 1}. (A ^ TY) = (A ^ TA) ^ {- 1}. (A ^ TA) .C \\ (A ^ TA) ^ {- 1}. (A ^ TY) = IC \\ (A ^ TA) ^ {- 1}. (A ^ TY) = C $$
Así es como hago esto en MATLAB:
t = 0:T:10; %time vector
u = wgn(length(t), 1, 1); %input vector
[y, t] = lsim(sys, u, t); %output vector applied to sys
%[u(k-2) u(k-1) u(k) y(k-3) y(k-2) y(k-1)]
A = [u(2:end-2) u(3:end-1) u(4:end) y(1:end-3) y(2:end-2) y(3:end-1)]; %doing the right shifts here, no problem about losing data...
Y = y(4:end);
C=(A'*A)\(A'*Y); %finding C
c1 = C(1); c2 = C(2); c3 = C(3);
c4 = C(4); c5 = C(5); c6 = C(6);
sys_ls = tf([c1 c2 c3], [-c4 -c5 -c6 1], T);
Cuando step(sys, sys_ls)
, eso es lo que estoy obteniendo:
Esperaba encontrar algo muy similar ... ¿Qué me falta para que este sistema se ajuste correctamente?