%% Control Planta Generalizada Hinf, relación con escalado
% (c) 2018, 2021, Antonio Sala Piqueras, Universitat Politécnica de Valencia. Todos los derechos reservados.
% Presentación en vídeo en: http://personales.upv.es/asala/YT/V/hinfeml.html
% Tabla de Contenidos
% Planta a controlar
% Control con 1 grado de libertad
% Análisis del resultado
% Reducción de Orden del regulador resultante
%
%% Planta a controlar
% Asumiremos que está escalada, para que pesos sean "alrededor de 1".

s=tf('s');
G=4/(s+1)/(0.11*s+1);
sigma(G,tf(1)),grid on
axis([1e-2 1e2 -20 20])
t_est_masrapido=pi/3.5

%
%% Control con 1 grado de libertad
% Minimizar error (r-Gu), con información al controlador coincidente con dicho error. También debemos ponderar la acción de control.

PlantaGen=[-1 G; ...
           0 1; ...
           -1 G];
PlantaGenSS=minreal(ss(PlantaGen));%eliminar las dos copias de G, realización mínima!
PlantaGen.InputName={'r','u'};
PlantaGen.OutputName={'e','u','e'};
%pesos de referencia y acción de control en planta ponderada
Wref=1; 
Wu=1;       

errorposiciondeseado=0.02;
anchodebandadecontrol=2.78;    %caso 1: 3.5;% caso 2: 2.78;
GanFerr=(1/errorposiciondeseado);
tau=GanFerr/anchodebandadecontrol;

Werror=GanFerr/(tau*s+1); 
sigma(G,Werror,1/Werror,tf(1)),grid on
legend('Planta Escalada','Peso Error','Inversa Pesos (plantilla)')
PlantaPonderada=minreal(ss(blkdiag(Werror,Wu,1)*PlantaGenSS*blkdiag(Wref,1)));
[K,CL,GAM,INFO]=hinfsyn(PlantaPonderada,1,1); %probar 'TOLGAM',1e-4
GAM
%estoescero=norm(CL-lft(PlantaPonderada,K),inf) %CL es la interconexión LFT de la planta ponderada y el regulador.
sigma(CL),grid on

%
%% Análisis del resultado

sigma(K,logspace(-2,3)), grid on
zpk(K)
buclecerradodetodalavida=minreal(feedback(-G*K,1));
eig(buclecerradodetodalavida)
acciondecontrol=minreal(feedback(-K,G));
%todo junto
sigma(buclecerradodetodalavida,acciondecontrol,G,logspace(-1,2))
legend('b.c.','u','b.abto'), grid on
step(buclecerradodetodalavida,acciondecontrol), grid on

%% Reducción de Orden del regulador resultante

hsvd(K)
bopt = balredOptions('FreqIntervals',[0,50]);
Kred=balred(ss(K),2,bopt);
zpk(Kred)
sigma(K,Kred,logspace(-2,4)),grid on
bucleponderado2=lft(PlantaPonderada,Kred);
norm(bucleponderado2,inf)
buclecerradodetodalavidared=feedback(-G*Kred,1);
acciondecontrolred=feedback(-Kred,G);

step(buclecerradodetodalavida,buclecerradodetodalavidared)
grid on, title('Salida ante escalon')
step(acciondecontrol,acciondecontrolred), grid on, title('Accion de control')
sigma(buclecerradodetodalavida,buclecerradodetodalavidared),grid on
sigma(acciondecontrol,acciondecontrolred), grid on
           