%% Ejemplos control con modelo interno (IMC): cuando NO funciona!
% © 2019, Antonio Sala Piqueras, Universitat Politécnica de Valencia. Todos los derechos reservados.
% Presentación en vídeo: http://personales.upv.es/asala/YT/V/imcnova.html
% *Este código ejecutó correctamente en Matlab R2019b
% Objetivos: diseñar mediante la metodología del control por modelo interno, en casos en los que no debería ser utilizada, para valorar sus desventajas.
% Tabla de Contenidos
% 1.- Modelos de plantas y modelos de referencia
% 2.- Control por modelo interno: parámetro Q y regulador resultante
% 3.- Respuesta en bucle cerrado
%
%% 1.- Modelos de plantas y modelos de referencia

s=tf('s');
numejemplo=8;
switch numejemplo
    case 7 %inestable
        G0=10/(s-0.06)/(0.05*s+1);Gplus=1;
        M0=1/(0.2*s+1)/(0.1*s+1); %salida inestable ante delta_u...
    case 8 %polo cerca del límite de estabilidad
        G0=10/(s+4e-3)/(0.05*s+1);Gplus=1;
        M0=1/(0.2*s+1)/(0.1*s+1); %es estable, pero penoso ante delta_u... 
end
G=minreal(G0*Gplus); zpk(G)
 M=M0*Gplus; zpk(M)

%% 2.- Control por modelo interno: parámetro Q y regulador resultante

Q=inv(G0)*M0; zpk(Q)
if(~isproper(Q))
    error('FATAL: Q no es realizable.')
end
K=minreal(feedback(ss(Q),ss(G),+1),5e-4); zpk(K)
T=minreal(feedback(G*K,1),5e-4); zpk(T)

%% 3.- Respuesta en bucle cerrado

figure
step(T,M0), grid on, legend('T','M0') %coinciden T y M claro, claro!
figure
bodemag(Q), title('Frecuencia Accion Control'), grid on %amplifica alta frec?
hold off
figure
subplot(1,3,1)
step(M), grid on
title('resp. Y escalón 1 ref')
subplot(1,3,2)
step(1-M), grid on
title('resp. Y escalón 1 pert d_y')
subplot(1,3,3)
step(minreal((1-M)*G)*.2), grid on
title('resp. Y escalón 0.2 pert d_u')
figure
subplot(1,3,1)
step(Q), grid on
title('resp. U escalón 1 ref')
subplot(1,3,2)
step(-Q), grid on
title('resp. U escalón 1 pert d_y')
subplot(1,3,3)
step(-Q*G*.2), grid on
title('resp. U escalón 0.2 pert d_u')

%%