%% Pasividad de sistemas lineales SISO: diagramas Bode/Nyquist
% © 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/sprml.html
% Este código funcionó correctamente con Matlab R2020a
% Objetivo: comprobar la relación entre respuesta en frecuencia y pasividad de sistemas lineales de 1 entrada y 1 salida.
% Tabla de Contenidos
% 1.- Sistema No pasivo
% 2.- Sistema estrictamente input y output pasivo
% 3.- Sistema estrictamente output pasivo
% 4.- Sistema pasivo (pero no estrictamente)
% Comparación de todos los diagramas de respuesta en frecuencia
% Conclusiones
%% 1.- Sistema No pasivo

G2=(s+1.3)/(s^2+s+1);
isPassive(G2) %NO
getPassiveIndex(G2) %si es >1, no es pasivo.
nyquist(G2), axis([-.1 1.6 -1.5 1.5]), xline(0,'-k',{'Passive'})
bode(G2), grid on

%% 2.- Sistema estrictamente input y output pasivo

s=tf('s');
G0=0.1+(s+.8)/(s^2+s+1);
norm(G0,'inf')
isPassive(G0)
isPassive(G0,0,.513) %output estricto
isPassive(G0,0.1,0) %input estricto
getPassiveIndex(G0) %<1 es estrictamente input pasivo
nyquist(G0,inv(G0))
axis([-.22 1.45 -3.2 3.2]), xline(0,'-k',{'Passive'})
xline(0.1,'--b',{'InputPassive'}), xline(0.513,'--r',{'OutputPassive'})
legend('G','inv(G)')

%% 3.- Sistema estrictamente output pasivo

G=(s+.8)/(s^2+s+1)
isPassive(G)
isPassive(G,0,0.2) %output estricto
isPassive(G,0,0.201) %output estricto
isPassive(G,0.001) %input estricto NO
getPassiveIndex(G)
nyquist(G,inv(G)), axis([-.25 1.5 -6 6]), 
xline(0,'-k',{'Passive'})
xline(0.2,'--r',{'OutputPassive'}), legend('G','inv(G)')

%% 4.- Sistema pasivo (pero no estrictamente)

G1=(s+1)/(s^2+s+1)
isPassive(G1)
isPassive(G1,0,0.0002) %output estricto NO
isPassive(G1,0.0002,0) %input estricto NO
getPassiveIndex(G1)
nyquist(G1,inv(G1)), axis([-.25 1.5 -6 6]), legend('G','inv(G)')
xline(0,'-k',{'Passive'})

%%
%% Comparación de todos los diagramas de respuesta en frecuencia

nyquist(G0,G,G1,G2), legend('estrict. Pasivo (I+O)','estrict. Pasivo (O)','Pasivo','NO Pasivo')
axis([-.1 1.56 -1.4 1.4])
bode(G0,G,G1,G2,logspace(-1,1.7)), legend('estrict. Pasivo (I+O)','estrict. Pasivo (O)','Pasivo','NO Pasivo','Location','best')
grid on

%% Conclusiones
% En este material hemos comprobado la pasividad y pasividad estricta entrada/salida con el comando isPassive así como la salida de getPassiveIndex; también hemos comprobado la relación entre los límites de pasividad en dicho comando y el menor valor de la parte real del diagrama de Nyquist de un proceso lineal y de su inverso.
%%