%% Control IMC con parámetro Q constante (sin modificar polos de bucle abierto)
% © 2023, Antonio Sala Piqueras. Universitat Politècnica de València. Todos los derechos reservados.
% Objetivo: diseñar un IMC que no cambie la dinámica ante referencia respecto al bucle abierto, porque se considera satisfactoria... es muy fácil: Q resulta ser la inversa de la ganancia estática.
% Presentación en vídeo: http://personales.upv.es/asala/YT/V/imcQcte.html
%% Proceso

s=tf('s');
G=3/(0.2*s+1)^2;
step(G,4), grid on

% El proceso tarda 1.5 segundos de tiempo de establecimiento en B.A., y tiene ganancia 3.

dcgain(G)

%% Especificaciones deseadas y control IMC
% El tiempo de establecimiento se supone razonable, no se desea cambiar la posición de los polos ni la respuesta ante referencia, aparte de hacerla ganancia 1.
% En "bucle abierto", sería simplemente u=\frac{1}{3}r.
% En bucle cerrado IMC sería básicamente lo mismo (ese es el "truco" del IMC, se diseña como un bucle abierto):

Q=1/3;

% El controlador resultante:

K=Q/(1-G*Q)
zpk(K)

% Como predice la teoría, el IMC resulta en un regulador con acción integral. Cancelará perturbaciones constantes.
%% Análisis del bucle cerrado resultante
%
% El bucle cerrado será:

T1=zpk(feedback(G*K,1))
T=minreal(T1,3e-4) %referencia a salida
norm(T-G*Q) %coinciden, aparte de cuestiones numéricas

% Respuesta ante perturbaciones en salida o entrada:

S=feedback(1,G*K); %dy a y
GS=G*S; %du a y
step(T,G/dcgain(G),4), grid on %bc versus ba en referencia
KS=K*S;zpk(KS)
minreal(KS,3e-4) %acc. control ante ref es ref/3, como en BA. KS es Q.
step(KS,4), grid on %acc. control ante referencia
step(S,tf(1),4), grid on %bc versus ba en dy
title("resp. escalón ante perturbación en salida"), legend("IMC","Open Loop")
step(GS,G,4), grid on %bc versus ba en du
title("resp. escalón ante perturbación en entrada"), legend("IMC","Open Loop")

% La diferencia entre roja y azul es lo que ganamos por comprar un sensor y cerrar el bucle, respecto al bucle abierto.