Ejemplo con trim y linmod.

Ejemplo con trim y linmod. Ejemplo con trim y linmod.

ib.cnea.gov.ar
from ib.cnea.gov.ar More from this publisher
04.01.2015 Views

Modelado y Linealización de Sistemas No Lineales usando MATLAB y SIMULINK 1 Introducción En este documento discutiremos la forma de emplear Simulink para modelar la conducta dinámica de sistemas no lineales y obtener modelos dinámicos lineales de su correspondiente representación no lineal. La información obtenida puede servir para diversos propósitos, como explorar la conducta dinámica de un sistema dado, o bien, el diseño de controladores usando alguna representación lineal del sistema a controlar (ya sea en forma de espacio de estado o de función de transferencia). 2 Modelado El modelo que usaremos para mostrar la forma de realizar las actividades anteriores en SIMULINK se refiere al control de nivel de aguan en un tanque con un único caudal de entrada y salida: dh 1 = ( q& i − q& o ) ec.1 dt ρ A q& = K h ec.2 o Donde q i y q o son los caudales másicos de entrada y salida, respectivamente y h es la altura del nivel de agua. Los parámetros del sistema son: ρ = 1 kg/m 3 , A = 1 m 2 y K = 1 kg/s m 1/2 . El estado de equilibrio se fija alrededor del punto h 0 = 1, calculando el caudal de entrada en estado estacionario se obtiene q i0 = 1 kg/s. 3 Diagrama de Bloques en SIMULINK Para representar el modelo dinámico del núcleo del reactor dado por las ecuaciones 1 y 2 en Simulink empezamos ejecutando desde el Workspace de Matlab la siguiente instrucción: >> simulink esta instrucción invoca el programa Simulink donde aparece la biblioteca básica de funciones. Cree un nuevo modelo y aparecerá el área de trabajo Es recomendable comenzar colocando los bloques integradores, tantos como ecuaciones, para este caso solo un integrador. Desde el bloque de funciones continuas arrastrar el bloque del integrador y soltarlo en el área de trabajo de Simulik, luego con el botón derecho del mouse copiaremos el bloque del integrador haciendo clic sobre el bloque integrador y soltando donde se desee ubicar el nuevo bloque. Colocar flechas de entrada/salida, y etiquetar las flechas con la información pertinente tal como se muestra a continuación:

Modelado y Linealización de Sistemas No Lineales usando MATLAB y SIMULINK<br />

1 Introducción<br />

En este documento discutiremos la forma de emplear Simulink para modelar la <strong>con</strong>ducta dinámica de<br />

sistemas no lineales y obtener modelos dinámicos lineales de su correspondiente representación no<br />

lineal.<br />

La información obtenida puede servir para diversos propósitos, como explorar la <strong>con</strong>ducta dinámica de<br />

un sistema dado, o bien, el diseño de <strong>con</strong>troladores usando alguna representación lineal del sistema a<br />

<strong>con</strong>trolar (ya sea en forma de espacio de estado o de función de transferencia).<br />

2 Modelado<br />

El modelo que usaremos para mostrar la forma de realizar las actividades anteriores en SIMULINK se<br />

refiere al <strong>con</strong>trol de nivel de aguan en un tanque <strong>con</strong> un único caudal de entrada y salida:<br />

dh 1<br />

= ( q&<br />

i<br />

− q&<br />

o ) ec.1<br />

dt ρ A<br />

q&<br />

= K h ec.2<br />

o<br />

Donde q i y q o son los caudales másicos de entrada y salida, respectivamente y h es la altura del nivel de<br />

agua. Los parámetros del sistema son: ρ = 1 kg/m 3 , A = 1 m 2 y K = 1 kg/s m 1/2 . El estado de equilibrio se<br />

fija alrededor del punto h 0 = 1, calculando el caudal de entrada en estado estacionario se obtiene q i0 = 1<br />

kg/s.<br />

3 Diagrama de Bloques en SIMULINK<br />

Para representar el modelo dinámico del núcleo del reactor dado por las ecuaciones 1 y 2 en Simulink<br />

empezamos ejecutando desde el Workspace de Matlab la siguiente instrucción:<br />

>> simulink<br />

esta instrucción invoca el programa Simulink donde aparece la biblioteca básica de funciones. Cree un<br />

nuevo modelo y aparecerá el área de trabajo Es recomendable comenzar colocando los bloques<br />

integradores, tantos como ecuaciones, para este caso solo un integrador. Desde el bloque de funciones<br />

<strong>con</strong>tinuas arrastrar el bloque del integrador y soltarlo en el área de trabajo de Simulik, luego <strong>con</strong> el<br />

botón derecho del mouse copiaremos el bloque del integrador haciendo clic sobre el bloque integrador y<br />

soltando donde se desee ubicar el nuevo bloque. Colocar flechas de entrada/salida, y etiquetar las<br />

flechas <strong>con</strong> la información pertinente tal como se muestra a <strong>con</strong>tinuación:


figura 1<br />

Antes de <strong>con</strong>tinuar, guardar el trabajo <strong>con</strong> el nombre ctrl_nivel_no_lineal.<br />

A <strong>con</strong>tinuación definiremos las <strong>con</strong>stantes que sean necesarias creando desde el workspace de Matlab<br />

