%% Modelos LFT racionales genéricos
% © 2020, Antonio Sala Piqueras, Universitat Politècnica de València, Todos los derechos reservados.
% Vídeo-presentación en https://youtu.be/qO9US5EtYTc
% Este código funcionó sin errores en Matlab R2022a (Linux)
% Modelemos en forma LFT un sistema cuyas matrices de la representación interna dependan de una incertidumbre "d" simétrica alrededor del origen en la forma dada por:

A=@(d) [3/(1+d^2)  -2+d; -4+d^2  d/(1+d+d^2)];
B=@(d) [-1; 5+d]; 
C=@(d) [1 -d]; 
D=@(d) 0;

% De modo que d=0 sea el modelo nominal:

ModeloNominal=ss(A(0),B(0),C(0),D(0));

% Concentremonos en la "estática", la dependencia de delta

Felipe=@(d) [D(d) C(d); B(d) A(d)];

% Nota: luego ya haremos la lft de Felipe y 1/s para recuperar la dinámica.
% Usemos la control-system-toolbox para algo que no estaba previsto...

s=tf('s');
CosaCambioVble=Felipe(1/s)
ReaCosa=minreal(ss(CosaCambioVble));
size(ReaCosa)

%
% Realmente no se trata de una matriz de transferencia... "s" es un mero artificio para encontrar una realización de una LFT. Saquemos la estática:

Federico=[ReaCosa.A ReaCosa.B;ReaCosa.C ReaCosa.D]

% De modo que las matrices orioginales (Felipe) serán la LFT de delta*I y  Federico.
% Comprobemos que la representación LFT coincide con las matrices del sistema a modelar nominal

Felipe2=lft(0.*eye(7),Federico)
Felipe(0.)

% Ahora montemos el sistema dinámico (con 's' de Laplace de verdad):


sys1=lft(Federico,1/s*eye(2)); %parte inferior (lineal, sin incertumbre)

sys2=lft(0*eye(7),sys1); %parte superior (incertidumbre)
norm(ModeloNominal-sys2,'inf')

% Generemos unos cuantos sistemas...

for i=1:10
    delta=rand()-.5;
    sys2=lft(delta*eye(7),sys1);
    sigma(sys2)
    hold on
end
hold off, grid on

% Teorema Pequeña Ganancia, márgen de estabilidad delta(t) arbitrario:

1/norm(sys1,'inf')

% Tiene error, porque no todo "sys1" va en LFT

size(sys1)
1/norm(sys1(1:7,1:7),'inf')