%% Desacoplamiento y linealización de un tanque de mezclado por realimentación del estado
% © 2019, 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/mixfl.html
% Este código ejecutó correctamente en Matlab R2019a
%
% Motivación y objetivos: El objetivo de este vídeo es modelar un tanque de mezclado, incorporando no-linealidades y diseñar una realimientación del estado que, a partir de dos medidas, linealice y desacople el sistema.
%
% Tabla de Contenidos
% Descripción del sistema y modelado
%     Ec. físicas
%     Representación en variables de estado (interna)
% Desacoplamiento y linealización por realimentación
%
%% Descripción del sistema y modelado
% La figura representa un tanque donde entran un caudal q_a de producto A y otro caudal q_b de producto B y se mezclan.
% El depósito tiene un conducto de salida que descarga a presión atmosférica.
%%
%% Ec. físicas

syms v_a v_b x_a x_b dv_adt dv_bdt q_s h q_ain q_bin
S=0.75;k_out=4; %parámetros constantes
Modelo=[ h==(v_a+v_b)/S; q_s==k_out*sqrt(h); dv_adt==-q_s*x_a+q_ain; ...
    dv_bdt==-q_s*x_b+q_bin; x_a==v_a/(v_a+v_b); x_b==1-x_a]

%% Representación en variables de estado (interna)
% Despejamos todas las variables restantes en función de entradas (qain,qbin) y estados (va,vb):

ReprInterna=solve(Modelo,dv_adt,dv_bdt,q_s,x_a,x_b,h)
derivEstado=[ReprInterna.dv_adt;ReprInterna.dv_bdt]
EcSalida=[ReprInterna.x_a;ReprInterna.h] %salidas controladas sólo...

%% Desacoplamiento y linealización por realimentación

y1=EcSalida(1);
dxa_dt=simplify(jacobian(y1)*derivEstado)
y2=EcSalida(2);
dh_dt=simplify(jacobian(y2)*derivEstado)

% Aparecen las entradas con sólo derivar una vez cada salida.

DerivSalidas=[dxa_dt;dh_dt];

% Podemos desacoplar si se puede despejar q_ain y q_bin para que las derivadas tengan un valor deseado arbitrario

syms v1 v2
sol=solve(DerivSalidas==[v1;v2],{q_ain,q_bin});
sqa=simplify(sol.q_ain)
sqb=simplify(sol.q_bin)
%comprobamos
simplify(subs(dxa_dt,{q_ain,q_bin},{sqa,sqb}))
simplify(subs(dh_dt,{q_ain,q_bin},{sqa,sqb}))

% parece una expresión complicada... ¿y si se hace cambio de variable en función de xa y h? Así, además, se pone en función de las salidas realmente medidas.

sqa2=simplify(subs(sqa,{v_a,v_b},{x_a*S*h,(1-x_a)*S*h}))
sqb2=simplify(subs(sqb,{v_a,v_b},{x_a*S*h,(1-x_a)*S*h}))

% El resultado final es x_A=\frac{1}{s}v_1, h=\frac{1}{s}v_2, lineal y desacoplado.

