Está en la página 1de 14

7. SISTEMAS LINEALES DE ORDEN MAYOR - MIMO.

Melanio Coronado**, Jonathan Cortes*, Wilfrido Ortega*


Universidad del Atlántico. Simulación y Control de Procesos. Programa de Ingeniería Química

Introducción

Los sistemas de orden mayor son aquellos cuya dinámica se expresa mediante una
ecuación diferencial de orden mayor que dos, como por ejemplo un proceso de flujo
a través de un sistema constituido de tres o más tanques conectados entre sí. Si en
cada uno de ellos las dinámicas son de primer orden, entonces la dinámica global del
conjunto es de un orden igual o mayor que tres, según el número total de tanques. Si
la variable de salida de uno de los tanques afecta, en un solo sentido, a la variable de
salida del siguiente entonces el sistema es no interactuante, pero si el efecto es
también en el sentido contrario entonces el sistema es interactuante. En este caso
solo se tratara el sistema no interactuante.

Considérese el sistema de tanques conectados en serie que se observa en la Figura


7.1 donde se realiza un proceso de calentamiento de un fluido, en cascada, que se
alimenta por el primero de ellos y cuya descarga se alimenta al segundo y así
sucesivamente, hasta un quinto tanque.

Se deduce del fenómeno que el sistema es no interactuante porque la variable de


salida del primer tanque afecta a la variable de salida en el segundo tanque, pero la
salida en el segundo tanque no afecta a su vez al primer tanque porque desde el
segundo tanque no hay retroalimentación que lo afecte. La relación causa-efecto es
un solo sentido. Igual comportamiento se observa entre los demás tanques.

Modelo matemático

Asumiendo que todos los parámetros físicos del sistema son constantes y si se
realiza un balance de energía en estado no estacionario del fluido a través del primer
tanque obtiene la siguiente ecuación:

dY1 (t )
1  Y1 (t )  K1 X (t ) (1)
dt
Fig. 7.1 Sistemas De Tanques No Interactuantes

Con planteamientos similares se obtienen las ecuaciones diferenciales que modelan


las dinámicas en el resto de los tanques así:

dY2 (t )
Segundo tanque: 2  Y2 (t )  K 2Y1 (t ) (2)
dt

dY3 (t )
Tercer tanque: 3  Y3 (t )  K 3Y2 (t ) (3)
dt

dY4 (t )
Cuarto tanque: 4  Y4 (t )  K 4Y3 (t ) (4)
dt

dY5 (t )
Quinto tanque: 5  Y5 (t )  K 5Y4 (t ) (5)
dt
En este caso, las variables de entrada y salida son las temperaturas y se asumen los
parámetros físicos con valores constantes y, por lo tanto, las ganancias y las
constantes de tiempo también son constantes.

De acuerdo a las ecuaciones diferenciales (1), (2), (3), (4) y (5), la dinámica de cada
uno de los tanques es lineal de primer orden y el sistema es no interactuante. A partir
de la ecuación (2) se entiende, por ejemplo si la variable de estado fuera la
temperatura, que la temperatura del segundo tanque es afectada por un cambio en la
temperatura en el tanque uno pero la temperatura del primer tanque no es afectada
por un cambio en la temperatura del segundo tanque. Igual observación se deduce de
la ecuación (3), (4) y (5) entre las temperaturas de los tanques.

Al combinar las ecuaciones diferenciales (1) y (2) se demuestra que la dinámica del
segundo tanque expresada con respecto a la variable de entrada al primer tanque es
de segundo orden sobre-amortiguada, así:

d 2Y2 (t ) dY (t )
1 2 2
 ( 1   2 ) 2  Y2 (t )  K1 K 2 X (t ) (6)
dt dt

Análogamente se demuestra para los demás tanques que las dinámicas son de tercer,
cuarto y quinto orden con respecto al primer tanque respectivamente.

Respuesta Dinámica del Proceso

