Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Introducción Este curso de introducción a MatLab está orientado a estudiantes de ingeniería interés por la programación. Los conocimientos de ingeniería requeridos no demasiado altos ya que está pensado para estudiantes de todos los cursos. Las primeras lecciones servirán de repaso para los estudiantes de cursos avanzados y actuales para los estudiantes de los primeros cursos. con son dos muy Los conocimientos que hay que tener sobre ordenadores son los básicos. Este curso está pensado para dotar a los asistentes con un instrumento de proceso y cálculo. La razón fundamental por la que esto es importante en el análisis de ingeniería (al igual que en otras disciplinas) es que en muchas ocasiones las modernas teorías y los modelos en las que éstas se sustentan no producen soluciones analíticas y hay que buscar por tanto soluciones numéricas a los problemas que plantean. Otra razón de importancia es que incluso en el caso en que la teoría produzca soluciones analíticas a veces es conveniente realizar simulaciones de los modelos o presentar los resultados de un modo que requiere el proceso de datos para problemas muy particulares. Un lenguaje de programación como MatLab permite resolver todos los problemas que resuelven paquetes de programación diseñados para propósitos generales y además permite resolver también los problemas particulares que se nos planteen para los cuales no existen paquetes. MatLab es un lenguaje de programación tan flexible como Fortran y, aunque por ser un lenguaje interpretado sea más lento que Fortran o C, tiene unas capacidades gráficas y una sencillez de manejo que lo hacen perfecto para iniciarse en la programación. Además las últimas versiones de MatLab permiten el diseño de interfaces gráficas de usuario (gui) que nos permiten diseñar entornos gráficos muy fáciles de usar por aquellos a los que nuestros programas estén dirigidos. En este curso vamos a ver los comandos básicos de programación e iremos amenizando el aprendizaje con ejercicios de modelos sencillos, para que al tiempo que aprendemos a manejar el lenguaje vayamos viendo su utilidad con problemas concretos de ingeniería. Una vez que tengamos los conocimientos básicos estaremos en condiciones de subir un nivel con la versión MatLab 6.5 en la que existen una serie de bibliotecas para una variedad sorprendente de problemas entre los que se encuentran el análisis de señales, matemáticas control, redes neuronales y un largísimo etcétera. No cabe ninguna duda de que este instrumento de trabajo tiene valor en el mercado y por tanto es bueno acostumbrarse a manejarlo con soltura. La notación a utilizar en el texto indicará en negrita nombres de comandos interpretables por MatLab como disp o nombres de archivos que MatLab puede leer como programa.m. El autor… 1 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Tabla de contenido Capitulo I: Información general e introducción al programa Matlab (Lo básico antes de comenzar) ACERCA DE ESTE MANUAL ¿QUE ES MATLAB ??? Arranque y espacio de trabajo USO DEL HELP CONTROL DE LOS FORMATOS DE SALIDA Y DE OTRAS OPCIONES DE MATLAB OPERACIONES CON MATRICES Y VECTORES DEFINICIÓN DE MATRICES DESDE TECLADO OPERACIONES CON MATRICES TIPOS DE MATRICES PREDEFINIDOS FORMACIÓN DE UNA MATRIZ A PARTIR DE OTRAS NÚMEROS REALES DE DOBLE PRECISIÓN NÚMEROS COMPLEJOS: FUNCIÓN COMPLEX CADENAS DE CARACTERES VARIABLES Y EXPRESIONES MATRICIALES OPERADOR DOS PUNTOS (:) FUNCIONES MATEMÁTICAS ELEMENTALES QUE OPERAN DE MODO ESCALAR FUNCIONES QUE ACTÚAN SOBRE VECTORES FUNCIONES QUE ACTÚAN SOBRE MATRICES FUNCIONES MATRICIALES ESPECIALES FUNCIONES DE FACTORIZACIÓN Y/O DESCOMPOSICIÓN MATRICIAL MÁS SOBRE OPERADORES RELACIONALES CON VECTORES Y MATRICES FUNCIONES PARA CÁLCULOS CON POLINOMIOS OTROS TIPOS DE DATOS DE MATLAB CADENAS DE CARACTERES GRÁFICOS BIDIMENSIONALES FUNCIÓN PLOT ESTILOS DE LÍNEA Y MARCADORES EN LA FUNCIÓN PLOT AÑADIR LÍNEAS A UN GRÁFICO YA EXISTENTE COMANDO SUBPLOT CONTROL DE LOS EJES FUNCIÓN LINE() CONTROL DE VENTANAS GRÁFICAS: FUNCIÓN FIGURE Otras funciones gráficas 2-D FUNCIÓN FPLOT FUNCIÓN FILL PARA POLÍGONOS ENTRADA DE PUNTOS CON EL RATÓN GRAFICOS 2D Y 3D Graficas de curvas dadas en coordenadas polares y parametricas. Comandos básicos de programación COMO HACER UN PROGRAMA EN MATLAB (GENERALIDADES) PROGRAMACIÓN DE MATLAB BIFURCACIONES Y BUCLES Comando END Comando IF Comando WHILE Comando FOR Comando PLOT Funciones de dos variables Comando DISP Comando INPUT FICHEROS *.M FICHEROS DE COMANDOS (SCRIPTS) RECOMENDACIONES GENERALES DE PROGRAMACIÓN 2 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Capitulo II: ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Introducción Tratamiento mediante funciones de transferencia. (Sistemas continuos) Dominio Temporal Dominio Frecuencial Respuesta en frecuencia Márgenes de estabilidad Efectos de los retardos Comandos relacionados con operaciones de bloques Lugar de las raíces Estudio temporal y frecuencial de sistemas de primer y segundo orden Sistemas de primer orden Sistemas de segundo orden Análisis del efecto de un cero en la respuesta temporal de un sistema de segundo orden Influencia de polos adicionales. Polos dominantes Tratamiento mediante funciones de transferencia. Sistemas discretos Tratamiento mediante descripción en el espacio de estados Manipulación mediante objetos Resumen de los comandos mas importantes del Control System Toolbox Capitulo III: Simulink Simulink Introducción al Simulink Librería de bloques. Crear un nuevo modelo Agregar un bloque al Área de trabajo Unir bloques con una línea. Sacar una derivación Bloques más comunes (de interés para la materia Control) de la librería de Simulink. Ejemplo elemental Parámetros de simulación Iniciar y detener una simulación. Capitulo IV: Complementarios… PID. Descripción y reglas heurísticas de Sintonización Introducción El sistema a controlar Controlador PID Control a lazo cerrado. Ajuste del PID. Reglas del Ziegler-Nichols. Primer método de Ziegler-Nichols Segundo método de Ziegler-Nichols Comentarios finales: 3 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 4 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 5 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Capitulo I: Información general e introducción al programa Matlab (Lo básico antes de comenzar) 1.ACERCA DE ESTE MANUAL Las primeras versiones de este manual estuvieron dirigidas a alumnos de un curso introductorio de una aplicación que, para muchos alumnos, iba a constituir su primer contacto con los ordenadores y/o con la programación por lo tanto estaba estructurado de forma muy sencilla pero a pesar de lo resumido estaban muy bien explicadas todas las actividades desarrolladas en él. Desde este momento, este manual se ha adaptado a las asignaturas de Controles Automáticos e Instrumentación de Plantas de la especialidad de Ingeniería Mecánica en La Universidad del Zulia, Núcleo Cabimas. Por encima de la asignatura citada, este manual puede ser útil a un público más amplio, que incluye a alumnos de cursos superiores de las distintas escuelas de Ingeniería, a alumnos de Tercer Ciclo y a profesores que quieren conocer más de cerca las posibilidades que tendría MATLAB en sus asignaturas, asi como a aquellas personas que esten realizando o piensen realizar cursos de mejoramiento profesional en el area tecnica, cientifica o industrial en los cuales se requiera de una herramienta computacional de la talla de MATLAB.. Se ha pretendido llegar a un equilibrio entre el detalle de las explicaciones, la amplitud de temas tratados y el número de páginas. En algunos casos, junto con las instrucciones introducidas por el usuario se incluye la salida de MATLAB; en otros casos no se incluye dicha salida, pero se espera que el lector disponga de un PC con MATLAB y vaya introduciendo esas instrucciones a la vez que avanza en estas páginas. En muchas ocasiones se anima al lector interesado a ampliar el tema con la ayuda del programa (toda la documentación de MATLAB está disponible on-line a través del Help). En cualquier caso recuérdese que la informática moderna, más que en “saber” consiste en “saber encontrar lo que se necesita” en pocos segundos. 2.¿QUE ES MATLAB ??? Eso es una buena Pregunta, MATLAB es el nombre abreviado de “MATrix LABoratory” o en cristiano “Laboratorio de Matrices”. Lo más fácil es pensar en MATLAB como en una calculadora programable muy potente, como éstas, MATLAB es capaz de realizar las operaciones básicas de suma, resta, multiplicación, división, etc.... A la vez que puede manejar números complejos, logaritmos, operaciones trigonométricas, operaciones lógicas, ... Por último, podemos almacenar, procesar y recuperar datos mediante algoritmos numéricos, en realidad, MATLAB es mucho más que una buena calculadora… Una de las capacidades más atractivas es la de realizar una amplia variedad de gráficos en dos y tres dimensiones, realiza cálculos numéricos con vectores y matrices conformados por números escalares, tanto reales como complejos. Es la herramienta de cálculo numérico por excelencia, es un lenguaje de programación fácil de usar y extremadamente potente, posee poderosas capacidades gráficas y es una plataforma de desarrollo de aplicaciones, ya que cuenta con numerosos grupos de herramientas (Código básico y librerías 6 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB especializadas llamados toolboxes) de aplicación específica (toolbox de matemática simbólica, toolbox de procesamiento de señales, toolbox de control,etc) 3.Arranque y espacio de trabajo MATLAB se puede arrancar como cualquier otra aplicación de Windows 95/98/2000/ME/XP/NT, clicando dos veces en el icono correspondiente en el escritorio (figura 1) (donde quiera que esté ubicado según la configuración del ordenador) o por medio del menú INICIO. Al arrancar MATLAB se abre una ventana del tipo de la indicada en la Figura 2. Figura 1 En la ventana inicial (“ventana de comandos”) se sugieren ya algunos comandos para el usuario inexperto que quiere echar un vistazo a la aplicación. En dicha ventana aparece también el prompt (aviso) característico de MATLAB (»). Esto quiere decir que el programa está preparado para recibir instrucciones. Esta ventana será la mayor parte del tiempo la ventana de trabajo con la que estaremos casi siempre interactuando, es decir será a través de Figura 2. Ventana Inicial ella que intercambiaremos información con el programa al introducir datos y obtener respuesta a lo solicitado. Como ya se dijo matlab es un programa fundamentalmente de calculo, por lo tanto seria bueno apreciar desde el principio la potencia de este, se puede comenzar con algunos ejemplos sencillos sobre tópicos básicos desde el punto de vista matemático. Supongamos que queremos calcular el determinante de una matriz cuadrada de orden 3, (esto es algo muy común dentro de cualquier curso básico de calculo o de algebra elemental) para lo cual recurrimos el método aquel de la suma algebraica del producto de los elementos de las diagonales principales, menos la suma algebraica del producto de las diagonales secundarias…. Y listo problema resuelto, pero cuan engorroso es este procedimiento?, y aun mas a cuantos errores de calculo estamos propensos?, aun así alguien bien experimentado en el área de los números podría pensar que esto no es problema, solo hay que practicar un poco hasta tener soltura y fluidez de lo que se hace. Pues hagamos una pequeña modificación en el tamaño de la matriz y volvamos a realizar el calculo del determinante… hablemos de pasar de una matriz de orden 3, a una de orden 5 (solo aumentar el orden en 2 unidades….) la cantidad de cálculos relacionados con este pequeño cambio aumenta en forma exponencial lo cual evidentemente aumenta la posibilidad de errores, hace la operación exponencialmente mas engorrosa e inevitablemente dispara hasta niveles inaceptables el tiempo de calculo, además de disminuir por todo lo anterior la confiabilidad de los cálculos realizados. Ahora bien veamos como maneja matlab esto. Para una matriz cuadrada de orden 3 el procedimiento para calcular el determinante es el siguiente: 1. definir o introducir la matriz 2. pedir al programa que calcule el determinante Para una matriz cuadrada de orden 5 el procedimiento es: 7 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 1. definir o introducir la matriz 2. pedir al programa que calcule el determinante.. Como puede verse el procedimiento es sencillo y no cambia en nada, la única diferencia es la introducción de los datos o elementos de la matriz… veamos como se hace esto, en las siguientes líneas aparece una corrida de el calculo del determinante de una matriz de orden 3 y luego el calculo para una de orden 5 para el de orden 3: >> a=[1 2 3;4 5 6;7 8 45] a = 1 2 3 4 5 6 7 8 45 >> b=det(a) b = -108 Para el de orden 5: >> c=[1 2 3 4 5;4 5 7 5 6;7 8 4 7 5;4 2 5 6 2;7 0 9 0 9] c = 1 2 3 4 5 4 5 7 5 6 7 8 4 7 5 4 2 5 6 2 7 0 9 0 9 >> d=det(c) d = 4630 Como puede verse el procedimiento en efecto no cambia, se utilizaron los mismos comandos e instrucciones para ambos casos, lo único que cambia son los datos introducidos (matlab no es adivino para adivinar a cual matriz debe extraerle el determinante) y constituye la parte en la cual el usuario interactúa con el computador. En este punto es bueno aclarar que matlab no es un programa que hace milagros ni resuelve problemas de ningún tipo, matlab es solo una herramienta de trabajo la cual facilita las cosas pero nunca podrá resolver problemas y tomar decisiones en base a análisis de nada, ese trabajo es de cada uno de nosotros, ninguna herramienta, mecánica, electrónica o computacional puede sustituir los conocimientos ni puede realizar nuestro trabajo, ellas son solo eso herramientas que lo facilitan pero no resuelven por si solas nada, por ello es importante el conocimiento de lo que se esta haciendo, además como toda herramienta computacional, el programa (al igual que la computadora en general) es un programa “ESTUPIDO” ya que siempre ara lo que tu le pidas que haga, el problema esta en que en muchísimas ocasiones, lo que le pedimos que haga no es lo que queremos que haga, y por lo tanto al proporcionar mal informaron de entrada obtendremos datos o información de salida (respuesta) incorrecta o inconsistente lo cual no es culpa del programa… Ante tal situación quedan dos soluciones, la primera consiste en no utilizar el programa al no ser responsables i consientes de lo que escribimos, y la segunda consiste en que al contrario del caso anterior necesitamos hacernos responsables de los datos que proporcionamos además de saber que es lo que quiero hacer o calcular y pedirle exactamente eso al programa… 8 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Como ejemplo adicional considérese el trabajo que daría resolver una simple matriz de 3 por tres pero que sus elementos sean decimales y complejos…. Parta este caso, matlab resuelve de igual manera… veamos. >> e=[1+i 3+5i 0.34+9i;5+8i 0+i 1;0+3i 6 2] e = Columns 1 through 2 1.0000 + 1.0000i 3.0000 + 5.0000i 5.0000 + 8.0000i 0 + 1.0000i 0 + 3.0000i 6.0000 Column 3 0.3400 + 9.0000i 1.0000 2.0000 >> f=det(e) f = -3.9378e+002 +2.2032e+002i » A= rand(6), B= inv(A), B*A A= 0.9501 0.2311 0.6068 0.4860 0.8913 0.7621 0.4565 0.0185 0.8214 0.4447 0.6154 0.7919 0.9218 0.7382 0.1763 0.4057 0.9355 0.9169 0.4103 0.8936 0.0579 0.3529 0.8132 0.0099 0.1389 0.2028 0.1987 0.6038 0.2722 0.1988 0.0153 0.7468 0.4451 0.9318 0.4660 0.4186 2.7510 -2.5266 -0.6076 -0.7576 -4.6087 3.3088 3.6505 -1.4681 -2.1058 -0.6076 -4.7057 2.9929 0.1513 -6.2170 -2.4143 -0.5742 5.3399 1.5631 -0.0857 1.5345 1.8561 -0.3681 3.1251 -0.6001 2.5299 6.1284 0.9044 -0.1943 -5.1286 -0.6537 B= 5.7430 -4.4170 -1.3917 -1.6896 -3.6417 2.7183 ans = 1.0000 0.0000 0 0.0000 0.0000 -0.0000 0.0000 1.0000 0.0000 0.0000 -0.0000 0.0000 0 0 1.0000 -0.0000 -0.0000 0.0000 0.0000 0 -0.0000 1.0000 -0.0000 0.0000 -0.0000 0.0000 -0.0000 -0.0000 1.0000 0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 1.0000 » Para apreciar desde el principio la Potencia de MATLAB, se puede comenzar por escribir la siguiente línea, a continuación del prompt. Al final hay que pulsar intro. En realidad, en la línea de comandos que se muestra se han escrito tres instrucciones diferentes, separadas por comas. Como consecuencia, la respuesta del programa tiene tres partes también, cada una de ellas correspondiente a una de las instrucciones. Con la primera instrucción se define una matriz cuadrada (6x6) llamada A, cuyos elementos son números aleatorios entre cero y uno (aunque aparezcan sólo 4 cifras, han sido calculados con 16 cifras). En la segunda instrucción se define una matriz B que es igual a la inversa de A. Finalmente se ha multiplicado B por A, y se comprueba que el resultado es la matriz unidad. Otro de los puntos fuertes de MATLAB son los gráficos, que se verán con más detalle en una sección posterior. A título de ejemplo, se puede teclear la siguiente línea y pulsar intro: » x=-4:.01:4; y=sin(x); » plot(x,y), grid, title('Función seno(x)') En la Figura 3 se puede observar que se abre una nueva ventana en la que aparece representada la función sin(x). Esta figura tiene un título "Función seno(x)" y una cuadrícula o "grid". En realidad la línea anterior contiene también varias instrucciones separadas por comas o puntos y comas. En la primera se crea un vector x con 801 valores reales entre -4 y 4, separados por una centésima. A continuación se crea un vector y, cada uno de cuyos elementos es el seno del 9 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB correspondiente elemento del vector x. Después se dibujan los valores de y en ordenadas frente a los de x en abscisas. Las dos últimas instrucciones establecen la cuadrícula y el título. Para borrar todas las salidas anteriores de MATLAB y dejar limpia la ventana principal se pueden utilizar las funciones clc y home. La función clc (clear console) elimina todas las salidas anteriores, mientras que home las mantiene, pero lleva el prompt (» ) a la primera línea de la ventana. Figura N ° 3 Si se desea salir del programa, basta teclear los comandos quit o exit, o bien elegir Exit MATLAB en el menú File (también se puede utilizar el Alt+F4 de todas las aplicaciones de Windows). Como puede observarse matlab con unas simples líneas de código puede ejecutar tareas extremadamente complejas en las que el usuario de forma manual tardaría muchísimo tiempo y los resultados no serian de la calidad grafica que aquí se obtiene sin mencionar nada de la precisión y la rapidez… 4.USO DEL HELP MATLAB dispone de un excelente Help con el que se puede encontrar la información que se desee. La Figura 4 muestra las distintas opciones que aparecen en el menú Help. También puede obtenerse ayuda de cualquier comando tecleando la palabra “help” seguida del nombre del comando y matalb responderá con Figura 4 un resumen de la aplicación de dicho comando además de algunos ejemplos sobre su aplicación. También puede solicitarse ayuda de la misma forma sobre los tolbox de cualquier área, a lo que matlab responderá con una lista de los comandos contenidos en dicho tolbox y el usuario deberá seleccionar aquel o aquellos que le interesen para ese momento… 5.CONTROL DE LOS FORMATOS DE SALIDA Y DE OTRAS OPCIONES DE MATLAB Los formatos de salida en la ventana principal de MATLAB se pueden controlar fácilmente a partir del cuadro de diálogo que se abre con el comando Preferences del menú File. En la Figura 5 y en la Figura 6 se ven dos de los tres cuadros de diálogo a los que se accede al elegir ese comando. 10 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB El cuadro de diálogo de la Figura 5 permite elegir un editor de programas distinto del que trae MATLAB, así como elegir el directorio donde están los ficheros Help. Figura 5 Figura 6 Respecto a los formatos numéricos con que MATLAB muestra los resultados (recuérdese que siempre calcula con la máxima precisión), se pueden activar las mismas posibilidades por medio de comandos tecleados en la línea de comandos de MATLAB. Los más importantes de estos comandos son los siguientes: format format format format format format format format format format format short long hex bank short e short g long e long g loose compact rat coma fija con 4 decimales (defecto) coma fija con 15 decimales cifras hexadecimales números con dos cifras decimales notación científica con 4 decimales notación científica o decimal, dependiendo del valor notación científica con 15 decimales notación científica o decimal, dependiendo del valor introduce algunas líneas en blanco en la salida (defecto) elimina las líneas en blanco citadas (opción recomendada) expresa los números racionales como cocientes de enteros. MATLAB aplica un factor de escala general a las matrices cuando los elementos más grandes o más pequeños son superiores o inferiores respectivamente a una determinada cantidad. 6.OPERACIONES CON MATRICES Y VECTORES Ya se ha comentado que MATLAB es fundamentalmente un programa para cálculo matricial. Inicialmente se utilizará MATLAB como programa interactivo, en el que se irán definiendo las matrices, los vectores y las expresiones que los combinan y obteniendo los resultados sobre la marcha. Si estos resultados son asignados a otras variables podrán ser utilizados posteriormente en otras expresiones. En este sentido MATLAB sería como una potente calculadora matricial (en realidad es esto y mucho más...). Antes de tratar de hacer cálculos complicados, la primera tarea será aprender a introducir matrices y vectores desde el teclado. Más adelante se verán otras formas más potentes de definir matrices y vectores. 6.1. DEFINICIÓN DE MATRICES DESDE TECLADO Como en casi todos los lenguajes de programación, en MATLAB las matrices y vectores son variables que tienen nombres. Ya se verá luego con más detalle las reglas que deben cumplir estos nombres. Por el momento se sugiere que se utilicen letras mayúsculas para matrices y minúsculas para vectores y escalares (MATLAB no 11 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB exige esto, pero puede resultar útil). Para definir una matriz no hace falta establecer de antemano su tamaño (de hecho, se puede definir un tamaño y cambiarlo posteriormente). MATLAB determina el número de filas y de columnas en función del número de elementos que se proporcionan (o se utilizan). Las matrices se definen por filas; los elementos de una misma fila están separados por blancos o comas, mientras que las filas están separadas por pulsaciones intro o por caracteres punto y coma (;). Por ejemplo, el siguiente comando define una matriz A de dimensión (3x3): » A 1 4 7 A=[1 2 3; 4 5 6; 7 8 9] = 2 3 5 6 8 9 » A' ans = 1 4 7 A partir de este momento la matriz A está disponible para hacer cualquier tipo de operación con ella (además de valores numéricos, en la definición de una matriz o vector se pueden utilizar expresiones y funciones matemáticas). Por ejemplo, una sencilla operación con A es hallar su matriz traspuesta. En MATLAB el apóstrofo (') es el símbolo de trasposición matricial. Para calcular A' (traspuesta de A) basta teclear lo siguiente (se añade a continuación la respuesta del programa): 2 5 8 3 6 9 » B 1 2 3 B=A' = 4 7 5 8 6 9 » B*A ans = 66 78 90 78 93 108 90 108 126 » A=[1 4 -3; 2 1 5; -2 5 3] A = 1 4 -3 2 1 5 -2 5 3 B=inv(A) B = 0.1803 0.2213 -0.1885 0.1311 0.0246 0.0902 -0.0984 0.1066 0.0574 12 Como el resultado de la operación no ha sido asignado a ninguna otra matriz, MATLAB utiliza un nombre de variable por defecto (ans, de answer), que contiene el resultado de la última operación. La variable ans puede ser utilizada como operando en la siguiente expresión que se introduzca. También podría haberse asignado el resultado a otra matriz llamada B: Ahora ya están definidas las matrices A y B, y es posible seguir operando con ellas. Por ejemplo, se puede hacer el producto B*A (deberá resultar una matriz simétrica): En MATLAB se accede a los elementos de un vector poniendo el índice entre paréntesis (por ejemplo x(3) ó x(i)). Los elementos de las matrices se acceden poniendo los dos índices entre paréntesis, separados por una coma (por ejemplo A(1,2) ó A(i,j)). Las matrices se almacenan por columnas (aunque se introduzcan por filas, como se ha dicho antes), y teniendo en cuenta esto puede accederse a cualquier elemento de una matriz con un sólo subíndice. Por ejemplo, si A es una matriz (3x3) se obtiene el mismo valor escribiendo A(1,2) que escribiendo A(4). Invertir una matriz es casi tan fácil como trasponerla. A continuación se va a definir una nueva matriz A -no singularen la forma: Ahora se va a calcular la inversa de A y el resultado se asignará a B. Para ello basta Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB hacer uso de la función inv( ) (la precisión o número de cifras con que se muestra el resultado se puede cambiar con el menú File/Preferences/General): » B*A ans = 1.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0 0.0000 1.0000 » x=[10 20 30] % vector fila x = 10 20 30 » y=[11; 12; 13] % vector columna y = 11 12 13 » x+y ??? Error using ==> + Matrix dimensions must agree. » x+y' ans = 21 32 43 Para comprobar que este resultado correcto basta pre-multiplicar A por B; es De forma análoga a las matrices, es posible definir un vector fila x en la forma siguiente (si los tres números están separados por blancos o comas, el resultado será un vector fila): Por el contrario, si los números están separados por intros o puntos y coma (;) se obtendrá un vector columna: MATLAB tiene en cuenta la diferencia entre vectores fila y vectores columna. Por ejemplo, si se intenta sumar los vectores x e y se obtendrá el siguiente mensaje de error: Estas dificultades desaparecen si se suma x con el vector traspuesto de y: Aunque ya se ha visto en los ejemplos anteriores el estilo sencillo e intuitivo con el que MATLAB opera con matrices y vectores, a continuación se va a estudiar este tema con un poco más de detenimiento. 6.2. OPERACIONES CON MATRICES MATLAB puede operar con matrices por medio de operadores y por medio de funciones. Se han visto ya los operadores suma (+), producto (*) y traspuesta ('), así como la función invertir inv( ). Los operadores matriciales de MATLAB son los siguientes: OPERADOR + – * ' ^ \ / .* ./ y .\ .^ DESCRIPCION adición o suma sustracción o resta multiplicación traspuesta potenciación división-izquierda división-derecha producto elemento a elemento división elemento a elemento elevar a una potencia elemento a elemento Estos operadores se aplican también a las variables o valores escalares, aunque con algunas diferencias. Todos estos operadores son coherentes con las correspondientes operaciones matriciales: no se puede por ejemplo sumar matrices que no sean del mismo tamaño. Si los operadores no se usan de modo correcto se obtiene un mensaje de error. Los operadores anteriores se pueden aplicar también de modo mixto, es decir con un operando escalar y otro matricial. En este caso la operación con el escalar se aplica a cada uno de los elementos de la matriz. Considérese el siguiente ejemplo: 13 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB » A 1 3 A=[1 2; 3 4] = 2 4 » A*2 ans = 2 4 6 8 » A-4 ans = -3 -2 -1 0 Los operadores de división requieren una cierta explicación adicional. Considérese el siguiente sistema de ecuaciones lineales, Ax = b (1) en donde x y b son vectores columna, y A una matriz cuadrada invertible. La resolución de este sistema de ecuaciones se puede escribir en las 2 formas siguientes (¡Atención a la 2ª forma, basada en la barra invertida (\), que puede resultar un poco extraña): x = inv(A)*b (2a) x = A\b (2b) » A 1 b 2 » x 0 1 A=[1 2], b=[2] = 2 = x=A\b = Así pues, el operador división-izquierda por una matriz (barra invertida \) equivale a premultiplicar por la inversa de esa matriz. En realidad este operador es más general y más inteligente de lo que aparece en el ejemplo anterior: el operador división-izquierda es aplicable aunque la matriz no tenga inversa e incluso no sea cuadrada, en cuyo caso la solución que se obtiene (por lo general) es la que proporciona el método de los mínimos cuadrados. Cuando la matriz es triangular o simétrica aprovecha esta circunstancia para reducir el número de operaciones aritméticas. En algunos casos se obtiene una solución de mínima con no más de r elementos distintos de cero, siendo r el rango de la matriz. Esto puede estar basado en que la matriz se reduce a forma de escalón y se resuelve el sistema dando valor cero a las variables independientes. Por ejemplo, considérese el siguiente ejemplo de matriz (1x2) que conduce a un sistema de infinitas soluciones: que es la solución obtenida dando valor cero a la variable independiente x(1). » A=[1 2; 1 0; 0 1], b=[2 0 0]' A = 1 2 1 0 0 1 b = 2 0 0 » x=A\b, resto=A*x-b x = 0.3333 0.6667 Por otra parte, en el caso de un sistema de resto = ecuaciones redundante (o sobre-determinado) el -0.3333 resultado de MATLAB es el punto más “cercano” 0.3333 -en el sentido de mínima norma del error- a 0.6667 las ecuaciones dadas (aunque no cumpla exactamente ninguna de ellas). Véase el siguiente ejemplo de tres ecuaciones formadas por una recta que no pasa por el origen y los dos ejes de coordenadas: 14 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB En MATLAB existe también la posibilidad de aplicar elemento a elemento los operadores matriciales (*, ^, \ y /). Para ello basta precederlos por un punto (.). Por ejemplo: » [1 2 3 4]^2 ??? Error using ==> ^ Matrix must be square. » [1 2 3 4].^2 ans = 1 4 9 16 » [1 2 3 4]*[1 -1 1 -1] ??? Error using ==> * Inner matrix dimensions must agree. » [1 2 3 4].*[1 -1 1 -1] ans = 1 -2 3 –4 TIPOS DE DATOS Ya se ha dicho que MATLAB es un programa preparado para trabajar con vectores y matrices. Como caso particular también trabaja con variables escalares (matrices de dimensión 1). MATLAB trabaja siempre en doble precisión, es decir guardando cada dato en 8 bytes, con unas 15 cifras decimales exactas. Ya se verá más adelante que también puede trabajar con cadenas de caracteres (strings) y, desde la versión 5.0, también con otros tipos de datos: Matrices de más dos dimensiones, matrices dispersas, vectores y matrices de celdas, estructuras y clases y objetos. 6.3. TIPOS DE MATRICES PREDEFINIDOS Existen en MATLAB varias funciones orientadas a definir con gran facilidad matrices de tipos particulares. Algunas de estas funciones son las siguientes: eye(4) zeros(3,5) zeros(4) ones(3) ones(2,4) forma la matriz unidad de tamaño (4x4) forma una matriz de ceros de tamaño (3x5) ídem de tamaño (4x4) forma una matriz de unos de tamaño (3x3) idem de tamaño (2x4) genera un vector con n valores igualmente espaciados entre x1 y linspace(x1,x2,n) x2 genera un vector con n valores espaciados logarítmicamente logspace(d1,d2,n) entre 10^d1 y 10^d2. Si d2 es pi 6 , los puntos se generan entre 10^d1 y pi forma una matriz de números aleatorios entre 0 y 1, con rand(3) distribución uniforme, de tamaño (3x3) rand(2,5) idem de tamaño (2x5) forma una matriz de números aleatorios de tamaño (4x4), con randn(4) distribución normal, de valor medio 0 y varianza 1. crea una matriz (4x4) con los números 1, 2, ... 4*4, con la magic(4) propiedad de que todas las filas y columnas suman lo mismo crea una matriz de Hilbert de tamaño (5x5). La matriz de Hilbert es una matriz cuyos elementos (i,j) responden a la hilb(5) expresión (1/(i+j-1)). Esta es una matriz especialmente difícil de manejar por los grandes errores numéricos a los que conduce. invhilb(5) crea directamente la inversa de la matriz de Hilbert kron(x,y) produce una matriz con todos los productos de los elementos del 15 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB vector x por los elementos del vector y. Equivalente a x'*y, donde x e y son vectores fila construye una matriz cuyo polinomio característico tiene como coeficientes los elementos del vector pol (ordenados de mayor grado a menor) construye la matriz de Vandermonde a partir del vector v (las columnas son las potencias de los elementos de dicho vector) compan(pol) vander(v) Existen otras funciones para crear matrices de tipos particulares. Con Help/Help Window se puede obtener información sobre todas las funciones disponibles en MATLAB, que aparecen agrupadas por directorios. En matlab\elmat aparecen la mayor parte de las funciones estudiadas en este apartado. 6.4. FORMACIÓN DE UNA MATRIZ A PARTIR DE OTRAS MATLAB ofrece también la posibilidad de crear una matriz a partir de matrices previas ya definidas, por varios posibles caminos: Recibiendo alguna de sus propiedades (como por ejemplo el tamaño), Por composición de varias submatrices más pequeñas, Modificándola de alguna forma. A continuación se describen algunas de las funciones que crean una nueva matriz a partir de otra o de otras, comenzando por dos funciones auxiliares: [m,n]=size(A) n=length(x) zeros(size(A)) ones(size(A)) A=diag(x) x=diag(A) diag(diag(A)) blkdiag(A,B) triu(A) tril(A) rot90(A,k) flipud(A) fliplr(A) reshape(A,m,n) devuelve el número de filas y de columnas de la matriz A. Si la matriz es cuadrada basta recoger el primer valor de retorno calcula el número de elementos de un vector x forma una matriz de ceros del mismo tamaño que una matriz A previamente creada ídem con unos forma una matriz diagonal A cuyos elementos diagonales son los elementos de un vector ya existente x forma un vector x a partir de los elementos de la diagonal de una matriz ya existente A crea una matriz diagonal a partir de la diagonal de la matriz A crea una matriz diagonal de submatrices a partir de las matrices que se le pasan como argumentos forma una matriz triangular superior a partir de una matriz A (no tiene por qué ser cuadrada). Con un segundo argumento puede controlarse que se mantengan o eliminen más diagonales por encima o debajo de la diagonal principal. ídem con una matriz triangular inferior Gira k*90 grados la matriz rectangular A en sentido antihorario. k es un entero que puede ser negativo. Si se omite, se supone k=1 halla la matriz simétrica de A respecto de un eje horizontal halla la matriz simétrica de A respecto de un eje vertical Cambia el tamaño de la matriz A devolviendo una matriz de tamaño m×n cuyas columnas se obtienen a partir de un vector formado por las columnas de A puestas una a continuación de otra. Si la matriz A tiene menos de m×n elementos se produce un error. Un caso especialmente interesante es el de crear una nueva matriz componiendo como submatrices otras matrices definidas previamente. A modo de ejemplo, ejecútense las siguientes líneas de comandos y obsérvense los resultados obtenidos: » A=rand(3) » B=diag(diag(A)) 16 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB » C=[A, eye(3); zeros(3), B] En el ejemplo anterior, la matriz C de tamaño (6x6) se forma por composición de cuatro matrices de tamaño (3x3). Al igual que con simples escalares, las submatrices que forman una fila se separan con blancos o comas, mientras que las diferentes filas se separan entre sí con intros o puntos y comas. Los tamaños de las submatrices deben de ser coherentes. 7.NÚMEROS REALES DE DOBLE PRECISIÓN Los elementos constitutivos de vectores y matrices son números reales almacenados en 8 bytes (53 bits para la mantisa y 11 para el exponente de 2; entre 15 y 16 cifras decimales equivalentes). Es importante saber cómo trabaja MATLAB con estos números y los casos especiales que presentan. MATLAB mantiene una forma especial para los números muy grandes (más grandes que los que es capaz de representar), que son considerados como infinito. Por ejemplo, obsérvese cómo responde el programa al ejecutar el siguiente comando: » 1.0/0.0 Warning: Divide by zero ans = Inf Así pues, para MATLAB el infinito se representa como inf ó Inf. MATLAB tiene también una representación especial para los resultados que no están definidos como números. Por ejemplo, ejecútense los siguientes comandos y obsérvense las respuestas obtenidas: » 0/0 Warning: Divide by zero ans = NaN » inf/inf ans = NaN En ambos casos la respuesta es NaN, que es la abreviatura de Not a Number. Este tipo de respuesta, así como la de Inf, son enormemente importantes en MATLAB, pues permiten controlar la fiabilidad de los resultados de los cálculos matriciales. Los NaN se propagan al realizar con ellos cualquier operación aritmética, en el sentido de que, por ejemplo, cualquier número sumado a un NaN da otro NaN. MATLAB tiene esto en cuenta. Algo parecido sucede con los Inf. MATLAB dispone de tres funciones útiles relacionadas con las operaciones de coma flotante. Estas funciones, que no tienen argumentos, son las siguientes: Eps Realmin Realmax devuelve la diferencia entre 1.0 y el número de coma flotante inmediatamente superior. Da una idea de la precisión o número de cifras almacenadas. En un PC, eps vale 2.2204e-016. devuelve el número más pequeño con que se puede trabajar (2.2251e-308) devuelve el número más grande con que se puede trabajar (1.7977e+308) 8.NÚMEROS COMPLEJOS: FUNCIÓN COMPLEX » a=sqrt(-4) a = 0 + 2.0000i » 3 + 4j ans = 3.0000 + 4.0000i 17 En muchos cálculos matriciales los datos y/o los resultados no son reales sino complejos, con parte real y parte imaginaria. MATLAB trabaja sin ninguna dificultad con números complejos. Para ver como se representan por defecto los números complejos, ejecútense los siguientes comandos: Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB En la entrada de datos de MATLAB se pueden utilizar indistintamente la i y la j para representar el número imaginario unidad (en la salida, sin embargo, puede verse que siempre aparece la i). Si la i o la j no están definidas como variables, puede intercalarse el signo (*). Esto no es posible en el caso de que sí estén definidas, porque entonces se utiliza el valor de la variable. En general, cuando se está trabajando con números complejos, conviene no utilizar la i como variable ordinaria, pues puede dar lugar a errores y confusiones. Por ejemplo, obsérvense los siguientes resultados: » i=2 i = 2 » 2+3i ans = 2.0000 + 3.0000i » 2+3*i ans = 8 » 2+3*j ans = 2.0000 + 3.0000i Cuando i y j son variables utilizadas para otras finalidades, como unidad imaginaria puede utilizarse también la función sqrt(-1), o una variable a la que se haya asignado el resultado de esta función. La asignación de valores complejos a vectores y matrices desde teclado puede hacerse de las dos formas, que se muestran en el ejemplo siguiente (conviene hacer antes clear i, para que i no esté definida como variable. Este comando se estudiará más adelante): » A = [1+2i 2+3i; -1+i 2-3i] A = 1.0000 + 2.0000i 2.0000 + 3.0000i -1.0000 + 1.0000i 2.0000 - 3.0000i » A = [1 2; -1 2] + [2 3; 1 -3]*I % En este caso el * es necesario A = 1.0000 + 2.0000i 2.0000 + 3.0000i -1.0000 + 1.0000i 2.0000 - 3.0000i Puede verse que es posible definir las partes reales e imaginarias por separado. En este caso sí es necesario utilizar el operador (*), según se muestra en el ejemplo anterior. MATLAB dispone asimismo de la función complex, que crea un número complejo a partir de dos argumentos que representan la parte real e imaginaria, como en el ejemplo siguiente: » complex(1,2) ans = 1.0000 + 2.0000i Es importante advertir que el operador de matriz traspuesta ('), aplicado a matrices complejas, produce la matriz conjugada y traspuesta. Existe una función que permite hallar simplemente la matriz conjugada (conj()) y el operador punto y apóstrofo (.') que calcula simplemente la matriz traspuesta. 9.CADENAS DE CARACTERES MATLAB puede definir variables que contengan cadenas de caracteres. En MATLAB las cadenas de texto van entre apóstrofos o comillas simples (Nótese que en C van entre comillas dobles: "cadena"). Por ejemplo, en MATLAB: s = 'cadena de caracteres' Las cadenas de texto tienen su más clara utilidad en temas que se verán más adelante y por eso se difiere hasta entonces una explicación más detallada. 18 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 10. VARIABLES Y EXPRESIONES MATRICIALES Ya han aparecido algunos ejemplos de variables y expresiones matriciales. Ahora se va a tratar de generalizar un poco lo visto hasta ahora. Una variable es un nombre que se da a una entidad numérica, que puede ser una matriz, un vector o un escalar. El valor de esa variable, e incluso el tipo de entidad numérica que representa, puede cambiar a lo largo de una sesión de MATLAB o a lo largo de la ejecución de un programa. La forma más normal de cambiar el valor de una variable es colocándola a la izquierda del operador de asignación (=). Una expresión de MATLAB puede tener las dos formas siguientes: primero, asignando su resultado a una variable, variable = expresión y segundo evaluando simplemente el resultado del siguiente modo, expresión en cuyo caso el resultado se asigna automáticamente a una variable interna de MATLAB llamada ans (de answer) que almacena el último resultado obtenido. Se considera por defecto que una expresión termina cuando se pulsa intro. Si se desea que una expresión continúe en la línea siguiente, hay que introducir tres puntos (...) antes de pulsar intro. También se pueden incluir varias expresiones en una misma línea separándolas por comas (,) o puntos y comas (;). Si una expresión termina en punto y coma (;) su resultado se calcula, pero no se escribe en pantalla. Esta posibilidad es muy interesante, tanto para evitar la escritura de resultados intermedios, como para evitar la impresión de grandes cantidades de números cuando se trabaja con matrices de gran tamaño. A semejanza de C, MATLAB distingue entre mayúsculas y minúsculas en los nombres de variables. Los nombres de variables deben empezar siempre por una letra y pueden constar de hasta 31 letras y números. El carácter guión bajo (_) se considera como una letra. A diferencia del lenguaje C, no hace falta declarar las variables que se vayan a utilizar. Esto hace que se deba tener especial cuidado con no utilizar nombres erróneos en las variables, porque no se recibirá ningún aviso del ordenador. El comando clear tiene varias formas posibles: Clear sin argumentos, clear A, b clear global Clear functions clear all clear elimina todas las variables creadas previamente (excepto las variables globales). Borra las variables indicadas. Borra las variables globales. Borra las funciones. Borra todas funciones. las variables, incluyendo las globales, y las 11. OPERADOR DOS PUNTOS (:) Este operador es muy importante en MATLAB y puede usarse de varias formas. Se sugiere al lector que practique mucho sobre los ejemplos contenidos en este apartado, introduciendo todas las modificaciones que se le ocurran y haciendo pruebas abundantes (¡Probar es la mejor forma de aprender!). Para empezar, defínase un vector x con el siguiente comando: 19 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB » x=1:10 x = 1 2 3 4 5 6 7 8 9 10 En cierta forma se podría decir que el operador (:) Representa un rango: en este caso, los números enteros entre el 1 y el 10. Por defecto el incremento es 1, pero este operador puede también utilizarse con otros valores enteros y reales, positivos o negativos. En este caso el incremento va entre el valor inferior y el superior, en las formas que se muestran a continuación: » x=1:2:10 x = 1 3 5 7 9 » x=1:1.5:10 x = 1.0000 2.5000 4.0000 5.5000 7.0000 8.5000 10.0000 » x=10:-1:1 x = 10 9 8 7 6 5 4 3 2 1 Puede verse que, por defecto, este operador produce vectores fila. Si se desea obtener un vector columna basta trasponer el resultado. El siguiente ejemplo genera una tabla de funciones seno y coseno. Ejecútese y obsérvese el resultado (recuérdese que con (;) Después de un comando el resultado no aparece en pantalla). » x=[0.0:pi/50:2*pi]'; » y=sin(x); z=cos(x); » [x y z] El operador dos puntos (:) es aún más útil y potente –y también más complicado– con matrices. A continuación se va a definir una matriz A de tamaño 6x6 y después se realizarán diversas operaciones sobre ella con el operador (:). » A=magic(6) A = 35 1 6 3 32 7 31 9 2 8 28 33 30 5 34 4 36 29 26 21 22 17 12 13 19 23 27 10 14 18 24 25 20 15 16 11 Recuérdese que MATLAB accede a los elementos de una matriz por medio de los índices de fila y de columna encerrados entre paréntesis y separados por una coma. Por ejemplo: » A(2,3) ans = 7 El siguiente comando extrae los 4 primeros elementos de la 6ª fila: » A(6, 1:4) ans = 4 36 29 13 20 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Los dos puntos aislados representan "todos los elementos". siguiente comando extrae todos los elementos de la 3ª fila: » A(3, :) ans = 31 9 2 22 27 Por ejemplo, el 20 Para acceder a la última fila o columna puede utilizarse la palabra end, en lugar del número correspondiente. Por ejemplo, para extraer la sexta fila (la última) de la matriz: » A(end, :) ans = 4 36 29 13 18 11 El siguiente comando extrae todos los elementos de las filas 3, 4 y 5: » A(3:5,:) ans = 31 9 8 28 30 5 2 33 34 22 17 12 27 10 14 20 15 16 Se pueden extraer conjuntos disjuntos de filas utilizando corchetes [ ]. Por ejemplo, el siguiente comando extrae las filas 1, 2 y 5: » A([1 2 5],:) ans = 35 1 6 3 32 7 30 5 34 26 21 12 19 23 14 24 25 16 En los ejemplos anteriores se han extraído filas y no columnas por motivos del espacio ocupado por el resultado en la hoja de papel. Es evidente que todo lo que se dice para filas vale para columnas y viceversa: basta cambiar el orden de los índices. El operador dos puntos (:) puede utilizarse en ambos lados del operador (=). Por ejemplo, a continuación se va a definir una matriz identidad B de tamaño 6x6 y se van a reemplazar filas de B por filas de A. Obsérvese que la siguiente secuencia de comandos sustituye las filas 2, 4 y 5 de B por las filas 1, 2 y 3 de A, » B=eye(size(A)); » B([2 4 5],:)=A(1:3,:) B = 1 0 0 0 35 1 6 26 0 0 1 0 3 32 7 21 31 9 2 22 0 0 0 0 0 19 0 23 27 0 0 24 0 25 20 1 Se pueden realizar operaciones aún más complicadas, tales como la siguiente » B=eye(size(A)); » B(1:2,:)=[0 1; 1 0]*B(1:2,:) 21 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Como nuevo ejemplo, se va a ver la forma de invertir el orden de los elementos de un vector: » x=rand(1,5) x = 0.9103 0.7622 0.2625 0.0475 0.7361 » x=x(5:-1:1) x = 0.7361 0.0475 0.2625 0.7622 0.9103 Obsérvese que por haber utilizado paréntesis –en vez de corchetes– los valores generados por el operador (:) afectan a los índices del vector y no al valor de sus elementos. Para invertir el orden de las columnas de una matriz se puede hacer lo siguiente: » A=magic(3) A = 8 1 6 3 5 7 4 9 2 Se sustituyen las dos primeras filas de B por el producto de dichas filas por una matriz de permutación. » A(:,3:-1:1) ans = 6 1 8 7 5 3 2 9 4 Aunque hubiera sido más fácil utilizar la función fliplr(A), que es específica para ello. Finalmente, hay que decir que A(:) representa un vector columna con las columnas de A una detrás de otra. 12. FUNCIONES MATEMÁTICAS ELEMENTALES QUE OPERAN DE MODO ESCALAR Estas funciones, que comprenden las funciones matemáticas trascendentales y otras funciones básicas, actúan sobre cada elemento de la matriz como si se tratase de un escalar. Se aplican de la misma forma a escalares, vectores y matrices. Algunas de las funciones de este grupo son las siguientes: Comando sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) Descripción seno coseno tangente arco seno arco coseno arco tangente (devuelve un ángulo entre p/2 y p/2) atan2(x) arco tangente (devuelve un ángulo entre y ); se le pasan 2 argumentos, proporcionales al seno y al coseno sinh(x) seno hiperbólico cosh(x) coseno hiperbólico tanh(x) tangente hiperbólica 22 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB asinh(x) acosh(x) atanh(x) log(x) log10(x) exp(x) sqrt(x) sign(x) rem(x,y) mod(x,y) round(x) fix(x) floor(x) ceil(x) gcd(x) lcm(x) real(x) imag(x) abs(x) angle(x) arco seno hiperbólico arco coseno hiperbólico arco tangente hiperbólica logaritmo natural logaritmo decimal función exponencial raíz cuadrada devuelve -1 si <0, 0 si =0 y 1 si >0. Aplicada a un número complejo, devuelve un vector unitario en la misma dirección resto de la división (2 argumentos que no tienen que ser enteros) similar a rem (Ver diferencias con el Help) redondeo hacia el entero más próximo redondea hacia el entero más próximo a 0 valor entero más próximo hacia valor entero más próximo hacia máximo común divisor mínimo común múltiplo partes reales partes imaginarias valores absolutos ángulos de fase 13. FUNCIONES QUE ACTÚAN SOBRE VECTORES Las siguientes funciones actúan sobre vectores (no sobre matrices ni sobre escalares) Comando Descripción Máximo elemento de un vector. Devuelve el valor máximo xm y la [xm,im]=max(x) posición que ocupa im Mínimo elemento de un vector. Devuelve el valor mínimo y la min(x) posición que ocupa. sum(x) suma de los elementos de un vector devuelve el vector suma acumulativa de los elementos de un vector cumsum(x) (cada elemento del resultado es una suma de elementos del original) mean(x) valor medio de los elementos de un vector std(x) desviación típica prod(x) producto de los elementos de un vector devuelve el vector producto acumulativo de los elementos de un Cumprod(x) vector ordenación de menor a mayor de los elementos de un vector x [y,i]=sort(x) Devuelve el vector ordenado y, y un vector i con las posiciones iniciales en x de los elementos en el vector ordenado y. En realidad estas funciones se pueden aplicar también a matrices, pero en ese caso se aplican por separado a cada columna de la matriz, dando como valor de retorno un vector resultado de aplicar la función a cada columna de la matriz considerada como vector. Si estas funciones se quieren aplicar a las filas de la matriz basta aplicar dichas funciones a la matriz traspuesta. 14. FUNCIONES QUE ACTÚAN SOBRE MATRICES Las siguientes funciones exigen que el(los) argumento(s) sean matrices. En este grupo aparecen algunas de las funciones más útiles y potentes de MATLAB. Se clasificarán en varios subgrupos: 23 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 3.5.1. FUNCIONES Comando B = A' B = A.' v = poly(A) t = trace(A) [m,n] = size(A) n = size(A) nf = size(A,1) nc = size(A,2) MATRICIALES ELEMENTALES Descripción calcula la traspuesta (conjugada) de la matriz A calcula la traspuesta (sin conjugar) de la matriz A devuelve un vector v con los coeficientes del polinomio característico de la matriz cuadrada A devuelve la traza t (suma de los elementos de la diagonal) de una matriz cuadrada A devuelve el número de filas m y de columnas n de una matriz rectangular A devuelve el tamaño de una matriz cuadrada A devuelve el número de filas de A devuelve el número de columnas de A 15. FUNCIONES MATRICIALES ESPECIALES Las funciones exp(), sqrt() y log() se aplican elemento a elemento a las matrices y/o vectores que se les pasan como argumentos. Existen otras funciones similares que tienen también sentido cuando se aplican a una matriz como una única entidad. Estas funciones son las siguientes (se distinguen porque llevan una "m" adicional en el nombre): Comando expm(A) sqrtm(A) logm() Descripción Si A=XDX', expm(A)=X*diag(exp(diag(D)))*X' devuelve una matriz que multiplicada por sí misma da la matriz A es la función recíproca de expm(A) Aunque no pertenece a esta familia de funciones, se puede considerar que el operador potencia (^) está emparentado con ellas. Así, es posible decir que A^n está definida si A es cuadrada y n un número real. Si n es entero, el resultado se calcula por multiplicaciones sucesivas. Si n es real, el resultado se calcula como: A^n=X*D.^n*X' siendo [X,D]=eig(A) 16. FUNCIONES MATRICIAL DE FACTORIZACIÓN Y/O DESCOMPOSICIÓN A su vez este grupo de funciones se puede subdividir en 4 subgrupos: Funciones basadas en la factorización triangular (eliminación de Gauss): Comando [L,U] = lu(A) B = inv(A) d = det(A) E = rref(A) [E,xc] = rref(A) U = chol(A) 24 Descripción descomposición de Crout (A = LU) de una matriz. La matriz L es una permutación de una matriz triangular inferior (dicha permutación es consecuencia del pivotamiento por columnas utilizado en la factorización) calcula la inversa de A. Equivale a B=inv(U)*inv(L) devuelve el determinante d de la matriz cuadrada A. Equivale a d=det(L)*det(U) reducción a forma de escalón (mediante la eliminación de Gauss con pivotamiento por columnas) de una matriz rectangular A reducción a forma de escalón con un vector xc que da información sobre una posible base del espacio de columnas de A descomposición de Cholesky de matriz simétrica y positivodefinida. Sólo se utiliza la diagonal y la parte triangular Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB superior de A. El resultado es una matriz triangular superior tal que A = U'*U devuelve una estimación del recíproco de la condición numérica de la matriz A basada en la norma sub-1. Si el resultado es próximo a 1 la matriz A está bien condicionada; si es próximo a 0 no lo está. c = rcond(A) Funciones basadas en el cálculo de valores y vectores propios: Comando [X,D] = eig(A) [X,D] = eig(A,B) Descripción valores propios (diagonal de D) y vectores propios (columnas de X) de una matriz cuadrada A. Con frecuencia el resultado es complejo (si A no es simétrica) valores propios (diagonal de D) y vectores propios (columnas de X) de dos matrices cuadradas A y B (Ax = lBx). Funciones basadas en la descomposición QR: Comando [Q,R] = qr() B = null(A) Q = orth(A) Descripción descomposición QR de una matriz rectangular. Se utiliza para sistemas con más ecuaciones que incógnitas. devuelve una base ortonormal del subespacio nulo (kernel, o conjunto de vectores x tales que Ax = 0) de la matriz rectangular A las columnas de Q son una base ortonormal del espacio de columnas de A. El número de columnas de Q es el rango de A Funciones basadas en la descomposición de valor singular Comando [U,D,V] = svd(A) B = r = nor nor c = pinv(A) rank(A) = norm(A) = norm(A,2) cond(A) Descripción Descomposición de valor singular de una matriz rectangular(A=U*D*V'). U y V son matrices ortonormales. D es diagonal y contiene los valores singulares Calcula la pseudo-inversa de una matriz rectangular A Calcula el rango r de una matriz rectangular A Calcula la norma sub-2 de una matriz (el mayor valor singular) Co mismo que la anterior Condición numérica sub-2 de la matriz A. Es el cociente entre el máximo y el mínimo valor singular. La condición numérica da una idea de los errores que se obtienen al resolver un sistema de ecuaciones lineales con dicha matriz: su logaritmo indica el número de cifras significativas que se pierden Normas de matrices: Comando Descripción norm(A) norma sub-2, es decir, máximo valor singular de A, max(svd(A)). normest(A) calcula una estimación o aproximación de la norma sub-2. Útil para matrices grandes en las que norm(A) necesita demasiado tiempo norm(A,2) lo mismo que norm(A) norm(A,1) norma sub-1 de A, máxima suma de valores absolutos por columnas, es decir: max(sum(abs((A)))) norm(A,inf) norma sub- de A, máxima suma de valores absolutos por filas, es 25 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB decir: max(sum(abs((A')))) Normas de vectores: Comando norm(x,p) norm(x) norm(x,inf) norm(x,1) 17. MÁS Descripción norma sub-p, es norma euclídea; norma sub-¥, es norma sub-1, es SOBRE MATRICES decir sum(abs(x)^p)^(1/p). equivale al módulo o norm(x,2). decir max(abs(x)). decir sum(abs(x)). OPERADORES RELACIONALES CON VECTORES Y Cuando alguno de los operadores relacionales vistos previamente (<, >, <=, >=, == y ~=) actúa entre dos matrices (vectores) del mismo tamaño, el resultado es otra matriz (vector) de ese mismo tamaño conteniendo unos y ceros, según los resultados de cada comparación entre elementos hayan sido true o false, respectivamente. » A=magic(3) A= 816 357 492 » M=A>4 M= 101 011 010 Por ejemplo, supóngase que se define una matriz magic A de tamaño 3x3 y a continuación se forma una matriz binaria M basada en la condición de que los elementos de A sean mayores que 4 (MATLAB convierte este cuatro en una matriz de cuatros de modo automático). Obsérvese con atención el resultado: De ordinario, las matrices "binarias" que se obtienen de la aplicación de los operadores relacionales no se almacenan en memoria ni se asignan a variables, sino que se procesan sobre la marcha. MATLAB dispone de varias funciones para ello. Recuérdese que cualquier valor distinto de cero equivale a true, mientras que un valor cero equivale a false. Algunas de estas funciones son: Comando any(x) any(A) all(x) all(A) find(x) find(A) Descripción función vectorial; chequea si alguno de los elementos del vector x cumple una determinada condición (en este caso ser distinto de cero). Devuelve un uno ó un cero se aplica por separado a cada columna de la matriz A. El resultado es un vector de unos y ceros función vectorial; chequea si todos los elementos del vector x cumplen una condición. Devuelve un uno ó un cero se aplica por separado a cada columna de la matriz A. El resultado es un vector de unos y ceros busca índices correspondientes a elementos de vectores que cumplen una determinada condición. El resultado es un vector con los índices de los elementos que cumplen la condición cuando esta función se aplica a una matriz la considera como un vector con una columna detrás de otra, de la 1ª a la última. 18. FUNCIONES PARA CÁLCULOS CON POLINOMIOS Para MATLAB un polinomio se puede definir mediante un vector de coeficientes. Por ejemplo, el polinomio: x4 – 8x2 + 6x – 10 = 0 Se puede representar mediante el vector [1, 0, -8, 6, -10]. MATLAB puede realizar diversas 26 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB operaciones sobre él, como por ejemplo evaluarlo para un determinado valor de x (función polyval()) y calcular las raíces (función roots()): » pol=[1 0 -8 6 -10] pol = 1 0 -8 6 -10 » roots(pol) ans = -3.2800 2.6748 0.3026 + 1.0238i 0.3026 - 1.0238i » polyval(pol,1) ans = -11 Para calcular producto de polinomios MATLAB utiliza una función llamada conv() (de producto de convolución). En el siguiente ejemplo se va a ver cómo se multiplica un polinomio de segundo grado por otro de tercer grado: » pol1=[1 -2 4] pol1 = 1 -2 4 » pol2=[1 0 3 -4] pol2 = 1 0 3 -4 » pol3=conv(pol1,pol2) pol3 = 1 -2 7 -10 20 -16 Para dividir polinomios existe otra función orientadas al cálculo con polinomios son las siguientes: Comando poly(A) roots(pol) llamada deconv(). Las funciones Descripción polinomio característico de la matriz A raíces del polinomio pol evaluación del polinomio pol para el valor de x. Si x es un Polyval(pol,x) vector, pol se evalúa para cada elemento de x polyvalm(pol,A) evaluación del polinomio pol de la matriz A conv(p1,p2) producto de convolución de dos polinomios p1 y p2 división del polinomio p por el polinomio q. En c se devuelve [c,r]=deconv(p,q) el cociente y en r el resto de la división descompone el cociente entre p1 y p2 en suma de fracciones Residue(p1,p2) simples(ver »help residue) Polyder(pol) calcula la derivada de un polinomio Polyder(p1,p2) calcula la derivada de producto de polinomios calcula los coeficientes de un polinomio p(x) de grado n que se Polyfit(x,y,n) ajusta a los datos p(x(i)) ~= y(i), en el sentido de mínimo error cuadrático medio. 27 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 19. OTROS TIPOS DE DATOS DE MATLAB En los Capítulos precedentes se ha visto la “especialidad” de MATLAB: Trabajar con vectores y matrices. En este Capítulo se va a ver que MATLAB puede también trabajar con otros tipos de datos: Conjuntos o cadenas de caracteres, fundamentales en cualquier lenguaje de programación. Hipermatrices, o matrices de más de dos dimensiones. Estructuras, o agrupaciones bajo un mismo nombre de datos de naturaleza diferente. Vectores o matrices de celdas (cell arrays), que son vectores o matrices cuyos elementos pueden ser cualquier otro tipo de dato. Matrices dispersas o matrices dispersas, que son matrices que pueden ser de muy gran tamaño con la mayor parte de sus elementos cero. 20. CADENAS DE CARACTERES MATLAB trabaja también diferencias respecto a del manejo de cadenas caracteres están en el esté instalado MATLAB. con cadenas de C/C++ y Java. de caracteres sub-directorio caracteres, con ciertas semejanzas y también A continuación se explica lo más importante en MATLAB. Las funciones para cadenas de toolbox\matlab\strfun del directorio en que Los caracteres de una cadena se almacenan en un vector, con un carácter por elemento. Cada carácter ocupa dos bytes. Las cadenas de caracteres van entre apóstrofos o comillas simples, como por ejemplo: 'cadena'. Si la cadena debe contener comillas, éstas se representan por un doble carácter comilla, de modo que se pueden distinguir fácilmente del principio y final de la cadena. Por ejemplo, para escribir la cadena ni 'idea' se escribiría 'ni''idea'''. Una matriz de caracteres es una matriz cuyos elementos son caracteres, o bien una matriz cuyas filas son cadenas de caracteres. Todas las filas de una matriz de caracteres deben tener el mismo número de elementos. Si es preciso, las cadenas (filas) más cortas se completan con blancos. A continuación se pueden ver algunos ejemplos y practicar con ellos: » c='cadena' c = cadena » size(c) % dimensiones del array ans = 1 6 » double(c) % convierte en números ASCII cada carácter ans = 99 97 100 101 110 97 » char(abs(c)) % convierte números ASCII en caracteres ans = cadena » cc=char('más','madera') % convierte dos cadenas en una matriz cc = más madera » size(cc) % se han añadido tres espacios a 'más' ans = 2 6 28 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Las funciones siguientes: más importantes para manejo de cadenas de caracteres son las double(c) char(v) char(c1,c2) convierte en números ASCII cada carácter convierte un vector de números v en una cadena de caracteres crea una matriz de caracteres, completando con blancos las cadenas más cortas deblank(c) elimina los blancos al final de una cadena de caracteres disp(c) imprime el texto contenido en la variable c ischar(c) detecta si una variable es una cadena de caracteres isletter() detecta si un carácter es una letra del alfabeto. Si se le pasa un vector o matriz de caracteres devuelve un vector o matriz de unos y ceros isspace() detecta si un carácter es un espacio en blanco. Si se le pasa un vector o matriz de caracteres devuelve un vector o matriz de unos y ceros strcmp(c1,c2) comparación de cadenas. Si las cadenas son iguales devuelve un uno, y si no lo son, devuelve un cero (funciona de modo diferente que la correspondiente función de C) strcmpi(c1,c2) igual que strcmp(c1,c2), pero ignorando la diferencia entre mayúsculas y minúsculas strncmp(c1,c2,n) compara los n primeros caracteres de dos cadenas c1==c2 compara dos cadenas carácter a carácter. Devuelve un vector o matriz de unos y ceros s=[s,' y más'] concatena cadenas, añadiendo la segunda a continuación de la primera findstr(c1,c2) devuelve un vector con las posiciones iniciales de todas las veces en que la cadena más corta aparece en la más larga strmatch(cc,c) devuelve los índices de todos los elementos de la matriz de caracteres (o vector de celdas) cc, que empiezan por la cadena c strrep(c1,c2,c3) sustituye la cadena c2 por c3, cada vez que c2 es encontrada en c1 [p,r]=strtok(t) separa las palabras de una cadena de caracteres t. Devuelve la primera palabra p y el resto de la cadena r int2str(v) convierte un número entero en cadena de caracteres num2str(x,n) convierte un número real x en su expresión por medio de una cadena de caracteres, con cuatro cifras decimales por defecto (pueden especificarse más cifras, con un argumento opcional n) str2double(str) convierte una cadena de caracteres representando un número real en el número real correspondiente vc=cellstr(cc) convierte una matriz de caracteres cc en un vector de celdas vc, eliminando los blancos adicionales al final de cada cadena. La función char() realiza las conversiones opuestas sprintf convierte valores numéricos en cadenas de caracteres, de acuerdo con las reglas y formatos de conversión del lenguaje C. Con las funciones anteriores se dispone posibilidades para trabajar con cadenas de caracteres. en MATLAB de una amplia A continuación se pueden ver algunos ejemplos: » num2str(pi) % el resultado es una cadena de caracteres, no un número ans = 3.142 29 gama de Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB » num2str(pi,8) ans = 3.1415927 Es habitual convertir los valores numéricos en cadenas de caracteres para poder imprimirlos como títulos en los dibujos o gráficos. Véase el siguiente ejemplo: » fahr=70; grd=(fahr-32)/1.8; » title(['Temperatura ambiente: ',num2str(grd),' grados centígrados']) 21. GRÁFICOS BIDIMENSIONALES MATLAB utiliza un tipo especial de ventanas para realizar las operaciones gráficas. Ciertos comandos abren una ventana nueva y otros dibujan sobre la ventana activa, bien sustituyendo lo que hubiera en ella, bien añadiendo nuevos elementos gráficos a un dibujo anterior. Todo esto se verá con más detalle en las siguientes secciones. 5.1. Funciones gráficas 2D elementales MATLAB dispone de cuatro funciones básicas para crear gráficos 2-D. Estas funciones se diferencian principalmente por el tipo de escala que utilizan en los ejes de abscisas y de ordenadas. Estas cuatro funciones son las siguientes: Comando Descripción crea un gráfico a partir de vectores y/o columnas de matrices, con plot() escalas lineales sobre ambos ejes. loglog() ídem con escala logarítmica en ambos ejes ídem con escala lineal en el eje de ordenadas y logarítmica en el eje semilogx() de abscisas ídem con escala lineal en el eje de abscisas y logarítmica en el eje de semilogy() ordenadas En lo sucesivo se hará referencia casi exclusiva a la primera de estas funciones (plot). Las demás se pueden utilizar de un modo similar. Existen además otras funciones orientadas a añadir títulos al gráfico, a cada uno de los ejes, a dibujar una cuadrícula auxiliar, a introducir texto, etc. Estas funciones son las siguientes: Comando title('título') Descripción añade un título al dibujo añade una etiqueta al eje de abscisas. Con xlabel off xlabel('tal') desaparece añade una etiqueta al eje de ordenadas. Con ylabel off ylabel('cual') desaparece introduce 'texto' en el lugar especificado por las coordenadas x e y. Si x e y son vectores, el texto se repite por cada par text(x,y,'texto') de elementos. Si texto es también un vector de cadenas de texto de la misma dimensión, cada elemento se escribe en las coordenadas correspondientes Introduce texto con ayuda del ratón: el cursor cambia de forma gtext('texto') y se espera un clic para introducir el texto en esa posición define rótulos para las distintas líneas o ejes utilizados en legend() la figura. Para más detalle, consultar el Help grid activa la inclusión de una cuadrícula en el dibujo. Con grid 30 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB off desaparece la cuadrícula Borrar texto (u otros elementos gráficos) es un poco más complicado; de hecho, hay que preverlo de antemano. Para poder hacerlo hay que recuperar previamente el valor de retorno del comando con el cual se ha creado. Después hay que llamar a la función delete con ese valor como argumento. Considérese el siguiente ejemplo: » v = text(1,.0,'seno') v = 76.0001 » delete(v) Los dos grupos de funciones anteriores no actúan de la misma forma. Así, la función plot dibuja una nueva figura en la ventana activa (en todo momento MATLAB tiene una ventana activa de entre todos las ventanas gráficas abiertas), o abre una nueva figura si no hay ninguna abierta, sustituyendo cualquier cosa que hubiera dibujada anteriormente en esa ventana. Para verlo, se comenzará creando un par de vectores x e y con los que trabajar: » x=[-10:0.2:10]; y=sin(x); Ahora se deben ejecutar los comandos siguientes (se comienza cerrando la ventana activa, para que al crear la nueva ventana aparezca en primer plano): » close % se cierra la ventana gráfica activa anterior » grid % se crea una ventana con una cuadrícula » plot(x,y) % se dibuja la función seno borrando la cuadrícula Se puede observar la diferencia con la secuencia que sigue: » close » plot(x,y) % se crea una ventana y se dibuja la función seno » grid % se añade la cuadrícula sin borrar la función seno En el primer caso MATLAB ha creado la cuadrícula en una ventana nueva y luego la ha borrado al ejecutar la función plot. En el segundo caso, primero ha dibujado la función y luego ha añadido la cuadrícula. Esto es así porque hay funciones como plot que por defecto crean una nueva figura, y otras funciones como grid que se aplican a la ventana activa modificándola, y sólo crean una ventana nueva cuando no existe ninguna ya creada. Más adelante se verá que con la función hold pueden añadirse gráficos a una figura ya existente respetando su contenido. a.FUNCIÓN PLOT Esta es la función clave de todos los gráficos 2-D en MATLAB. Ya se ha dicho que el elemento básico de los gráficos bidimensionales es el vector. Se utilizan también cadenas de 1, 2 ó 3 caracteres para indicar colores y tipos de línea. La función plot(), en sus diversas variantes, no hace otra cosa que dibujar vectores. Un ejemplo muy sencillo de esta función, en el que se le pasa un único vector como argumento, es el siguiente: » x=[1 3 2 4 5 3] x = 31 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 1 3 2 4 5 3 » plot(x) El resultado de este comando es que se abre una ventana mostrando el gráfico de la Figura. Por defecto, los distintos puntos del gráfico se unen con una línea continua. También por defecto, el color que se utiliza para la primera línea es el azul. Cuando a la función plot() se le pasa un único vector –real– como argumento, dicha función dibuja en ordenadas el valor de los n elementos del vector frente a los índices 1, 2, ... n del mismo en abscisas. Más adelante se verá que si el vector es complejo, el funcionamiento es bastante diferente. En la pantalla de su ordenador se habrá visto que MATLAB utiliza por defecto color blanco para el fondo de la pantalla y otros colores más oscuros para los ejes y las gráficas. Una segunda forma de utilizar la función plot() es con dos vectores como argumentos. En este caso los elementos del segundo vector se representan en ordenadas frente a los valores del primero, que se representan en abscisas. Véase por ejemplo cómo se puede dibujar un cuadrilátero de esta forma (obsérvese que para dibujar un polígono cerrado el último punto debe coincidir con el primero): » x=[1 6 5 2 1]; y=[1 0 4 3 1]; » plot(x,y) La función plot() permite también dibujar múltiples curvas introduciendo varias parejas de vectores como argumentos. En este caso, cada uno de los segundos vectores se dibujan en ordenadas como función de los valores del primer vector de la pareja, que se representan en abscisas. Si el usuario no decide otra cosa, para las sucesivas líneas se utilizan colores que son permutaciones cíclicas del azul, verde, rojo, cyan, magenta, amarillo y negro. Obsérvese bien cómo se dibujan el seno y el coseno en el siguiente ejemplo: » x=0:pi/25:6*pi; » y=sin(x); z=cos(x); » plot(x,y,x,z) Ahora se va a ver lo que pasa con los vectores complejos. Si se pasan a plot() varios vectores complejos como argumentos, MATLAB simplemente representa las partes reales y desprecia las partes imaginarias. Sin embargo, un único argumento complejo hace que se represente la parte real en abscisas, frente a la parte imaginaria en ordenadas. Véase el siguiente ejemplo. Para generar un vector complejo se utilizará el resultado del cálculo de valores propios de una matriz formada aleatoriamente: » plot(eig(rand(20,20)),'+') Donde se ha hecho uso de elementos que se verán en la siguiente sección, respecto a dibujar con distintos tipos de “markers” (en este caso con signos +), en vez de con línea continua, que es la opción por defecto. En el comando anterior, el segundo argumento es un carácter que indica el tipo de marker elegido. El comando anterior es equivalente a: » z=eig(rand(20,20)); » plot(real(z),imag(z),'+') 32 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Como ya ignoran hay que como se también se ha dicho, si se incluye más de un vector complejo como argumento, se las partes imaginarias. Si se quiere dibujar varios vectores complejos, separar explícitamente las partes reales e imaginarias de cada vector, acaba de hacer en el último ejemplo. El comando plot puede utilizarse con matrices como argumentos. Véanse algunos ejemplos sencillos: dibuja una línea por cada columna de A en ordenadas, frente al índice de los elementos en abscisas dibuja las columnas (o filas) de A en ordenadas frente al vector x en abscisas. Las dimensiones de A y x deben ser coherentes: si la plot(x,A) matriz A es cuadrada se dibujan las columnas, pero si no lo es y la dimensión de las filas coincide con la de x, se dibujan las filas análogo al anterior, pero dibujando las columnas (o filas) de A en plot(A,x) abscisas, frente al valor de x en ordenadas dibuja las columnas de B en ordenadas frente a las columnas de A en plot(A,B) abscisas, dos a dos. Las dimensiones deben coincidir análogo al anterior para cada par de matrices. Las dimensiones de plot(A,B,C,D) cada par deben coincidir, aunque pueden ser diferentes de las dimensiones de los demás pares plot(A) Se puede obtener una excelente y breve descripción de la función plot() con el comando help plot o helpwin plot. La descripción que se acaba de presentar se completará en la siguiente sección, en donde se verá cómo elegir los colores y los tipos de línea. b.ESTILOS DE LÍNEA Y MARCADORES EN LA FUNCIÓN PLOT En la sección anterior se ha visto cómo la tarea fundamental de la función plot() era dibujar los valores de un vector en ordenadas, frente a los valores de otro vector en abscisas. En el caso general esto exige que se pasen como argumentos un par de vectores. En realidad, el conjunto básico de argumentos de esta función es una tripleta formada por dos vectores y una cadena de 1, 2 ó 3 caracteres que indica el color y el tipo de línea o de marker. En la tabla siguiente se pueden observar las distintas posibilidades. Cuando hay que dibujar varias líneas, por defecto se van cogiendo sucesivamente los colores de la tabla comenzando por el azul, hacia arriba, y cuando se terminan se vuelve a empezar otra vez por el azul. Si el fondo es blanco, este color no se utiliza para las líneas. 33 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB c.AÑADIR LÍNEAS A UN GRÁFICO YA EXISTENTE Existe la posibilidad de añadir líneas a un gráfico ya existente, sin destruirlo o sin abrir una nueva ventana. Se utilizan para ello los comandos hold on y hold off. El primero de ellos hace que los gráficos sucesivos respeten los que ya se han dibujado en la figura (es posible que haya que modificar la escala de los ejes); el comando hold off deshace el efecto de hold on. El siguiente ejemplo muestra cómo se añaden las gráficas de x2 y x3 a la gráfica de x previamente creada (cada una con un tipo de línea diferente): » » » » » plot(x) hold on plot(x2,'--') plot(x3,'-.') hold off d.COMANDO SUBPLOT Una ventana gráfica se puede dividir en m particiones horizontales y n verticales, con objeto de representar múltiples gráficos en ella. Cada una de estas subventanas tiene sus propios ejes, aunque otras propiedades son comunes a toda la figura. La forma general de este comando es: subplot(m,n,i) donde m y n son el número de subdivisiones en filas y columnas, e i es la subdivisión que se convierte en activa. Las subdivisiones se numeran consecutivamente empezando por las de la primera fila, siguiendo por las de la segunda, etc. Por ejemplo, la siguiente secuencia de comandos genera cuatro gráficos en la misma ventana: » » » » » y=sin(x); z=cos(x); w=exp(-x*.1).*y; v=y.*z; subplot(2,2,1), plot(x,y) subplot(2,2,2), plot(x,z) subplot(2,2,3), plot(x,w) subplot(2,2,4), plot(x,v) Se puede practicar con este ejemplo añadiendo títulos a cada subplot, así como rótulos para los ejes. Se puede intentar también cambiar los tipos de línea. Para volver a la opción por defecto basta teclear el comando: » subplot(1,1,1) e.CONTROL DE LOS EJES También en este punto MATLAB tiene sus opciones por defecto, que en algunas ocasiones puede interesar cambiar. El comando básico es el comando axis. Por defecto, MATLAB ajusta la escala de cada uno de los ejes de modo que varíe entre el mínimo y el máximo valor de los vectores a representar. Este es el llamado modo "auto", o modo automático. Para definir de modo explícito los valores máximo y mínimo según cada eje, se utiliza el comando: axis([xmin, xmax, ymin, ymax]) mientras que : axis('auto') devuelve el escalado de los ejes al valor por defecto o automático. Otros posibles usos de este comando son los siguientes: 34 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Comando Descripción devuelve un vector v con los valores [xmin, xmax, v=axis ymin, ymax] mantiene los ejes en sus actuales valores, de cara a axis(axis) posibles nuevas gráficas añadidas con hold on utiliza ejes de pantalla, con el origen en la axis('ij') esquina superior izda. y el eje j en dirección vertical descendente utiliza ejes cartesianos normales, con el origen en axis('xy') la esquina inferior izda. y el eje y vertical ascendente axis('equal') el escalado es igual en ambos ejes axis('square') la ventana será cuadrada la ventana tendrá las proporciones de la imagen que se desea representar en ella (por ejemplo la de una axis('image') imagen bitmap que se desee importar) y el escalado de los ejes será coherente con dicha imagen elimina las restricciones introducidas por 'equal' y axis('normal') 'square' axis('off') elimina las etiquetas, los números y los ejes axis('on') restituye las etiquetas, los números y los ejes i j y x f.FUNCIÓN LINE() La función line() permite dibujar una o más líneas que unen los puntos cuyas coordenadas se pasan como argumentos. Permite además especificar el color, grosor, tipo de trazo, marcador, etc. Es una función de más bajo nivel que la función plot(), pero ofrece una mayor flexibilidad. En su versión más básica, para dibujar un segmento de color verde entre dos puntos, esta función se llamaría de la siguiente manera: line([xini, xend]', [yini, yend]', 'color', 'g') Se puede también dibujar dos líneas a la vez utilizando la forma: line([xini1 xini2; xend1 xend2], ([yini1 yini2; yend1 yend2]); Finalmente, si cada columna de la matriz X contiene la coordenada x inicial y final de un punto, y lo mismo las columnas de la matriz Y con las coordenadas y, la siguiente sentencia dibuja tantas líneas como columnas tengan las matrices X e Y: line([X], [Y]); Se pueden controlar las características parámetro/valor, como por ejemplo: de la línea por medio de pares line(x,y,'Color','r','LineWidth',4,'MarkerSize',12,'LineStyle','—','Marker','*') g.CONTROL DE VENTANAS GRÁFICAS: FUNCIÓN FIGURE Si se llama a la función figure sin argumentos, se crea una nueva ventana gráfica con el número consecutivo que le corresponda. El valor de retorno es dicho número. Por otra parte, el comando figure(n) hace que la ventana n pase a ser la ventana o figura activa. Si dicha ventana no existe, se crea una nueva ventana con el número consecutivo que le corresponda (que se puede obtener como valor de retorno del 35 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB comando). La función close cierra la figura activa, mientras que close(n) cierra la ventana o figura número n. El comando clf elimina el contenido de la figura activa, es decir, la deja abierta pero vacía. La función gcf devuelve el número de la figura activa en ese momento. El comando figure(gcf) (get current figure) permite hacer visible la ventana de gráficos desde la ventana de comandos. » » » » » » » » » » » » x=[-4*pi:pi/20:4*pi]; plot(x,sin(x),'r',x,cos(x),'g') title('Función seno(x) -en rojo- y función coseno(x) -en verde-') xlabel('ángulo en radianes'), figure(gcf) ylabel('valor de la función trigonométrica'), figure(gcf) axis([-12,12,-1.5,1.5]), figure(gcf) axis('equal'), figure(gcf) axis('normal'), figure(gcf) axis('square'), figure(gcf) axis('off'), figure(gcf) axis('on'), figure(gcf) axis('on'), grid, figure(gcf) 22. Otras funciones gráficas 2-D Existen otras funciones gráficas bidimensionales orientadas a generar otro tipo de gráficos distintos de los que produce la función plot() y sus análogas. Algunas de estas funciones son las siguientes (para más información sobre cada una de ellas en particular, utilizar help nombre_función): COMANDO bar() barh() bar3() bar3h() pie() pie3() area() stairs() errorbar() compass() feather() hist() rose() quiver() RESULTADO crea diagramas de barras diagramas de barras horizontales diagramas de barras con aspecto 3-D diagramas de barras horizontales con aspecto 3-D gráficos con forma de “tarta” gráficos con forma de “tarta” y aspecto 3-D similar plot(), pero rellenando en ordenadas de 0 a y función análoga a bar() sin líneas internas representa sobre una gráfica –mediante barras– valores de errores dibuja los elementos de un vector complejo como un conjunto de vectores partiendo de un origen común dibuja los elementos de un vector complejo como un conjunto de vectores partiendo de orígenes uniformemente espaciados sobre el eje de abscisas dibuja histogramas de un vector histograma de ángulos (en radianes) dibujo de campos vectoriales como conjunto de vectores A modo de ejemplo, genérese un vector de valores aleatorios entre 0 y 10, y ejecútense los siguientes comandos: » » » » » x=[rand(1,100)*10]; plot(x) bar(x) stairs(x) hist(x) 36 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB » hist(x,20) » alfa=(rand(1,20)-0.5)*2*pi; » rose(alfa) 23. FUNCIÓN FPLOT La función plot vista anteriormente dibuja vectores. Si se quiere dibujar una función, antes de ser pasada a plot debe ser convertida en un vector de valores. Esto tiene algunos inconvenientes, por ejemplo, el que "a priori" es difícil predecir en que zonas la función varía más rápidamente y habría por ello que reducir el espaciado entre los valores en el eje de abscisas. La función fplot admite como argumento un nombre de función o un nombre de fichero *.m en el cual esté definida una función de usuario. La función puede ser escalar (un único resultado por cada valor de x) o vectorial. La forma general de esta función es la siguiente: fplot('funcion', limites, 'cadena', tol) donde 'funcion' representa el nombre de la función o del fichero *.m entre apóstrofos (pasado como cadena de caracteres), limites es un vector de 2 ó 4 elementos que puede tomar los valores [xmin,xmax] o [xmin,xmax,ymin,ymax], 'cadena' tiene el mismo significado que en plot y permite controlar el color, los markers y el tipo de línea. tol es la tolerancia de error relativo. El valor por defecto es 2e-03. El máximo número de valores en x es (1/tol)+1 Esta función puede utilizarse también en la forma: [x,y]=fplot('funcion', limites, 'cadena', tol) y en este caso se devuelven los vectores x e y, pero no se dibuja nada. El gráfico puede obtenerse con un comando posterior por medio de la función plot. Véase un ejemplo de utilización de esta función. Se comienza creando un fichero llamado mifunc.m en el directorio G:\matlab que contenga las líneas siguientes: function y = mifunc(x) y(:,1)=200*sin(x)./x; y(:,2)=x.^2; y a continuación se ejecuta el comando: » fplot('mifunc(x)', [-20 20], 'g') Obsérvese que la función mifunc devuelve una matriz con dos columnas, que constituyen las dos gráficas dibujadas. En este caso se ha utilizado para ellas el color verde. 24. FUNCIÓN FILL PARA POLÍGONOS Ésta es una función especial para dibujar polígonos planos, rellenándolos de un determinado color. La forma general es la siguiente: » fill(x,y,c) que dibuja un polígono definido por los vectores x e y, rellenándolo con el color especificado por c. Si es necesario, el polígono se cierra uniendo el último vértice con el primero. Respecto al color: 37 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Si c es un carácter de color ('r','g','b','c','m','y','w','k'), o un vector de valores [r g b], el polígono se rellena de modo uniforme con el color especificado. Si c es un vector de la misma dimensión que x e y, sus elementos trasforman de acuerdo con un mapa de colores determinado, y el llenado polígono –no uniforme en este caso– se obtiene interpolando entre colores de los vértices. Sobre este tema de los colores, se volverá adelante con un cierto detenimiento. se del los más Este comando puede utilizarse también con matrices: » fill(A,B,C) Donde A y B son matrices del mismo tamaño. En este caso se dibuja un polígono por cada par de columnas de dichas matrices. C puede ser un vector fila de colores uniformes para cada polígono, o una matriz del mismo tamaño que las anteriores para obtener colores de relleno por interpolación. Si una de las dos, o A o B, son un vector en vez de una matriz, se supone que ese vector se repite tantas veces como sea necesario para dibujar tantos polígonos como columnas tiene la matriz. Considérese un ejemplo sencillo de esta función: » x=[1 5 4 2]; y=[1 0 4 3]; » fill(x,y,'r') » colormap(gray), fill(x,y,[1 0.5 0.8 0.7]) 25. ENTRADA DE PUNTOS CON EL RATÓN Se realiza mediante la función ginput, que permite introducir las coordenadas del punto sobre el que está el cursor, al clicar (o al pulsar una tecla). Algunas formas de utilizar esta función son las siguientes: [x,y] = ginput lee un número indefinido de puntos –cada vez que se clica o se pulsa una tecla cualquiera– hasta que se termina pulsando la tecla intro [x,y] = lee las coordenadas de n puntos ginput(n) [x,y,bot] = igual que el anterior, pero devuelve también un vector de enteros ginput bot con el código ASCII de la tecla pulsada o el número del botón del ratón (1, 2, ...) con el que se ha clicado Como ejemplo de utilización de este comando, ejecútense las instrucciones siguientes en la ventana de comandos de MATLAB para introducir un cuadrilátero arbitrario y dibujarlo de dos formas: » clf, [x,y]=ginput(4); » figure(gcf), plot(x,y,'w'), pause(5), fill(x,y,'r') Donde se ha introducido el comando pause(5) que espera 5 segundos antes de pasar a ejecutar el siguiente comando. Este comando admite como argumento un tiempo con precisión de centésimas de segundo. 26. GRAFICOS 2D Y 3D Ya hemos venido realizando gráficos en 2D como lo son las respuestas de los ejercicios anteriores, ahora vamos a dibujar gráficos en 3D. 38 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Supongamos que superficie: Esto lo hacemos instrucciones: queremos con la dibujar la secuencia de »x=-5:.4:5; »y=x; »[X,Y]=meshgrid(x,y); »Z=X.^2.*exp(-Y.^2); » surf(X,Y,Z) Las primeras dos instrucciones dividen los ejes de “x” y “y” en subintervalos de largo 0.4; la tercera instrucción genera una rejilla en el conjunto [5,5]x[-5,5] con cuadraditos de lados 0.4. La cuarta instrucción evalúa la función en los puntos de la rejilla, y finalmente trazamos la superficie con surf. Para crear un fichero llamado sombrero procedemos de la siguiente forma: >> w=sin(r)./r; >> mesh(w) >> u=-8:0.5:8; >> v=u; >> [u,v]=meshgrid(u,v); >> r=sqrt(u.^2+v.^2)+eps; >> w=sin(r)./r; >> mesh(w) si ingresamos el comando surf(w), nos muestra la misma grafica pero en vez de líneas aparece ahora una superficie faceteada 39 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 27. Graficas de curvas dadas en coordenadas polares y parametricas. En muchos casos se hace necesario realizar graficas en forma Parametrica para lo cual lo único que debemos hacer es parametrizar la curva correspondiente como ilustra el ejemplo siguiente. Dada la curva definida en forma Parametrica por: t=0:0.1:10; x=2*cos(t)-cos(2*t); y=2*sin(t)-sin(2*t); plot(x,y,'r') Obtenemos las siguiente salida: Para realizar graficas en coordenadas polares Matlab cuenta con los siguientes comandos: polar(a,r) : Representa la curva en coordenadas polares polar(a,r,S): Representa la curva en coordenadas polares con el estilo de líneas especificado por S. veamos algunos Ejemplos: a=0:0.01:2*pi; r=sin(2*a).*cos(2*a); polar(a,r) a=0:0.01:2*pi; r=4*(1+cos(a)); polar(a,r) 28. Comandos básicos de programación a. COMO HACER UN PROGRAMA EN MATLAB (GENERALIDADES) Es posible realizar un programa en Matlab tal como se hace en otros lenguajes como el basic, pascal o el lenguaje C. Es necesario utilizar un editor para escribir el código. Para cargar un editor, se puede hacer desde la ventana options, escogiendo editor preferente, y cargando el editor que se desee utilizar. Para escribir código, requerimos crear un archivo *.M. Para esto necesitamos abrir new M.file en la ventana file. Ahora escribimos el código y salvamos el archivo utilizando la terminación archivo.M. Se puede correr el programa desde Matlab simplemente escribiendo el nombre del archivo que fue creado. Es posible abrir programas con la terminación *.M desde Matlab, en el menú file, open M.file. 40 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB b. PROGRAMACIÓN DE MATLAB Como ya se ha dicho varias veces –incluso con algún ejemplo– MATLAB es una aplicación que se puede programar muy fácilmente. De todas formas, como lenguaje de programación pronto verá que no tiene tantas posibilidades como otros lenguajes (ni tan complicadas...). Se comenzará viendo las bifurcaciones y bucles, y la lectura y escritura interactiva de variables, que son los elementos básicos de cualquier programa de una cierta complejidad. c. BIFURCACIONES Y BUCLES Se van a introducir aquí los primeros conceptos de programación. MATLAB posee un lenguaje de programación que –como cualquier otro lenguaje– dispone de sentencias para realizar bifurcaciones y bucles. Las bifurcaciones permiten realizar una u otra operación según se cumpla o no una determinada condición. La Figura 12 muestra tres posibles formas de bifurcación. Los bucles permiten repetir las mismas o análogas operaciones sobre datos distintos. Mientras que en C/C++/Java el "cuerpo" de estas sentencias se determinaba mediante llaves {...}, en MATLAB se utiliza la palabra end con análoga finalidad. Existen también algunas otras diferencias de sintaxis. La Figura 13 muestra dos posibles formas de bucle, con el control situado al principio o al final del mismo. Si el control está situado al comienzo del bucle es posible que las sentencias no se ejecuten ninguna vez, por no haberse cumplido la condición cuando se llega al bucle. Sin embargo, si la condición está al final del bucle las sentencias se ejecutarán por lo menos una vez, aunque la condición no se cumpla. Muchos lenguajes de programación disponen de bucles con control al principio (for y while en C/C++/Java) y al final (do … 41 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB while en C/C++/Java). En MATLAB no hay bucles con control al final del bucle, es decir, no existe la construcción análoga a do ... while. Las bifurcaciones y bucles no sólo son útiles en la preparación de programas o de ficheros *.m. También se aplican con frecuencia en el uso interactivo de MATLAB, como se verá más adelante en algunos ejemplos. Para la estructura de programación en MATLAB se requiere conocer por lo menos los siguientes comandos: d. Comando END Determina hasta cual orden llega el efecto ejemplos de su uso ver if, while y for) e. Comando IF de if, for, y while. (Para Verifica si se cumple cierta condición, y de acuerdo a si se cumple o no realiza la acción que se desee. La sintaxis de la orden es: if (condición), (ordenes 1) [else, (ordenes 2)] end; Donde las ordenes entre [ ] son opcionales. (ordenes 1) son las ordenes que se realizarán si (condición) se cumple. (ordenes 2) son las ordenes que se realizarán si (condición) NO se cumple. (condición) Puede ser: a == b (verifica si a es igual a b) a < b (verifica si a es menor que b) a > b (verifica si a es mayor que b) a <= b (verifica si a es menor o igual que b) a >= b (verifica si a es menor o igual que b) a ~= b (verifica que a y b sean diferentes) El siguiente ejemplo ilustra el uso de if: %Ejemplo de uso de if. n=0; if n==0, n % al escribir una expresión sin punto y coma final, MATLAB escribe % su resultado en pantalla. else, n = 1 end; 42 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB n = 2; if n == 0, n else, n =1 end; La salida que se obtiene con el programa anterior es la siguiente: n = 0 n = 1 Donde el 0 (cero) proviene de entrar al primer if, y el 1 (uno), de entrar al else del segundo if. f. Comando WHILE Realiza una parte del programa mientras se cumpla alguna condición. La sintaxis de la orden es: while (condición), (ordenes) end; (ordenes) son las ordenes que se realizarán mientras (condición) se cumpla. (condición) Puede ser: a == b (verifica si a es igual a b) a < b (verifica que si a es menor que b) a > b (verifica que si a es mayor que b) a <= b (verifica si a es menor o igual que b) a >= b (verifica que si a es mayor o igual que b) a ~= b (verifica que a y b sean diferentes) El siguiente ejemplo ilustra el uso de while: %Ejemplo de uso de while. n=0; while n<=5, n %Al escribir el nombre de la variable (sin punto y coma) MATLAB % imprime su valor. n = n + 1; de n. 43 %El punto y coma evita que MATLAB imprima el nuevo valor Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB end; La salida que se obtiene al correr el programa anterior es: n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 g. Comando FOR Muy parecido al While, pero utiliza un contador, es útil si se quiere repetir una parte del programa un número. determinado de veces. La sintaxis de la orden es: for (contador), (ordenes) end; (ordenes) son las ordenes que se realizarán (contador) llega a su valor final. (contador) Es de la forma: variable = a [ , b ] : c Donde: variable es el contador en sí. a es el valor inicial del contador (variable). b es el segundo valor del contador (opcional, si se omite, b=a+1), su función es determinar el incremento del contador. c es el valor final del contador (variable). El siguiente ejemplo ilustra el uso de for: % Ejemplo de uso de for. for i=0,0.5:2.5, i %al escribir el nombre de una variable (sin punto y coma) %MATLAB muestra su valor. end; La salida del programa anterior es la siguiente: i = 44 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 0 i = 0.5 i = 1 i = 1.5 i = 2 i = 2.5 h. Comando PLOT Sirve para obtener resultados gráficos en 2D. La sintaxis de la orden es: plot(x, y); x es el vector que contiene los valores de x. y es el vector que contiene los valores de y, tal que el valor de y en la posición uno del vector corresponde al primer valor del vector x. La gráfica se realiza uniendo una serie de rectas entre los puntos incluidos en los vectores X y Y. Si las curvas quedan muy mal hechas (se notan las rectas) puede ser necesario disminuir el paso de los vectores (y aumentar el número de puntos. Para claridad, puede ser necesario leer la parte correspondiente a vectores a la orden FOR. El siguiente ejemplo ilustra el uso de plot: % Ejemplo de uso de plot. for i =1:101, x(i) = (i-1) /100; y(i)=x(i) ˆ3 - 1; % Organiza en vectores la función y=x^3 - 1 end; plot(x, y); pause; %pausa el computador hasta que se presione una teclaesta orden es necesaria cuando se hace más de una gráfica, para poder ver cada una por separado. Ya que MATLAB las dibuja en la misma ventana siempre. (a menos que se use el comando FIGURE). Al correr el programa se obtiene la gráfica de la curva y=x3 -1 (para 0<=x<=1). La gráfica aparecerá en una ventana aparte llamada Figure 1, y la recta se verá asi: Otro ejemplo, para la gráfica de y = sin(t) en el intervalo t = 0 a t = 10; donde debemos hacer lo siguiente: 45 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB >> t = 0:.3:10; >> y = sin(t); >> plot( t , y) Aquí el resultado gráfico: El comando t = 0: .3 :10; define el vector entre los componentes desde 0 a 10 incrementados de 0.3. La expresión y = sin(t); va a definir los valores de los componentes que son: sin(0), sin(0.3), sin(0.6), etc. Finalmente, plot(t,y) usa el vector de t y los valores de y para la construcción del gráfico. i. Funciones de dos variables Vamos a elaborar la gráfica de la función z(x,y) = x exp( - x^2 - y^2): >> [x,y] = meshdom(-2:.2:2, -2:.2:2); >> z = x .* exp(-x.^2 - y.^2); >> mesh(z) El primer comando crea una matriz para hacer la entrada de los puntos en el espacio cuadrado de -2 <= x <= 2, -2 <= y <= 2. Los cuadrados pequeños que constituyen la reja son de 0.2 unidades ancho y 0.2 unidades de alto. La segunda orden crea una matriz cuyas entradas son los valores de la función z(x,y) a los puntos de la reja. La tercera orden usa esta información para construir el gráfico. j. Comando DISP Sirve para escribir texto de salida o vectores. de resultados. La sintaxis de la orden es: disp(X); X Puede ser: Un vector. Una matriz. Una cadena de texto. El siguiente ejemplo ilustra el uso de disp: %Ejemplo de uso de disp. a = [1, 2, 3, 4, 9 11]; % Un vector disp(a); a = [1, 2 , 7 ; 6, 3, 4]; % Una matriz disp(a); 46 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB a = ˆTexto se puede escribir así ˆ; % Cadena de texto disp(a); disp( ˆ También se puede escribir así.’ ); La salida del programa anterior será: 1 2 3 1 2 7 6 3 4 4 9 11 Texto se puede escribir así También se puede escribir así. k. Comando INPUT Se utiliza ejecuta. para que el programa pida valores de variables mientras se La sintaxis de la orden es: variable = input ( texto ); variable es un nombre válido de variable, en la que se quiere almacenar el valor que se pregunta.texto puede ser una variable o, Una cadena. El siguiente ejemplo ilustra el uso de input: %Ejemplo de uso de input. a = 0; % hace válido el nombre de variable a. a = input( ˆ Teclee el valor de a: ˆ); tex = ˆ Cual es el nuevo valor de a? ˆ; a % Al escribir el nombre de una variable (sin punto y coma al final) % MATLAB muestra su valor. a = input(tex); a La salida de este programa será: Teclee el valor de a: (espera) a = 47 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB xxx % aquí se imprime el valor asignado para a. Cual es el nuevo valor de a? (espera) a = yyy Donde xxx y yyy son valores introducidos por el usuario en el momento de correr el programa. 29. FICHEROS *.M Los ficheros con extensión (.m) son ficheros de texto sin formato (ficheros ASCII) que constituyen el centro de la programación en MATLAB. Ya se han utilizado en varias ocasiones. Estos ficheros se crean y modifican con un editor de textos cualquiera. En el caso de MATLAB 5.3 ejecutado en un PC bajo Windows, lo más sencillo es utilizar su propio editor de textos. Existen dos tipos de ficheros *.m, los ficheros de comandos (llamados scripts en inglés) y las funciones. Los primeros contienen simplemente un conjunto de comandos que se ejecutan sucesivamente cuando se teclea el nombre del fichero en la línea de comandos de MATLAB. Un fichero de comandos puede llamar a otros ficheros de comandos. Si un fichero de comandos se llama desde de la línea de comandos de MATLAB, las variables que crea pertenecen al espacio de trabajo base de MATLAB (recordar Apartado 1.4.4), y permanecen en él cuando se termina la ejecución de dicho fichero. Las funciones MATLAB, con su permiten definir funciones enteramente análogas a las de nombre, sus argumentos y sus valores de retorno. Los ficheros *.m que definen funciones permiten extender las posibilidades de MATLAB; de hecho existen bibliotecas de ficheros *.m que se venden (toolkits) o se distribuyen gratuitamente (a través de Internet). Las funciones definidas en ficheros *.m se caracterizan porque la primera línea (que no sea un comentario) comienza por la palabra function, seguida por los valores de retorno (entre corchetes [ ] y separados por comas, si hay más de uno), el signo igual (=) y el nombre de la función, seguido de los argumentos (entre paréntesis y separados por comas). Recuérdese que un fichero *.m puede llamar a otros ficheros *.m, e incluso puede llamarse a sí mismo de forma recursiva. Los ficheros de comandos se pueden llamar también desde funciones, en cuyo caso las variables que se crean pertenecen a espacio de trabajo de la función. El espacio de trabajo de una función es independiente del espacio de trabajo base y del espacio de trabajo de las demás funciones. Esto implica por ejemplo que no puede haber colisiones entre nombres de variables: aunque varias funciones tengan una variable llamada A, en realidad se trata de variables completamente distintas (a no ser que A haya sido declarada como variable global). A continuación se verá con un poco más de detalle ambos tipos de ficheros *.m. 30. FICHEROS DE COMANDOS (SCRIPTS) Como ya se ha dicho, los ficheros de comandos o scripts son ficheros con un nombre tal como file1.m que contienen una sucesión de comandos análoga a la 48 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB que se teclearía en el uso interactivo del programa. Dichos comandos se ejecutan sucesivamente cuando se teclea el nombre del fichero que los contiene (sin la extensión), es decir cuando se teclea file1 con el ejemplo considerado. Cuando se ejecuta desde la línea de comandos, las variables creadas por file1 pertenecen al espacio de trabajo base de MATLAB. Por el contrario, si se ejecuta desde una función, las variables que crea pertenecen al espacio de trabajo de la función. En los ficheros de comandos conviene poner los puntos y coma (;) al final de cada sentencia, para evitar una salida de resultados demasiado cuantiosa. Un fichero *.m puede llamar a otros ficheros *.m, e incluso se puede llamar a sí mismo de modo recursivo. 31. RECOMENDACIONES GENERALES DE PROGRAMACIÓN Las funciones vectoriales de MATLAB son mucho más rápidas que sus contrapartidas escalares. En la medida de lo posible es muy interesante vectorizar los algoritmos de cálculo, es decir, realizarlos con vectores y matrices, y no con variables escalares dentro de bucles. Aunque los vectores y matrices pueden ir creciendo a medida que se necesita, es mucho más rápido reservarles toda la memoria necesaria al comienzo del programa. Se puede utilizar para ello la función zeros. Además de este modo la memoria reservada es contigua. Es importante utilizar el profile para conocer en qué sentencias de cada función se gasta la mayor parte del tiempo de cálculo. De esta forma se descubren “cuellos de botella” y se pueden desarrollar aplicaciones mucho más eficientes. Conviene desarrollar los programas incrementalmente, comprobando cada función o componente que se añade. De esta forma siempre se construye sobre algo que ya ha sido comprobado y que funciona: si aparece algún error, lo más probable es que se deba a lo último que se ha añadido, y de esta manera la búsqueda de errores está acotada y es mucho más sencilla. Recuérdese que de ordinario el tiempo de corrección de errores en un programa puede ser 4 ó 5 veces superior al tiempo de programación. El debugger es una herramienta muy útil a la hora de acortar ese tiempo de puesta a punto. En este mismo sentido, puede decirse que pensar bien las cosas al programar (sobre una hoja de papel en blanco, mejor que sobre la pantalla del PC) siempre es rentable, porque se disminuye más que proporcionalmente el tiempo de depuración y eliminación de errores. Otro objetivo de la programación debe ser mantener el código lo más sencillo y ordenado posible. Al pensar en cómo hacer un programa o en cómo realizar determinada tarea es conveniente pensar siempre primero en la solución más sencilla, y luego plantearse otras cuestiones como la eficiencia. Finalmente, el código debe ser escrito de una manera clara y ordenada, introduciendo comentarios, utilizando líneas en blanco para separar las distintas partes del programa, sangrando las líneas para ver claramente el rango de las bifurcaciones y bucles, utilizando nombres de variables que recuerden al significado de la magnitud física correspondientes, etc. En cualquier caso, la mejor forma (y la única) de aprender a programar es programando. 49 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Capitulo II: ANÁLISIS Y CONTROL DE SISTEMAS USANDO MATLAB 1.Introducción En lo que sigue, se va a realizar una introducción a los comandos de matlab relacionados con la teoría de control de sistemas. Casi todas las funciones que se describen pertenecen al Control System Toolbox. Las funciones principales se van a explicar sobre ejemplos demostrativos, con el fin de que su uso y comprensión sean lo mas sencillos posible. Se realizarían ejemplos tanto en el dominio temporal, continuo y discreto, como en el frecuencial. También se mostrara la forma de dar la descripción de un sistema lineal mediante función de transferencia, conjunto de polos y ceros, o variables de estado. Asimismo se comentara la forma de manipular una función de transferencia como un objeto. 2.Tratamiento mediante funciones de transferencia. (Sistemas continuos) Este apartado muestra el uso de algunas de las herramientas con las que cuenta matlab para el diseño y análisis de sistemas de control. Para el ejemplo se va a partir de una descripción de la planta en forma de función de transferencia: En matlab las funciones de transferencia se introducen dando el par de polinomios numerador denominador: num = [.2 .3 1]; den1 = [1 .4 1]; den2 = [1 .5]; El polinomio del denominador es el producto de dos términos. Para obtener el polinomio resultante se usa el producto de convolución (o de polinomios). den = conv(den1,den2) Para ver los polos (o los ceros) de la función de transferencia, podemos usar: roots(den) (roots(num)). Una forma mas completa de convertir una función de transferencia dada por dos polinomios numerador y denominador, en un conjunto de factores de grado 1, correspondientes a los polos (z1, z2, z3) y ceros (c1, c2), de la forma: 50 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB es mediante el comando tf2zp: [ceros ,polos ,gan] = tf2zp (N,D); que devuelve un vector conteniendo los ceros de la función de transferencia, un vector conteniendo los polos, y un escalar correspondiente a la ganancia estática. La función complementaria a ésta también existe: [N,D] = zp2tf (ceros,polos,gan); Como curiosidad, cabe mencionar que el nombre de estas funciones es bastante descriptivo: ”tf-two-zp” procede de transfer-function to zero-pole form. 2.1. Dominio Temporal La respuesta ante un escalón a la entrada se puede analizar en sistemas que tengan una descripción en forma de función de transferencia o una representación en el espacio de estados, generando un vector de tiempos y usando la función step: t = [0:.3:15]’; y = step(num,den,t); plot (t,y); title (’Respuesta a un escalón unitario’); xlabel (’tiempo(seg)’); grid; La respuesta al escalón unitario puede verse en la Fig. 1.1. Seleccionando con el ratón en la curva, pueden modificarse algunos atributos de la misma. También pueden modificarse las propiedades de los ejes de forma análoga. Las figuras guardarse en ficheros .Fig. propios de matlab, o exportarse en diferentes formatos gráficos estándar. No es necesario recuperar el resultado de la simulación ante escalón que realiza step para después representarlo con plot, sino que el propio comando step, si lo utilizamos sin parámetros de salida, realiza la representación. Es mías, en este segundo caso, la representación grafica es algo mías interactiva, puesto que si ”pinchamos” con el botón izquierdo en algún punto de la grafica, nos dice los valores correspondientes al tiempo y al valor de la salida en ese punto. La respuesta impulsional se puede obtener del mismo modo, pero usando en este caso la función impulse, que tiene una 51 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB sintaxis similar al comando step. Nótese que el vector de tiempos ya ha sido definido con anterioridad. impulse (num,den,t); La respuesta al impulso puede verse en la Fig. 1.2. La respuesta del sistema a cualquier tipo de entrada también puede obtenerse. Para ello es necesario tener la señal de entrada en un vector u, que lógicamente deberá tener la misma dimensión que el vector de tiempos. En sistemas multivariables, en vez de un vector de entradas tendremos una matriz. A estos efectos se usa la función lsim. Un ejemplo característico es la respuesta a una entrada en rampa: ramp = t; y = lsim (num,den,ramp,t); plot (t,y,t,ramp); title (’Respuesta a una rampa’); xlabel (’tiempo(seg)’); La respuesta a la rampa puede verse en la Fig. 1.3. Otro ejemplo característico es la respuesta a un ruido uniforme aleatorio. Recordamos que rand(m,n) genera una matriz m×n de números aleatorios uniformemente distribuidos entre 0 y 1. Es importante darse cuenta del filtrado que se produce en la señal cuando pasa por el sistema (hace de filtro paso bajas). noise = rand (size(t)); y = lsim (num,den,noise,t); plot (t,y,t,noise); title (’Respuesta a un ruido aleatorio’); xlabel (’tiempo(seg)’); La respuesta al ruido puede verse en la Fig. 1.4. 2.2. Dominio Frecuencial Respuesta en frecuencia La respuesta en frecuencia de los sistemas se puede obtener usando las funciones bode, 52 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB nyquist y nichols. Si no se le ponen argumentos a la izquierda, estas funciones generan las gráficas por si solas. En caso contrario, vuelcan los datos en los vectores de salida oportunos. A continuación se presentan ejemplos de las tres posibles sintaxis de la función bode: 1.- bode(num,den) 2.- [mag,phase,w] = bode (num,den) 3.- [mag,phase] = bode (num,den,w) La primera de ellas produce un grafico con la magnitud en decibelios (dB) y la fase en grados. En las otras dos la magnitud se devuelve en el vector mag y esta expresada en unidades absolutas, no en dB. Por su parte, la fase, devuelta en el vector phase, sigue siendo en grados. En esta forma, la representación es mas interactiva, en el sentido de que ”pinchando” con el ratón en un punto de la curva, podemos ver los valores correspondientes. La segunda forma automáticamente genera los puntos de frecuencia en el vector w. En la tercera forma es el usuario el que escoge los rangos de frecuencia, y resulta muy adecuado cuando se quieren representar varias graficas conjuntamente, que habrán de compartir una misma escala frecuencial. El resultado de los dos últimos comandos se puede representar usando funciones conocidas: subplot(211), loglog(w,mag), title(’Magnitud’), xlabel(’rad/s’); subplot(212), semilogx(w,phase), title(’Fase’), xlabel(’rad/s’); El resultado para la función de transferencia del ejemplo anterior puede verse en la Fig. 1.5. Cabe comentar que el comando subplot(n,m,i) permite dividir una ventana grafica en una matriz de n × m sub-graficas, seleccionando como activa la numero i (numeradas consecutivamente de izquierda a derecha y de arriba abajo). El comando sintaxis: nyquist tiene la misma nyquist (num,den,w); [re,im] = nyquist (num,den,w); Computa las partes real e imaginaria de G(jw) y realiza la representación si no se le ponen parámetros de salida. Para obtener la representación grafica por nosotros mismos, sólo hay que dibujar la parte real frente a la imaginaria. El resultado obtenido mediante el ejemplo anterior puede verse en la Fig. 1.6. El comando nichols computa el diagrama de Nichols de un sistema a partir de la función de transferencia en bucle abierto. Para verlo basta dibujar la magnitud del bucle abierto en dB (en el eje de ordenadas) frente a fase del bucle abierto en grados (en eje de abscisas), o 53 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB llamar a la función sin argumento de salida. Si se quiere en forma de ábaco, se puede usar el comando ngrid. nichols (num,den,w), ngrid; [mag,phase] = nichols (num,den,w); Márgenes de estabilidad Como es bien sabido en la teoría clásica del control, los márgenes de estabilidad son el margen de fase y el margen de ganancia. Estos márgenes se calculan usando el comando margin. margin (num,den); [mg,mf,wmg,wmf] = margin (num,den); Como tercer parámetro de entrada se le puede pasar el rango de frecuencias deseado. En el primer caso indicado, en el que no se le especifican parámetros de salida, se realiza la representación del diagrama de Bode, junto con una indicación, mediante líneas verticales de los puntos donde se mide cada uno de los márgenes y los valores de los mismos. En la segunda variante, como salidas se obtienen los valores de los márgenes de ganancia (no en dB), el margen de fase (en grados) y sus correspondientes frecuencias. Si existen varias frecuencias de corte marca los mías desfavorables (ver Fig. 1.8). 54 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Efectos de los retardos Los retardos existen en numerosas aplicaciones de control automático. En sistemas lineales continuos invariantes en el tiempo, el retardo viene representado por e−sT . La forma mías sencilla de manipular los retardos en matlab es en el dominio de la frecuencia. Nótese que e−jwT = 1|−wT . Por tanto los retardos dejan la magnitud invariable y afectan al desfase, tendiendo a inestabilizar al sistema controlado. Para propósitos de representación mediante el comando bode, todo lo que habría que hacer es restar la fase del retardo a la de la función de transferencia. Por ejemplo: num = [0.2 0.3 1]; den = [1 0.9 1.2 0.5]; T = 1; % Tiempo de retardo puro w = logspace (-2,1,100)’; [mag,fase] = bode (num,den,w); faseDelay = fase - (T*w*180/pi); % Sustrae la fase tras convertirla a grados subplot(211); semilogx (w, 20*log10(mag)); grid; subplot(212); semilogx (w, [fase, faseDelay]); grid; 2.3. Comandos relacionados con operaciones de bloques Existen una serie de diagramas de bloques: comandos relacionados con las operaciones típicas en – [N12,D12] = series (N1,D1,N2,D2): Devuelve la resultante de colocar en serie dos Funciones de transferencia (Fig. 1.9). El mismo resultado podr´ıa obtenerse llamando dos veces al comando conv, que recuérdese permitía multiplicar dos polinomios. – [N12,D12] = parallel (N1,D1,N2,D2): Devuelve la resultante de colocar en paralelo dos funciones de transferencia (Fig. 1.10). – 55 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB – – – – [Nbc,Dbc] = feedback (N1,D1,N2,D2,-1): A partir de un sistema en bucle abierto, dado por el numerador y denominador N1,D1, proporciona el correspondiente en bucle cerrado, considerando que en la cadena de realimentación hay otra función de transferencia, dada por N2, D2 (Fig. 1.11). El ultimo parámetro indica el signo de la realimentación (−1 para realimentación negativa y 1 para positiva). – [Nbc,Dbc] = cloop (N1,D1,-1): En el caso en que se pretenda obtener la función de transferencia en bucle cerrado con realimentación unitaria, puede emplearse este comando mías compacto, en el que se evita tener que especificar una segunda función de transferencia. Conviene tener claro que para todos estos comandos relacionados con operaciones por bloques, se podría perfectamente estar trabajando con funciones de transferencia discretas, sin ninguna diferencia. Para operaciones de bloques más complejas, resulta más adecuado usar la herramienta simulink que también se explicarla en estas notas. Lugar de las raíces El análisis mediante el lugar de las raíces se puede obtener definiendo un vector de ganancias deseadas (que es el parámetro usado habitualmente para ver la evolución de los polos en bucle cerrado). Lá sintaxes ES: r = rlocus (N,D,K); rlocus (N,D); En la primera forma, calcula el lugar de las raíces de 1+KN(s) /D(s) = 0, para un vector de ganancias especificado, K. rlocus devuelve una matriz r con length(K) filas y length(den) columnas, conteniendo la localización de las raíces complejas. Cada fila de la matriz corresponde a una ganancia del vector K. El lugar de las raíces puede ser dibujado con plot(r,’x’). En la segunda forma, que es la usada habitualmente, la función directamente dibuja el lugar de las raíces. Además, como vemos, no es imprescindible indicar un vector de ganancias. Para la función de transferencia que veníamos utilizando en los ejemplos, se obtendría el lugar de las raíces mostrado en la Fig. 1.12 Un comando muy útil como complemento a rlocus es rlocfind, cuya sintaxis general es: [K,polos] = rlocfind (num,den) Antes de introducir dicho comando es necesario haber dibujado el lugar de las raíces. Al introducir rlocfind, se pide que se seleccione con el ratón un punto determinado del lugar, 56 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB proporcionando como resultado la ganancia K en dicho punto y la localización de los polos correspondientes a esa ganancia. Para mejorar la precisión, puede realizarse un zoom en torno a una zona de internes en la grafica, antes de ejecutar rlocfin. Otra utilidad para ver la sobre oscilación que correspondería a un par de polos complejos conjugados situados en el lugar, seria dibujar los lugares geométricos de factor de amortiguamiento (δ) y frecuencia natural (ωn) constantes, mediante el comando sgrid. Ejemplo: Los siguientes comandos dibujan el lugar de las raíces de una función de transferencia, realizando una conveniente ampliación y resaltando las líneas de factor de amortiguamiento 0.5, 0.6 , 0.7 y de frecuencia natural 0.5 rad/s (Fig. 1.13). N = 1; D = [1 3 2 0]; rlocus(N,D); sgrid ([0.5:0.1:0.7],0.5); axis([-2.5,1,-3,3]); Las nuevas versiones de matlab van más allá y ofrecen una herramienta interactiva para ir viendo en vivo las variaciones que sufre el lugar de las raíces, conforme se añaden, eliminan y mueven los polos y ceros de bucle abierto. A esta herramienta se accede mediante el comando rltool. Merece la pena que el alumno dedique unos minutos a esta herramienta de gran valor didáctico. 3.Estudio temporal y frecuencial de sistemas de primer y segundo orden 3.1. Sistemas de primer orden La representación en forma de función de transferencia viene dada por: que en notación matlab se introduce: K = tau num den 1; = 1; = K; = [tau 1]; La respuesta a un escalón unitario de entrada se obtiene con la función step. El resultado puede verse en la Fig. 1.14 t = [0:0.1:10]’; ye = step(num,den,t); plot(t,ye); title (’Respuesta a un escalón unitario’); xlabel (’tiempo(seg)’); grid; 57 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Las dos características fundamentales de un sistema de primer orden son su ganancia estática K y su constante de tiempo τ. La constante de tiempo es el tiempo que tarda en alcanzar el 63% de la salida. La ganancia estática es el cociente entre la amplitud de salida y la de entrada en el régimen permanente. Estos valores se pueden comprobar directamente en la grafica o analizando el vector de datos resultante: La respuesta a una rampa unitaria de entrada para nuestro sistema de primer orden se puede simular mediante: El resultado se muestra en la Fig. 1.15, en la que aparecen, tanto la rampa de entrada como la salida. El error de seguimiento en posición en régimen permanente puede obtenerse, al igual que se ha hecho anteriormente, midiendo directamente en la grafica o bien a partir del vector de datos resultante. La respuesta impulsión al se puede obtener del mismo modo, pero usando en este caso la función impulse (Fig. 1.16), que tiene una sintaxis similar al comando step. 58 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Para finalizar con la sección de sistemas de primer orden, se va a comprobar que los resultados coinciden con los esperados en la teoría. Como es bien sabido, los sistemas lineales de primer orden de ganancia unidad invariantes en el tiempo tienen las siguientes características (nos remitimos a la bibliografía): Respuesta a escalón unitario: ye2(t) = 1 − e(−t/τ), (t ≥ 0) Respuesta a rampa unitaria: yr2(t) = t − τ + τe(−t/τ), (t ≥ 0) Respuesta a impulso: yi2(t) = (1/τ)e(−t/τ), (t ≥ 0) Si se dibujan estas funciones con el vector de tiempos definido anteriormente, y se superponen con las graficas vistas anteriormente, puede apreciarse que coinciden perfectamente (Fig. 1.17). ye2 = 1 - exp(-t/tau); yr2 = t - tau + tau * exp(-t/tau); yi2 = (1/tau) * exp(-t/tau); plot (t,ye,t,ye2,’o’); title(’Respuesta teórica a escalón unitario’); grid; pause; plot (t,yr,t,ramp,t,yr2,’o’); title(’Respuesta teórica a rampa unitaria’); grid; pause; plot (t,yi,t,yi2,’o’); title (’Respuesta teórica a impulso’); grid; 3.2. Sistemas de segundo orden La representación normal de un sistema de segundo orden en forma de función de transferencia viene dada por: donde: K: ganancia estática del sistema. Se va a suponer en el análisis siguiente, sin perdida de generalidad, que K = 1. δ: Coeficiente de amortiguamiento. wn: Frecuencia natural no amortiguada del sistema. Del polinomio característico se tiene que las dos raíces son s1,2 = −δwn±wn√δ2 − 1, pudiendo distinguirse los siguientes casos: 59 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Caso 1: Si δ > 1 → 2 raíces reales distintas en SPI (sobré amortiguado). Caso 2: Si δ = 1 → 2 raíces reales iguales en SPI (limite sobre-sub), sistema críticamente amortiguado. Caso 3: Si 0 < δ < 1 → raíces complejas conjugadas en SPI (subamortiguado) Caso 4: Si δ = 0 → Respuesta oscilatoria. Sistema críticamente estable. Raíces en eje imaginario. Caso 5: Si δ < 0 → Sistema inestable, raíces en SPD. Se va a analizar el comportamiento para el conjunto de valores de δ en la respuesta a un escalón unitario. Se supone wn = 1. Dado que el caso 3 se verá con mas detalle, dado su mayor interés, se presentara en ultimo lugar. Primer caso: 2 raíces reales distintas (Fig. 1.18). t = [0:0.2:20]’; wn = 1; d = 2; num = [wn^2]; den = [1,2*d*wn,wn^2]; ye = step (num,den,t); plot (t,ye); title (’Respuesta a un escalón unitario’); xlabel (’tiempo(seg)’); grid; Segundo caso: 2 raíces reales iguales (críticamente amortiguado) (Fig. 1.19). El sistema, en este caso es lo mas rápido posible, antes de hacerse subamortiguado. d = 1; den = [1,2*d*wn,wn^2]; ye = step (num,den,t); plot (t,ye); title (’Respuesta a un escalón unitario’); xlabel (’tiempo(seg)’); grid; 60 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Cuarto caso: Sistema en punto critico de oscilación (Fig. 1.20). d = 0; den = [1,2*d*wn,wn^2]; ye = step (num,den,t); plot (t,ye); title (’Respuesta a un escalon unitario’); xlabel (’tiempo(seg)’); grid; Quinto caso: Sistema inestable (Fig. 1.21). d = -0.1; den = [1,2*d*wn,wn^2]; ye = step (num,den,t); plot(t,ye); title (’Respuesta a un escalon unitario’); xlabel (’tiempo(seg)’); grid; 61 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Tercer caso: Dos raises complejas conjugadas (Fig. 1.22). d = 0.5; den = [1,2*d*wn,wn^2]; ye = step (num,den,t); plot (t,ye); title (’Respuesta a un escalón unitario’); xlabel (’tiempo(seg)’); grid; Se puede también analizar para este tercer caso de dos raíces complejas el efecto de modificar el factor de amortiguamiento. Se muestra para valores δ = {0.1, 0.2, ...0.9} (Fig. 1.23). t = [0:0.2:20]’; wn = 1; vectDelta = [0.1:0.1:0.9]; num = wn^2; Y = []; for ind = 1:length(vectDelta) d = vectDelta(ind); den = [1,2*d*wn,wn^2]; y = step (num,den,t); Y = [Y, y]; 62 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB end plot (t,Y); title (’Respuesta a un escalón unitario’); xlabel (’tiempo(seg)’); grid; Se mantiene el valor de δ = 0.2 para el siguiente análisis: d = 0.2; den = [1,2*d*wn,wn^2]; ye = step (num,den,t); La salida del sistema viene dada por la ecuación: ev1 = 1 + ((exp(-d*wn*t)/(sqrt(1-d^2)))); ev2 = 1 - ((exp(-d*wn*t)/(sqrt(1-d^2)))); plot (t,ye,t,ev1,t,ev2); title (’Respuesta de sist. segundo orden’) xlabel (’tiempo (s)’); ylabel (’salida’); grid; Los parámetros característicos del transitorio vienen dados por: 63 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Estos valores se pueden calcular analíticamente y compararlos con los obtenidos directamente de la grafica o analizando el vector de resultados. % Valor de la salida en reg. perm: yeRP = 1; % Calculo SO teorica: SOana = exp (-(d*pi)/(sqrt(1-d^2))); % A partir de la respuesta obtenida: SO = max(ye) - yeRP; % Tiempo de pico teorico: Tpana = pi/(Wn*sqrt(1-d^2)); % A partir de la respuesta. Aunque existen muchas formas de calcularlo, % una trivial es la siguiente (la precisión viene determinada por la % primera cifra decimal, debido al modo de definir el vector de tiempos): for i = 1:length(ye) if ye(i) == max(ye) Tp = t(i); break; end end % Tiempo de subida teorico: fi = atan (sqrt(1-d^2)/d); Tsana = (pi-fi) / (wn*sqrt(1-d^2)); % A partir de la respuesta. Por definición, el tiempo de subida es aquel % para el cual la salida iguala por primera vez al valor en reg. perm. for i = 1:length(t) if (ye(i) <= yeRP & ye(i+1) >= yeRP) Ts = t(i); break; end end disp ’Sobreoscilaciones’; [SOana SO] disp ’Tiempos de pico’; [Tpana Tp] disp ’Tiempos de subida’; [Tsana Ts] 64 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 3.3. Análisis del efecto de un cero en la respuesta temporal de un sistema de segundo orden Los ceros afectan al valor de la ganancia y a la forma de respuesta transitoria, pero no a la estabilidad. Supongamos la función de transferencia siguiente: Según la posición de los polos y los ceros se tendrían comportamientos diferentes. Si el valor absoluto del cero es mucho mayor que el valor absoluto de la parte real de los polos, apenas varía la forma de la respuesta típica (polos dominantes). Ver Fig. 1.25. t = [0:0.2:20]’; K = 1; wn = 1; d = 0.5; c = 10; % Numeradores sin cero y con cero: num = K * wn^2; num2 = K * (wn^2/c) * [1 c]; den = [1 2*d*wn wn^2]; % Comparamos la salida con la correspondiente al mismo sistema sin cero: y = step (num,den,t); y2 = step (num2,den,t); plot (t,y2,t,y,’o’); title (’Influencia de un cero lejos del eje imaginario’); polos = roots(den); disp ’Magnitud de la parte real polos:’; abs(real(polos(1))) Si el cero está entre dos raíces reales no varia la forma de la respuesta, pero varia su rapidez (Fig. 1.26), pues se introduce acción derivativa. 65 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB t = [0:0.2:20]’; K=1; wn=1; d=2; c=0.5; num = K*wn^2; num2 = K*(wn^2/c)*[1 c]; den = [1 2*d*wn wn^2]; y = step (num,den,t); y2 = step (num2,den,t); plot (t,y2,t,y,’o’); title(’Influencia del cero entre polos reales’); disp ’Magnitud de los polos:’; abs(roots(den)) Si el cero está mas cerca del eje imaginario que los polos reales, aumenta la rapidez de la respuesta (Fig. 1.27), pudiendo la salida rebasar ampliamente su valor de régimen permanente. Como el efecto derivativo es muy grande, aunque el sistema sin el cero no sobrepasara el valor de régimen permanente, el efecto del cero hace que si sobrepase dicho valor. t = [0:0.2:20]’; K=1; wn=1; d=2; c=0.05; num = K*wn^2; num2 = K*(wn^2/c)*[1 c]; den = [1 2*d*wn wn^2]; y = step (num,den,t); y2 = step (num2,den,t); plot (t,y2,t,y,’o’); title(’Influencia del cero cercano al eje imag.’); disp ’Magnitud de los polos:’; abs(roots(den)) 66 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Si el cero pasa al semiplano derecho (sistema de fase no mínima) modifica sensiblemente la oscilación (típico por ejemplo en arranque de turbinas). Ver Fig. 1.28. En este caso, la acción derivativa inicial va en sentido contrario a la salida del sistema, por lo que si dicha acción derivativa es grande (cero cercano al eje imaginario), la salida ira inicialmente en sentido contrario a la de régimen permanente. t = [0:0.2:20]’; K=1; wn=1; d=2; c=-0.5; num = K*wn^2; num2 = K*(wn^2/c)*[1 c]; den = [1 2*d*wn wn^2]; y = step (num,den,t); y2 = step (num2,den,t); plot (t,y2,t,y,’o’); title(’Influencia de un cero positivo’); 3.4. Influencia de polos adicionales. Polos dominantes Al régimen transitorio afectan fundamentalmente los polos y ceros cercanos al eje imaginario. El efecto de un cero adicional se ha visto anteriormente. Analizamos ahora el de un polo adicional. Supongamos la función de transferencia siguiente: 67 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Se va a tomar para el estudio el caso de comportamiento subamortiguado analizado en las secciones anteriores. En dicho caso, la función de transferencia correspondiente tenia los polos con su parte real en −0.5. Si la distancia entre esos polos y el resto es del orden de 5wn (con δ cercano a 1) todos los polos y ceros a partir de esa distancia no afectan al transitorio. De hecho, en el análisis de sistemas, normalmente cuando un sistema tiene un número grande de polos, se trata de simplificar para obtener un sistema aproximado de segundo orden con sus polos localizados en los polos dominantes citados. La influencia de un polo lejano y uno cercano puede verse en las Fig. 1.29 y 1.30. En ambas figuras se muestra la salida del sistema con y sin el polo p adicional comparadas ante una entrada en escalón. t = [0:0.2:20]’; K=1; wn=1; d=0.5; p=10; num = K*wn^2; num2 = wn^2*K*p; den = [1 2*d*wn wn^2]; den2 = conv (den,[1 p]); y = step (num,den,t); y2 = step (num2,den2,t); plot (t,y2,t,y,’o’); title (’Influencia de un polo lejano’); disp ’Situacion de los polos:’; roots(den2) Como se observa en la Fig. 1.29 la influencia es muy pequeña o casi inexistente en este caso. Si se analiza el caso de un polo cercano al eje imaginario: t = [0:0.2:20]’; K=1; wn=1; d=0.5; p=0.2; num = K*wn^2; num2 = wn^2*K*p; den = [1 2*d*wn wn^2]; den2 = conv (den,[1 p]); y = step (num,den,t); y2 = step (num2,den2,t); plot (t,y2,t,y,’o’); title (’Influencia de un polo lejano’); disp ’Situacion de los polos:’; roots(den2) 68 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 4. Tratamiento mediante Sistemas discretos funciones de transferencia. Se incluyen en esta sección algunas aclaraciones sobre comandos para tiempo discreto, cuya sintaxis suele ser similar, en su caso, a su equivalente continuo, añadiendo una d delante. Se van a exponer sólo unas pocas, dejando al lector el análisis por su cuenta del resto. • [Nz,Dz] = c2dm (N,D,Ts,’metodo’): Discretización de un modelo en tiempo continuo, cuya función de transferencia viene dada por los polinomios numerador y denominador. Como tercer parámetro se especifica el periodo de muestreo. El ultimo parámetro proporciona una cadena de caracteres que indica el método con el que se va a hacer la discretización, las posibilidades son: – – – – – – ’zoh’: Discretización utilizando mantenedor de orden cero (ZOH). opción por defecto. ’foh’: Discretizaci´on utilizando mantenedor de orden uno (FOH). ’tustin’: Discretización mediante aproximación trapezoidal. ’prewarp’: Discretización trapezoidal con prewarping. ’matched’: Discretización mediante emparejamiento de polos y ceros Es la Se echa de menos en esta función la posibilidad de usar otros métodos de discretización como son el rectangular hacia delante o hacia atrás. También da numerosos problemas cuando se intenta discretizar una función no propia (como pueda ser la función de transferencia de un controlador PID). No es el único comando de matlab que tiene esta limitación. función contraria a la anterior. Transforma un sistema discreto en uno continuo, mediante alguno de los métodos citados. secuencia escalón. Esta función dibuja directamente la respuesta. Esta representación no tendría en el eje horizontal valores temporales absolutos, sino que aparecerían múltiplos del periodo de muestreo. Por otro lado, si indicamos un parámetro de salida en la llamada al comando, y = dstep (Nz,Dz);, no se realiza la 69 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB representación, deberemos hacerlo nosotros mismos. En este caso, seria conveniente pintar la curva con puntos, en lugar de con un trazo continuo (como por defecto hace el comando plot). Veámoslo con el siguiente ejemplo, que dará como resultado la figura que aparece a la izquierda en Fig. 1.31: N = [0.2 0.3 1]; D = [1 0.9 1.2 0.5]; [Nz,Dz] = c2dm (N,D,1,’zoh’); y = dstep (Nz,Dz); plot (y,’.’); title (’Respuesta escal{\’o}n de un sistema discreto’); xlabel (’Periodo de muestreo’); ylabel (’Salida’); grid; • stairs(y): Para obtener una respuesta como la de que aparece a la derecha en Fig. 1.31, con la forma escalonada típica de sistemas digitales, simulando que la salida se mantiene constante entre dos periodos de muestreo, bastaría con reemplazar la instrucción plot(y,’.’) del ejemplo anterior por stairs(y). tiempo discreto. Siendo w un vector con las frecuencias donde queremos que se evalúen magnitud y fase de la función de transferencia. embargo, se usa una rejilla distinta para que la representación tenga en cuenta el círculo de radio unidad. Por ejemplo, para el sistema discretizado anterior, si hacemos: rlocus (Nz,Dz); zgrid; 70 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Podremos obtener analizar el lugar de las raíces en relación con los lugares geométricos de δ constante y wn Ts constante, en el plano z (Fig. 1.32). 5.Tratamiento estados mediante Se va a utilizar para apareció anteriormente: el descripción análisis la misma en función el espacio de transferencia de que ya El sistema se puede representar en el espacio de estados Existen comandos que permiten obtener una descripción de un sistema en espacio de estados (ss) a partir de una función de transferencia, venga esta dada mediante polinomios numerador-denominador (tf) o mediante polos-ceros (zp), y viceversa: [A,B,C,D] [A,B,C,D] [num,den] [z,p,k] = = tf2ss(num,den) Paso de función de transferencia a espacio de estados = zp2ss(z,p,k) Paso de descripción polo-cero a espacio de estados = ss2tf(A,B,C,D) Paso de espacio de estados a función de transferencia ss2zp(A,B,C,D) Paso de espacio de estados a descripción polo-cero Supongamos que disponemos de nuestra función de transferencia dada mediante: num = [.2 .3 1]; den = conv([1 .4 1],[1 .5]); con el comando tf2ss, podemos obtener descripción en espacio de estados: [A,B,C,D] = tf2ss (num,den). 71 las matrices correspondientes a su Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB La mayoría de las funciones que se han comentado en secciones anteriores para la manipulación y simulación de sistemas lineales dados por un par numeradordenominador, tienen su correspondencia para espacio de estados. Valgan los ejemplos siguientes: step (A,B,C,D,1,t); impulse (A,B,C,D,1,t); [Abc,Bbc,Cbc,Dbc] = cloop (A,B,C,D,-1); [A12,B12,C12,D12] = series (A1,B1,C1,D1,A2,B2,C2,D2); [Ad,Bd] = c2dm (A,B,Ts,’metodo’)}; Como es bien sabido, una propiedad fundamental de los sistemas es el concepto de estabilidad. Si se considera la ecuación no forzada x = Ax, x(0) = x0, se dice que el sistema es asintóticamente estable si el estado alcanza el valor cero asintóticamente con el tiempo, es decir, x(t) → 0 con t → •. Se puede demostrar que esto ocurre cuando los autovalores de la matriz A tienen partes reales negativas. Por tanto, se puede analizar la estabilidad encontrando los autovalores de la matriz A, usando el comando: evalues = eig (A) 6.Manipulación mediante objetos En las nuevas versiones del paquete de control (en consonancia con la nueva filosofía de matlab), se ofrece la posibilidad de manipular los sistemas mediante unas estructuras de datos específicas para modelos de sistemas lineales. Estos ”objetos” harán mas fácil la manipulación de los sistemas, pudiendo ser tratados de forma mas abstracta, independientemente de que vinieran descritos mediante funciones de transferencia, conjuntos de polos y ceros o matrices correspondientes a una descripción en espacio de estados. Para empezar, veamos justamente las tres formas de crear un “objeto de tipo sistema”, en función de como proporcionemos la descripción de dicho sistema: – sys = tf(num,den) – sys = zpk(ceros,polos,k) – sys = ss(A,B,C,D) En cualquiera de los casos, se puede añadir un parámetro adicional que seria indicativo de un periodo de muestreo, y por tanto, el sistema seria discreto. Para cada una de las tres posibilidades el objeto que se crea tiene una estructura diferente, puesto que tiene que almacenar datos de distinto tipo. Supongamos que creamos dos sistemas mediante sendas funciones de transferencia: sys1 = tf (1,[1 3 1]); sys2 = tf ([1,2],1); sys1 Transfer function: 1 ------------s^2 + 3 s + 1 72 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Como vemos, al pedirle el valor de sys1 nos lo da de una forma monolítica, que hará muy cómoda su manipulación. Por ejemplo, podríamos sumar o poner en serie ambos sistemas sin mas que: sys1+sys2 Transfer function: s^3 + 5 s^2 + 7 s + 3 --------------------s^2 + 3 s + 1 sys12 = sys1*sys2 Transfer function: s + 2 ------------s^2 + 3 s + 1 Por otra parte, las propiedades que están asociadas a estos objetos pueden verse mediante: get(sys1) num: {[0 0 1]} den: {[1 3 1]} Variable: ’s’ Ts: 0 InputDelay: 0 OutputDelay: 0 ioDelayMatrix: 0 InputName: {’’} OutputName: {’’} InputGroup: {0x2 cell} OutputGroup: {0x2 cell} Notes: {} UserData: [] Nos informa del numerador y denominador de la función de transferencia en s. Al ser continua, su periodo de muestreo es Ts = 0. Se pueden asociar retardos a las entradas o salidas, asociar nombres a entradas o salidas, etc. Si en un momento dado, quisiéramos cambiar alguna propiedad podríamos hacerlo mediante el operador .: sys1.Ts = 1; sys1.num{1} = [0 0 2]; sys1 Transfer function: 2 ------------z^2 + 3 z + 1 El nuevo sistema es discreto, con periodo de muestreo Ts = 1 y con un polinomio ganancia 2 en el numerador (no confundir esta manipulación con una discretización, en este caso el sistema continuo original y el discreto no tienen porqué guardar ninguna relación). 73 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Estos objetos también están pensados para poder manipular cómodamente sistemas de múltiples entradas y múltiples salidas. De hecho, podríamos haber creado un sistema de la siguiente forma: num1 = 0.5; num2 = [1 1]; den1 = [1 2 1]; den2 = [1 0]; sys = tf ({num1,num2},{den1,den2}) Transfer function from input 1 to output: 0.5 ------------s^2 + 2 s + 1 Transfer function from input 2 to output: s + 1 ----s % O lo que hubiera sido igual: sys1 = tf (num1,den1); sys2 = tf (num2,den2); sys = [sys1, sys2]; 7.Resumen de los System Toolbox comandos mas importantes del Control Normalmente, en la nomenclatura usada en este paquete de control, los comandos referentes a tiempo discreto que posean un equivalente para tiempo continuo, se denominan igual que estos, pero precedidos de una d. Por ejemplo: step y dstep. 74 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 75 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Capitulo III: Simulink Introducción al Simulink Simulink es una herramienta para la simulación de sistemas dinámicos. Esto es decir que resuelve ecuaciones diferenciales ordinarias usando métodos numéricos (Euler, Runge Kuta, etc.). Los sistemas dinámicos (representados por ecuaciones diferenciales) se deben introducir a este programa por medio de su descripción en diagramas de bloques. La descripción por diagrama en bloques usa líneas para representar variables y bloques para representar funciones. Las líneas son usadas para interconectar los bloques entre sí. Librería de bloques. Para la elaboración del diagrama de bloques, se dispone de una bloques. Ésta librería se invocará ejecutando el siguiente comando: librería de » simulink En la siguiente figura se puede ver la ventana que se abre en consecuencia. Crear un nuevo modelo Una vez abierta la librería de bloques, se debe crear un nuevo modelo “en blanco”. Para ello se puede usar la barra de herramientas o el menú, como se muestra en la siguiente figura. 76 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB El modelo “en blanco” se verá como se muestra a continuación. Sobre este modelo “en blanco” se deberán colocar los bloques que se interconectarán por medio de líneas. Los bloques son funciones tanto algebraicas como dinámicas. Las líneas son variables (locales) que serán usadas para interrelacionar las funciones. Las líneas pueden ser reales, complejas escalares y/o vectoriales. Bloques →Funciones. Líneas → Variables. Agregar un bloque al Área de trabajo Estando abiertas y visibles la librería de bloques y el modelo, se pueden agregar bloques al modelo, seleccionándola de la librería y arrastrándola al modelo. Más adelante se hará una breve descripción de los bloques más comunes para el uso en esta materia. 77 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Unir bloques con una línea. Se debe notar que los bloques tienen entradas de señal o salidas de señal o ambas, y se refieren respectivamente al argumento y resultado de la función. En consecuencia para armar un sistema se deberán conectar salidas con entradas usando líneas. Para unir bloques, se deberá presionar el botón izquierdo del ratón sobre la salida de un bloque, y manteniendo el botón presionado, arrastrarlo hasta la entrada de otro bloque, como se muestra en las siguientes figuras. Obsérvese que el puntero se transforma en una cruz cuando puede iniciar una línea (una entrada, una salida u otra línea) y en una doble cruz cuando puede finalizar una línea sin que ésta quede abierta. Se puede trazar una línea desde una salida a una entrada, de una entrada a una salida, de una línea (sacando una derivación) a una entrada, o de una entrada a una línea. Al igual que las variables en un sistema de ecuaciones, las líneas pueden ir a varios destinos, pero tendrán un solo origen. Sacar una derivación Para sacar una derivación de una línea existente se debe colocar el puntero sobre el mismo (el puntero se transformará en una cruz) y presionando el botón derecho del ratón, y manteniéndolo presionado, arrastrarlo hasta el destino final o intermedio. No es necesario finalizar la línea inmediatamente. Se puede trazar un segmento, soltar el botón del ratón, y continuar más adelante (una vez iniciada la derivación, el siguiente segmento se deberá continuar usando el botón izquierdo). Otra alternativa para iniciar una derivación es usando el botón izquierdo del ratón mientras se mantiene presionada la tecla “Control” del teclado. Bloques más comunes (de interés para la materia Control) de la librería de Simulink. Se describirá brevemente la lista de los bloques más comunes y de interés para la materia Control. Una vez que el bloque ha sido agregado al modelo, se puede acceder a sus parámetros haciendo “doble clic” sobre el mismo. El dialogo que se abre para ingresar los parámetros incluye, además de los campos para cargar éstos, una breve descripción y asistencia para el uso, un botón “Ok” para aceptar y cerrar, “Cancel” para rechazar los cambios y cerrar, “Help“ para acceder a la ayuda (Muy útil! por favor usarlo para aprender más sobre el bloque!) y “Apply” para aceptar los cambio sin cerrar el dialogo. 78 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 79 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Ejemplo elemental Supóngase que desee ver una curva senoidal y su integral en el tiempo. Esto responde a la siguiente ecuación diferencial: que puede ser escrita en forma integral: Para ello arme el siguiente diagrama en un modelo “en blanco”. Se debe considerar que la variable tiempo (t) que aparece en la última ecuación es una variable implícita del Simulink, por lo que no está relacionado con ninguna línea, pero es considerado en el bloque "Integrator". Una vez armado el sistema, se deberán ajustar los parámetros de simulación como se muestra en la siguiente sección. Parámetros de simulación Una vez creado un modelo se deben ajustar los parámetros de simulación, que se pueden acceder desde el menú "Simulation"->"Simulation parameters...", como se muestra a continuación: 80 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Por medio de este diálogo se pueden ajustar, entre otros, los siguientes parámetros: Iniciar y detener una simulación. Para iniciar la simulación se debe seleccionar el menú "Simulation"-> "Start" como se muestra a continuación: Alternativamente se puede iniciar la simulación con el botón herramientas. de la barra de En la barra de estados del modelo se muestra el estado de la simulación y en consecuencia si finalizó la misma. Una vez finalizada la simulación se puede abrir el bloque "Scope" del modelo y ver el resultado de la simulación. 81 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Capitulo IV: Complementarios… PID. Descripción y reglas heurísticas de Sintonización 1. Introducción El objetivo de esta práctica es que el alumno se familiarice y profundice en el conocimiento de la estructura de control PID, profusamente usada en el mundo industrial. Para ello se empleara el software de simulación de sistemas dinámicos SIMULINK® asociado al paquete de computación técnica MATLAB ®. La descripción de la práctica y los puntos a tratar en la misma se recogen en los siguientes apartados. 2. El sistema a controlar Para comenzar abordaremos el problema del control de un sistema simple de primer orden con retardo, definido por la función de transferencia. donde k representa la ganancia estática del sistema, t es su constante de tiempo y L es el retardo del mismo. Este tipo de sistemas, a pesar de su sencillez, modelan bastante bien una amplia clase de sistemas dinámicos que involucran generalmente fenómenos de transporte de materia como sucede en muchos procesos químicos, térmicos y muchos otros muy comunes en la industria de procesos. Comenzaremos viendo la respuesta de este sistema a lazo abierto ante una entrada en escalón, y para ello construiremos el siguiente sistema en SIMULINK para un sistema con los siguiente parámetros: 2 = k , s 5 . 0 = t y L=0.8 s. En la simulación observaremos la respuesta esperada, es decir la respuesta de un sistema de primer orden con un retardo de 0.8 segundos respecto a la entrada en escalón marcada. 3. Controlador PID El controlador PID es una estructura de control en la que la señal de control del proceso se expresa en función del error, e(t)=yref (t) - y(t), según la expresión estandar: donde p K , i K y d K corresponden respectivamente a las constantes Proporcional, Integral y Derivativa del controlador. La expresión anterior puede igualmente expresarse como la siguiente función de transferencia del controlador PID 82 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Esta función distintos: de transferencia puede implementarse en SIMULINK de dos modos 1) Empleando el bloque PID que proporciona el software para este controlador que puede encontrarse en Simulink Extras -> Additional Linear Pulsando dos veces sobre este bloque obtenemos la ventana de diálogo donde podemos introducir los parámetros del controlador arriba indicados 2) También es posible construir la estructura elementales de SIMULINK del siguiente modo del PID partiendo de bloques Esta segunda estructura será la que emplearemos en lo sucesivo en la práctica. 4. Control a lazo cerrado. Para comprobar la influencia del controlador PID en el construiremos la siguiente estructura de control realimentada 83 sistema propuesto Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Esta estructura representa un control PID clásico que incluye el controlador en la cadena directa del sistema. 5. Ajuste del PID. Reglas del Ziegler-Nichols. Para un ajuste inicial del controlador anterior, emplearemos las conocidas reglas de Ziegler- Nichols. a) Primer método de Ziegler-Nichols Las características del sistema estudiado permiten emplear el método de respuesta a escalón de Ziegler-Nichols que caracteriza un sistema mediante dos parámetros, L y T, obtenidos a partir de la respuesta a lazo abierto del mismo como representa la figura 1. Según este procedimiento de sintonización los parámetros del controlador pueden obtenerse de acuerdo con las expresiones de la siguiente tabla. De este modo a partir de la respuesta a lazo abierto del sistema, calcularemos los controladores P, PI y PID apropiados para nuestro sistema. Para cada uno de los tres controladores anteriores se pide: 1) Calcular las respuesta en el dominio temporal y caracterizar la respuesta según la ganancia estática a lazo cerrado (K0), sobreoscilación (SO), tiempo de subida, (ts), tiempo de establecimiento (te) y ratio de decaimiento (rd). 84 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB 2) Modificar los parámetros de cada controlador para un ajuste fino de la respuesta anotando la influencia del aumento o disminución de cada parámetro en la respuesta temporal. b) Segundo método de Ziegler-Nichols El segundo método de Ziegler-Nichols, o método de respuesta en frecuencia es un método alternativo de sintonización de PIDs que puede describirse como sigue: En primer lugar es necesario ajustar las ganancias integral y derivativa a cero, esto es 0 = i K y 0 = d K . A continuación, partiendo de un valor bajo de la ganancia proporcional, p K , vamos aumentando ésta gradualmente hasta conseguir un comportamiento oscilatorio mantenido en la respuesta del sistema tal como muestra la gráfica. A esta ganancia la llamaremos U K . El otro parámetro que nos hace falta es el periodo de oscilación del sistema para esta ganancia, que llamaremos U T , y que se calcula como muestra la gráfica. Con los valores de U K y U T entramos en la tabla 2 de Ziegler-Nichols y calculamos los parámetros correspondientes. Para cada uno de los tres controladores, P, Pi y PID, se pide: 1) Calcular las respuesta en el dominio temporal y caracterizar la respuesta según la ganancia estática a lazo cerrado (K0), sobreoscilación (SO), tiempo de subida, (ts), tiempo de establecimiento (te) y ratio de decaimiento (rd). 85 Universidad del Zulia ANALISIS Y CONTROL DE SISTEMAS USANDO MATLAB Comentarios finales: Ante la gran cantidad de material necesario para cubrir en el área en cuestión y la gran cantidad de información disponible en este manual se pretendió tomar los aspectos básicos necesarios para introducir a los participantes del curso a lo que es este extenso mudo, pero es de hacer notar que como dijo ISAAC NEWTON: “Lo que conocemos es una gota, y lo que ignoramos es el océano”, y por lo tanto, no importa cuan largo sea este material y el curso donde se dicta, el aprendizaje, y las aplicaciones de este sofguard son se podría decir infinitas…. En virtud de lo anterior no queda mas que invitarles a adentrarse cada dia mas en este mundo, adentrarse según sus necesidades, sus problemas diarios y tener en cuenta que el aprendizaje debe ser continuo y constante y sobre todo tener en cuenta que “La practica hace al maestro”… Cualquier sugerencia y /o corrección a este material será bien recibido ya que la intención es de mejorar continuamente para que todos aquellos que en un futuro transiten por estos caminos encuentren mejores opciones y oportunidades que aquellos que pasamos primero… MF. 86