%% Predictor de Smith, ejemplo Matlab
% © 2019, Antonio Sala Piqueras, Universitat Politècnica de València.
% Presentación en vídeo: http://personales.upv.es/asala/YT/V/smithml.html
% Este código funcionó sin errores en Matlab R2019b.
%
% Objetivo: comprender cómo codificar en matlab y analizar las propiedades del predictor de Smith.
% Tabla de Contenidos
% 1. Modelo y regulador nominal (sin retardo)
% 2. Regulador nominal en presencia de retardo
% 3. Predictor de Smith
%     3.1 Análisis de propiedades en tiempo y frecuencia de bucle cerrado
%
%% 1. Modelo y regulador nominal (sin retardo)

s=tf('s');
tildeG=5/(s+1)/(0.45*s+1);
PID=0.38*(1+0.75/s+.12*s)/(0.025*s+1); %regulador que consigue comportamiento nominal satisfactorio
tildeT=feedback(tildeG*PID,1);
step(tildeT,tildeG/5), grid on
legend('b. cerrado','b.abto')
title('Respuesta nominal, sin retardo')
step(feedback(PID,tildeG)),grid on
title('Respuesta nominal ref->acción de control, sin retardo')

%% 2. Regulador nominal en presencia de retardo

retardoPlanta=1.5;
G=tildeG*exp(-retardoPlanta*s)

% El regulador sin modificaciones no funciona bien, porque el retardo es una fracción importante del tiempo de establecimiento nominal:

buclemalo=feedback(G*PID,1);
step(tildeT,buclemalo,15), grid on
title('PID nominal, proceso con retardo')
legend('Sin retardo (nominal)','Con retardo')

%% 3. Predictor de Smith
%
% Implementamos el diagrama de bloques como una conexion en Feedback del regulador PID y del predictor:

Smith=tildeG*(1-exp(-retardoPlanta*s));
K_Smith=feedback(PID,Smith); 

%% 3.1 Análisis de propiedades en tiempo y frecuencia de bucle cerrado
% El predictor de Smith mantiene el comportamiento ante referencia (sólo lo retrasa):

bucleSmith=feedback(G*K_Smith,1);
step(bucleSmith,tildeT), grid on
legend('Con Pred. Smith','Nominal','Location','best')

% La sensibilidad (perturbación de la salida a error) es diferente debido al retraso

bodemag(1-bucleSmith,1-tildeT)
legend('Con Pred. Smith','Nominal'), grid on
title('Bode Diagram -- rechazo perturbaciones salida')
bodemag((1-bucleSmith)*G,(1-tildeT)*tildeG)
legend('Con Pred. Smith','Nominal'), grid on
title('Bode Diagram -- rechazo perturbaciones entrada')
bodemag(K_Smith,PID), grid on
title('Ganancia del regulador')
bodemag((1-bucleSmith)*K_Smith,(1-tildeT)*PID*.999)
legend('Con Pred. Smith','Nominal'), grid on
title('Bode referencia a acción control')

% Aunque la respuesta se deteriora si el retardo estimado no es igual al del proceso, va mejor que si no teníamos en cuenta dicho retardo (era inestable).

Smith2=tildeG*(1-exp(-retardoPlanta*0.85*s)); %nuestro modelo cree que el retardo es un 85% del verdadero retardo
K_Smith2=feedback(PID,Smith2);
bucleSmith2=feedback(G*K_Smith2,1);
step(bucleSmith,tildeT,bucleSmith2), grid on
legend('Con Pred. Smith','Nominal','Con error retardo','Location','best')

%