La Figura 7.2 muestra la respuesta del sistema de los tanques conectados en cascada
donde se realiza el proceso de calentamiento modelado de acuerdo a las ecuaciones
(1), (2), (3), (4) y (5) para un cambio paso en la variable de entrada al primer tanque.

Para los cinco tanques se observa una respuesta monotónica estable. El primer
tanque muestra una dinámica más rápida característica de un sistema de primer
orden, pero otros tanques son de una dinámica más atrasada debido a los atrasos
dinámicos adicionales en cada uno de ellos. El perfil de la respuesta del segundo al
quinto tanque muestra la característica forma de S itálica que se hace más notoria
con el aumento en el atraso de la respuesta. En esta simulación la respuesta última es
la misma para cada una de las temperaturas en los tanques respectivos porque se
asigna un valor constante de uno para cada una de las ganancias en los cinco
tanques. Si se consideran diferentes, el valor último depende del valor de estas
Figura 7.2 Respuesta Paso En Un Sistema De Tanques En Serie No Interactuante

Solución numérica con Matlab GUI

A continuación se describe la elaboración de una interfaz gráfica que facilite,


al usuario de Matlab, la solución gráfica de un sistema de tres ecuaciones
diferenciales lineales de primer orden SISO mediante la introducción de los
parámetros dinámicos y las condiciones iniciales del sistema y la magnitud
del cambio paso en la variable de entrada. Para ello se instalan en el GUIDE
un conjunto de elementos (o controles) que o muestran leyendas (Static Text)
o capturan datos (Edit Text) o seleccionan el número de unidades
interconectadas en serie (Radio Button) o ejecutan procedimientos (Push
Button) o despliegan gráficos (Axes)

Instalación de los controles en la interfaz de usuario GUI:

Una vez iniciado GUIDE, en el área de diseño se instalan los diferentes


controles y se observa una interfaz con la configuración que muestra la
Figura 7.3. Para todos los controles se deja la propiedad Tag con sus
asignaciones por defecto. Al archivo se le asigna el nombre
INTERACTUANTES.

Figura 7.3. Interfaz gráfica de usuario

1. Controles Axes: Se instalan dos controles de esta clase para desplegar


imágenes. En el “axes2” se despliega la imagen de la ecuación
diferencial de acuerdo al número de unidades seleccionadas y en el
“axes1” se despliega la respuesta gráfica a la solución solicitada por el
usuario. El código para el “axes2” se incluye de tal manera que la
imagen se observe al desplegarse la interfaz para su ejecución.
(OpeningFcn)
2. Controles Radio Button: Se instalan tres controles de esta clase para
seleccionar el número de unidades que se quieren simular. Se asignan
las propiedades “String” con las leyendas que se observan en la Figura
7.3, es decir, “Una Unidad”, “Dos Unidades” y “Tres Unidades”.
3. Controles Static Text: Se instalan ocho controles de esta clase para
anexar leyendas a los botones (Edit Text) donde se introducen datos
requeridos para la solución de la ecuación diferencial. Se asignan las
propiedades “String” con las leyendas que se observan en la Figura
7.3, es decir, “Primer Tanque”, “Segundo Tanque”, “Tercer Tanque”,
“Condiciones Iniciales”, “Cambio Paso”, “Tiempo”, “Tau”, “K”. El
código elaborado hace que al desplegarse la interfaz para su ejecución,
se desplieguen los elementos requeridos para desarrollar las
ecuaciones diferenciales correspondientes a dos unidades. En forma
similar, al seleccionar cualquiera de las otras dos opciones se
despliegan solo los elementos requeridos en cada caso
4. Controles Edit Text: Se instalan onces controles de esta clase para que
el usuario introduzca los parámetros requeridos para la solución de
la(s) ecuaciones diferenciales (constantes de tiempo, ganancias,
condiciones iniciales, tiempo de simulación, magnitud del cambio
paso en la variable de entrada). Se asigna a todos ellos la propiedad
“String” con un valor de cero. La propiedad “Visible” de estos
elementos se ajusta de acuerdo a la opción seleccionada en el Número
de Unidades
5. Controles Push Button: Se instalan tres botones de esta clase para
ejecutar y cancelar la simulación y solicitar ayuda sobre la misma. Se
asignan las propiedades “String” a los nombres “Solución”,
“Cancelar” y “Ayuda”. Al presionar el botón “Solucion” se resuelve la
ecuación diferencial y se despliega la respuesta grafica en el control
axes1. Al presionar el botón “Cancelar” se desplegará un cuadro de
diálogo para confirmar el cierre de la interfaz. Al presionar el botó
“Ayuda” se despliega una ayuda dentro del escritorio de Matlab que
muestra el código construido para la elaboración de la interfaz
6. Controles Panel: Se instalan dos botones de esta clase para encerrar
los botones en cuadros separados para observarlos como dentro de un
marco. Se asignan las propiedades “String” con los nombres “Número
de Unidades”, “Parámetros”. La propiedad ¨ForegroundColor¨ se
ajusta a color rojo y la propiedad ¨TitlePosition¨ a ¨centertop¨
7. Figure. Se asigna como la propiedad ‘Color’ a blanco y la propiedad
“Name” con el titulo “MIMO – Sistemas No Interactuantes”
Concluida la instalación y distribución de los componentes del GUI se
procede a construir la codificación para el funcionamiento de este
programa. Para ello presione el botón “M-File Editor” de la barra de
herramientas para acceder al código hasta ahora construido por MatLab
para su modificación

