%% Control de "mínima acción" para estabilizar
% © 2019, Antonio Sala Piqueras, Universitat Politècnica de València. Todos los derechos reservados.
% Presentación vídeo en: http://personales.upv.es/asala/YT/V/minust.html
% *Este código funcionó correctamente con Matlab R2019a
% Objetivo: verificar que existe una mínima actividad de control requerida necesariamente  cuando existen polos inestables y que esa acción es todavía mayor cuando además hay ceros en el semiplano derecho (fase no mínima) en un ejemplo monovariable.
%% 1.- Planteamiento del problema
% La entrada u está limitada a 1 unidad. Señal de referencia (o pert. salida dy amplitud 1) y perturbación du a la entrada de la planta (5% del rango del actuador).
% \bullet Se desea comprobar si se es capaz de estabilizar al sistema sin saturar.
% Diagrama de bloques:
%
%% 2.- Resultados

s=tf('s');
frqs=logspace(-2,3,100);
Wu=tf(1); Wdu=tf(.05); Wref=tf(1);%pesos comunes a todas las pruebas
for prueba=1:5
    switch prueba
        case 1
            G=7*40*(2+s)/(s+1)/(s+4)/(s+20);
            disp('estable, fasemin')
        case 2
            G=7*40*(2+s)/(-s+1)/(s+4)/(s+20);
            disp('INestable, fasemin')
        case 3
            G=7*40*(2-s)/(s+1)/(s+4)/(s+20);
            disp('estable, faseNOmin')
        case 4
            G=7*40*(2-s)/(-s+1)/(s+4)/(s+20);
            disp('INestable, faseNOmin')
        case 5
            G=7*40*(2-s)/(-s/1.55+1)/(s+4)/(s+20);
            disp('INestable, faseNOmin casi CANCELA')
    end
    GP=minreal(ss([0 0 1;1 -G -G]));
    GP.OutputName={'u','errm'};GP.InputName={'ref','du','u'};
    GPW=minreal(ss(blkdiag(Wu,1)*GP*blkdiag(Wref,Wdu,1)));
    [K,CL,GAM,INFO]=hinfsyn(GPW,1,1);
    GAM
    CLnw=minreal(lft(GP,K));
    figure(1)
    step(CLnw(:,1),9), grid on, hold on
    figure(2)
    step(CLnw(:,2),9), grid on, hold on
    figure(3)
    sigma(CLnw(1,:)*blkdiag(1,Wdu),frqs), grid on, hold on
end %for
figure(1), hold off, legend('est','inest','fnm','inest+fnm','inest+fnm2')
figure(2), hold off, legend('est','inest','fnm','inest+fnm','inest+fnm2')
figure(3), hold off, legend('est','inest','fnm','inest+fnm','inest+fnm2'), axis([0.01 100 -20 10])
