%% Influencia del escalado en los resultados de ncfmargin
% © 2019, Antonio Sala Piqueras, Universitat Politécnica de Valencia. Todos los derechos reservados.
% Este código ejecutó sin errores en Matlab R2018b.
% Presentación en vídeo: http://personales.upv.es/asala/YT/V/ncfescm.html
%
% Objetivo: comprobar el efecto del escalado en la interpretación del margen ante incertidumbre coprima normalizada, ncfmargin(proceso,controlador).
% Tabla de Contenidos
% Modelado
%     Escalado propuesto:
% Diseño de controladores (Hinf., mixed sensitivity minimizando pico de sensibilidad)
% Comparación de prestaciones y robustez (ncfmargin)
% Conclusiones
%%
%% Modelado
% Sistema original, escalado a entrada amplitud 1, seguir referencias amplitud 1.

clear all
s=tf('s');
nuevoesc=24;
sysorig=12/(s^2+0.25*s+1); cotaUorig=1;
dcgain(sysorig)
norm(sysorig,'inf')
bodemag(sysorig), grid on

%% Escalado propuesto:

sys=1/nuevoesc*sysorig;  cotaU=cotaUorig*nuevoesc;
bodemag(sys), grid on
step(sys/dcgain(sys)), grid on

% Limitaciones ancho banda actuador: El actuador tiene ancho de banda limitado a 10 rad/s.

anchobanda_act=10;
plantillaU=cotaU/(s/(anchobanda_act)+1)*(s/(anchobanda_act*40)+1);
figure(1)
sigma(inv(sys),plantillaU), grid on

% No podemos esperar controlar más allá de 3 radianes por segundo.
%% Diseño de controladores (Hinf., mixed sensitivity minimizando pico de sensibilidad)
% Diseñamos una batería de controladores mixed-sensitivity de ancho de banda creciente, buscando el mínimo pico de sensibilidad hasta GAM=1.

Wy=0.05;
anchobanda=[0.083 0.199   .5   1.01    1.29    1.74   1.961];
picosensparam=[1.001 1.002 1.016 1.05 1.13 1.62 600];
PicoSenCadaPrueba=[]; PicoTenCadaPrueba=[]; 
GenP=ss([1 0;0 1;0 0;1 0]+[-1;0;1;-1]*[0 sys]);
GenP.OutputName={'err','u','y','errcopy'};
Wu=1/plantillaU;
for prueba=1:length(anchobanda)
    prueba
    bw=anchobanda(prueba); 
    plantillaerr{prueba}=makeweight(0.01,bw,picosensparam(prueba));
    Werr=1/plantillaerr{prueba};
    GenPW=minreal(ss(blkdiag(Werr,Wu,Wy,1)*GenP));
    [K,CL,GAM,INFO]=hinfsyn(GenPW,1,1,hinfsynOptions('Reltol',1e-3));
    reg{prueba}=K;
    GAM
    CL_pond{prueba}=CL;
    ncfm(prueba)=ncfmargin(sys,K);
    CL_nopond{prueba}=lft(GenP,K);
    figure(2)
    step(CL_nopond{prueba}(2:3,:),12), grid on, hold on
    figure(3)
    bodemag(CL_nopond{prueba},logspace(-3,2,150)), grid on, hold on
    PicoSenCadaPrueba=[PicoSenCadaPrueba norm(CL_nopond{prueba}(1,:),'inf')];
    PicoTenCadaPrueba=[PicoTenCadaPrueba norm(CL_nopond{prueba}(3,:),'inf')];
end

%% Comparación de prestaciones y robustez (ncfmargin)

figure(2) 
hold off
figure(3)
hold off

% Los márgenes de incert. coprima, picos de S y de T son:

ncfm
PicoSenCadaPrueba
PicoTenCadaPrueba

%
% El diseño con margen ncf >.2 más rápido, comparado con buce abierto resulta:

step(CL_nopond{4}(2:3),[1; sys]/dcgain(sys))
margenesdelos4elementos(sysorig,reg{4}/nuevoesc)
margenesdelos4elementos(sys,reg{4})
allmargin(sys*reg{4}) %medidas "clásicas" de robustez SISO:
norm(CL_nopond{4}(1,:),inf), grid on %pico de sensibilidad
bodemag(CL_nopond{4}(1,:)), grid on

%
%% Conclusiones
% Comando ncfmargin sensible al escalado. Ante la duda, siempre es más informativo mirar cada uno de los 4 elementos en norma y en bodemag/sigma. El ncfmargin resulta interpretable con escalado de modo que ganancias, resonancias, etc. estén alrededor de 1. Un mismo ncfmargin puede estar asociado a una distribución diferente de tolerancia a incertidumbre (picos de cada uno de los cuatro componentes).
%

function margenesdelos4elementos(G,K)
    T=minreal(ss([K;1]*inv(1+G*K)*[1 G]));
    margaditivo=1/norm(T(1,1),inf)
    margmult=1/norm(T(1,2),inf)
    margmultin=1/norm(T(2,1),inf)
    margaditivoinv=1/norm(T(2,2),inf)
    margncf=1/norm(T,inf)
end

%