Programación del GUI

Antes de empezar a codificar los callbacks de cada uno de los controles se


procede a definir las ecuaciones que se utilizaran para el desarrollo del
programa que en este caso se declararan como funciones para que no sea
necesario crear archivos adicionales.

Funciones Definición de las Respuestas

Una Unidad

function dy = uniunidad(t,y)
global tau K X
dy = (K*X - y)/tau;

Dos Unidades

function dy = biunidad(t,y)
global K1 K2 tau1 tau2 X
dy = [(K1*X - y(1))/tau1; (K2*y(1) - y(2))/tau2];

Tres Unidades

function dy = triunidad(t,y)
global K1 K2 K3 tau1 tau2 tau3 X
dy = [(K1*X - y(1))/tau1; (K2*y(1) - y(2))/tau2; (K3*y(2) - y(3))/tau3];

Imagen Ecuación Diferencial y Funcion de Apertura de la interfaz

En este ejercicio se construyen tres imagen con la(s) ecuación(es)


diferencial(es) de primer orden lineal SISO de la misma forma como se
procedió con la de primer orden y se guardan con los nombres
“mayor1.jpg”, “mayor2.jpg” y “mayor3.jpg”.

A continuación se digita el siguiente código dentro de la función de apertura


del GUI para que en su despliegue inicial se observe la ecuación diferencial
de primer orden que se quiere resolver en este programa.

function INTERACTUANTES_OpeningFcn(hObject, eventdata, handles, varargin)

% Choose default command line output for INTERACTUANTES


handles.output = hObject;

% Update handles structure


guidata(hObject, handles);

set(handles.radiobutton2,'Value',1);
set(handles.radiobutton1,'Value',0);
set(handles.radiobutton3,'Value',0);
set(handles.text2,'String','Segunda Unidad');
set(handles.text3,'String','Condiciones Iniciales');
set(handles.text4,'String','Cambio Paso');
set(handles.text5,'Visible','on');
set(handles.text5,'String','Tiempo');
set(handles.text6,'Visible','off');
set(handles.edit4,'Visible','on');
set(handles.edit6,'Visible','on');
set(handles.edit8,'Visible','off');
set(handles.edit9,'Visible','off');
set(handles.edit10,'Visible','on');
set(handles.edit11,'Visible','off');
axes(handles.axes2)
im = imread('MAYOR2.jpg')
axis off;
imshow(im);

Se deja para análisis del estudiante la justificación de cada una de las


sentencias en el código anterior
Radio Botones

Los códigos que se muestran a continuación se cumplen cuando se


