%% Transformaciones Pasivo \leftrightarrow Contractivo
% © 2020, Antonio Sala Piqueras, Universitat Politècnica de València. Todos los derechos reservados.
% Presentación en vídeo: http://personales.upv.es/asala/YT/V/pasctml.html
% El presente código ejecutó sin errores en Matlab R2020a
% Objetivos: Demostrar las transformaciones entre pasivo (parte real resp.frec >=0), contractivo (norma inf<=1) o -pasivo (parte real resp.frec<=0).
%
% Tabla de Contenidos
% Transformación Pasivo a contractivo
%     Bucles con realimentación negativa:
%     Bucles con realimentación positiva:
%     Ejemplos adicionales
% Transformación contractivo a pasivo
%     Bucles con realimentación positiva:
% Doble transformación pasivo  contractivo pasivo
%
%
%% Transformación Pasivo a contractivo
%% Bucles con realimentación negativa:

T_P2C=[-1 2;1 -1]; %Pasivo a contractivo
tildeG=simplify(lft(T_P2C,sym('G')))

% Si G es pasivo (y estable, o sea, si G es estrictamente pasivo), tildeG es contractivo, estable. Por Nyquist, en el caso lineal, G no rodeará el -1 [equiv. G+1 no rodeará el origen] si G tiene parte real positiva.

s=tf('s');

for k=0:10
    figure(1)
    nyquist(k+s)
    hold on
    figure(2)
    nyquist(lft(T_P2C,k+s))
    hold on
end
figure(1)
hold off, axis equal, title("Diagrama de Nyquist sistema original"), axis([-5 10 -10 10])
figure(2)
hold off, axis equal, title("Diagrama de Nyquist sistema transformado")

%% Bucles con realimentación positiva:

Tn_P2C=[-1 2;-1 1]; % pasivo cambiado de signo a contractivo.
tildeG=simplify(lft(Tn_P2C,sym('G')))

% SI -G es pasivo, entonces tildeG es contractivo, estable. Por Nyquist, G-1 no rodeará el origen si G tiene parte real negativa.

for k=0:10
    figure(1)
    nyquist(-(k+s))
    hold on
    figure(2)
    nyquist(lft(Tn_P2C,-(k+s)))
    hold on
end
figure(1)
hold off, axis equal, title("Diagrama de Nyquist sistema original"), axis([-5 10 -10 10])
figure(2)
hold off, axis equal, title("Diagrama de Nyquist sistema transformado")

%% Ejemplos adicionales

G=0.2+s/(0.1*s+1);
getPassiveIndex(G)
tG=lft(T_P2C,G) %es contractivo, y estable... 
norm(tG,inf)
nyquist(G,tG,lft(T_P2C,s)), axis equal, legend('orig.','transf P->C','circ. unidad')
tG=lft(Tn_P2C,-G) %es contractivo, y estable... efectivamente, -G es "antipasivo".
G=-3*s/(s^2+s+2)-0.2;
nyquist(-G)
getPassiveIndex(-G)
tildeG=lft(Tn_P2C,G) 
isstable(tildeG)
bodemag(tildeG) %contractivo
norm(tildeG,inf)

%
%% Transformación contractivo a pasivo
%% Bucles con realimentación positiva:

hatT_C2P=[-1 1;-2 1];

z=tf('z'); %su resp. frec. recorre el círculo unidad

for k=1:10
    figure(1)
    nyquist(z/k)
    hold on
    figure(2)
    nyquist(lft(hatT_C2P,z/k))
    hold on
end
figure(1)
hold off, axis equal, title("Diagrama de Nyquist sistema original")
figure(2)
hold off, axis equal, title("Diagrama de Nyquist sistema transformado"), axis([-5 3 -3 3])

%% Doble transformación pasivo \to contractivo \topasivo

lft(hatT_C2P,Tn_P2C,1,1)
G
otravezG=minreal(lft(hatT_C2P,lft(Tn_P2C,G))) %-otravezG es pasivo

%
%%