un nuevo M-File. En este tipo de archivos ejecutables desde Matlab se puede crear programas y<br />

funciones o simplemente definir <strong>con</strong>stantes. Dentro del archivo escribir las siguientes líneas:<br />

%Constantes<br />

rho = 1 %[kg/m3]<br />

A = 1 %[m2]<br />

K = 1<br />

%Condicion de equilibrio<br />

h0 = 1<br />

qi0 = 1<br />

Luego salvar como dinámica_tanque.<br />

Siguiendo <strong>con</strong> el modelo colocaremos un bloque sumador (de la librería Math Operations) a la entrada<br />

del integrador anterior (la salida de este sumador será el lado derecho de la ecuación 1) tal como se<br />

muestra en la figura siguiente:


figura 2<br />

Ahora agregamos los bloques necesarios para <strong>con</strong>struir la parte derecha de la ecuación 1, haciendo<br />

doble clic sobre los bloques es posible cambiar algunos parámetros, en los bloques de ganancia colocar<br />

el nombre de la variable que corresponda según las definiciones que se hicieron en el M-File, hacer lo<br />

mismo <strong>con</strong> el bloque de la <strong>con</strong>stante. Luego unir los bloques como muestra la siguiente figura (hint: para<br />

unir los bloques puede ser útil seleccionar el bloque origen, presionar la tecla ctrl y hacer clic sobre el<br />

bloque destino, también es útil para copiar bloques, hacer clic <strong>con</strong> el botón derecho del mouse arrastrar<br />

y soltar):<br />

figura 3<br />

De la misma forma que antes, completamos el modelo de <strong>con</strong>trol de nivel del tanque agregando los<br />

bloques de entrada y salida (inport/outport), en la siguiente figura se ve el modelo terminado:


Figura 4<br />

4 Linealización del Sistema No Lineal<br />

Antes de proceder a explicar el procedimiento de linealización debemos mencionar que dicho proceso<br />

normalmente se acostumbra realizarlo alrededor de algún estado estacionario del proceso en cuestión.<br />

Por lo tanto, antes de linealizar el proceso debemos primero evaluar el estado estacionario<br />

4.1 Estado estacionario del proceso (antes de usar Matlab, hallar las <strong>con</strong>diciones a mano)<br />

Para obtener el estado estacionario de un sistema cualquiera modelado en Simulink usamos el comando<br />

<strong>trim</strong> (hacer help <strong>trim</strong> para ver los parámetros que necesita y devuelve) el cual es parte de Matlab.<br />

Entonces desde la ventana de comandos de Matlab, o bien directamente en el M-File, tecleamos la<br />

siguiente instrucción:<br />

xo = [h0];<br />

uo = 0;<br />

yo = 0;<br />

ix = [h0];<br />

[x,u,y,dx] = <strong>trim</strong>('ctrl_nivel_no_lineal',xo,uo,yo,ix)<br />

donde:<br />

xo = estimado inicial para evaluar el estado estacionario<br />

uo = valor fijo de la entrada<br />

yo = estimado inicial de las salida<br />

ix = valor fijo de los estados<br />

iu = variable de entrada cuyo valor permanece <strong>con</strong>stante<br />

ejecutando el comando anterior obtenemos la siguiente respuesta de Matlab:<br />

x =<br />

1<br />

u =<br />

1<br />

y =<br />

1


dx =<br />

0<br />

Observar que la derivada en el punto hallado es dx = 0, esto indica que el punto es un punto<br />

estacionario.<br />

Nota: Antes de <strong>con</strong>tinuar, nos detendremos un instante a imaginar un sistema de mayor complejidad,<br />

supongamos que en lugar de una única variable de estado, x, existen dos o mas variables, es decir, dos o<br />

mas integradores. Deberíamos preguntarnos como hace Simulink para ordenar las variables de estado.<br />

Es posible extraer la estructura de las variables de estado x del modelo usando el siguiente comando.<br />

x = Simulink.BlockDiagram.getInitialState('ctrl_nivel_no_lineal');<br />

Donde x, es una estructura del tipo:<br />

x.signals<br />

struct array with fields:<br />

values<br />

dimensions<br />

label<br />

blockName<br />

stateName<br />

inReferencedModel<br />

sampleTime<br />

Si accedemos al blockName (ejecutando x.signals.blockName) veremos los nombres de todos los bloques<br />

integradores del modelo, según el orden que les da Simulink. Algunos parámetros pueden ser<br />

<strong>con</strong>figurados desde el modelo, para facilita el la identificación de los estados, es recomendable los<br />

parámetros stateName y blockName.<br />

4.2 Linealización<br />

Una vez que hemos calculado un estado estacionario del sistema estamos listos para proceder a<br />

linealizar el modelo no lineal original. Para este propósito usaremos el estado estacionario evaluado<br />

anteriormente. Tecleando la siguiente instrucción en Matlab (hacer un help de <strong>linmod</strong>):<br />

[A,B,C,D] = <strong>linmod</strong>('ctrl_nivel_no_lineal',x)<br />

Con este resultado se puede <strong>con</strong>struir un bloque de espacio de estado y validar los resultados de la<br />

linealización. También es posible obtener el sistema linealizado en función transferencia.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!