selecciona cada uno de los radio botones con los cuales se selecciona el
numero de unidades que se quieren simular

function radiobutton1_Callback(hObject, eventdata, handles)

% Hint: get(hObject,'Value') returns toggle state of radiobutton1


axes(handles.axes2)
im = imread('ecuacion.jpg')
axis off;
imshow(im);
set(handles.radiobutton1,'Value',1);
set(handles.radiobutton2,'Value',0);
set(handles.radiobutton3,'Value',0);
set(handles.text2,'String','Condicion Inicial');
set(handles.text3,'String','Cambio Paso');
set(handles.text4,'String','Tiempo');
set(handles.text5,'Visible','off');
set(handles.text6,'Visible','off');
set(handles.edit4,'Visible','off');
set(handles.edit6,'Visible','off');
set(handles.edit8,'Visible','off');
set(handles.edit9,'Visible','off');
set(handles.edit10,'Visible','off');
set(handles.edit11,'Visible','off');

% --- Executes on button press in radiobutton2.


function radiobutton2_Callback(hObject, eventdata, handles)

% Hint: get(hObject,'Value') returns toggle state of radiobutton2


set(handles.radiobutton2,'Value',1);
set(handles.radiobutton1,'Value',0);
set(handles.radiobutton3,'Value',0);
set(handles.text2,'String','Segunda Unidad');
set(handles.text3,'String','Condiciones Iniciales');
set(handles.text4,'String','Cambio Paso');
set(handles.text5,'Visible','on');
set(handles.text5,'String','Tiempo');
set(handles.text6,'Visible','off');
set(handles.edit4,'Visible','on');
set(handles.edit6,'Visible','on');
set(handles.edit8,'Visible','off');
set(handles.edit9,'Visible','off');
set(handles.edit10,'Visible','on');
set(handles.edit11,'Visible','off');
axes(handles.axes2)
im = imread('MAYOR2.jpg')
axis off;
imshow(im);

% --- Executes on button press in radiobutton3.


function radiobutton3_Callback(hObject, eventdata, handles)

% Hint: get(hObject,'Value') returns toggle state of radiobutton3

set(handles.radiobutton1,'Value',0);
set(handles.radiobutton2,'Value',0);
set(handles.radiobutton3,'Value',1);
set(handles.text2,'String','Segunda Unidad');
set(handles.text3,'String','Tercera Unidad');
set(handles.text4,'String','Condiciones Iniciales');
set(handles.text5,'String','Cambio Paso');
set(handles.text6,'String','Tiempo');
set(handles.text5,'Visible','on');
set(handles.text6,'Visible','on');
set(handles.edit4,'Visible','on');
set(handles.edit6,'Visible','on');
set(handles.edit7,'Visible','on');
set(handles.edit8,'Visible','on');
set(handles.edit9,'Visible','on');
set(handles.edit10,'Visible','on');
set(handles.edit11,'Visible','on');
axes(handles.axes2)
im = imread('mayor3.jpg')
axis off;
imshow(im);
Push Button “Solución”
El siguiente código es el procedimiento que se desarrolla cuando se presiona
el botón denominado “Solución”. Se convierten los parámetros a carácter
numérico y se resuelve(n) la(s) ecuacion(es) diferencial(es) para cada uno de
los casos que incluye el diseño de la interfaz. Los resultados se muestran
gráficamente en el axes1

function pushbutton1_Callback(hObject, eventdata, handles)

axes(handles.axes1);

global tau K X Inicio tspan tau1 tau2 tau3 K1 K2 K3 Inicio1 Inicio2 Inicio3

if (get(handles.radiobutton1,'Value')) == 1;
cla;
tau = str2double(get(handles.edit1,'String'));
K = str2double(get(handles.edit2,'String'));
Inicio = str2double(get(handles.edit3,'String'));
X = str2double(get(handles.edit5,'String'));
tspan = str2double(get(handles.edit7,'String'));
[t,y] = ode45(@uniunidad,[0 tspan],Inicio);
plot(t,y,'k')
xlabel('Tiempo','Fontsize',10);
ylabel('Respuesta','Fontsize',10);
title('Respuesta Paso Una Unidad','Fontsize',12,'Fontweight','bold');
grid on
elseif (get(handles.radiobutton2,'Value')) == 1;
cla reset;
tau1 = str2double(get(handles.edit1,'String'));
K1 = str2double(get(handles.edit2,'String'));
tau2 = str2double(get(handles.edit3,'String'));
K2 = str2double(get(handles.edit4,'String'));
Inicio1 = str2double(get(handles.edit5,'String'));
Inicio2 = str2double(get(handles.edit6,'String'));
X = str2double(get(handles.edit7,'String'));
tspan = str2double(get(handles.edit10,'String'));
[t,y] = ode45(@biunidad,[0 tspan],[Inicio1 Inicio2]);
plot(t,y)
xlabel('Tiempo','Fontsize',10);
ylabel('Respuesta','Fontsize',10);
title('Respuesta Paso Dos Unidades','Fontsize',12,'Fontweight','bold');
legend('Primera Unidad','Segunda Unidad',4);
grid on
elseif (get(handles.radiobutton3,'Value')) == 1;
cla reset;
tau1 = str2double(get(handles.edit1,'String'));
K1 = str2double(get(handles.edit2,'String'));
tau2 = str2double(get(handles.edit3,'String'));
K2 = str2double(get(handles.edit4,'String'));
tau3 = str2double(get(handles.edit5,'String'));
K3 = str2double(get(handles.edit6,'String'));
Inicio1 = str2double(get(handles.edit7,'String'));
Inicio2 = str2double(get(handles.edit8,'String'));
Inicio3 = str2double(get(handles.edit9,'String'));
X = str2double(get(handles.edit10,'String'));
tspan = str2double(get(handles.edit11,'String'));
[t,y] = ode45(@triunidad,[0 tspan],[Inicio1 Inicio2 Inicio3]);
plot(t,y)
xlabel('Tiempo','Fontsize',10);
ylabel('Respuesta','Fontsize',10);
title('Respuesta Paso Tres Unidades','Fontsize',12,'Fontweight','bold');
legend('Primera Unidad','Segunda Unidad','Tercera Unidad',4);
grid on
end

Push Button “Cancelar”


El siguiente código es el procedimiento que se desarrolla cuando se presiona
el botón denominado “Cancelar”.

function pushbutton2_Callback(hObject, eventdata, handles)

selection = questdlg(['¿Desea cerrar ' get(handles.figure1,'Name') '?'],...


['Cerrar ' get(handles.figure1,'Name') '...'],...
'Yes','No','No');
if strcmp(selection,'No')
return;
end
clear, close all;
Push Button “Ayuda”
El siguiente código es el procedimiento que se desarrolla cuando se presiona
el botón denominado “Ayuda”.

function pushbutton3_Callback(hObject, eventdata, handles)

helpwin('INTERACTUANTES.m')

Ejecución del Programa

Al ejecutar el programa se despliega la interfaz elaborada. La Figura 7.4


muestra las respuestas paso de tres unidades no interactuantes con las
especificaciones observadas en la figura

Figura 7.4 Respuesta Paso de Tres Unidades No Interactuantes


Se observan los atrasos dinámicos adicionales en la segunda y tercera unidad, la
forma de S itálica de sus respuestas. En este caso, es el mismo valor último para
cada uno de los tanques porque el valor de las tres ganancias es de uno.

Se deja como ejercicio modificar el programa adicionando las opciones para cuatro
y cinco unidades de tal manera que cuando se desplieguen las respectivas interfaces
se muestre el correspondiente sistema de ecuaciones diferenciales.

Además, se deja como ejercicio la elaboración de una nueva interfaz en la cual se


simule la solución de dos unidades conectadas en serie, pero con una recirculación
desde la segunda hasta la primera unidad; es decir, interactuantes.

También podría gustarte