Guía de Matlab

147
Portada Contenido Introducción Capitulo I: Que trata de la necesidad de la programación en la ingeniería y de los alcances de la programación, así como de una pequeña introducción a lo que es Matlab Capitulo II: Que trata de la ventana de comandos, de la composición y el uso de la misma, de cómo utilizar la ayuda, de cómo utilizar el path browse, de algunos demos. Uso de Matlab como una Calculadora. Introducción a las gráficas. Capitulo III: Programación. Capitulo IV: Gráficas y animaciones.

Transcript of Guía de Matlab

Page 1: Guía de Matlab

PortadaContenidoIntroducciónCapitulo I: Que trata de la necesidad de la programación en la ingeniería y de los alcances de la programación, así como de una pequeña introducción a lo que es Matlab

Capitulo II: Que trata de la ventana de comandos, de la composición y el uso de la misma, de cómo utilizar la ayuda, de cómo utilizar el path browse, de algunos demos. Uso de Matlab como una Calculadora. Introducción a las gráficas.

Capitulo III: Programación.

Capitulo IV: Gráficas y animaciones.

Page 2: Guía de Matlab

2.1 Command WindowEn esta sección describiremos una de las ventanas más importantes de Matlab, la cual le dará la bienvenida cada vez que usted ingrese al programa Matlab 5.3. También aprovecharemos para introducir algunos conceptos básicos de la programación. En particular se recomienda la lectura de las secciones 2.1.6, 2.1.7, 2.1.9 y 2.1.10.

Cada vez que usted inicia Matlab se abre por defecto una ventana titulada Matlab Command Window (ventana de trabajo o ventana de comandos). Desde esta ventana usted puede ejecutar Matlab como una calculadora de alta capacidad, llamar funciones y otros programas guardados en archivos para observar los resultados y eventualmente almacenarlos en variables. Además puede escribir y ejecutar pequeños algoritmos, aunque no podrá usarlos una vez cierre Matlab. La ventana también incluye en su parte superior un menú y una serie de botones que son tanto vínculos a otras ventanas como herramientas comunes de Windows. En la zona inferior se observan barras que indican el estado actual de Matlab.En la figura 2-1 se indican las partes de la ventana de trabajo, que serán discutidas en las secciones 2.1.1 a 2.1.15.

Figura 2-1 Partes de la ventana Command Window (Los números corresponden a la sección donde se explican)

1 2 3 4 5 10 11 12 13

6

8

7

9

14 15

Page 3: Guía de Matlab

2.1.1 Menú File

El menú file (archivo) permite acceder a la mayoría de las aplicaciones de Matlab. Entre estas se encuentran: crear, abrir y ejecutar archivos que contienen gráficas, figuras o modelos de Matlab; manipular variables; acceder al editor de gráficas (GUIDE); modificar la ruta de ejecución de los programas; configurar las preferencias de Matlab; abrir la ventana de impresión y salir de Matlab.GUIDE es el nombre de un conjunto de herramientas que tienen por objeto facilitar la creación de entornos gráficos en Matlab, abreviados GUI (Graphical User Interface), tales como ventanas con menús y botones que llaman funciones creadas por el usuario. En este texto no se utilizará GUIDE, pero su uso puede consultarse en el manual “Building GUIs with MATLAB”, incluido en el CD de instalación de Matlab 5.3.

Figura 2-2 Menú File

2.1.2 Menú EditAl igual que muchos de los entornos gráficos de Windows, Matlab incluye herramientas de edición, que en este caso actúan sobre el contenido de la ventana de trabajo (sección 2.1.9), a saber: deshacer, cortar, copiar, pegar, borrar, seleccionar todo y borrar sesión. Esta última opción es de gran utilidad, permitiendo remover de la pantalla todo el contenido de la ventana de trabajo, la cual tiende saturarse de números.

Figura 2-3 Menú Edit

2.1.3 Menú ViewDesde el menú Ver puede mostrarse u ocultarse la barra de herramientas haciendo clic en toolbar.

Page 4: Guía de Matlab

2.1.4 Menú WindowEl menú ventana despliega el nombre de las ventanas abiertas (incluida la ventana de trabajo), y permite activar una ellas. Estas ventanas pueden ser figuras de Matlab, modelos de Simulink, o ventanas de ayuda, entre otros.

Figura 2-4 Menú Window

El ejemplo de la Figura 2-4 muestra el contenido de esta ventana cuando se tienen abiertas las siguientes ventanas:

La ventana Library Browser de Simulink, a partir de la cual se crean allí los programas.

2 figuras (una sin título y la otra llamada “Gráfico de la población actual”) La ventana de ayuda de Matlab, llamada Matlab help window. La ventana Matlab Command Window Un bloque sin nombre de Simulink

Entonces puede alternarse sin problema una ventana por otra, seleccionando esta última en el menú Window

2.1.5 Menú HelpEl Menú Help (ayuda) permite acceder a una serie de herramientas de ayuda y tutoriales en los que se explican en detalle todos los componentes de Matlab.A partir del contenido de este Menú, una persona interesada podría perfectamente aprender a utilizar Matlab en casi toda su extensión. En la sección 2.3 se tratará este tema con mayor detenimiento. Figura 2-5 Menú Help

2.1.6 Botón New M-fileEs equivalente a FileNewM-File. Los archivos tipo *.m contienen algoritmos (códigos) que pueden ser ejecutados por Matlab. Una manera de crearlos es a través de este botón. Entonces se abre el editor de Matlab y aparece allí un archivo en blanco donde puede escribirse un algoritmo. Sin embargo, siempre es necesario grabar el archivo antes de poder utilizarlo.

2.1.7 Botón OpenEl botón Abrir permite abrir los archivos asociados con Matlab y Simulink. Es equivalente a FileOpen. Por ejemplo, puede usarse para abrir los archivos que contienen algoritmos, mencionados en la sección anterior. Debe distinguirse entre abrir un archivo y ejecutarlo. Cuando decimos que abrimos un archivo que contiene un algoritmo (por ejemplo, un archivo *.m), entendemos por ello que estamos observando las instrucciones tal y como fueron escritas, sin que ellas sean realizadas por el programa. Por otra parte, decimos que ejecutamos un archivo o que “corremos” un programa, cuando hacemos que el computador realice las tareas que el contenido de éste

Page 5: Guía de Matlab

le indica. Una manera de hacer esto último es escogiéndolo luego de hacer FileRun Script en la ventana de trabajo.

2.1.8 Botones de ediciónSon equivalentes a los explicados en la sección 2.1.2. Puede verse temporalmente el nombre un botón si se ubica el puntero sobre él.

2.1.9 Contenido de la ventana de TrabajoLa ventana command window es en realidad un entorno gráfico que permite visualizar la verdadera zona de trabajo de Matlab, llamada workspace (Abreviada WS). Esta zona de trabajo no es ninguna ventana, sino más bien el espacio virtual o parte de la memoria de del computador destinada para Matlab y sobre la cual usted trabaja mientras se encuentra en la ventana de comandos o cuando utiliza un archivo Script. Cuando se emplea Matlab, el objetivo siempre es que el computador ejecute una serie de instrucciones para producir un resultado que puede almacenarse en una o más variables, así como en archivos. Con el fin de comunicar estas instrucciones al programa, es necesario escribirlas en un lenguaje de programación. La ventana de trabajo nos brinda formas gráficas para introducir ciertas instrucciones básicas, como por ejemplo la instrucción “salir de Matlab”, la cual se ejecuta haciendo clic en FileExit Matlab. No obstante, en Matlab la mayoría de las instrucciones se dan en forma escrita (es decir, como líneas de un programa), e incluso aquellas que se dan en forma gráfica son mucha veces en última instancia líneas de un programa. Por ejemplo, la forma de escribir “salir de Matlab” es simplemente quit.La ventana de trabajo permite escribir la mayoría de las instrucciones de Matlab en su parte modificable (zona marcada con el número 9, Figura 2-1) utilizando el teclado como se haría, por ejemplo, en el bloc de notas. Cada línea que se escribe en esta ventana representa una instrucción o un comando (de ahí el nombre de command window) que es ejecutado por Matlab cuando usted presiona la tecla Enter (o Intro).Una particularidad importante del contenido de esta ventana es que, una vez se ha pulsado Enter, éste no puede borrarse o modificarse como se haría en un procesador de texto común. Lo anterior significa que si comete un error escribiendo una línea (o instrucción) en la ventana command window, no puede simplemente corregirlo, sino que deberá repetir la instrucción en una nueva línea.El último símbolo » indica la línea que está actualmente activada, es decir, la única que es modificable directamente. Para manipular el contenido de la ventana de trabajo pueden usarse los comandos de edición; por ejemplo, si se desea borrar todo el contenido de la ventana puede utilizarse la opción Clear session del menú Edit. Como se verá más adelante, este procedimiento no borra las variables existentes. También puede seleccionarse con el mouse parte de lo que se muestra en la ventana, para luego copiarlo en un procesador de texto (como Word o bloc de notas) utilizando las herramientas de edición.En la sección 2.2 se ampliarán algunos de estos temas.

2.1.10 Botón Workspace BrowserHemos dicho que el WS es el verdadero entorno en el cual trabajamos cuando estamos en la ventana command window. Ahora bien, como se verá más adelante, siempre es posible crear variables desde esta ventana, quedando ellas almacenadas en el espacio virtual WS. El botón Workspace Browser despliega una ventana homónima que permite visualizar y manipular las variables creadas en este entorno. Por ejemplo, si escribimos

y luego pulsamos Enter, se creará una variable llamada , que tendrá ese nombre,

Page 6: Guía de Matlab

un tamaño, un contenido y una clase determinados, así como tendrá asignada una porción de memoria virtual del computador medida en Bytes.Esta ventana permite visualizar o manipular dicha información. Alternativamente puede emplearse el comando whos para tales propósitos (Sección 2.5.1).

2.1.11 Botón Path BrowserUn programa no es más que una secuencia de instrucciones esperando a ser realizadas (ejecutadas). Cuando Matlab recibe la orden de ejecutar un programa que ha sido grabado, entonces debe buscarlo en el computador. Comoquiera que buscar dicho archivo en toda la extensión del computador tomaría mucho tiempo, Matlab sólo busca en ciertas carpetas previamente seleccionadas por el usuario, y lo hace en un orden específico llamado ruta de búsqueda (path). Además de las carpetas que contienen las herramientas incluidas en Matlab (llamadas Toolbox), la carpeta que se usa por defecto para buscar los archivos se llama Work, y en ella pueden normalmente grabarse los archivos a ejecutar. El botón Path Browser brinda acceso a una ventana homónima donde puede modificarse la ruta de búsqueda, como se verá en la sección 2.2.

2.1.12 Botón Simulink Library BrowserEl CD de instalación de Matlab 5.3 contiene, además de Matlab y sus tutoriales, otros programas desarrollados por The Math Works, siendo Simulink uno de los más importantes. Simulink es una de las herramientas más utilizadas para modelar sistemas dinámicos, y en él los programas se crean a través de diagramas de flujo, siendo perfectamente compatibles con Matlab. En este texto no utilizaremos Simulink, pero el lector interesado puede consultar los tutoriales de Simulink incluidos en el CD de instalación de Matlab 5.3, a los cuales puede accederse desde el menú Help de la ventana de trabajo. Aquí sólo diremos que el botón Simulink Library Browser es un acceso directo a una ventana homónima que puede considerarse la ventana principal de dicha herramienta, así como la ventana command window lo es de Matlab.

2.1.13 Botón Help WindowEste botón abre una ventana de ayuda de Matlab, desde la cual podrá accederse a una descripción sintética de la mayoría de funciones del mismo, aunque para ello deberá saber el nombre de cada una. Esta ayuda sintética será de gran utilidad sólo si se aprende a combinar con otras herramientas de ayuda que serán descritas en la sección 2.3. Presionar el botón Help Window (ventana de ayuda) es equivalente a HelpHelp Window.

2.1.14 Barra de estadoLa barra de estado de Matlab nos dice si éste se encuentra o no realizando alguna tarea (por ejemplo, ejecutando un programa o realizando algún cálculo). En el caso de la Figura 2-1, en la barra se muestra el mensaje Ready, lo cual significa que Matlab está listo para realizar la tarea que se le asigne. En caso contrario se mostraría el mensaje busy (ocupado).

Page 7: Guía de Matlab

2.1.15 Opciones del teclado ActivadasEn este espacio de Matlab se muestran las opciones del teclado que están actualmente activadas, estas son: mayúscula sostenida, teclado numérico activado y bloquear desplazamiento.

Sus funciones son prácticamente las mismas que en un procesador de texto.

Figura 2-6 Vista de la barra con las tres opciones del teclado activadas

Page 8: Guía de Matlab

2.2 Algunos cálculos en la ventana de trabajoEn secciones anteriores emprendimos una descripción de la ventana de trabajo, ahora comenzaremos a utilizarla para hacer cálculos tal y como se haría en una calculadora, sin reparar mucho en los detalles de los mismos. Recuerde escribir siempre en la última de las líneas marcadas con » y presionar Enter (o Intro) cuando haya terminado.

2.2.1 La noción de variableTal vez el significado de variable en el ámbito de la programación sea un poco diferente del de variable matemática. En programación, puede pensarse en una variable como en una caja con un nombre propio que contiene una serie de objetos. Algunos de esos objetos pueden ser números, letras, matrices, símbolos matemáticos, o incluso otros objetos más generales que contienen a varios de los anteriores. Una condición necesaria para la existencia de una variable es que ésta tenga un nombre, el cual es usado para manipularla a ella y a su contenido. Además está claro que la forma de manipular variables varía ligeramente dependiendo de los objetos que ésta contenga, los cuales determinan la clase de variable (Sección 2.5).Por ahora limitaremos esos objetos a números reales, y observaremos que, a diferencia de otros programas, en Matlab no es necesario especificar de antemano el tipo de objeto que contendrá la variable, ni aún enunciar al principio de los algoritmos todas las variables que se van a utilizar. Además, no hay necesidad de distinguir entre números enteros y racionales, ni aún entre reales y complejos. Cuando Matlab encuentra el nombre de una nueva variable, la crea automáticamente y ubica en ella los objetos deseados. Si la variable ya existe, entonces cambia su contenido y almacena en ella los nuevos objetos definidos (puede pensarse en ello como desocupar una caja y llenarla con nuevos objetos). Esta es una de las razones por las cuales Matlab es un lenguaje de programación sencillo y versátil. Debe tenerse en cuenta que el aspecto esencial de Matlab, como su nombre lo indica (Laboratorio de Matrices) es su manejo matricial de las variables, esto es, que toda variable de Matlab es una matriz1.

2.2.2 Creación de una variable en MatlabLa manera de crear variables en Matlab es simplemente a través del símbolo igual ( = ), y se explicará con un ejemplo. Para crear la variable llamada TE, simplemente debemos almacenar algo en ella, digamos TE=5. Se entiende que inicialmente no existe ninguna variable (es decir, no existe ninguna “caja”), y tras ejecutar esta línea se habrá creado una variable numérica (esto es, que contiene un número), llamada TE y en la cual se encuentra almacenado el número 5. Obsérvese que a la izquierda del igual se encuentra el nombre de la variable, y a la derecha el contenido. De este modo, = es el operador que asigna variables en Matlab, y no el operador lógico que verifica la validez de una igualdad2. El nombre de una variable consta de una letra, seguida de cualquier cantidad de letras, dígitos y sub-guiones ( _ ), aunque Matlab usa sólo los primeros 31 caracteres del nombre de una variable.Llegado este punto, hay dos consideraciones importantes:

1. Matlab es un Lenguaje de programación sensible, lo que significa que distingue las mayúsculas de las minúsculas. Las siguientes son por lo tanto variables diferentes: Te, tE, te, TE.

1 En un sentido más estricto, se trata de un arreglo rectangular (array). Aquí se empleará indistintamente el término matriz para referirse a estos arreglos.2 Este operador lógico es ==.

Page 9: Guía de Matlab

2. No cualquier nombre es válido para una variable. Todo nombre debe respetar una serie de normas: No puede comenzar por un dígito, por ejemplo: 548, 2TE. En cambio, sí

puede contener un número después de una letra, por ejemplo: a2, q01cra No puede contener espacios, si desea separar palabras, utilice el sub-guión.

Por ejemplo: buen_nombre No puede contener estos y otros símbolos (signos de puntuación y

operadores matemáticos o lógicos) + - * ^ / . , ; : ¿ ? “ ” ¡! # $ ( ) = \ & @ %

No debe ser estrictamente homónima a una función de Matlab. Por ejemplo, la función matemática coseno se calcula con la función cos, y no es aconsejable usar este nombre para una variable, ya que luego no podrá calcularse el coseno de un número. En cambio, sí puede crearse cos3, cos_x coseno, costa, o incluso Cos.

Para crear una variable, basta entonces con escribir un nombre válido, seguido de un igual y de su contenido, y luego presionar Enter. Este contenido puede escribirse explícitamente, o ser el resultado de alguna operación. Si se trata de números decimales, la parte decimal se separa de la entera a través de un punto. La coma no es aplicable a la notación decimal. Por ejemplo

A = 3B = 5-2+4+5+6C=0.6

Lo que hemos hecho en el segundo caso es almacenar en la variable B el resultado de la operación indicada. Naturalmente cabe preguntarse lo que sucede cuando se escribe la misma operación sin almacenarlo en variable alguna. El resultado en este caso es

» 5-2+4+5+6ans = 18

Como vemos, Matlab ha efectuado el cálculo y se ha almacenado el resultado en una variable llamada ans (abreviatura de answer, respuesta). Esto sucede siempre en la ventana de trabajo. Las variables que se crean desde esta ventana se almacenan en la memoria virtual WS.

Para ver el contenido de una variable una vez que se ha creado, basta con escribir su nombre y presionar Enter. Por ejemplo

» ansans = 18

Lo que prueba que en efecto se había creado tal variable. Debe tenerse presente que en la variable ans sólo se almacena el resultado de la última operación cuyo resultado no se ha almacenado en otra variable. Por lo tanto, si ahora escribimos R=7.5, la variable ans sigue siendo igual a 18, puesto que este resultado se ha almacenado en R.

Page 10: Guía de Matlab

Como es de esperarse, si se hace lo anterior con una variable aún inexistente, se producirá un error, y Matlab mostrará un mensaje diciendo que se trata de un archivo o variable no definidos. Por ejemplo

» variable_desconocida??? Undefined function or variable 'variable_desconocida'.

También es posible crear una variable a partir de otras. Por ejemplo

A=5B=3C=A+6D=A-B-C

Esto es válido aún para la variable ans

» 5ans = 5

» k=ans+6k = 11

Por último, recordando la analogía de la caja, podría suceder que a los objetos de la caja se les aplicara alguna operación y se devolvieran a la misma, lo que significa que una variable se puede crear de nuevo a partir de ella misma. Por ejemplo

» A=A+A-1A = 9

2.2.3 Operaciones elementales con escalaresYa se ha dicho que para Matlab, toda variable es en última instancia una matriz. Por lo tanto es de esperar que un escalar se considere como una matriz de una fila y una columna. En la sección anterior vimos cómo crear una variable, y aprendimos un poco sobre la manipulación de las mismas. En esta sección se verán las operaciones básicas con variables que contienen números escalares, mientras que la lista completa de los operadores de Matlab se tratará después de haber introducido el uso de las ayudas.

Operación escalarEscritura en el lenguaje de

MatlabSignificado Prioridad

Suma A+B 4

Resta A-B 4Multiplicación A*B 3

División A/B 2

Exponenciación A^B 1

Tabla 2-1 Algunos operadores para escalares en lenguaje Máquina y sus equivalencias

La Tabla 2-1 indica la manera de escribir en Matlab algunas de las operaciones matemáticas elementales cuando ellas se aplican a escalares. Como puede verse en las

Page 11: Guía de Matlab

operaciones de división y exponenciación, existe una diferencia importante entre la forma de escribir las operaciones en el formalismo matemático tradicional, y la de hacerlo en Matlab.En Matlab, toda operación debe escribirse en una línea, y para ello se usan a menudo

los paréntesis. Por ejemplo, puede escribirse como (4/5)+(1/3), y

como 0.6^(2-1)Nos referiremos a este cambio en la notación como el procedimiento de convertir una expresión a su equivalente en lenguaje de programación. Debe tenerse presente que el uso de espacios entre operadores es opcional.

Antes de dar más ejemplos, conviene decir algo acerca del orden en que se ejecutan las operaciones elementales, es decir, la prioridad de los operadores. Cuando Matlab ejecuta una línea, lo hace siempre en un orden de prioridades que puede ser modificado por los paréntesis. En ausencia de ellos, este orden es el que indica la cuarta columna de la Tabla 2-1. Ello significa que primero se elevan las potencias, luego se hacen las divisiones, seguidas de las multiplicaciones, y por último se efectúan las sumas y restas; esto es, se aplica el mismo orden de una calculadora convencional. Así, escribir 1/6-2*5^3+8*4 es equivalente a (1/6)-((2*5)^3)+(8*4), que significa

.

Debe siempre tenerse cuidado de cerrar cada paréntesis abierto, o de lo contrario se producirá un error y se mostrará un mensaje, siendo éste diferente si falta el paréntesis izquierdo o el derecho. Por ejemplo

» 1-6)??? 1-6) |Missing operator, comma, or semi-colon.

» (1-6??? (1-6 |A closing right parenthesis is missing. Check for a missing ")" or a missing operator.

Ejemplo 2-1Convertir las siguientes expresiones a su equivalente en lenguaje de programación. Recuerde que si no existen tales variables se producirá un error.

a)

b) c)

d)

e)

Page 12: Guía de Matlab

f)

Solucióna) (a-b)/(c+d)b) (a+b)^n

c) La raíz cuadrada tiene una función especial para calcularla, llamada sqrt. Por lo tanto puede escribirse como sqrt(5) o como 5^(1/2) y será calculada de manera diferente.

d) (2/3)^(1/8)e) (1/s-p)^-kf) a+1/(b+1/(c+1/(d-e)))

Ejemplo 2-2Encontrar el volumen específico molar (litros/mol) de un gas ideal confinado en un recipiente a una temperatura de 315.73K y una presión de 260 KPa.

SoluciónLa ecuación de estado del gas ideal es:

Donde es el volumen específico molar y es la constante universal de los gases.Para utilizar esta ecuación, primero se asignan las variables y luego se despeja para hacerla explícita en el volumen. Evidentemente debe tenerse un cuidado especial con las unidades, pues en el programa sólo se manejarán números.

Primero introducimos la temperatura en una escala absoluta; en este caso 315.73 K

» T=373.15T = 373.15

Después introducimos la presión; en este caso 260 KPa

» P=260P = 260

Ahora calculamos la constante de los gases R (KPa*Lt/mol*K). Para ello se despeja y se aplica el hecho experimental de que un mol de un gas ideal confinado a 101.325 KPa y 273.15K ocupa 22.414 litros.

» R=101.327*22.414/(1*273.15)R = 8.3146

Por último se aplica la ecuación de estado del gas ideal, despejada para el volumen

» v=R*T/Pv = 11.9331

El volumen específico molar es por lo tanto 11.9331 Lt/mol

Page 13: Guía de Matlab

2.2.3 Algunas observaciones sobre los cálculos en la ventana de trabajoYa hemos utilizado la ventana de trabajo para realizar cálculos elementales cuyos resultados se han mostrado en la misma. Sin embargo, no siempre es deseable mostrar estos cálculos, como puede ser el caso en el trabajo con vectores y matrices, donde una sola variable puede contener miles de números. Ahora veremos una manera de evitar estas molestias, y aprenderemos formas rápidas de repetir comandos sin tener que copiarlos de nuevo. Además veremos cómo escribir varios comandos en una sola línea, así como la manera de continuar un comando largo en otras líneas.

En Matlab siempre es posible realizar los cálculos sin que se muestre el resultado en la ventana de trabajo. Para ello basta añadir un punto y coma al final de cada comando, para que no se desarrolle la operación como en la sección anterior. Por ejemplo

» a=5;

Al igual que antes, la variable se ha creado, pero no se ha mostrado el número que contiene. Lo mismo es válido para cualquier cálculo que se realice. Incluso la variable ans es manipulada de esta manera. Por ejemplo

» 7^2;

Y entonces ans contiene el número 49 aunque no se haya mostrado, como puede comprobarse diciendo, por ejemplo» c=ans-49c = 0

En otros términos, el punto y coma al final de una instrucción actúa como un operador que le indica a Matlab nuestra voluntad de que no se muestre el resutado de esa instrucción.Ahora bien, muchas veces sucede que los comandos resultan ser repetitivos, o que sencillamente se comete un error al escribir una línea y se requiere rescribirla. Matlab brinda la posibilidad de hacer esto rápidamente a través de las flechas del teclado. La Tabla 2-2, tomada del tutorial “Getting Started with Matlab”, sintetiza el uso de estas teclas.

ctrl-p Recordar línea anterior

ctrl-n Recordar línea siguiente

ctrl-b Retroceder un carácter

ctrl-f Avanzar un carácter

ctrl- ctrl-r Moverse una palabra a la derecha

ctrl- ctrl-l Moverse una palabra a la izquierda

home ctrl-a Moverse al inicio de la línea

end ctrl-e Moverse al final de la línea

Page 14: Guía de Matlab

esc ctrl-u Borrar la línea

del ctrl-d Borrar el caracter en el cursor

backspace ctrl-h Borrar el caracter en el cursor antes del cursor

ctrl-k Borrar hasta el final de la línea

Tabla 2-2 Teclas usadas para editar las líneas de comandos en la ventana de trabajo

El lector puede ahora experimentar con la información suministrada en la Tabla 2-2. Cabe comentar que la flecha puede usarse incluso después de haber comenzado a escribir una línea, y entonces Matlab buscará inicialmente solamente entre aquellas líneas que coincidan con la parte que se ha escrito. Esto resulta ser de gran utilidad cuando se quiere rescribir un comando que se ha utilizado con bastante anterioridad; entonces se escribe la primera parte de éste, y en tal caso Matlab lo muestra prontamente al ir presionando sucesivamente la flecha . También puede usarse ctrl-c (copiar) para copiar la parte seleccionada de una línea, ctrl-v (pegar) para pegar la parte que se ha copiado. Para seleccionar parte de una línea puede usarse el mouse o también mantener presionada la tecla shift y usar las flechas del teclado. Para seleccionar todo el contenido de la ventana de trabajo, puede irse al menú EditSelect All.Por ejemplo, si se escribe

» a=1+*4??? a=1+* |Missing variable or function.

Entonces puede presionarse la flecha en el teclado, o también ctrl-p, y enmendar el error repitiendo el comando en una nueva línea. La flecha tiene sentido cuando ya se ha presionado la flecha , y entonces se muestra la línea que estaba escrita antes de presionar . Se trata pues de un retorno.

También es posible escribir comentarios en la ventana de trabajo, los cuales pueden servir para explicar lo que se está realizando. La parte que en una línea se encuentra después del símbolo porcentaje (%) se considera como un comentario y no se ejecuta, por ejemplo

» a=5 %Estamos creando la variable a

a =

5

De esta manera se harán comentarios en los ejemplos de esta guía.

Algunas veces sucede que se desea escribir varios comandos en una sola línea. Para ello puede emplearse una coma (,) o un punto y coma (;) entre cada comando y entonces el resultado se mostrará en el primer caso y se suprimirá en el segundo. No es necesario dejar espacio entre los comando. Por ejemplo» a=10,b=5a = 10

Page 15: Guía de Matlab

b = 5

Lo que ha hecho el programa es leer esta serie de instrucciones de izquierda a derecha, como si cada una estuviera en una línea aparte. Si se escriben estas mismas instrucciones con punto y coma, las respuestas se suprimen, siendo lo mismo válido para cualquier operación. También pueden alternarse comas con puntos y comas, y entonces los cálculos se muestran sólo donde se usó coma para separar comandos. Por ejemplo,

» a=3; b=a^3-9; c=b-a, 15^2c = 15ans = 225

Por último, puede ser útil escribir un comando largo en varias líneas, para lo cual se deja un espacio y se colocan 3 puntos consecutivos al final de las líneas involucradas. Debe presionarse Enter cada vez. Por ejemplo

s = 1 -1/2 + 1/3 -1/4 + 1/5 - 1/6 + 1/7 ... - 1/8 + 1/9 - 1/10 + 1/11 - 1/12;

2.2.4 Notación científica y números especialesMuchos de los resultados numéricos pueden ser demasiado prolijos cuando se escriben en toda su extensión, por lo que Matlab tiende a abreviarlos utilizando la notación científica, basada las potencias del número 10. Normalmente escribimos un número en notación científica como ba 10* , con un número real y entero (y no los nombres de una variable). Para utilizar la notación científica en Matlab, estos números se escriben como ae+b y ae-b. Es decir, se utiliza la letra e, que significa la multiplicación por una potencia de diez. Nótese que “e”, escrita entre números es una potencia de 10, y no el número de Euler, ni una variable. Por ejemplo

» 10^15ans = 1e+015

» 4.5*10^-15ans = 4.5e-015

También puede emplearse directamente la notación de Matlab para escribir estos números. Por ejemplo

» -8e+3ans = -8000

» 8/2e-5+1 %primero se divide 8 entre 2e-5, luego se le suma 1ans = 400001

La Tabla 2-3, una modificación de la que se encuentra en el mismo tutorial del cual se tomó la Tabla 2-2, muestra la manera introducir ciertos números que suelen aparecer en los cálculos con Matlab, y cuyo conocimiento es de gran utilidad a la hora de crear ciertos algoritmos.

Page 16: Guía de Matlab

pi 3.14159265 ( )

i Unidad imaginaria ( )

j Igual que i

eps Precisión relativa del punto flotante ( )

realmin    Menor número de punto flotante ( )

realmax Mayor número de punto flotante ( )

Inf Infinito

NaN “No es un número” (Not-a-number)

exp(1) 2.7182818 ( )

Tabla 2-3 Lista de símbolos y números especiales

Así, un número complejo se escribirá como a+bi, o como a+bj, donde a y b son reales, e “i” la unidad imaginaria. Por ejemplo

» 5+3ians = 5 + 3i

» j^2ans = -1

» sqrt(-25) %esta es una función con una entradaans = 0 + 5i

» 5+i*1e+4ans = 5 + 10000i

Este último ejemplo que utiliza *i, es posible porque i no es aún el nombre de ninguna variable. En cambio, cuando se ha almacenado otro valor en ella, digamos » i=5;

La misma expresión toma el valor almacenado en la variable i, y no la unidad imaginaria. Así, tenemos

» 5-2*i %El * hace que i se tome como una variable cuando existeans = -5» 5-2i %Como no hay *, i se toma como la unidad imaginariaans = 5 - 2i

» i-1ians = 5 - 1i

Lo mismo es válido para el número j. Para restaurar la unidad imaginaria, debemos borrar la variable escribiendo

» clear i

Page 17: Guía de Matlab

El número eps es una medida de la precisión de los cálculos. Representa la distancia en la recta real, entre el 1 y el siguiente número de punto flotante. Los cálculos realizados más allá de eps pueden resultar incorrectos, por lo que éste se usa como la tolerancia para ciertos métodos numéricos. Su valor es aproximadamente 2.22044604925031e-016, cantidad ínfima que puede variar según el sistema operativo. Este valor indica que los cálculos que normalmente hacemos en Matlab, tienen una precisión aproximada de 16 cifras decimales. Puede operarse con eps como con cualquier número. Por ejemplo

» r=eps*1e+10r = 2.2204e-006» eps*ians = 0 +2.2204e-016i

Existen en Matlab dos números reales que acotan en valor absoluto el intervalo de todos los números posibles. El mayor número que puede utilizarse en Matlab se designa realmax, y al menor se le llama realmin. Este último puede entenderse como el más cercano al cero, mientras que realmax puede tomarse como el más cercano al infinito.

» realminans = 2.2251e-308

» realmaxans = 1.7977e+308

Esto significa que el número no puede utilizarse directamente en Matlab, pues de alguna manera excede su capacidad. Los números mayores que realmax se consideran como infinito, el cual se escribe en Matlab como inf. Por ejemplo

» realmax^2ans = Inf

El símbolo inf se obtiene también como un límite, tal como ocurre en la división por cero. Por ejemplo

» 1/0Warning: Divide by zero.ans = Inf

También existe su versión negativa

» -1/0Warning: Divide by zero.ans = -Inf

Las propiedades de inf son básicamente las mismas de los límites infinitos

Page 18: Guía de Matlab

» inf-1e+9ans = Inf

» inf*infans = Inf

» inf*-infans = -Inf

» 1/infans = 0

Es de esperar que exista también una manera de designar ciertos límites divergentes, como el cociente 0/0 o la resta de infinitos. En efecto, el símbolo “nan” se utiliza para tales propósitos. Por ejemplo

» 0/0Warning: Divide by zero.ans = NaN

» 0*infans = NaN

» inf-infans = NaN

» i*infans = NaN + Infi

Lógicamente, algunas de sus propiedades son

» nan+1ans = NaN

» nan/0Warning: Divide by zero.ans = NaN

» nan^nanans = NaN

Por último, dos números que aparecen comúnmente en la matemática aplicada tienen su propia notación en Matlab. El número π es simplemente el área de un disco de radio unidad, mientras que es el número de Euler. Para utilizar π basta con escribir pi, siendo su uso análogo al de la unidad imaginaria. Por ejemplo» pians = 3.1416

Page 19: Guía de Matlab

» pi*1e+5ans = 3.1416e+005

» 2*(1+pi*j)ans = 2.0000 + 6.2832i

Por su parte, el número de Euler se calcula como una función, escribiéndose exp(a) para simbolizar . Por ejemplo

» exp(1)ans = 2.7183

» exp(0)+exp(-1)*exp(1)ans = 2» exp(pi*i)ans = -1.0000 + 0.0000i

Donde se ve en el último ejemplo que la exponencial compleja también está definida y cumple la identidad de Euler

2.2.5 Uso de las funciones matemáticas elementalesEn la sección anterior encontramos que el número se obtiene a partir de la función exp, análoga a la función matemática . Existen asimismo varias funciones matemáticas que se encuentran en Matlab como funciones en el sentido de la programación. En términos generales puede decirse que una función en el sentido usado en programación, es un algoritmo con cero o más argumentos de entrada, y uno o más de salida. En esta sección nos limitaremos a reseñar el uso de ciertas funciones con un argumento de entrada y uno de salida.

Para utilizar una función, basta con escribir su nombre seguido de unos paréntesis que contienen el argumento de entrada; entonces se obtiene un valor al que llamamos argumento de salida.La Tabla 2-4 contiene algunas funciones matemáticas de uso muy común. En la sección 2.3.2 se verá una manera de obtener la lista completa de estas funciones.

Función Nombre en MatlabSeno SinCoseno CosTangente Tan

Valor Absoluto AbsLogaritmo Natural

Log

Logaritmo Decimal

log10

Exponencial ExpRaíz Cuadrada Sqrt

Tabla 2-4 Algunas funciones elementales

Page 20: Guía de Matlab

Su se ilustra en los ejemplos 2-3 y 2-4. Debe tenerse presente que todas ellas están definidas para los números complejos. Tampoco debe olvidarse que, por ser Matlab un lenguaje sensible, el nombre de las funciones también debe respetar la distinción entre mayúsculas y minúsculas.Ejemplo 2-3Escribir las siguientes expresiones en lenguaje el de programación de Matlab usando únicamente las funciones de la Tabla 2-4. Tenga presente que las expresiones implícitas no representan las líneas de un programa y no pueden escribirse directamente en Matlab.a) b) c) Solucióna) cos(x+y)=cos(x)*cos(y)-sin(x)*sin(y)b) Utilizando j para la unidad imaginaria, tenemos

exp(j*x) = sin(x) + j*cos(x)

c) Utilizando sqrt para la raiz cuadrada y abs para el valor absoluto, se encuentrasqrt(a^2) = abs(a)

Alternativamente(a^2)^(1/2)= abs(a)

Ejemplo 2-4Expresar los siguientes cálculos en términos de las funciones de la tabla 2-4. Use identidades cuando sea necesario.a)

b)

c) Solución

a) Haciendo uso de la identidad , puede escribirse este cálculo en

términos de log ó de log10, así

» log(36)/log(6)ans = 2

» log10(36)/log10(6)ans = 2

b) » sin(log(i)/i)ans = 1

Este resultado es consecuencia directa de la identidad , la cual puede

obtenerse a partir de la identidad de Euler.

c) Aquí se supone que x e y son variables que contienen números. De nuevo encontramos que es válido tomar una función como argumento de entrada de otra; es decir, la composición de funciones es permisible y sencilla en Matlab

Page 21: Guía de Matlab

» sqrt((x-y)^3*abs(x+y));

Esto concluye el ejemplo.

Observemos que para elevar una función a una potencia, ésta bien puede o no encerrarse entre paréntesis

» sin(10)^2ans = 0.2960

» (sin(10))^2 %estos paréntesis pueden omitirseans = 0.2960

Por último, recordemos que las funciones tangente y logaritmo presentan discontinuidades, así que

» log(0)Warning: Log of zero.ans = -Inf

» tan(pi/2)ans = 1.6331e+016

En este último caso debió haberse obtenido el símbolo infinito como respuesta. Sin embargo, los métodos empleados por Matlab para calcular esta y otras funciones son aproximativos, por lo que en vez de infinito se obtiene un número un número grande en valor absoluto.Terminamos esta sección con un ejemplo que muestra la manera de realizar ciertos cálculos, que escritos directamente exceden la capacidad de Matlab.

Ejemplo 2-5

Cálculo del cociente para números grandes.

Solución

Considérese la expresión , cociente que es igual a .

Si intentamos calcularlo directamente en Matlab, resulta

» 12e500/6e220ans = Inf

Lo cual era de esperarse ya que el numerador es mayor que realmax, y se toma como infinito. Empero, podemos realizar este cálculo a partir las propiedades de los logaritmos, ya que

Page 22: Guía de Matlab

Pero si , podemos aún escribir

Este artificio evita trabajar directamente con el numerador, utilizando para el efecto el dos o más de sus factores, elegidos para que sean menores que realmax. Por lo tanto, tomando y , el cociente considerado se calcula como

» exp(log(12e250)+log(1e250)-log(6e220))ans = 2e+280

Que es el valor esperado.Este artificio es particularmente útil en el cálculo de combinatorias, donde los factoriales se transforman en sumas de logaritmos buscando que no excedan el número realmax. El precio a pagar por ello es la pérdida de un poco de precisión en el resultado final.

Page 23: Guía de Matlab

2.3 Uso de las AyudasSon tantas las herramientas incluidas en Matlab, que sería una lástima si el programa no incluyera ayuda donde se reseñara su uso. Afortunadamente los creadores de Matlab son consientes de ello, y han incorporado en él un sistema de ayuda sumamente completo. El resultado es que existe una ayuda para casi todas las herramientas contenidas en Matlab. Aún más, se incluyen en el CD de instalación múltiples tutoriales3 donde puede aprenderse a utilizar Matlab en casi toda su extensión. En esta sección describiremos prolijamente el uso de estas ayudas, puesto que basta con saber emplearlas para aprender Matlab.2.3.1 El comando helpNormalmente cuando se escribe un algoritmo, suele incluirse a manera de comentario una descripción de su uso en el encabezado del mismo. El comando help es una función que permite ver tal descripción de los programas. Aunque su uso es sencillo, requiere el conocimiento previo del nombre de la función. Esta función de ayuda se usa escribiendo en la ventana de comandos la palabra help, y tras un espacio y el nombre del archivo o función de Matlab, respetando las mayúsculas y minúsculas. Así, por ejemplo para obtener sobre la función sin escribimos help sin, obteniendo:» help sin

SIN Sine. SIN(X) is the sine of the elements of X.

Overloaded methods help sym/sin.m

En primer lugar se encuentra el nombre de la función, escrito en letra mayúscula. Aunque normalmente las funciones de Matlab tienen su nombre verdadero en minúscula, en las ayudas se encuentran escritas de este otro modo con el fin de resaltarlas. Así pues, la ayuda nos dice que sin(x) es el seno de los elementos de x, donde x es una matriz cualquiera.

En algunos casos la ayuda reporta otras funciones con finalidades similares. Por ejemplo, para la función exponencial tenemos

» help exp

EXP Exponential. EXP(X) is the exponential of the elements of X, e to the X. For complex Z=X+i*Y, EXP(Z) = EXP(X)*(COS(Y)+i*SIN(Y)). See also LOG, LOG10, EXPM, EXPINT.

Overloaded methods help sym/exp.m

3Si no posee estos tutoriales, puede descargarlos de la página oficial de The Math Works http://www.mathworks.com

Page 24: Guía de Matlab

Lo cual significa que los comandos log, log10, expm, y expint están relacionados con la función exponencial, como puede comprobarse mirando sus ayudas.

Para ver los temas de ayuda, se escribe únicamente help. Estos se son los mismos que se encuentran en la Figura 2-7.

2.3.2 La ventana MATLAB Help WindowHaciendo clic en el menú HelpHelp Window desde la ventana de trabajo, es posible acceder a ventana de ayuda MATLAB Help Window, mostrada en la Figura 2-7.

Figura 2-7 Ventana de Ayuda MATLAB Help Window

La información contenida en esta ventana de encuentra organizada por temas (help topics), a los cuales puede accederse haciendo doble clic sobre el nombre. Por ejemplo, haciendo doble clic en matlab\elfun se obtiene una lista con las funciones matemáticas elementales, ordenadas en varias categorías. Si en esta lista se hace de nuevo doble clic en sin, entonces se en la ventana aparecerá exactamente la misma información que se vio en la sección 2.1. Se recomienda al lector examinar las funciones de esta lista puesto que su uso es muy común.En resumen, la ventana de trabajo es un entorno gráfico que ofrece la misma ayuda de la función help. Así, para buscar una función específica cuyo nombre se conoce, se escribe éste en la región que en la Figura 2-7 contiene el mensaje “MATLAB Help Topics”, ubicada en la parte superior izquierda de la ventana de ayuda, y se presiona enter. El botón Home sirve para volver a la lista original de los temas de ayuda. El botón Tips

Page 25: Guía de Matlab

ofrece una descripción de las funciones de ayuda de Matlab. El menú desplegable See also proporciona vínculos a comandos similares a los consultados, cuando ellos existen.Por último, el botón Go to Help Desk brinda acceso a una ventana en html que contiene una lista de productos de The Math Works, así como tutoriales de Matlab y simulink, incluyendo una amplia lista de funciones de Matlab descritas con gran detalle. Para acceder a estas últimas ayudas se utiliza el comando doc, descrito en la siguiente sección.

2.3.3 El comando doc y la ayuda en HtmlComo se comentó antes, existe una ayuda en versión Html que cuenta con información adicional sobre los comandos y funciones de Matlab, además de tutoriales referentes a temas diversos como gráficas, desarrollo de entornos gráficos, articulación con otros lenguajes de programación, etc. El comando doc abre desde la ventana de comandos una ventana en Html, llamada MATLAB Help Desk. Se recomienda al lector revisar el vínculo “Getting Started” de la categoría MATLAB Topics, mediante el cual se accede a un tutorial introductorio a Matlab.

Figura 2-8 Ventana de Ayuda MATLAB Help Desk

Los vínculos señalados en la Figura 2-8 contienen una lista de las funciones de Matlab, organizadas ya sea por tema o por índice alfabético. Si bien esta no es la manera más eficiente de buscar ayuda sobre un comando cuyo nombre desconocemos, pero del cual tenemos una idea de lo que debe hacer, constituye un último recurso en la búsqueda de tal comando.

Lista de Funciones

Page 26: Guía de Matlab

Para obtener ayuda sobre un comando en particular, basta utilizar el comando doc como se hizo antes con el comando help. Por ejemplo, si se escribe» doc sin

Se abre una ventana como la que muestra la Figura 2-9.

Figura 2-9 Ayuda del sistema Help Desk sobre el comando sin

Cabe anotar que si bien de esta manera se obtiene más información sobre el comando, no todos los ellos están reportados en esta ayuda.Una manera alternativa de acceder a la ayuda en formato Html es desde el menú desplegable See also, en la ventana MATLAB Help Window.

2.3.4 El comando lookforHasta ahora hemos buscado las ayudas de comandos cuyo nombre conocíamos de antemano. Sin embargo, es evidente que este no es el caso general, y es indispensable la existencia un mecanismo que permita sortear esta dificultad. El comando lookfor es precisamente este mecanismo, y su uso es bastante sencillo: para buscar un comando que realice una tarea específica, se escribe lookfor seguido de una palabra clave (en inglés), obteniéndose así una lista de comandos que la contienen. Esto se ilustra en el siguiente ejemplo.Ejemplo 2-6

Page 27: Guía de Matlab

Encontrar una función de Matlab que realice el producto punto de dos vectores.SoluciónRecordemos del álgebra lineal que el producto punto de dos vectores y , denotado por , se define en términos de sus componentes como el escalar , donde

, son respectivamente las componentes (elementos) de los vectores y .Entonces tenemos las siguientes palabras claves, con sus equivalencias en inglés:

Producto = productPunto = dotVector = vectorElemento = element

Probando la primera opción, encontramos al cabo de un tiempo

>> lookfor productKRON Kronecker tensor product.CROSS Vector cross product.DOT Vector dot product.CUMPROD Cumulative product of elements.PROD Product of elements.RESTOREDEFAULTPATH Restores the MATLAB search path to installed products.COLLATETRANSLATIONS Searches the MATLAB path for products with save-as translations.FINDBLIB Searches the MATLAB path for products with Simulink blocks.

Donde se ve que el comando dot es el buscado, como puede comprobarse mirando las ayudas help dot y doc dot.Para obtener ayuda sobre este comando, escríbase help lookfor. También se recomienda revisar las ayudas correspondientes a los comandos which y what una vez que se haya visto la ruta de búsqueda (path).

2.4 La notación matricial en MatlabAntes de dar inicio a nuestro estudio del Matlab como un lenguaje de programación, más que como una versátil calculadora, aprenderemos algunas formas de introducir y manipular matrices. Como se verá cuando se estudien los ciclos, el empleo adecuado del aspecto matricial de Matlab es esencial en el desarrollo de funciones eficientes, ya que permite realizar un gran número de cálculos de manera simultánea.

2.4.1 Dos formas de introducir vectores

Comencemos entonces por los vectores, como caso especial de las matrices. Existen básicamente dos formas de introducir un vector en Matlab, a saber: la escritura elemento a elemento y la notación abreviada (cuando esta es viable).Así pues, para escribir un vector fila en la notación elemento a elemento o nominal, se escriben éstos separados por espacios o por comas y se agrupan con un corchete angular4. Algunos ejemplos son:» A=[1 3 5]A = 1 3 5» B=[0,-5,0.5 1/4 1e+2]B = Columns 1 through 3

4 Para las ayudas de matlab, el corchete se llama Bracket.

Page 28: Guía de Matlab

0 -5 0.5 Column 4 0.25

Como se observa en este último ejemplo, es posible combinar las comas con los espacios para separar los elementos. Además, un elemento puede ser el resultado de una operación, así como un número complejo o alguno de los números especiales de la Tabla 2-3. Obsérvese también que en este caso el vector B no puede se mostrado en una línea de la pantalla, por lo que Matlab escribe sobre cada elemento la columna a la que éste pertenece. Si B fuera una matriz, esta especificación se haría sobre cada columna de la misma.Para crear un vector columna por este método, vasta utilizar un punto y coma (;) para separar cada par de elementos. Por ejemplo

» A=[-1; 0; i ;pi; exp(1); 1/0]Warning: Divide by zero.A = -1.0000 0 0 + 1.0000i 3.1416 2.7183 Inf

La introducción del espacio después del punto y coma es sólo cuestión de estética. Nótese cómo la parte imaginaria de los números complejos aparece a la derecha de la columna. Por consiguiente, las columnas que contienen números complejos tienden a ser más anchas que su semejante real. Al igual que antes, la introducción del punto y coma al final de una línea evita que los resultados se presenten en la pantalla.

En ciertas ocasiones los elementos de un vector se construyen según una regla fija, tal como una progresión aritmética con incrementos constantes. En este caso en particular es útil la notación abreviada de los vectores, la cual utiliza el operador dos puntos5 (:). Supongamos que queremos construir un vector fila conteniendo los números pares del 2 al 10. Entonces podríamos proceder escribiendo

» A=[2 4 6 8 10];

Pero existe evidentemente una diferencia constante e igual a 2 entre cada par de elementos consecutivos del vector A. Por lo tanto, A queda completamente definido si decimos que es un vector fila cuyos elementos son los números que se obtienen iniciando en 2 (elemento inicial) y sumando sucesivamente 2 a cada elemento de A (es decir, con un incremento de 2 unidades), llegando hasta el número 10 (elemento final). La notación abreviada para la creación de vectores hace uso de esta regla fija, y utiliza para ello el operador dos puntos, escribiéndose un vector cualquiera similar a A, de la manera Inicial: incremento: final. Para el caso anterior tenemos

» A=2:2:10 %El resultado es siempre un vector filaA = 2 4 6 8 10

5 Matlab se refiere a este operador como “colon operator”, y el operador punto y coma como “semicolon”.

Page 29: Guía de Matlab

Nótese cómo con esta notación no es indispensable agrupar los términos en un corchete angular. Para formar de esta manera vectores debe tenerse en cuenta que sólo funciona directamente para elementos reales. Los siguientes ejemplos ilustran un uso un poco más general de esta notación.

» A=0:0.1:1 %los incrementos pueden ser decimalesA = Columns 1 through 7 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 Columns 8 through 11 0.7000 0.8000 0.9000 1.0000

» Aa=1:-0.1:0 %incrementos negativosAa = Columns 1 through 7 1.0000 0.9000 0.8000 0.7000 0.6000 0.5000 0.4000 Columns 8 through 11 0.3000 0.2000 0.1000 0

» B=pi:pi/10:2*pi %uso de números especialesB = Columns 1 through 7 3.1416 3.4558 3.7699 4.0841 4.3982 4.7124 5.0265 Columns 8 through 11 5.3407 5.6549 5.9690 6.2832

Se presenta una especie de error utilizando esta notación cuando no existe coherencia lógica entre los incrementos y los elementos extremos. Por ejemplo

» A=5:-1:10A = Empty matrix: 1-by-0

A es entonces una “matriz” vacía con una fila y cero columnas, y es invariante frente a la adición o la multiplicación por un escalar. Es decir

» A+1ans = Empty matrix: 1-by-0

» 5*Aans = Empty matrix: 1-by-0

Lo mismo ocurre cuando se utilizan incrementos nulos en la creación de un vector.

Cabe hacer notar que el elemento superior o final es en realidad un límite que no puede ser excedido por los elementos obtenidos mediante adición sucesiva de los incrementos, motivo por el cual éste no está necesariamente contenido en el vector creado. Por ejemplo

» d=[0:3:10] %los corchetes son opcionalesd = 0 3 6 9

Es decir, el 10 no está contenido en d porque el siguiente número que se obtiene sumando el incremento establecido es 12, y éste es mayor que el límite superior fijado

Page 30: Guía de Matlab

por dos unidades. Si el incremento no se especifica, se asume igual a una unidad, por ejemplo

» 2:5ans = 2 3 4 5

La combinación de los dos métodos presentados en esta sección permite introducir fácilmente vectores más generales. Por ejemplo

» A=[1/2 3 -18 0 1:5]A = Columns 1 through 7 0.5000 3.0000 -18.0000 0 1.0000 2.0000 3.0000 Columns 8 through 9 4.0 5.00005.0

» B=[0:2:9 1:2:10]B = 0 2 4 6 8 1 3 5 7 9

Estos últimos ejemplos sugieren que los elementos de un vector pueden ellos mismos ser otro vector. En efecto, si se tienen los 3 vectores fila A, B, C, pueden formarse los vectores D=[A B C], E=[A C B], y F=[C A B], G=[A A], H=[C C C B], etcétera 6. Estos vectores pueden también combinarse con otros elementos para producir nuevos vectores, por ejemplo

» a=[1 i 0] %elementos complejos no tienen problemasa = 1.0000 0 + 1.0000i 0 » b=[-1 -3 4]b = -1 -3 4

» c=[15 a 8 b]c = Columns 1 through 4 15.0000 1.0000 0 + 1.0000i 0 Columns 5 through 8 8.0000 -1.0000 -3.0000 4.0000

Por último, si algún elemento de un vector cualquiera X debe expresarse mediante la notación científica, entonces Matlab aplica esta notación a todo el vector X, “factorizando” de sus elementos la potencia de 10 necesaria. Esto puede ser causa de confusiones cuando da la apariencia de elementos nulos. Por ejemplo

» a=[100000; 5.8; 50; 500; 0.3]a = 1.0e+005 * 1.0000 0.0001 0.0005 0.0050 0.0000

6 El método aquí expuesto es a menudo referido en la ayuda de Matlab como concatenación (concatenation). Recordemos que concatenar significa “unir o enlazar unas cosas con otras”. (D.R.A.E.)

Page 31: Guía de Matlab

La notación “1.0e+005 * ” significa que cada elemento del vector se encuentra reducido en un factor de 10000. Naturalmente, ésta no es más que una cuestión de forma, y los elementos del vector no se han alterado. A diferencia del trabajo con escalares, la notación científica sólo se aplica automáticamente cuando un vector o una matriz dada contiene elementos grandes en valor absoluto. En cambio, la presencia de números pequeños no modifica la presentación de una matriz. Por ejemplo

» b=[0.5 1e-8 3 4 3/100000 0.03]b = 0.5000 0.0000 3.0000 4.0000 0.0000 0.0300

Puede usarse el comando format para apreciar más decimales en una variable numérica. La instrucción format long hace que los resultados de los cálculos subsiguientes se muestren con más decimales, aunque ello no modifica en modo alguno la precisión real de los cálculos. Para volver a cambiar los decimales se usa format short. Se invita al lector a revisar las ayudas disponibles para este comando. Para cambiar permanentemente el formato de los números, se ingresa al menú FilePreferences…, donde se elige el formato numérico deseado, así como la fuente y el tamaño de la letra de la ventana de trabajo7. Se recomienda activar el formato long g para obtener un buen número de decimales siempre que sea necesario.

2.4.2 Introducción de Matrices de tamaño m*nLa creación de matrices elemento a elemento queda sugerida por el método de creación de vectores fila y vectores columna, visto en la sección anterior. Para ello se separan mediante espacios o comas los elementos de una misma fila, mientras que éstas se separan con punto y coma, agrupando todo con corchetes angulares. Debe tenerse cuidado de que todas las filas contengan la misma cantidad de elementos. Por ejemplo

» A=[1 2 3; 8 4 3; 4 0 2]A = 1 2 3 8 4 3 4 0 2

» B=[1:5;-5:1:-1; 0 8 3 10 -40]B = 1 2 3 4 5 -5 -4 -3 -2 -1 0 8 3 10 -40

Asimismo, es posible crear una matriz a partir de las variables ya existentes, las cuales pueden ser ellas mismas escalares, vectores, o matrices; siempre y cuando las dimensiones coincidan. Por ejemplo» a=13a = 13

» aa=[a a-1 a+1 3*a]aa = 13 12 14 39

» B=[aa; -3 -2 a.^2 0; 0:1:3]

7 Cambiar el formato de “loose” a “compact” en este menú evitará que se deje espacio entre las líneas, de tal modo que la presentación de los resultados sea más compacta.

Page 32: Guía de Matlab

B = 13 12 14 39 -3 -2 169 0 0 1 2 3

El procedimiento equivalente con los vectores columna es análogo al anterior, y se pueden dar combinaciones como

» c=[-1; -5; -7]c = -1 -5 -7» [B c B]ans = 13 12 14 39 -1 13 12 14 39 -3 -2 169 0 -5 -3 -2 169 0 0 1 2 3 -7 0 1 2 3

Si no se escribe ningún elemento entre los corchetes, se obtiene la matriz vacía

» a=[]a = []

Ejemplo 2-7Creación de una tabla de logaritmos.Las funciones matemáticas elementales como las estudiadas en la sección 2.2.5 se aplican con facilidad a cada elemento de una matriz, resultando fácil la creación de una tabla de logaritmos, como se ve a continuación

» a=[1:10]'; b=log(a); Tabla=[a b]Tabla = 1 0 2 0.693147180559945 3 1.09861228866811 4 1.38629436111989 5 1.6094379124341 6 1.79175946922806 7 1.94591014905531 8 2.07944154167984 9 2.19722457733622 10 2.30258509299405

2.4.3 Operaciones básicas entre Matrices y funciones especiales para crearlasAhora que hemos visto algunas maneras de crear matrices, procedamos a revisar las operaciones simples más comunes que con ellas se efectúan. Las operaciones de suma y resta de matrices se realizan elemento a elemento de la misma forma que se muestra en la Tabla 2-1. Es posible sumar o restar así dos matrices de iguales dimensiones, obteniendo una nueva matriz cuyos elementos se obtienen de la suma o resta de los correspondientes elementos en la misma posición de tales matrices. Cuando se efectúa la operación de adición entre una matriz y un escalar, se suma este escalar a cada elemento de la matriz, obteniéndose otra de iguales dimensiones. Por ejemplo

» A=[1:4;4:7;-1 0 -1 0]A = 1 2 3 4

Page 33: Guía de Matlab

4 5 6 7 -1 0 -1 0

» B=A-5B = -4 -3 -2 -1 -1 0 1 2 -6 -5 -6 -5

» A+Bans = -3 -1 1 3 3 5 7 9 -7 -5 -7 -5

Si bien las operaciones de adición y sustracción están definidas con unicidad, existen dos tipos de productos entre matrices en los que podemos estar interesados. Uno de ellos es el producto elemento a elemento, el cual se escribe como A.*B . Para ello se requiere que A y B sean de igual tamaño, o que alguno de los dos sea un escalar. Por ejemplo:

» A=[1 3 5].*[4 3 -2]%multiplicación elemento a elementoA = 4 9 -10

» B=2.*A %duplica cada elemento de A y lo almacena en BB = 8 18 -20

» C=A.*(B-8)C = 0 90 280

Análogamente, la división de los elementos de dos matrices se escribe como A./B

» C./Aans = 0 10 -28

» A./CWarning: Divide by zero.ans = Inf 0.1 -0.0357142857142857

Y como es de esperarse, lo mismo ocurre con la exponenciación, la cual se escribe A.^B

» A.^(1/2)ans = Column 1 2 Column 2 3 Column 3 1.93633660727019e-016 + 3.16227766016838i

» A.^[0 2 3]

Page 34: Guía de Matlab

ans = 1 81 -1000

El punto que precede al operador puede suprimirse siempre que se aplique a un escalar. Es decir, A.*B es igual a A*B cuando A ó B son escalares, y lo mismo vale para las otras operaciones vistas. En las operaciones elemento a elemento que no involucran escalares debe verificarse que las matrices tengan las mismas dimensiones, o de lo contrario se produce el siguiente mensaje de error

» [1 0]-[1;0]% vector fila menos vector columna ??? Error using ==> -Matrix dimensions must agree.

La transpuesta de una matriz A se escribe como A.’ y es la matriz que se obtiene intercambiando sus filas con sus columnas. De esta forma pueden también transformarse los vectores fila en vectores columna, y viceversa. Por ejemplo

» A=[2 3 4].'A = 2 3 4» A=[i 4-3i; 1 -8+i]A = Column 1 0 + 1i 1 Column 2 4 - 3i -8 + 1i» A.'ans = Column 1 0 + 1i 4 - 3i Column 2 1 -8 + 1i

Si en lugar de escribir A.’ se escribe A’, entonces se obtiene una matriz llamada transjugada de la matriz A, la cual puede obtenerse transponiendo A, y reemplazando sus elementos por los correspondientes complejos conjugados8. Como consecuencia, si todos los elementos de A son reales, se verifica la igualdad A.’=A’ El operador de transposición también se puede escribir después de un paréntesis, por ejemplo» A=[1 3 5];

» B=(A+1)'B = 2 4 6

8 El complejo conjugado de un número , con y reales, suele denotarse por y se define como . Por lo tanto, si es real, se tiene .

Page 35: Guía de Matlab

» z=[2:4]+i*[3:5]z = Column 1 2 + 3i Column 2 3 + 4i Column 3 4 + 5i

» (z').' %equivalente a (z.’)’ans = Column 1 2 - 3i Column 2 3 - 4i Column 3 4 - 5i

Este último ejemplo muestra que se puede obtener la matriz conjugada de A, como la transpuesta de la transjugada (en realidad, el orden en que ejecuten las operaciones es indistinto).

Adicionalmente a las operaciones elemento a elemento, existen en Matlab las operaciones con matrices que se estudian en el álgebra lineal. Así, el producto matricial9

de A y B puede formarse siempre que A tenga tantas columnas como filas tenga B, y el resultado es otra matriz con tantas filas como A, y tantas columnas como B. Por ejemplo:» ([1:5]')*([1:5])%Multiplicación matricialans = 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25

Y puesto que el producto matricial no es conmutativo, tenemos» ([1:5])*([1:5]')ans = 55

Este último resultado equivale al producto punto de los dos vectores considerados.

Ahora puede verificarse que la matriz identidad10 es el módulo de la multiplicación matricial. Existe una función especial para crear esta matriz, llamada eye. El comando eye(m,n), donde m y n son números enteros, crea una matriz identidad de tamaño m*n. Por su parte, eye(n) crea una matriz cuadrada de orden n. Tenemos entonces: » A=[-1 4 6; 2 0 8; 12 47 39]A = -1 4 6 2 0 8 12 47 39

9 Recordemos que el elemento de la matriz C=A*B, donde A es de tamaño m*n y B de n*p se obtiene

como . C es una matriz de tamaño m*p.

10 Por matriz identidad entendemos aquí aquella que contiene unos en su diagonal principal, y ceros fuera de ella. Si bien en álgebra lineal se trata normalmente de una matriz cuadrada, le función eye de Matlab permite crear matrices de este tipo que no son necesariamente cuadradas.

Page 36: Guía de Matlab

» B=eye(3)B = 1 0 0 0 1 0 0 0 1» A*Bans = -1 4 6 2 0 8 12 47 39

Hasta ahora habíamos trabajado únicamente con funciones que contenían un argumento de entrada, y para usarlas escribíamos funcion(argumento). No obstante, existen funciones tales como eye, para las que se emplea más de un argumento. En tal caso, los argumentos de entrada de las funciones se encierran entre paréntesis y se separan por comas, como funcion(argumento1, argumento2,...). Por lo tanto, cuando escribimos eye(5,3), 5 es el primer argumento de entrada y 3 el segundo.

De otra parte, la función eye es sólo un ejemplo de las funciones destinadas a la creación de matrices especiales11. Entre ellas destacan las funciones ones, zeros12 y rand. El uso de ellas es completamente análogo al de la función eye. Las primeras dos originan martices conteniendo elementos que son sólo unos y sólo ceros, respectivamente. El tercero de estos comandos merece especial atención, pues se trata de una función que da origen a matrices con elementos aleatorios (en inglés random, de ahí su nombre) con valores entre cero y uno, los cuales se encuentran uniformente distribuidos. Haremos un paréntesis para explicar en detalle su uso y significado.

En muchos problemas de simulación es importante disponer de una manera de generar números aleatorios, como sería el caso si quisiéramos hacer una lotería electrónica. Supongamos ahora que se dispone de una fuente de tales números, y tras haber obtenido una cantidad suficientemente grande de ellos a partir de esta fuente, definimos unos intervalos de igual tamaño y procedemos a contar cuántos de esos números se encuentran en un intervalo dado; es decir, determinamos la frecuencia de repetición de ese intervalo. Si la tendencia es que cada intervalo tenga la misma frecuencia, entonces podemos afirmar que esta fuente no tiene preferencia por ningún número en particular. Por el contrario, como la frecuencia de repetición es igual para cada intervalo, podemos afirmar que cada número tiene la misma probabilidad de surgir de esa fuente. Decimos entonces que la fuente origina números con una distribución de probabilidad uniforme.Esto es precisamente lo que queremos decir cuando afirmamos que la función rand genera números uniformemente distribuidos. Los números contenidos en los arreglos rectangulares generados por rand oscilan entre 0 y 1, pero son distintos cada vez que se ejecuta el comando. Por ejemplo, si creamos dos veces una matriz de 2*3, obtenemos algo como

» rand(2,3)%función de dos entradasans = 0.370021621052006 0.364377061057412 0.354897736682523

11Si se escribe help elmat en la ventana trabajo, se tiene acceso a una lista de tales funciones.12 Estas funciones no están limitadas a la creación de matrices de m*n. En realidad, Matlab permite manipular arreglos rectangulares de n dimensiones, donde se las matrices son arreglos de 2 dimensiones. Una manera fácil de crear estos arreglos es utilizando la función zeros, ya que el comando zeros(m,n,p,….) permite crear un arreglo rectangular multidimensional de tamaño m*n*p*…., donde cada elemento es 0.

Page 37: Guía de Matlab

0.135472321020959 0.403461190884072 0.489071030969134

» rand(2,3)ans = 0.399868442323011 0.321350516107878 0.0683318900993758 0.662271525725172 0.182714976381846 0.612297286574831

La Figura 2-10, creada en Matlab 5.3, prueba que los valores generados por rand se encuentran uniformemente distribuidos. Para su construcción se ha creado un vector de 10000 elementos con la instrucción rand(1,10000). Luego se ha partido el intervalo [0 1] en los diez subintervalos que se muestran en la gráfica, y se ha implementado un algoritmo con la finalidad de contar los datos que se encontraban en cada subintervalo 13. Por último, esta información se ha colocado en una gráfica de barras debidamente etiquetada. Como era de esperarse para una distribución uniforme, en cada una de las diez particiones se encuentran aproximadamente mil números14.

0.0 - 0.1 0.1 - 0.2 0.2 - 0.3 0.4 - 0.5 0.5 - 0.6 0.6 - 0.7 0.7 - 0.8 0.8 - 0.9 0.9 - 1.0 0.0 - 0.10

200

400

600

800

1000

1200

Intervalo del número

Fre

cuen

cia

de r

epet

ició

n en

el i

nter

valo

Distribución de frecuencias para 10000 números generados por la función rand

Figura 2-10 Histograma de frecuencias de para los 10000 valores generados por el comando rand

Es importante subrayar que una vez que los elementos generados por rand se han almacenado en una variable, éstos permanecen constantes. El siguiente ejemplo muestra cómo crear matrices con números aleatorios contenidos entre valores arbitrarios a partir de esta función.

Ejemplo 2-8

13 Este procedimiento puede resumirse utilizando un comando para gráficas llamado histogram.14 El comando randn genera números que siguen una distribución normal con media 0 y varianza 1, como puede consultarlo en la ayuda el lector interesado. La estadística enseña métodos para convertir una distribución en otra, por lo que no son necesarias más funciones para otras distribuciones.

Page 38: Guía de Matlab

Utilizando la función rand, encontrar un método para crear una matriz de tamaño m*n con elementos uniformemente distribuidos entre los valores reales y , siendo .

SoluciónMediante la instrucción rand(m,n) es posible obtener una matriz de tamaño m*n con 0 y 1 como sus valores extremos, valores no necesariamente contenidos en ella. Sea R la matriz engendrada de esta manera. Consideremos ahora lo que sucede con los elementos de R cuando la multiplicamos por una constante escalar X. Se ve al instante que los valores que antes se encontraban en el intervalo [0 1], se encuentran ahora en [0 X]. Si sumamos a cada elemento de esta nueva matriz el escalar Y, obtenemos una nueva matriz cuyos elementos se encuentran uniformemente distribuidos en el intervalo [Y X+Y]. Si queremos que esta última sea la matriz pedida, entonces sus elementos han de encontrarse en el intervalo [ ].Por lo tanto, el problema consiste en encontrar los números X e Y que satisfagan simultáneamente las dos ecuaciones lineales correspondientes a los extremos del intervalo, a saber

De donde obtenemos

Donde X es el número por el cual se ha de multiplicar la matriz engendrada por rand, e Y es el número que ha de sumársele a este producto.Es decir, se ha aplicado una transformación lineal de la forma , donde X e Y son escalares, y R es la matriz obtenida a través de la función rand.Por lo tanto, hemos encontrado la siguiente solución al problema:

Para crear una matriz A de tamaño m*n cuyos elementos son aleatorios y se encuentran uniformemente distribuidos en el intervalo real [ ], se escribe en MatlabA=(b-a)*rand(m,n)+a

Como caso particular, supóngase . Entonces escribimos en Matlab

» A=(pi-exp(1))*rand(3,2)+exp(1)%elementos entre exp(1) y piA = 2.91150953244696 2.90652957656182 2.72611462095038 2.97880100354545 3.06599237294518 3.05351734922388

Para probar que estos elementos varían cada vez, volvemos a escribir la misma línea, obteniendo

» A=(pi-exp(1))*rand(3,2)+exp(1)A = 3.10849523772125 2.89002166027103 3.03077294680066 3.1142762786731 2.79289719552768 3.10641740348484

Ejemplo 2-9Creación de una lotería virtual con cifras de 4 dígitos en la ventana de trabajo.

Page 39: Guía de Matlab

SoluciónEl problema consiste en encontrar una manera de obtener números de 4 dígitos, donde cada dígito se obtiene de manera aleatoria. El número así generado, se supone que corresponde al billete ganador de la lotería. Puesto que la lotería debe ser imparcial, debemos garantizar que cada dígito tenga la misma oportunidad de ser elegido; en otras palabras, los números deben obtenerse de una distribución uniforme, tal como la proporcionada por rand.Ahora observamos que un número entero se puede escribir como un vector que contiene sus dígitos. Por ejemplo, el número 2347 puede escribirse [2 3 4 7]. Puesto que los dígitos oscilan entre 0 y 9, el problema se reduce a encontrar la manera de generar un vector con elementos enteros igualmente probables, ubicados en el intervalo [0 9]. Debido a que el comando rand no se limita a los números enteros, debemos redondear al entero más cercano los valores que obtengamos mediante su aplicación. Para este efecto empleamos el comando round, función que redondea los elementos de una matriz aproximándolos al entero más cercano. Por ejemplo» round([1 pi 0.3 2.5 -2.3])ans = 1 3 0 3 -2

Pi ha sido aproximado a 3, y de forma similar los números no enteros, positivos y negativos.

Utilizando el resultado del ejemplo 2-8, podemos ahora crear un vector con elementos enteros entre 0 y 9 escribiendo

» round(9*rand(1,4))ans = 6 1 3 6

El número 6136 es un resultado particular que varía cada vez que se repite la instrucción.Empero, ésta no es la solución del problema porque que en ella los dígitos 0 y 9 se encuentran menos favorecidos. En efecto, un dígito intermedio como el 8 se obtendrá por redondeo de cualquier número x, siempre que . En cambio, si definimos así nuestro intervalo, los dígitos 0 y 9 sólo se obtendrán respectivamente cuando y , por lo que no son igualmente probables15. Por lo tanto es necesario modificar la instrucción para que la lotería sea imparcial, lo cual se logra ampliando el intervalo de los números generados por rand, para que quede

. Y la respuesta del ejercicio toma la forma

round((9.5-(-0.5))*rand(1,4)+(-0.5))

O bien

round(10*rand(1,4)-0.5)

De esta manera damos por concluido el paréntesis explicativo del comando rand.

15 Estadísticamente, la probabilidad x tome un valor puntual es exactamente cero, de modo que el signo igual en las desigualdades es en realidad opcional.

Page 40: Guía de Matlab

Ahora que hemos visto un poco sobre la matriz identidad, nos resultará más fácil comprender el significado de la escritura A/B en el caso en que ambos son matrices. En el álgebra lineal surge a menudo el problema de encontrar la matriz X tal que A*X=B, donde A y B son matrices conocidas. Si I es la matriz identidad, debe cumplirse I*X=X, ya que I es el módulo de la multiplicación matricial. Por lo tanto, si encontramos una matriz Y tal que Y*A=I, el problema quedará resuelto pues podemos hacer uso de la propiedad distributiva del producto matricial para multiplicar por Y a la izquierda de la ecuación, obteniendoY*(A*X) = (Y*A)*X = I*X = X =Y*B.A la matriz Y, cuando existe, se le llama la inversa de A, y suele denotarse en el álgebra lineal por . La inversa de una matriz A se calcula en Matlab con la función inv.

El proceso recién descrito puede entonces considerarse como la “división matricial” de B y A, operación para la cual Matlab introduce, entre otras opciones, el operador \ , de tal suerte que para resolver la ecuación A*X=B, se escribe X=A\B, y es completamente equivalente a X= inv(A)*B, sólo que se calcula de manera diferente.Por su parte, la escritura Z=B/A es equivalente a Z=B*inv(A), calculada de otra manera. Más precisamente, B/A=(A’\B’)’.

Ejemplo 2-10Resolver el sistema de ecuaciones lineales

SoluciónPodemos escribir este sistema en su forma matricial comoA*X=BDonde

, ,

Entonces la solución del sistema, si es única, viene dada por .En Matlab creamos primero A y B, de la siguiente manera

A=[1 3 -1; 0 4 -13; 3 -2 5]; B=[16 7 1]';

Y la solución se puede obtener por cualquiera de los siguientes métodos

» X=inv(A)*BX = 2 5 1

» X=A\B %se usa un método numérico distinto del anteriorX = 2 5 1

Page 41: Guía de Matlab

» X=(B'/A')' %se el mismo numérico método que en X=A/BX = 2 5 1

En resumen, existen en Matlab dos tipos de operaciones entre matrices. A las que se efectúan elemento a elemento, se les llama operaciones entre arreglos (en inglés arrays), y normalmente los operadores destinados para ello contienen un punto, como es el caso de la operación .*, a la cual nos referimos como multiplicación de arreglos rectangulares. El otro tipo de operaciones es el que se refiere a las matrices (en inglés matrix operations) propiamente dichas, tal y como se entienden en el álgebra lineal.Ahora se recomienda al lector revisar la ayuda doc arithmeticoperators, donde se incluyen numerosos ejemplos de estas operaciones.

2.4.3 Manipulación de MatricesEn secciones anteriores hemos aprendido distintas formas de crear matrices. Dada una matriz, se plantea el problema de manipular sus elementos por separado, lo cual se estudia en esta sección.

Si A es una matriz, en el álgebra lineal es común denotar al elemento que en la fila i-ésima y la columna j-ésima de A, como . Existe en Matlab una notación equivalente que se sirve de los paréntesis y las comas. Así, el elemento se escribe en Matlab como A(i,j), donde “i” y “j” son números naturales que representan respectivamente la fila y la columna en la que se ubica el elemento en A. Por ejemplo, dadas

» A=[2 4; 8 2; -1 5], B=eye(2)A = 2 4 8 2 -1 5B = 1 0 0 1

Se tienen las relaciones

» A(1,2) % A ;Primera fila, segunda columna ans = 4

» A(2,1) % A ;Segunda fila, primera columna  ans = 8

» B(1,2) % B ;Primera fila, segunda columna ans = 0

» c=A(2,2)*B(1,1)c = 2

Incluso, haciendo uso del valor en c

» A(c,1) %equivale a A(2,1)ans =

Page 42: Guía de Matlab

8

La misma notación es válida para los vectores por constituir éstos un caso especial de las matrices.

La diagonal principal de A se puede almacenar en un vector columna escribiendo

» [A(1,1);A(2,2)]ans = 2 2

O bien con la función diag, como

» diag(A)ans = 2 2

Existe una forma alternativa de referirse a los elementos de A, la cual sólo utiliza un número como referencia de la posición. En ésta, 2 es el primer elemento y 5 el sexto. Esto es, para la matriz A del ejemplo anterior, observamos que la posición de un elemento queda unívocamente determinada si contamos su posición a lo largo de las columnas, de arriba hacia abajo y empezando por la de la izquierda. Es decir, comenzando en el número 2, al cual llamamos elemento en la posición número 1, contamos los elementos a lo largo de esta columna hasta llegar a -1, que se encuentra en la posición 3; luego pasamos al elemento en la parte superior de la siguiente columna, que es 4 y se encuentra en la cuarta posición dentro de la matriz A. Seguimos así hasta haber recorrido la totalidad de la matriz, y terminamos en el 5, ubicado en la sexta posición.Al número o par de números con que se identifica la posición de un elemento, se les conoce como índices del elemento en la matriz A. Por lo tanto, tenemos

» A(6)%equivale a A(3,3)ans = 5

» A(1,2)-A(4)ans = 0

» A(8)??? Index exceeds matrix dimensions.

Este último mensaje de error (“el índice excede las dimensiones de la matriz”), se ha generado precisamente porque no hay un octavo elemento en A.

Utilizando el operador dos puntos con esta notación, es posible referirse a toda una fila o columna de una matriz dada. Para ello se reemplazan ambos subíndices por dicho operador. Así, la fila i-ésima de A se escribe A(i,:), y la columna j-ésima A(:,j). Por su parte, la matriz A se escribe A(:,:). En otras palabras, se trata de otro uso del operador dos puntos, en el que actuando como índice de una matriz, viene a significar “todos los elementos”. En el ejemplo anterior tenemos

Page 43: Guía de Matlab

» A(:,1) % A ; todos los elementos, columna 1ans = 2 8 -1

» A(2,:) %A ; fila 2, todos los elementosans = 8 2

» A(:,:) % A ; todos los elementos, todos los elementosans = 2 4 8 2 -1 5

Pudiendo efectuarse la multiplicación elemento a elemento

» B(2,:).*A(:,1)' ans = 14 56 -7

También se encuentra que es posible utilizar vectores como subíndices en esta notación, y entonces los elementos , se aíslan en un B vector escribiendo B=A(i,[j k l]). Si se colocan como subíndices un vector y el operador dos puntos, entonces es posible obtener simultáneamente varias filas o varias columnas de una matriz.Adicionalmente, siempre es posible convertir una matriz en un vector columna, obtenido uniendo dicha matriz por sus columnas. Esto se hace con la notación A(:). Por ejemplo:

» A(1,[2 1]) % fila uno; columnas 2,1 (en ese orden)ans = 4 2

» A(1,[1 2]) % fila uno; columnas 1,2

ans =

2 4

» A([2 3],:)% filas 2,3 ; todos los elementosans = 8 2 -1 5

» A(:)'ans = 2 8 -1 4 2 5

» C=1+B(:)C = 2 1 1 2

» A(C,[1 2])% A; filas 2,1,1,2; columnas 1,2ans =

Page 44: Guía de Matlab

8 2 2 4 2 4 8 2

Como se aprecia en este último caso, es posible duplicar filas o columnas escribiendo varias veces es mismo subíndice en un vector. Esta es una propiedad que se usa con frecuencia para crear el dominio de una gráfica tridimensional, y es la base del comando meshgrid, como se aprecia en el ejemplo 2-11.

Ejemplo 2-11Dados dos vectores columna A y B, contando A con m elementos y B con n, obtener las matrices X e Y, de tamaño m*n, tal que las filas de X sean copias de A, y las filas de Y sean copias de B.SoluciónDado que A consta de una sola columna, escribir A(:,1) equivale a escribir A. Pero si escribimos A(:,[1 1]), creando una matriz de tamaño n*2. Por ejemplo, tenemos

» s=A(:,[1 1])%A; todos los elementos; columnas 1,1 s = 2 2 3 3 4 4 5 5

Por lo tanto, si en lugar del vector [1 1], colocamos en la expresión que define s, un vector de unos conteniendo m elementos16, habremos obtenido la matriz pedida X. Valíendonos para ello de la función ones, podemos escribir

X=A(:,ones(1,m))

Donde m es conocido y A es el vector dado. Para el vector Y se escribe

Y= B(:,ones(1,n))

El procedimiento que acabamos de seguir no es otro que una versión corta del algoritmo de cálculo de la función meshgrid, de tal suerte que las matrices X e Y se obtienen escribiendo[X,Y]=meshgrid(A,B)Este es un ejemplo de una función con dos argumentos de entrada (A y B), y dos argumentos de salida. Nótese como los argumentos de entrada se escriben entre paréntesis y se separan por comas, mientras los de salida se escriben en corchetes angulares y se separan también por comas. Más adelante encontraremos más de estas funciones y aprenderemos también a crearlas.

Continuamos esta sección destacando un hecho importante del operador dos puntos: su dualidad.

Examinemos lo que sucede cuando el operador dos puntos se encuentra sólo en un paréntesis que indica los índices de los elementos de una matriz, por ejemplo A(1,:). Allí lo encontramos significando “todas las columnas”.

16 Es indistinto utilizar un vector fila o columna. Es decir, puede usarse ones(m,1) o bien ones (1,m)

Page 45: Guía de Matlab

Por otra parte, cuando se define un vector como B=[1:3:15], este operador está sirviendo como una función que abrevia el proceso de creación del vector B.Siendo distintos en esencia los dos usos mencionados, no están exentos de encontrarse ambos en una misma línea. Por ejemplo, si tenemos la matriz

» A=10*[1:6;-5:2:5]A = 10 20 30 40 50 60 -50 -30 -10 10 30 50

Entonces hemos visto que podemos escribir

» B=A([1 2 1],[1 3 5 2])B = 10 30 50 20 -50 -10 30 -30 10 30 50 20

Pero siendo un vector fila los índices referentes a las columnas de A, el vector [1 3 5 2] se puede escribir en notación abreviada como [1:2:5 2], y se llega al mismo resultado

» B=A([1 2 1],[1:2:5 2])B = 10 30 50 20 -50 -10 30 -30 10 30 50 20

Si bien hemos usado sólo vectores como subíndices, Matlab admite también utilizar matrices con números naturales para este efecto, y en tal caso se supone que cada elemento en la matriz representa un índice. Es decir, si se escribe Z=X(Y), donde X es una matriz cualquiera, mientras que Y es una matriz que contiene números naturales, se obtiene otra matriz Z del tamaño de Y, en la que cada elemento es el elemento de X indicado por el índice en . Por ejemplo, si tenemos A y B como en el último ejemplo, entonces ninguna puede usarse como Y para cualquier matriz X ya que ambas contienen elementos negativos. Pero si tenemos

» C=1+round(11*rand(2,3))C = 8 10 9 5 7 6

Entonces podemos crear

» D=B(C)D = 30 20 50 -10 50 30

Resultado que se entiende mejor reescribiendo B como B(:). Para ver también la posición de cada elemento, escribimos

» [[1:12]' B(:)]ans = 1 10 2 -50 3 10 4 30

Page 46: Guía de Matlab

5 -10 6 30 7 50 8 30 9 50 10 20 11 -30 12 20

Donde la columna de la izquierda representa la posición o índice del elemento en B, mientras a la derecha se encuentra B(:). Puede observarse que el elemento C(1,1) es 8, y el octavo elemento de B es 30, valor que a su vez se ha asignado a D(1,1). Análogamente, C(2,3)=6, B(6)=30, y D(2,3)=30.De este modo, el proceso de asignación ya descrito de la matriz Z=X(Y) puede resumirse en el siguiente enunciado:Para cada y= Y(i,j) se hace Z(i,j)=X(y).

Otros ejemplos son

» A(C)ans =

-50 40 10 30 20 -30 10 -10 20 20 30 30

» A(C')ans = 10 30 30 40 50 -10

» E=A'E = 10 -50 20 -30 30 -10 40 10 50 30 60 50

» E(C)ans = -30 10 -10 50 -50 60

» C(C)??? Index exceeds matrix dimensions.

Este último error era de esperarse ya que, por ejemplo, C(2,3) es igual a 10, pero C sólo contiene seis elementos, así que C(10) no existe y se produce el error que indica el mensaje.El ejemplo 2-13 de la siguiente sección tiene por objeto hacer conciente al lector de la simplificación que representa este manejo directo de las matrices como subíndices.

2.4.3 Modificación de los valores contenidos en una Matriz

Page 47: Guía de Matlab

Considérese el problema de resolver un sistema de ecuaciones lineales con n ecuaciones y m incógnitas. El enfoque del álgebra lineal para resolver uno de tales sistemas es representarlo en su forma matricial, como se vio ya en el ejemplo 2-10. Si bien el método la matriz inversa expuesto allí es de gran utilidad y sencillez, está restringido a sistemas de ecuaciones cuya solución es única. Expondremos brevemente ahora un método más general para abordar el problema de la solución de un sistema de ecuaciones lineales, llamado Eliminación de Gauss. Se recomienda al lector que no esté familiarizado con este método su consulta en los textos introductorios de álgebra lineal.

Tomemos, a título de ejemplo explicativo, el sistema de ecuaciones del ejemplo 2-10. En su representación matricial nos hemos olvidado de las incógnitas y hemos colocado sus coeficientes en la matriz A, de tal manera que cada una de sus filas representa una ecuación, mientras que cada columna conciente los coeficientes de una variable distinta en cada ecuación. Ahora bien, es un hecho conocido que dos o más ecuaciones pueden siempre multiplicarse por un escalar no nulo, así como sumarse para obtener una nuevas ecuaciones cuya solución no es la misma contenida en el sistema original.Si ampliamos A en una columna para que incluya los términos independientes, encontramos17

En esta representación matricial del sistema de ecuaciones lineales, efectuar operaciones entre ecuaciones equivalente a hacerlo entre las filas de A. Por ejemplo, para eliminar la variable x de la última ecuación, basta con hacer cero su coeficiente en la matriz A, lo cual puede lograrse si se resta de la fila que la contiene (tercera fila), el triple de la primera fila de A. Esto equivale a restar de la tercera ecuación el triple de la primera, para obtener la nueva ecuación que no contiene la variable x

Si desechamos la tercera ecuación del sistema original y consideramos el nuevo sistema formado por sus dos primeras ecuaciones y la que acabamos de obtener, habremos dado un paso hacia delante en nuestra búsqueda de los valores para los cuales se satisface el conjunto de ecuaciones dado ya que éstos son los mismos para ambos sistemas, el viejo y el nuevo. Si B es la representación del nuevo sistema, entonces tenemos.

Que es la representación matricial de

Si introducimos la notación para denotar la fila i-ésima, el paso de la matriz A a la matiz B puede representarse como . Este es un ejemplo de una operación entre las filas de una matriz.Puesto que intercambiar las filas de la matriz B no altera el sistema más que en su orden, podemos añadir el intercambio de filas a nuestra lista de operaciones entre filas. Bajo la notación anterior, las tres operaciones aceptadas pueden escribirse como

17 Aquí está tácito un igual que separa la última columna del resto de la matriz. También pudo invertirse el signo de los elementos independientes, y entonces las ecuaciones se supondrían igualadas a cero. Ambas posibilidades son equivalentes ya que sólo difieren en la forma de leer la respuesa.

Page 48: Guía de Matlab

(multiplicación por escalares) (suma de filas)

(Intercambio de filas)

Mediante el uso adecuado de estas operaciones18, el sistema anterior se convierte en

Esta matriz, conteniendo unos en su diagonal principal y ceros debajo de ella, recibe el nombre de Matriz escalonada. En particular, la matriz S mostrada, por contener también ceros por encima de esta diagonal, es una Matriz escalonada reducida, de la cual se lee directamente la solución

El procedimiento expuesto para convertir una matriz en su equivalente matriz escalonada, recibe el nombre de Eliminación Gaussiana. En la eliminación Gaussiana, la solución final se obtiene por sustitución regresiva, por ejemplo, si en un sistema cualquiera se llega a la matriz escalonada

Entonces se lee directamente , mientras que se obtiene reemplazando este valor en la ecuación que representa la primera fila; para encontrar . Este reemplazamiento es a veces llamado sustitución regresiva.Por otra parte, si se continúa este proceso de realizar operaciones entre filas, también conocido como reducción, se puede llegar a obtener la matriz escalonada reducida, y entonces el método se llama eliminación de Gauss-Jordan, el cual tiene la ventaja de evitar la sustitución regresiva.

Antes de ver la implementación manual de este método en Matlab, procederemos a revisar las formas de modificar el contenido de una matriz.

Si M es una matriz, entonces es posible cambiar un elemento cualquiera en ella, volviéndolo a definir tal y como si se tratara de una variable. Por ejemplo, sea

» M=[1 3 5;-7 3 0;-2 1 1]M = 1 3 5 -7 3 0 -2 1 1

Colocamos un cero en la posición central de M así

» M(2,2)=0M = 1 3 5 -7 0 0

18 Las operaciones entre filas se hacen arreglando cada columna de la matriz, de izquierda a derecha, hasta obtener .

Page 49: Guía de Matlab

-2 1 1

Debe notarse que ahora la matriz contenida en la variable M ha cambiado, y ya no será la misma cuando intentemos realizar cálculos con ella.Mediante este método es posible modificar más de un elemento cada vez, utilizando la notación de la sección anterior, incluyendo el uso de un solo índice para ubicar un elemento en la matriz. En particular, resulta útil el operador dos puntos para realizar operaciones sobre filas o columnas. Algunos ejemplos son:

» M(2)=M(3)%Se modifica aquello que está a la izquierda del igualM = 1 3 5 -2 0 0 -2 1 1

» M(1,:)=[10 15 26]%Se redefine la primera filaM = 10 15 26 -2 0 0 -2 1 1

» M(:,2)=ones(3,1)%se redefine la segunda columnaM = 10 1 26 -2 1 0 -2 1 1

» M(:,1)=2*M(:,1)%Se duplica la primera columnaM = 20 1 26 -4 1 0 -4 1 1

Para intercambiar dos filas es necesario almacenar una de ellas temporalmente en una variable, tal como ans. Por ejemplo

» M(2,:)ans = -4 1 0

» M(2,:)=M(1,:)M = 20 1 26 20 1 26 -4 1 1

» M(1,:)=ansM = -4 1 0 20 1 26 -4 1 1

La Tabla 2-5 resume el empleo en Matlab de las tres operaciones entre filas. Las operaciones entre columnas se realizan de modo análogo, ubicando el operador dos puntos del otro lado de la coma.

Operación Notación Escritura en Matlab19

Page 50: Guía de Matlab

Multiplicación de la fila j por un escalar

tA(:,j)=t*A(:,j)

Intercambio de la fila j con la fila k

B=A(:,j)A(:,j)=A(:,k)

A(:,k)=BSuma de la fila k a la

fila jA(:,j)+A(:,k)

Tabla 2-5 Operaciones entre filasEl siguiente ejemplo ilustra la manera de emplear esta notación para resolver un sistema de ecuaciones lineales paso a paso en Matlab. Este conocimiento nos será útil para el tercer capítulo, donde crearemos un algoritmo que haga esto por nosotros20.

Ejemplo 2-12

Utilizar la Eliminación de Gauss-Jordan para resolver el sistema de ecuaciones

Solución21

Primero observamos que el método de la inversa no es aplicable a este sistema, dado que no posee solución única. Puesto que el sistema es independiente y de tamaño 3*4, las infinitas soluciones se pueden escribir con respecto a un solo parámetro.Procedemos a almacenar el sistema en la matriz A

» A=[2 2 -5 6 20; 0 1 -3 4 2; 2 0 0 -1 8]A = 2 2 -5 6 20 0 1 -3 4 2 2 0 0 -1 8

A continuación operamos de tal modo que la primera columna se convierta en [1 0 0]’. Primero hemos de dividir toda la primera fila por el primer elemento de A22, lo cual es posible pues este es no nulo; en caso contrario sería necesario intercambiar las filas de A.

» A(1,:)=A(1,:)/A(1)A = Columns 1 through 3 1 1 -2.5 0 1 -3 2 0 0 Columns 4 through 5 3 10 4 2 -1 8

19 Se supone que las filas se encuentran en la matriz A20 De hecho Matlab incorpora una función llamada rref que nos permite reducir una matriz, aunque el algoritmo utilizado allí sigue otro método de reducción.21 Si el lector intenta seguir él mismo la solución en el computador, encontrará útil copiar la matriz A en otra variable para recuperarla en caso de que cometa errores. También puede ahorrar mucho tiempo utilizando las flechas del teclado para modificar los comandos repetitivos.22 Buscando la generalidad del método, en esta solución no copiamos directamente un elemento de A. Por ello no escribimos A(1,:)=A(1,:)/2. Esto nos permitirá luego crear un programa de aplicación general.

Page 51: Guía de Matlab

Ahora se resta de la tercera fila de A, la primera fila multiplicada por el primer elemento de la tercera

» A(3,:)=A(3,:)-A(3,1)*A(1,:)A = Columns 1 through 3 1 1 -2.5 0 1 -3 0 -2 5 Columns 4 through 5 3 10 4 2 -7 -12

Procediendo con la segunda columna de A, deseamos operar hasta transformarla en [0 1 0]’, cuidando de no alterar la primera columna. Con este fin nos valemos de la segunda fila de A23, la cual no modificamos pues ya contiene un 1 donde así lo queremos.

» A(1,:)=A(1,:)-A(1,2)*A(2,:)A = Columns 1 through 3 1 0 0.5 0 1 -3 0 -2 5 Columns 4 through 5 -1 8 4 2 -7 -12

» A(3,:)=A(3,:)-A(3,2)*A(2,:)A = Columns 1 through 3 1 0 0.5 0 1 -3 0 0 -1 Columns 4 through 5 -1 8 4 2 1 -8

Finalmente, nos queda convertir la tercera columna de A en [0 0 1]’. Con tal fin se emplea como pivote la tercera fila de A.

» A(3,:)=A(3,:)/A(3,3)A = Columns 1 through 3 1 0 0.5 0 1 -3 0 0 1 Columns 4 through 5 -1 8 4 2 -1 8

23 En el empleo de este método es común llamar fila pivote a aquella que sirve de apoyo para las operaciones de reducción.

Page 52: Guía de Matlab

Esta es la forma escalonada de la matriz A. Los subsiguientes pasos marcan la diferencia entre el método de Gauss-Jordan y el método de Gauss.

» A(1,:)=A(1,:)-A(1,3)*A(3,:) %Se convierte en A(1,3) en 0A = Columns 1 through 3 1 0 0 0 1 -3 0 0 1 Columns 4 through 5 -0.5 4 4 2 -1 8

» A(2,:)=A(2,:)-A(2,3)*A(3,:) % Se convierte en A(2,3) en 0A = Columns 1 through 3 1 0 0 0 1 0 0 0 1 Columns 4 through 5 -0.5 4 1 26 -1 8En esta última matriz (que es escalonada reducida) puede leerse

Parametrizando la solución con respecto a t, obtenemos

Lo cual concluye la solución del problema.

Además de escalares, en esta notación también pueden utilizarse vectores como índices de la matriz que va a modificarse. Por ejemplo, dada

» A=[6 3 2; 9 7 10];

Podemos redefinir los elementos en la primera y tercera posición de la primera fila, escribiendo

» A(1,[1 3])=[10 -5]A = 10 3 -5 9 7 10

Además es también válida la notación abreviada del operador dos puntos.

Page 53: Guía de Matlab

En ocasiones es útil referirse en esta notación al último elemento de una fila o columna, sin importar su tamaño. Para ello se escribe como end como índice. Por ejemplo

» A(end) %último elemento contado por las columnasans = 10

» A(end,end) %última fila, última columnaans = 10

» A(1,end) %primera fila, última columnaans = -5

» A(end,2) %%última fila, segunda columnaans = 7

Podemos entender end como el número que representa el subíndice de la posición final de la fila o la columna de una matriz ya creada. Por lo tanto, no es extraño que pueda sumarse, restarse o multiplicarse. Sin embargo, end sólo funcionará dentro de los paréntesis que contienen los subíndices de una matriz o vector.

» A([end end-1],1) %filas última y penúltima, columna 1ans = -1 10

Combinando adecuadamente end con el operador dos puntos es posible realizar varias tareas útiles. En uno de los usos del operador dos puntos, end sirve para modificar la última fila o columna de una matriz. Por ejemplo

» A(:,end) %todos los elementos, última columnaans = -5 15

» A(end,:)=A(end,:)-A(1,:) %última fila menos primera filaA = 10 3 -5 -1 4 15

En otro de sus usos combinados, la inversión de un vector se escribe

» B=1:3:16; B(end:-1:1)ans = 16 13 10 7 4 1

Finalmente, es posible borrar elementos de un vector haciéndolos igual a la matriz vacía

» a=[1 3 5 7 -5]; a([2 4])=[]a = 1 5 -5

El mismo procedimiento se usa para suprimir filas o columnas en una matriz. Por ejemplo, dada

» m=ones(5); m([3 2],:)=-5*m([3 2],:)

Page 54: Guía de Matlab

m = 1 1 1 1 1 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 1 1 1 1 1 1 1 1 1 1

Pueden borrarse las filas segunda tercera escribiendo

» m([2 3],:)=[]m = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Ejemplo 2-12Sean B y C las matrices del final de la sección 2.4.2, obtener la matriz D=B(C) empleando únicamente escalares como subíndices.

SoluciónEn aquella sección teníamos las matrices» BB = 10 30 50 20 -50 -10 30 -30 10 30 50 20» CC = 8 10 9 5 7 6

Para resolver el problema partiremos almacenando en D una matriz de ceros del tamaño requerido, y luego modificaremos uno por uno todos de sus elementos hasta haber terminado. Así pues, como D y C deben tener el mismo tamaño, copiamos

» D=zeros(2,3)D = 0 0 0 0 0 0

Recordando que si C(i,j)=c entonces D(i,j)=B(c), podemos sintetizar el proceso en un paso y modificar cada elemento D(i,j), escribiendo D(i,j)=B(C(i,j)). En aras de la brevedad, todo el proceso se copiará en un par de líneas que en conjunto tienen de 6 comandos, uno por cada elemento modificado.

» D(1,1)=B(C(1,1)); D(1,2)=B(C(1,2)); D(1,3)=B(C(1,3)); ...D(2,1)=B(C(2,1)); D(2,2)=B(C(2,2));D(2,3)=B(C(2,3))D = 30 20 50 -10 50 30

Nótese cómo los puntos suspensivos han permitido continuar escribiendo en la siguiente línea.

Evidentemente, una matriz C más grande requeriría de muchas más líneas para lograr obtener D=B(C). Si bien en un algoritmo es posible implementar con facilidad la técnica recién descrita, el tiempo que tardaría en hacerlo considerablemente mayor que el requerido por el comando B(C). Esta mayor eficiencia es precisamente la razón por la

Page 55: Guía de Matlab

cual hemos dedicado tantas páginas a la manipulación de matrices, y con suerte los frutos comenzarán a verse en el capítulo tercero.

2.4.4 Funciones que actúan sobre matrices y sobre arreglos rectangularesYa hemos visto que las funciones matemáticas elementales pueden aplicarse directamente a todos los elementos de un arreglo rectangular. También nos encontramos ya con la función inv, la cual vimos que permite calcular la inversa de una matriz. En la ayuda help elmat es posible encontrar otras funciones útiles en la manipulación de matrices y de arreglos en general. En esta sección comentaremos algunas de esas funciones, prestando especial atención a las que son más utilizadas en una amplia gama de algoritmos que cumplen diferentes propósitos.

La Tabla 2-6 contiene las funciones que se estudian en esta sección. Se supone que A es una matriz cualquiera; X es un vector fila o columna, y B es una matriz cuadrada.

Comando Argumento de salidasize(A) Vector fila con el tamaño de Alength(X) Longitud de X

sum(A) Vector fila con las sumas a lo largo de las columnas de A

prod(A) Vector fila con los productos a lo largo de las columnas de A

max(A) Vector fila con los mayores elementos de las columnas de A

min(A) Vector fila con los menores elementos de las columnas de A

union(X1,X2) Vetor fila con el conjunto unión de X1 y X2

intersect(X1,X2) Vetor fila con el conjunto intersección de X1 y X2

diag(A) Vector columna con la diagonal principal de A

det(B) Determinante de B

El comando size (tamaño), tiene como argumento de salida un vector fila que contiene las dimensiones del arreglo rectangular al que se le aplica. Este conocimiento es de particular importancia cuando se pretende crear funciones generales que actúen sobre arreglos de cualquier tamaño. Veamos su uso con algunos ejemplos:

» p=ones(4,3);

» size(p)

ans =

4 3

Puesto que s es también un vector, podemos reconstruir p escribendo

» p=ones(s(1),s(2))

p =

1 1 1 1 1 1 1 1 1

Page 56: Guía de Matlab

1 1 1

La variable ans también puede someterse a esta función, por ejemplo

» [-1:.5:10]';

» size(ans)ans = 23 1

Por último, este comando puede aplicarse a una parte de una matriz. Por ejemplo

» t=zeros(20,30);

» size(t(10:end,[1 3]))%filas décima a última, columnas 1 y 3 de tans = 11 2

Resultado que es el tamaño de la matriz indicada.El comando length, cuando se aplica a un vector, devuelve el número de elementos que contiene. Si se aplica a una matriz, devuelve la mayor de sus dimensiones. Por ejemplo

» length(pi:pi/50:100*pi)ans = 4951

» length(t)ans = 30

» 5:10:length(t) %length puede usarse para crear vectoresans = 5 15 25

El comando sum es de gran utilidad para escribir sumatorias sin tener que recorrer a ciclos. Para ilustrar su uso, apliquémoslo a las llamadas matrices “mágicas”, matrices cuadradas para las que la suma a lo largo de una fila o columna es constante. El comando magic(n) crea en Matab la matriz mágica de orden n. Por ejemplo

» M=magic(3)M = 8 1 6 3 5 7 4 9 2

Realizando la suma a lo largo de sus columnas, obtenemos

» sum(M)ans = 15 15 15

Para sumar los elementos de cada fila, basta con transponer la matriz

» sum(M')ans = 15 15 15

Page 57: Guía de Matlab

El uso del comando prod es completamente análogo

» prod(M)%producto de las columnasans = 96 45 84

Y puesto que M(:) devuelve un vector columna con todos los elementos de M, podemos multiplicarlos todos ellos escribiendo

» prod(M(:))%producto de todos los elementos de Mans = 362880

Para ver el mayor de los elementos en un vector X, se usa max(x). Cuando este comando se aplica a una matriz, se obtiene el mayor elemento de cada columna. Obsérvese que leght(A) es equivalente a max(size(A)). Por otra parte, si A contiene elementos complejos, entonces se usa automáticamente su valor absoluto, es decir, max(abs(A)). La función min es completamente análoga.

» max(5:10:337)ans = 335

» min(prod(M)) %menor de los productos de las columnas de Mans = 45

» [max(M); max(M')] %[Mayores en columnas; Mayores en filas] ans = 8 9 7 8 7 9

En otro de sus usos, si se escribe C=max(A,B), se obtiene una matriz de igual tamaño que A y B, en la que el elemento corresponde al mayor de los elementos y

» S=round(10*rand(size(M)))S = 4 9 4 6 7 9 8 2 9

» max(M,S)ans = 8 9 6 6 7 9 8 9 9

Adicionalmente, la función max puede tener más de un argumento de salida. Para las separar los argumentos de salida se una función, éstos se encierran entre corchetes y se separan por comas. Así, una función con m entradas y n salidas se escribe

[salida_1,...,salida_m]=funcion(entrada_1,...,entrada_n)

Page 58: Guía de Matlab

El segundo argumento de salida de max es un vector que contiene los índices que indican la posición donde se ubican en la columna de la matriz los elementos mayores. Por ejemplo

» [a,b]=max(M)a = 8 9 7b = 1 3 2

Lo que significa que el 8 está de de primero en su columna, el 9 está de tercero en la suya, y el 7 de segundo. Nótese que se han creado simultáneamente dos variables.

Ahora veremos dos funciones que son útiles cuando las matrices se toman en el sentido del álgebra lineal.

El determinante de una matriz cuadrada se calcula fácilmente a través del comando det. Para la matriz mágica de orden tres, se tiene

» det(M)ans = -360

Ahora se puede probar que la matriz mágica de orden seis es singular, esto es, que su determinante es cero

» det(magic(6))ans = 0

Propiedad que tienen todas las matrices mágicas de orden par.La diagonal principal de una matriz (cuadrada o no), se obtiene con el comando diag. Por ejemplo

» diag(M)ans = 8 5 2» diag(S.^2)ans = 16 49 81» diag(magic(6))ans = 35 32 2 17 14 11

Por lo tanto, la traza de una matriz A, entendida como la suma de los elementos de su diagonal, se escribe sum(diag(A)).

Ejemplo 2-14

Page 59: Guía de Matlab

Calcular las siguientes sumatiorias en Matlab

a)

b)

c)

SoluciónLa idea consiste en almacenar en un vector cada elemento de la sumatoria, y utilizar luego la función sum para efectuar su suma. Es decir, si la sumatoria es

, entonces se crea un vector X con los elementos correspondientes

; y luego se evalúa sum(X).

a) Puesto que los valores van de 3 a 8 con incrementos de 1, escribimos» a=3:8;

» sum(a) %Se pudo escribir directamente sum(3:8)ans = 33

b) Se procede a crear un vector cuyos elementos se elevan al cuadrado, y luego se calcula su suma

» a=[10:200];

» sum(a.^2) %o bien: sum([10:200].^2)ans = 2686415

c) Aquí existen varias formas de proceder. Sin aplicar la propiedad distributiva de la sumatoria, podemos escribir

» sum(log(a)-log(a+a.^2))ans = -853.430879527389

Si la aplicamos, podemos tomar la diferencia de las dos sumatorias resultantes para escribir» sum(log(a))-sum(log(a+a.^2))ans = -853.430879527389

Ahora el lector puede replantear el ejemplo 2-5 para escribirlo en términos de sumatorias. Se propone también que aplique el artificio allí expuesto para calcular el cociente del factorial de dos números grandes.

Aunque aquí no lo mostramos, el uso de la función prod es análogo al de sum, y el factorial de un número natural n siempre puede escribirse como prod(1:n).

2.4.5 Concatenación y la expansión escalar

Page 60: Guía de Matlab

Terminamos nuestro estudio de las matrices haciendo énfasis en la ya mencionada concatenación, por constituir ésta una herramienta muy utilizada en cierto tipo de algoritmos que contienen rutinas repetitivas llamadas ciclos.Para esta discusión tomaremos las matrices» A=magic(3)A = 8 1 6 3 5 7 4 9 2» B=magic(4)B = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1

Veremos primero cómo formar nuevas matrices y vectores a partir de ellas. Observemos que podemos hacer referencia a las primeras columnas tres de B escribiendo

» B(:,1:end-1) % todos los elementos, columnas 1 hasta penúltimaans = 16 2 3 5 11 10 9 7 6 4 14 15

Podemos formar una nueva matriz C uniendo A con esta parte de B a través de sus columnas. Para ello las encerramos entre corchetes punto y coma.

» C=[A;B(:,1:end-1)]C = 8 1 6 3 5 7 4 9 2 16 2 3 5 11 10 9 7 6 4 14 15

La matriz resultante contiene encima a A, bajo la cual se hallan las primeras tres columnas de B. Naturalmente, la concatenación ha sido posible porque ambas tienen el mismo número de columnas. Si intentásemos unirlas por las filas, obtendríamos el error

» C=[A B(:,1:end-1)]%A tiene una fila menos??? All matrices on a row in the bracketed expression must have the same number of rows.

Sin embargo, también es posible transponer B(:,1:end-1) para tornarla en una matriz de 3*4, y entonces sí puede efectuarse la concatenación por filas

» Cc=[A B(:,1:end-1)']Cc = 8 1 6 16 5 9 4 3 5 7 2 11 7 14 4 9 2 3 10 6 15

Observemos también que en este proceso de formación de matrices, podemos aplicar funciones y cálculos como elementos de la nueva matriz formada

Page 61: Guía de Matlab

» D=[A, round(9*rand(size(A)))] %El segundo "elemento" es una ... matriz aleatoria del tamaño de AD = 8 1 6 4 3 1 3 5 7 8 7 2 4 9 2 1 0 2

En un uso algo más general de la concatenación, pueden crearse matrices a partir de otras no sólo empleando la notación de los “vectores”, sino como matrices ellas mismas.Por ejemplo, podemos crear una matriz cuadrada que contenga las potencias de A, escribiendo» potencias=[A A.^2;A.^3 A.^4]potencias = 8 1 6 64 1 36 3 5 7 9 25 49 4 9 2 16 81 4 512 1 216 4096 1 1296 27 125 343 81 625 2401 64 729 8 256 6561 16

Es decir, hemos formado la matriz

, donde los exponentes se refieren a la exponenciación elemento a elemento.

Ahora cabe preguntarnos lo que sucede cuando intentamos concatenar de este modo una matriz y un escalar. Por ejemplo» [B 5]??? All matrices on a row in the bracketed expression must have the same number of rows.

En estos casos se produce siempre el mismo error. Sin embargo, sí existe una forma de ampliar una matriz dada aumentándola en un escalar; entonces, Matlab rellena los elementos restantes con ceros para completar la matriz. Para hacerlo, basta con definir una parte de la matriz que exceda su tamaño. Por ejemplo, en la matriz A que tenemos, intentamos introducir un elemento en una cuarta fila de A, obtenemos

» A(4,1)=16A = 8 1 6 3 5 7 4 9 2 16 0 0

Como vemos, los elementos restantes se han rellenado con ceros. Si en cambio se redefine toda una columna o fila empleando un escalar, éste se copia en toda esa columna o fila, exista o no. Por ejemplo

» A(2,:)=-1 %se redefine la fila dos, ya existenteA = 8 1 6 -1 -1 -1 4 9 2 16 0 0» A(:,5)=8 %Se crea la quinta filaA = 8 1 6 0 8

Page 62: Guía de Matlab

-1 -1 -1 0 8 4 9 2 0 8 16 0 0 0 8

En este último caso, puesto que no existía tampoco la fila cuatro, ésta se ha rellenado con ceros. Estos procedimientos para aumentar matrices definiendo sus nuevas filas o columnas reciben el nombre de expansión escalar.También es posible aplicar la expansión escalar para crear simultáneamente filas y columnas, como en» B(6,6)=3B = 16 2 3 13 0 0 5 11 10 8 0 0 9 7 6 12 0 0 4 14 15 1 0 0 0 0 0 0 0 0 0 0 0 0 0 3

Restauramos las matrices originales volviéndolas a crear» A=magic(3);B=magic(4);

Se pueden redefinir rápidamente todos los elementos de una matriz utilizando los dos puntos» A(:)=0 %o bien A(:,:)=0A = 0 0 0 0 0 0 0 0 0

También es válido copiar vectores o aún matrices en las filas o columnas aún inexistentes de una matriz

» A(:,6)=[1 4 3]' %se crea la sexta columna de AA = 0 0 0 0 0 1 0 0 0 0 0 4 0 0 0 0 0 3

De nuevo se han introducidos los ceros necesarios en la quinta columna. Para borrar una las primeras tres columnas, la hacemos iguales a la matriz vacía» A(:,1:3)=[]A = 0 0 1 0 0 4 0 0 3

Podemos copiar una parte de B en esta última matriz. Digamos que sea la parte de B que va de la primera a la penúltima fila, y de la tercera a la última columna. Queremos copiarla en la parte de A que va de la primera a la última fila, en la primera y segunda columnas. Escribimos entonces

» A(:,[1 2])=B([1:end-1],[3:end])A = 3 13 1 10 8 4 6 12 3

Por último, observemos que es fácil copiar elementos de un vector en una matriz utilizando un solo subíndice» d=2:3:14 %se crea el vector dd = 2 5 8 11 14

Page 63: Guía de Matlab

» s(1:length(d))% los primeros length(d) elementos en s ans = 3 10 6 13 8

» s(1:length(d))=-d %cambiamos esos elementos por los de -ds = -2 -11 1 -5 -14 4 -8 12 3

El siguiente ejemplo aplica parte de los conocimientos adquiridos sobre vectores y matrices.

Ejemplo 2-15Dados dos vectores A y B, donde A tiene tantos o más elementos que B, generar un tercer vector fila C que contenga los elementos intercalados de ambos, hasta donde sea posible. Esto es, si hay n elementos en B, entonces C=[a1 b1 a2 b2…an bn]SoluciónSi A ó B no son vectores columna, entonces podemos escribirA=A(:); B=B(:);

Para que así lo sean.Además, puesto que n=length(B) y nos interesan los n primeros elementos de A, escribimos Aa=A(1:length(B));

De suerte que el problema planteado se reduce a encontrar una forma de intercalar dos vectores columna de igual tamaño. En este punto hacemos uso del siguiente artificio: Si a y b son vectores fila de igual tamaño, entonces se puede formar la matriz de dos filas [a; b]. Observemos con un ejemplo lo que sucede cuando se leen sus columnas

» a=[1:3]; b=-[3:-1:1]; X=[a;b]X = 1 2 3 -3 -2 -1

Para leer las columnas, escribimos» X(:)ans = 1 -3 2 -2 3 -1

Evidentemente, la lectura de las columnas de X equivale al vector intercalado de a y b. Para que el resultado sea un vector fila, basta con transponer este resultado, de modo que podemos obtener el vector intercalado C escribiendo

X=[Aa; B]C=X(:).'

Donde para transponer se ha usado “.'” en lugar de “'”, ya que los elementos de A y B bien podrían ser complejos.

Page 64: Guía de Matlab

Finalmente, podemos generalizar más la respuesta si levantamos la restricción de que length(A)>length(B). Para ello, una vez que A y B son vectores columna, almacenamos en S el menor se estos dos números, escribiendoS=min(length(A),length(B))

Y luego se redefinen tanto A como B diciendoA=A(1:s); B=B(1:s)

En conjunto, hemos de realizar los siguientes pasos en el orden en que se escriben:

%1.Transformar A y B en vectores columnaA=A(:); B=B(:) %2. Almacenar en S el menor de los tamaños de A y BS=min(length(A),length(B));

%3. Crear la matriz X, compuesta de las filas dos filas %correspondientes a los primeros S elementos en A y B X=[A(1:S).'; B(1:S).'];

%4. El vector resultante C, se obtiene leyendo las columnas de X.%Se transpone para que sea un vector filaC=X(:).';

La secuencia lógica de pasos o instrucciones que acabamos de escribir, y mediante la cual se obtiene un resultado cada vez que se ejecuta en su totalidad; es lo que comúnmente denominamos algoritmo. En el capítulo tercero se verá cómo se almacena una algoritmo en un archivo, de tal manera que no sea más necesario escribir estos pasos cada vez que se desean llevar a cabo.

De esta manera damos por concluida la introducción a las matrices de elementos numéricos. Ahora procederemos a estudiar otros tipos de variables, y veremos que su manipulación es en esencia la misma que acabamos de ver para las matrices.

2.5 Diversos tipos de variables y su manipulaciónHasta ahora hemos empleado Matlab como una calculadora de alta capacidad, y por ello nos hemos limitado a las variables que contienen números. Si bien para efectos de cálculo pueden resultar suficientes estas variables y tal vez otras que se manejen como símbolos matemáticos, el uso de Matlab como lenguaje de programación requiere de la manipulación de tipos adicionales de variables, que serán estudiados en esta sección.Así, por ejemplo, para la creación de una base de datos que almacene el nombre y el teléfono de varios individuos, es necesario al menos tratar con variables que contengan cadenas de caracteres, y en las cuales se almacenen los nombres de aquellos individuos.

Hemos de recordar que la clase o tipo de una variable se define según su contenido.

2.5.1 Números de precisión doble y sencilla. Funciones para ver y manipular los tipos de variablesTodas las variables que hemos empleado hasta ahora son números de doble precisión (double). La precisión hace referencia a los decimales que emplea el programa para realizar los cálculos. Las variables de precisión doble contienen números de punto flotante que se calculan con 16 cifras significativas en el intervalo a .

Page 65: Guía de Matlab

Por defecto, todas las variables numéricas de Matlab son de precisión doble, a menos que se especifique lo contrario. Números de precisión sencilla se pueden obtener con la función single. Cuando X es una matriz, single(x) crea una variable de precisión sencilla, en la que los cálculos no consideran tantos dígitos. La ventaja de ello se debe en parte a que una variable de precisión simple ocupa alrededor de un 50% menos de memoria, comparada con una de precisión doble.

Para ver una lista de las variables existentes, se emplea el comando who. Por ejemplo, supongamos que únicamente hemos escrito en Matlab los comandos

» a=rand(50,60); b=pi; c=single(a); 84;

Entonces podemos ver las variables que se han creado, escribiendo who

» who

Your variables are:

a ans b c

Cuando no existe ninguna variable, who no regresa ningún resultado.El comando clear permite borrar variables y no genera error cuando estas aún no existen24. Para emplearlo se escribe clear, seguido de espacios y los nombres de las variables que se desean borrar. Por ejemplo

» clear a ans www %Borra las variables "a" y "ans"

Verificamos que se han borrado escribiendo

» who

Your variables are:

b c

Cuando se escribe

» clear all

Se borran todas las variables almacenadas en la memoria virutal Workspace

Para ver una lista que incluye información sobre las variables, se emplea el comando whos. Por ejemplo

» a=rand(50,60); b=pi; c=single(a); 84; whos Name Size Bytes Class

a 50x60 24000 double array ans 1x1 8 double array b 1x1 8 double array c 50x60 12000 single array

Grand total is 6002 elements using 36016 bytes

24 El comando clc sólo deja en blanco la ventana de trabajo, pero no borra las variables de la memoria WS.

Page 66: Guía de Matlab

La primera columna de la lista contiene el nombre de la variable, la segunda su tamaño; la tercera el espacio que ocupa en WS, y la cuarta indica la clase de variable que es.Esta última columna nos dice que c es diferente de las demás variables, pues su precisión es sencilla, motivo por el cual ocupa sólo 12000 Bytes, en comparación con los 24000 de a. La frase del final nos dice que en total las matrices contienen 6002 elementos y ocupan una memoria virtual de 36016 bytes.La misma información puede verse en la ventana Workspace Browser, que se abre desde el menú FileShow Workspace, o bien escribiendo en la ventana de trabajo la palabra workspace.

Figura 2-11 Ventana Workspace BrowserEn esta ventana puede seleccionarse una variable haciendo click en su nombre. Luego puede borrarse del botón delete, o puede presionarse open para abrir una ventana desde la cual es posible ver y modificar la información contenida en la variable, en un entorno gráfico similar al de Excel. Para ampliar el tema se sugiere leer la ayuda doc workspace.

También es posible conocer directamente la clase de una variable X mediante el comando class(X). Por ejemplo» class(pi^3) %el argumento puede ser el resultado de un cálculoans =double

» class(c) % o bien: class(single(a))ans =single

2.5.2 Acerca de la precisión de los cálculosHemos dicho que en la notación científica un número se expresa como ba 10* . Una representación de un número en la forma , donde es un número real tal

que y es un entero, se dice que es la notación científica normalizada para el

número . Ahora bien, los computadores utilizan normalmente en sus cálculos el sistema binario en lugar del decimal, y entonces la notación científica adopta la forma . El

Page 67: Guía de Matlab

número se denomina mantisa y el entero exponente. En un ordenador binario tanto como estarán representados como números en base 2. Puesto que la mantisa está

normalizada, en la representación binaria empleada se cumplirá que .

Los computadores construidos en un sistema binario, emplean esta notación científica normalizada para realizar sus cálculos, y en el proceso deben realizar ciertas aproximaciones, de modo que los números ocupen un tamaño determinado. La manera como se ataca el problema de las aproximaciones, define si un número es flotante o si es de punto fijo, y también radica allí la veradera distinción entre los números de precisión doble y sencilla. Una discusión más profunda sobre estos temas queda fuera del alacance de esta guía, pero puede consultarse en http://www.uv.es/~diaz/mn/node11.html.

2.5.3 Cadenas de caracteresPor “caracter” entendemos cada uno de los símbolos que pueden escribirse utilizando un teclado, y aún algunos más. Las letras, los números, los signos de puntuación, e incluso un espacio son algunos ejemplos de caracteres. Una cadena de caracteres (en inglés string) no es más que un conjunto ordenado de caracteres, tal como una palabra o una frase.Los computadores disponen generalmente de un código especial para introducir la mayoría de los caracteres, llamado código ASCII. En este código, a cada caracter le corresponde un número especial, y pueden escribirse éstos en varios procesadores de texto comoAlt + CODIGOEs decir, para escribir el caracter con el código 64, se escribe este número en el teclado numérico manteniendo presionada la tecla Alt. Cabe resaltar que las mayúsculas y minúsculas poseen diferentes códigos, al igual que las vocales con y sin tilde.

Para Matlab, una cadena de caracteres no es más que un vector cuyos elementos son caracteres. Para dar a entender que se están escribiendo caracteres, éstos se encierran entre apróstrofes. Por ejemplo

» a='Esta es una cadena de caracteres.'a =Esta es una cadena de caracteres.» ['Obsérvese que los corchetes angulares son opcionales']ans =Obsérvese que los corchetes angulares son opcionales» c='¿Puede leerlo?'c =¿Puede leerlo?

Observemos el operador ' no está transponiendo una matriz, sino abriendo y cerrando el espacio dentro del cual va la cadena de caracteres.Para probar que en cada caso se trata de un vector para el cual cada caracter corresponde a un elemento, hallamos su transpuesta escribiendo» c' %El espacio es también un caracterans =¿Pued

Page 68: Guía de Matlab

e leerlo?

Este tipo de variables son llamadas char por Matlab, así que

» class(c)ans =char

Además, el resultado (o argumento de salida) de la función class en sí mismo una cadena de caracteres, de modo que

» class(class(8))ans =char

Entendidas como vectores, la manipulación variables tipo char es sencilla, y bastante similar a la ya vista.

» s=c([1 2 4 end-1 end-3 end])s =¿Peor?

» length(c) %el resultado es un número "double"ans = 14

Si se desea almacenar caracteres en una matriz, debe tenerse presente que cada caracter es un elemento, así que cada fila o columna debe tener igual cantidad de caracteres. Por esta misma razón, separar los elementos por espacios es inútil. Por ejemplo

» A=['mire' 'el'; 'problema']??? All rows in the bracketed expression must have the same number of columns.

Este error se produce porque la primera fila 'mireel' no tiene tantos elementos como la segunda 'problema'. En efecto

» length(['mire' 'el'])ans = 6» length(['problema'])ans = 8

Para evitarlo podemos simplemente colocar espacios para completar los elementos necesarios. Estos espacios son también caracteres y deben ir entre ' .» A=['mire ' 'el '; 'problema']A =mire el problema

Page 69: Guía de Matlab

Y puesto que A es una matriz, se cumple25

» size(A) %A tiene un tamaño definidoans = 2 8» A(1,2)='%' %Pueden modificarse sus elementosA =m%re el problema

Esto significa que el resultado del ejemplo 2-15 es aplicable a vectores que contienen cadenas de caracteres. Por ejemplo

» clear all; a='Primer Vector'; b='vector 2';

» s=min(length(a),length(b))s = 8

» X=[a(1:s); b(1:s)]X =Primer Vvector 2

» c=X(:)'c =Pvreicmteorr V2

Después de este procedimiento, el comando whos reporta las variables» whos Name Size Bytes Class

X 2x8 32 char array a 1x13 26 char array b 1x8 16 char array c 1x16 32 char array s 1x1 8 double array

Grand total is 54 elements using 114 bytes

Cuando una cadena de caracteres se suma a un número, Matlab reemplaza cada caracter por su correspondiente código ASCII. Por ejemplo» b+0ans = 118 101 99 116 111 114 32 50

Esto significa que “v” puede escribirse como Alt+118, “2” como Alt+50, y así sucesivamente. Algunas veces esto puede servir para deducir el código ASCII de un carácter desconocido, como lo ilustra el ejemplo 2-16.

La concatenación es válida cuando las variables implicadas son todas de la misma clase, pero cuando se intentan combinar en una matriz variables char y variables numéricas, los números en estas últimas se interpretan como el código ASCII cuando esto es posible. De lo contrario se produce un error. Por ejemplo, si tenemos

25 También es posible borrar algunos caracteres igualándolos a la matriz vacía. Además, puede invertirse una frase almacenada en w, escribiendo w(end:-1:1)

Page 70: Guía de Matlab

» a='magic(3)' %no estamos creando una matriz mágicaa =magic(3)

Intentamos colocar el número 120 en la segunda posición de esta cadena de caracteres, escribiendo

» a(2)=120a =mxgic(3)

Donde la “a” se cambió por una “x” puesto que 120 es el código ASCII de este caracter

Para ver el caracter que se obtiene a partir de un número puede utilizarse la función char, cuyas ayudas debe consultar el lector. Si lo que se desea es convertir un una variable numérica en una cadena de caracteres, se emplea para ello la función num2str.Por ejemplo» num2str([4 3; pi 2])ans = 4 33.1416 2

» class(ans)ans =char

También se deja al lector la consulta de las ayudas respectivas.

Ejemplo 2-16En programación es frecuente utilizar los operadores lógicos “y” y “ó”, que en Matlab se escriben respectivamente “&” y “|”. Encontrar el código ASCII de estos operadores.

SoluciónPuesto que en alguna ayuda han de encontrarse estos operadores, podremos copiarlos de allí y almacenarlos en una variable tipo char, a la cual le sumaremos el número cero para ver su código ASCII.Ya que en inglés estos operadores lógicos se llaman respectivamente “and” y “or”, podría usarse el comando lookfor para encontrar las ayudas respectivas en Matlab. Sin embargo, son tantos los resultados para estos casos, que es preferible explorar los temas de ayuda. Entre estos temas, el que nos interesa ahora es help ops (que contiene ayuda sobre los operadores de Matlab), y en él encontramos los operadores lógicos “and” y “or”.Ahora pedimos ayuda sobre cada uno

» help and

& Logical AND. A & B is a matrix whose elements are 1's where both A and B have non-zero elements, and 0's where either has a zero element. A and B must have the same dimensions unless one is a scalar. C = AND(A,B) is called for the syntax 'A & B' when A or B is an object.

» help or

Page 71: Guía de Matlab

| Logical OR. A | B is a matrix whose elements are 1's where either A or B has a non-zero element, and 0's where both have zero elements. A and B must have the same dimensions unless one is a scalar. C = OR(A,B) is called for the syntax 'A | B' when A or B is an object. See also XOR.

Seleccionamos los operadores necesarios con el puntero, y copiamos cada uno con EditCopy, o bien presionando Ctrl+c.Los pegamos con EditPaste, o bien con Ctrl+v para formar la línea

» t=['&' '|']t =&|

Sumando cero a este vector, encontraremos sus códigos ASCII

» t+0ans = 38 124

Así, hemos encontrado los operadores lógicos para “y” y “ó”, que son respectivamente “&” y “|”; y pueden escribirse en el teclado presionando Alt+38 y Alt+124. La operación inversa, la obtención de un caracter dado su código ASCII, es realizada por una función llamada char, así que

» char(ans)ans =&|

Esto concluye el ejemplo.

Ejemplo 2-17Codificación de mensajes.La guerra ha comenzado y a usted se le asigna la misión de encriptar mensajes usando Matlab para evitar que su enemigo los entienda, al menos por un tiempo. ¿Qué haría?.

SoluciónObservemos que a cada caracter en un mensaje le corresponde un código ASCII. Si logramos modificar este código de una manera que sólo nosotros conozcamos, habremos encriptado satisfactoriamente el mensaje.

Para hacerlo comenzamos almacenando el mensaje como vector fila en una variable char, que llamaremos M. Cuando realizamos una operación entre esta variable y un número, Matlab toma el código ASCII correspondiente a cada caracter en ella, así que podemos modificar estos códigos simplemente realizando alguna operación con M. Deseamos que los números que resulten de esta operación sean los códigos de otros caracteres.Así, si nuestro mensaje es

M='La invasión se aproxima';

Page 72: Guía de Matlab

Procedemos a multiplicarlo por 2 y a sumarle 1, para obtener

» 2*M+1ans = Columns 1 through 12 153 195 65 211 221 237 195 231 211 487 221 65 Columns 13 through 23 231 203 65 195 225 229 223 241 211 219 195

Nos valemos del comando char para convertir estos nuevos códigos ASCII en sus caracteres correspondientes. El mensaje así encriptado lo almacenamos en la variable Cripta» Cripta=char(2*M+1)Cripta =™ÃAÓÝíÃçÓçÝAçËAÃáåßñÓÛÃ

Este es el mensaje que interceptaría el enemigo. El receptor puede restituir el mensaje original aplicando la operación inversa a los nuevos códigos.

Para restituirlo, hemos de restarle 1 y dividir entre 2 el resultado

» R=char((Cripta-1)/2)R =La invasión se aproxima

Esto concluye el ejemplo.

Como se verá más adelante, algunas veces es conveniente guardar instrucciones para Matlab en una variable tipo char. Para ello debe tenerse presente que lo que en ella se almacene, debe poder ser leído por Matlab sin que se produzcan errores. Por ejemplo, escribimos

» a0='1+3' %no se evalúa la sumaa0 =1+3

» a='clear all' %no se ejecuta la instrucción, sólo son caracteresa =clear all

» b='[1:3:10]'% los corchetes aquí son también caracteresb =[1:3:10]

» c='m=3/4' %Contiene la instrucción de crear mc =m=3/4

» d='pi-*3' %Aquí se ha copiado un errord =a-*3

Page 73: Guía de Matlab

El comando eval permite evaluar estas expresiones, es decir, ejecuta las instrucciones que se indican en la cadena de caracteres.Entonces podemos escribir

» eval(a0)ans = 4

» k=eval(b)k = 1 4 7 10

» eval(c)m = 0.75» eval(d) %se produce el error esperado??? pi-* |Missing variable or function.

» eval(a) %Borra todas las variables, incluso a

Este comando también puede usarse con variables que ya existen, por ejemplo

» t=0:10; eval('t.^2')ans = 0 1 4 9 16 25 36 49 64 81 100

Si t no existiera, se produciría el error que ya conocemos.

El comando eval puede también usarse para evaluar simultáneamente varias expresiones contenidas en una misma cadena de caracteres, como en

» eval(['x=3; y=4, z=x-1'])%El primer resultado no se muestra por el ;y = 4z = 2

Puesto que ' abre y cierra las cadenas de caracteres, nos preguntamos por la forma de indicar la transposición de una matriz. La manera de hacerlo consiste simplemente en colocar dos apóstrofes consecutivas (''), que Matlab leerá como una, sin cerrar la cadena de caracteres. Así

» eval('[1 i-1 0]''+3')ans = 4 7 3

Nótese que las expresiones eval('t') y eval(t) son conceptualmente diferentes. Si tenemos t='sin(pi)', entonces la primera equivale a escribir t y presionar Enter en la ventana de trabajo, mientras en el segundo caso Matlab ejecuta la cadena de caracteres que contiene la variable t. Así, encontramos

» eval('t')t =

Page 74: Guía de Matlab

sin(pi)

» eval(t)ans = 1.2246e-016

Finalmente, observamos que eval es una función que puede tener dos argumentos de entrada, los cuales se separan por comas. Así, eval(x,y) evalúa la expresión en x, y si ésta produce un error, entonces evalúa la expresión en y. Por ejemplo, si tenemos

» a=magic(2);

Entonces a sólo tiene cuatro elementos, de modo que se produce un error si intentamos

» eval('a(5)')??? Index exceeds matrix dimensions.

Pero si escribimos

» eval('a(5)','a(4)')ans = 2

Matlab detecta este error e intenta ejecutar la segunda expresión. Se recomienda ahora revisar la ayuda doc eval.

2.5.4 Objetos inlineUna manera breve de crear ciertas funciones sencillas en las que para un valor dado se evalúa una breve expresión, es almacenar estas expresiones como objetos inline. Dichos objetos representan un tipo muy especial de funciones que pueden escribirse en la ventana de trabajo, sin necesidad de almacenarlas en un archivo. Se trata de una clase particular de variables cuya manipulación, aunque sencilla, no está del todo basada en la notación matricial, siendo más bien análoga a la notación para funciones que se usa en Cálculo.

Para crear uno de estos objetos, se emplea el comando inline, que se escribe como G=inline(expresión). Dicha expresión debe ser una cadena de caracteres (string), esto es, una variable tipo char. Esto significa que toda variable t para la que se copie inline(t) debe pertenecer a la clase char. El argumento de salida de este comando, es una variable del tipo inline. Algunos ejemplos son

» F=inline('8*x-3/x') %Crea una función de x, válida para escalaresF = Inline function: F(x) = 8*x-3/x

» G=inline('sin(y.^2)') %Crea una función de y, válida para vectoresG = Inline function: G(y) = sin(y.^2)

» H=inline('pi') %Una función constante, x es la variable por defectoH = Inline function: H(x) = pi

Page 75: Guía de Matlab

» inline('t-3') %Convierte temporalmente ans en un objeto inlineans = Inline function: ans(t) = t-3

» Entero=inline('round(H)') %Aquí H es diferente de la variable del WSEntero = Inline function: Entero(H) = round(H)

» whos Name Size Bytes Class

Entero 1x1 832 inline object F 1x1 830 inline object G 1x1 834 inline object H 1x1 820 inline object ans 1x1 822 inline object

Grand total is 194 elements using 4138 bytes

El parecido con la notación de funciones en cálculo se extiende también a su uso.

» F(1) %reemplaza x por 1 y evalúaans = 5

» H(inf) %H es constante, no importa lo que se reemplaceans = 3.1416» G(magic(2)) %Reemplaza en G una matrizans = 0.84147 0.41212 -0.2879 -0.7568

Nótese que aquí F(1) no indica el primer elemento de F, lo que muestra que la notación matricial no es directamente aplicable a un objeto inline.

La razón de que G sea útil para vectores o matrices, y no así F, radica en que la expresión inline del primero contiene el operador .^, que es la exponenciación elemento a elemento; en tanto que F emplea la división /, que en este contexto es sólo aplicable a escalares. Esto muestra que la manera de proceder cuando se evalúa una expresión almacenada como objeto inline, es reemplazar en ella sus variables por los valores indicados. Así, cuando se escribe F(a), se sustituye en x en la en la expresión por el valor que indica a, y luego es como si se copiara esta expresión en una línea y se presionara Enter. Por lo tanto, las expresiones que se almacenen de esta manera pueden involucrar cualquier comando de Matlab que se pueda invocar desde la ventana de trabajo.

Uno de los rasgos distintivos de un objeto inline es que las variables que maneja son internas, y por lo tanto diferentes de aquellas que se encuentran en el WS. Así, la variable clase inline que hemos llamado Entero, contiene una expresión escrita en términos de cierta variable interna llamada H, pero con este mismo nombre estamos almacenando en la memoria WS otro objeto inline independiente. Dado que las variables

Page 76: Guía de Matlab

de una función inline no emplean la memoria virtual WS, no se produce confusión y es posible manipular Entero sin que se superpongan ambas variables, la interna y la externa. Dicho de otro modo, H es la manera como hemos llamado al argumento de entrada de una función inline almacenada el nombre Entero, y decimos que es su variable interna; pero otro H es también el nombre de una variable del WS (que en este caso en particular contiene otro objeto inline), sin que ambas se superpongan en modo alguno. Esta es la principal diferencia entre evaluar una expresión char con la función eval, y hacerlo creándola como una variable inline, pues, como ya vimos, en el primer caso se utilizan las mismas variables almacenadas en WS, mientras en el segundo se toman estos nombres como variables internas e indepentidentes. Por ejemplo, si se tiene

» x=3; s='x^3-2';

Entonces eval(s) reemplaza x por 3 y ejecuta, obteniendo

» eval(s)ans = 25

Lo que significa que utiliza para la “x” en s el valor de la variable x que se encuentra en la memoria WS. En cambio, si se tiene

x=3; s=inline('x^3-2');

Entonces la “x” que aparece en s es una variable interna, completamente independiente de la x en la memoria WS, pudiéndose escribir

» s(0), s(inf), s(x)ans = -2ans = Infans = 25

La composición de funciones creadas como objetos inline no representa mayores problemas si lo que se desea es evaluar ciertos puntos de la función compuesta

. Por ejemplo

» G(F(1)) %equivale a G(5)ans = -0.13235

» Entero(H(5)) %equivale a Entero(pi)ans = 3

En síntesis, el comando inline crea una función que maneja variables internas, a las que llamamos argumentos de entrada. Evaluar un objeto inline para un argumento de entrada corresponde a sustituir este argumento en la variable interna de ese objeto. Puede pensare en ello como tener una expresión tipo char que se va a evaluar con eval, y en la que un caracter en especial (la variable interna), se reemplaza cada vez por un valor distinto (el argumento de entrada), sin que se creen nunca variables adicionales en WS.

Page 77: Guía de Matlab

Hemos dicho “variables internas”, porque un objeto inline puede manejar simultáneamente varios argumentos de entrada. Por ejemplo

» s=inline('max(x,y)-x^2+y^2')s = Inline function: s(x,y) = max(x,y)-x^2+y^2

» s(5,3)ans = -11

El teorema de Pitágoras para el espacio tridimensional queda

» Pitagoras=inline('sqrt(a^2+b^2+c^2)')Pitagoras = Inline function: Pitagoras(a,b,c) = sqrt(a^2+b^2+c^2)

» Pitagoras(3,4,5)ans = 7.0711

» M=inline('a1-a2')M = Inline function: M(a1,a2) = a1-a2

Aquí es evidente que importa el orden en que se escriban los argumentos de entrada del objeto inline, siendo diferentes M(5,3) y M(3,5). En los casos anteriores no especificamos el orden en que debían escribirse las variables, por lo que se dispusieron en orden alfabético. Para definir otro orden se coloca un segundo argumento de entrada durante la creación del objeto inline, así:

» Pitagoras2=inline('sqrt(a^2+b^2+c^2)','c','b','a')Pitagoras2 = Inline function: Pitagoras2(c,b,a) = sqrt(a^2+b^2+c^2)

Observemos que es posible (aunque no muy útil) crear un objeto inline anidado, tal como

» h=inline('inline(t)')h = Inline function: h(t) = inline(t)

Entonces, cuando t es una cadena de caracteres que indica una instrucción, h(t) definirá un objeto inline que la evalúe.

» t='sin(1./x)';

» f=h(t)f = Inline function: f(x) = sin(1./x)

Page 78: Guía de Matlab

» f(0) %límite divergenteWarning: Divide by zero.> In C:\MATLABR11\toolbox\matlab\funfun\@inline\subsref.m at line 25ans = NaN

En este último aviso nos dice además que los objetos inline son creados por archivos que están en la carpeta funfun (funciones de funciones), la cual tiene su propio tema de ayuda (help funfun) que puede revisar el lector.

Adicionalmente, observemos que los argumentos con que se llama inline no son necesariamente números. Por ejemplo, la función idéntica ( ) puede crearse como

» Idem=inline('e')Idem = Inline function: Idem(e) = e

» Idem(5)ans = 5

Pero entonces también se aplica a caracteres

» Idem('caracter')ans =caracter

» class(ans)ans =char

Notemos tabíen que se generan errores cuando se especifican inadecuadamente las variables de un objeto inline

» ss=inline('x^2','a','b','c')ss = Inline function: ss(a,b,c) = x^2

» ss(2,3,4) %Nunca se reemplaza x??? Error using ==> inline/subsrefError in inline expression ==> x^2??? Undefined function or variable 'x'.

Ahora nos preguntamos por lo que sucede cuando se suma un número a un objeto inline

» s+1??? Error using ==> +Function '+' not defined for variables of class 'inline'.

Como vemos, la suma no está definida para estas variables. Lo mismo sucede con las demás operaciones matemáticas elementales.

Page 79: Guía de Matlab

La conversión de una cadena de caracteres almacenada en una variable a uno de estos objetos se realiza sin complicaciones, siendo incluso válido almacenar el nuevo objeto inline en una variable con el mismo nombre que originalmente contenía la cadena de caracteres. Esto se entiende fácilmente si recordamos la analogía planteada entre una variable y una caja.

» campana_gauss='exp(-x.*x)' %Cadena de caracterescampana_gauss =exp(-x.*x)

» class(campana_gauss) %Comprobamos la clase de variable que esans =char

» campana_gauss=inline(campana_gauss) %Redefinimos la variablecampana_gauss = Inline function: campana_gauss(x) = exp(-x.*x)

» class(campana_gauss) %Ahora es un objeto inlineans =inline

El proceso contrario, la obtención de una cadena de caracteres a partir de un objeto inline, se realiza aplicando a este último el comando char.

» s=inline('i*x') %la unidad imaginaria no se reconoce como variables = Inline function: s(x) = i*x

» w=char(s) %Se convierte la función en una cadena de caracteresw =i*x

» class(w)ans =char

En algunas ocasiones se requiere saber cuáles son las variables internas de un objeto inline, o de una expresión guardada como una cadena de caracteres. Una forma de hacerlo es a través del comando symvar

» cuadratica=inline('a*x^2+b*x+c','x','a','b','c');

» variables=symvar(cuadratica)variables = 'x' 'a' 'b' 'c'» symvar('j*sin(x-a)') %No reconoce la unidad imaginariaans = 'a' 'x'» class(variables) %Otra clase de variableans =cell

Page 80: Guía de Matlab

Como vemos, el argumento de salida de symvar pertenece a otra clase de variable, llamada cell (Sección 2.5.6). También notamos que las variables se retornan en el orden requerido cuando symvar se aplica a un objeto inline, y en orden alfabético cuando se trata de objetos char.

Ejemplo 2-18Dadas dos funciones inline almacenadas como f y g, mostrar una manrea de crear la función suma h=f+g como objeto inline con los argumentos de entrada dispuestos alfabéticamente.Verificar para las funciones

.

SoluciónIntentaremos resolver el problema para las funciones dadas y de una manera general, tal que el mismo método resulte aplicable a cualquier par de funciones.Comenzamos por crear las funciones que vamos a sumar. Obsérvese que en este caso en particular, es necesario definir el orden de los argumentos de entrada, así que escribimos

» f=inline('rand(1)+x*cos(a)','x','a');» g=inline('3-x+y+3*x*y*z','z','y','x');

La función que queremos obtener es

El problema se origina porque no podemos simplemente escribir h=f+g, ya que la suma no está definida para esta clase de variables, y escribirlo da lugar al error

» f+g??? Error using ==> +Function '+' not defined for variables of class 'inline'.

En cambio, observemos podríamos crear directamente la función h escribiendo

h=inline('rand(1)+x*cos(a)+3-x+y+3*x*y*z')

Pero debido a que la expresión escrita representa una variable tipo char, es también posible formarla por concatenación de varias cadenas de caracteres. Así, podemos crear h en varios pasos escribiendo

» a='rand(1)+x*cos(a)';» b='3-x+y+3*x*y*z';» t=[a '+' b] %Se "suman" las ecuacionest =rand(1)+x*cos(a)+3-x+y+3*x*y*z

» h=inline(t)h = Inline function: h(a,x,y,z) = rand(1)+x*cos(a)+3-x+y+3*x*y*z

Pero a es la cadena de caracteres correspondiente a f, por lo que puede obtenerse escriendo

Page 81: Guía de Matlab

» a=char(f)a =rand(1)+x*cos(a)

Análogamente,

» b=char(g)b =3-x+y+3*x*y*z

Con lo que queda resuelto el ejercicio. Sin embargo, podemos realizar el mismo procedimiento en menos pasos escribiendo

» t=[char(f) '+' char(g)];» h=inline(t);

Y aún en una sola línea, si se escribe

» h=inline([char(f) '+' char(g)])h = Inline function: h(a,x,y,z) = rand(1)+x*cos(a)+3-x+y+3*x*y*z

Que es una solución más elegante y compacta para el problema planteado.

Ejemplo 2-19Generación de los puntos de una curva en dos dimensiones utilizando una función inline.

SoluciónMás adelante veremos que la gráfica de una curva bidimensional en Matlab se realiza uniendo por segmentos de recta los puntos consecutivos cuyas coordenadas se encuentran en dos vectores, X e Y (el nombre de estos vectores es indistinto). Cuando existe una función explícita y=f(x) que genera los puntos de la curva, entonces Y puede escribirse como una función inline, que se evalúa para cada vector X dado.

En este ejemplo, denotemos por al mayor entero que es menor que el número real . Intentaremos construir la gráfica de la función

, para .

Primero debemos almacenar en un vector X todos los puntos de este intervalo que deseamos considerar; cuantos más puntos se tomen, tanto mejor es la gráfica de la curva. Para ello podríamos escribir X=[-5:0.01:5], pero en esta ocasión haremos algo diferente. La instrucción X=linspace(a,b,n) crear un vector fila X que contiene n elementos igualmente espaciados en el intervalo [a b], siempre que sea a<b. Tomando 100 puntos de nuestro intervalo, escribimos

» X=linspace(-5,5,100);

Ahora almacenaremos en y una función inline que nos de el punto para cada en X. El comando de Matlab que calcula es floor(x). Por ejemplo

Page 82: Guía de Matlab

» floor([pi -1.1 5.9 1.1 1/2 -4/9])ans = 3 -2 5 1 0 -1

Así que este comando formará parte de la expresión de nuestra función inline, de modo que creamos

» y=inline('floor(t.^2)+sin(t)')%Nótese que se coloca .^ y no ^y = Inline function: y(t) = floor(t.^2)+sin(t)

Puesto que y se puede usar con vectores, calculamos las coordenadas de los 100 puntos como

» Y=y(X);

La gráfica se crea simplemente con plot(X,Y)

Ejemplo 2-20

Crear como objeto inline la función

Solución

Recordemos que la letra griega pi se utiliza como abreviación de una serie de multiplcaciones (productoria), análoga a la sumatoria. Así, tememos

. En particular, (Siempre que sea

)

En la sección 2.4.4 se vió que una manera de escribir una sumatoria en Matlab consiste en crear primero un vector con todos los elementos a ser sumados, y luego aplicarle a éste el comando sum. Si en este procedimiento utilizamos prod en lugar de sum, entonces se obtiene la productoria de los elementos del vector. Por lo tanto, puede escribirse como prod(1:n), siempre que sea .

Para expresar de este modo la multiplicatoria pedida, observemos primero que el índice toma los valores 0, 1, 2, 3, 4 y 5; que se abrevian en un vector como [0:5]. A cada

elemento en este vector hemos de restarle 1 y el resultado se resta de , quedando el vector x-([0:5]-1). Éste es el vector que contiene los valores de los elementos de la productoria, de suerte que sólo resta aplicarle el comando prod. Así, hemos encontrado que

prod(x-([0:5]-1))

Ahora que sabemos cómo se escribe la productoria, procedemos a crear la función que la contiene, valíendonos del comando inline. Si y es la variable que ha de contener esta función, entonces la creamos escribiendo

» y=inline('prod(x-([0:5]-1))')y =

Page 83: Guía de Matlab

Inline function: y(x) = prod(x-([0:5]-1))

Observemos que, por la forma como se ha definido la función, x está limitado a valores escalares, o eventualmente a un vector fila de 6 elementos (que tiene el mismo tamaño que 0:5). En efecto, se llega a un error cuando se intenta

» y([1 2])??? Error using ==> inline/subsrefError in inline expression ==> prod(x-([0:5]-1))??? Error using ==> -Matrix dimensions must agree.

Podemos ver algunos de sus valores en una especie de tabla almacenándolos en una matriz formada por concatenación, escribiendo

» VALORES=[-5:5; y(-5) y(-4) y(-3) y(-2) y(-1) ...y(0) y(1) y(2) y(3) y(4) y(5)]'VALORES = -5 60480 -4 20160 -3 5040 -2 720 -1 0 0 0 1 0 2 0 3 0 4 0 5 720

Nótese que aquí x no está limitado a valores enteros, ni aún reales. Por ejemplo

» y(pi*i)ans = 1730.44779670308 - 2213.68478917688i

En el capítulo tercero veremos una forma de hacer que Matlab evalúe esta función para un gran número de valores.

2.5.5 Variables simbólicasLas variables simbólicas descritas en esta sección representan la clase de variable más cercana a aquellas que se tratan normalmente en el Cálculo. La creación y manipulación de estos símbolos es posible gracias a un paquete de herramientas incluidas en Matlab, llamado Symbolic Math Toolbox. En este paquete se incluyen comandos que permiten realizar analíticamente operaciones como la integración y derivación; solucionar sistemas de ecuaciones (incluidas ecuaciones diferenciales); factorizar, simplificar, o desarrollar expresiones algebraicas; evaluar funciones especiales; y obtener transformadas de Laplace y Fourier, entre otros. El lector puede consultar una lista de estas aplicaciones en la ayuda help toolbox\symbolic.Aunque el paquete de matemática simbólica permite realizar fácilmente una gran diversidad de cálculos, el precio a pagar por ello es un mayor consumo de tiempo en cada operación que involucre variables simbólicas. Comoquiera que la utilidad de recurrir a un computador para que efectúe cálculos por nosotros radica ante todo en la posibilidad de reducir considerablemente el tiempo que toma realizarlos, debe procurar

Page 84: Guía de Matlab

evitarse el uso de tales variables en los programas destinados a procesar grandes cantidades de datos.

Para crear una variable simbólica nos valemos del comando sym, mediante el cual un símbolo o variable matemática se almacena en una variable (en el sentido utilizado en programación). Cuando el argumento de entrada de sym es del tipo char, el resultado es un número o variable simbólica. Si el argumento es un número o matriz escalar, el resultado es una representación simbólica de los valores numéricos dados.Así, la instrucción

» a=sym('x') %Nótese que el argumento de "sym" es del tipo chara =x

Almacena a el símbolo matemático x en la variable a. Además

» class(a) % "a" es una variable simbólicaans =sym

» x % "x" no existe??? Undefined function or variable 'x'.» h=sym([1 3 5; pi -1 0])h =[ 1, 3, 5][ pi, -1, 0]

» h.^2ans =[ 1, 9, 25][ pi^2, 1, 0]

Podemos considerar también que la variable “a” contiene una función derivable (la función idéntica), a partir de la cual pueden formarse muchas otras funciones. Por ejemplo

» y=a^2y =x^2

» z=a^2/(1-a)z =x^2/(1-x)

Estas son también variables que contienen funciones, y puesto que la mayoría de las funciones matemáticas elementales están también incluidas en el paquete de matemática simbólica, podemos también escribir

» w=sin(a)-exp(1/a)w =sin(x)-exp(1/x)

» M=abs(y)-atan(z)M =abs(x)^2-atan(x^2/(1-x))

Page 85: Guía de Matlab

El comando pretty permite visualizar estas expresiones (que se encuentran en lenguaje de programación) en su equivalente notación matemática. Se invita al lector a probar las siguientes instrucciones: pretty(M), pretty(w), pretty(h).

Para evitar confusiones, normalmente deseamos que el símbolo creado se almacene en una variable homónima. Para nuestros siguientes ejemplos nos serviremos de s y t, que podemos crear así:

clear all; s= sym('s'); t= sym('t');

Pero por llamarse igual en cada caso el símbolo y la variable que contiene, el comando syms permite crearlas de manera abreviada. Para ello se separan sus nombres mediante espacios, así

» syms s t

» whos % Nótese que las variables sym ocupan más memoria que las demás Name Size Bytes Class

s 1x1 126 sym object t 1x1 126 sym object

Grand total is 4 elements using 252 bytes

Ahora creemos las funciones

» A=t-(sin(t)^2+cos(t)^2)A =t-sin(t)^2-cos(t)^2

» B=exp(t)*exp(2*t+1)B =exp(t)*exp(2*t+1)

» C=(s+t)*sin(abs(s-t))C =(s+t)*sin(abs(-s+t))

» D=s^3-s^2-s+1D =s^3-s^2-s+1

Haremos algunos cálculos con ellas. Comencemos por utilizar simple para simplificar cada una de ellas26:

» A=simple(A)A =t-1

» B=simple(B)B =exp(3*t+1)

» C=simple(C)C =

26 La simplificación de estas expresiones se basa en una especie de proceso de ensayo y error en el que se prueban varias simplificaciones y al final se elige la mejor. Para ver la lista de estos ensayos, no almacene el resultado en una variable.

Page 86: Guía de Matlab

(s+t)*sin(abs(-s+t))

» D=simple(D)D =s^3-s^2-s+1

Si deseamos saber los símbolos que contiene la variable C, escribimos27

» findsym(C) % Devuelve los símbolos en Cans =s, t

» class(ans) % El resultado es una cadena de caracteresans =char

Utilizamos subs para sustituir realizar sustituciones en una variable simbólica, por ejemplo

» subs(A,t,0) % Reemplaza "t" por "0"ans = -1» subs(A,s,0) % "A" no contiene "s", no sucede nadaans =t-1» subs(A,5.1) % Reemplaza el símbolo en "A" por "5.1"ans = 4.1

» class(ans)ans =double

También es válido reemplazar un símbolo por la expresión simbólica almacenada en otra variable, de suerte que la composición de dos funciones - o bien - se escribe subs(F,t,G), donde F, G y t son variables de Matlab, y t es contiene el símbolo en F que se va a sustituir por el contenido de G. Por ejemplo:

» subs(A,t,5*t^2)ans =5*t^2-1

» subs(B,t,A)ans =exp(3*t-2)

» subs(C,s,1/s-t)ans =1/s*sin(abs(-1/s+2*t))

Para hacer sustituir varias variables simultáneamente, tanto sus nombres como sus contenidos se encierran entre llaves o entre corchetes y se separan por comas o por espacios. Por ejemplo» subs(C,[s t],[1 -2]) %sustituye s por 1 y t por -2ans =

27 Este comando devuelve el símbolo como tal, y no la variable que lo contiene, así que para a=sym('t'), findsym(a) devuelve t. Además nótese que la respuesta, para el caso de múltiples variables, se ordena alfabéticamente.

Page 87: Guía de Matlab

-0.141120008059867

» subs(C,[s, t],{1 -2})ans = -0.141120008059867

» subs(C,{s t},{1, -2})ans = -0.141120008059867

» subs(C,{s, t},[1, -2])ans = -0.141120008059867

La misma notación sirve para reemplazar unos símbolos por otros.

Para derivar una función de este tipo, empleamos el comando diff, con el cual puede calcularse la derivada n-ésima de una función F con respecto a una variable t, escribendo diff(F,t,n). Cuando n no se especifica, se asume igual a 1; si la variable no se especifica, se toma aquella que se encuentra de primera según findsym. Por ejemplo

» diff(D,s) %O también: diff(D)ans =3*s^2-2*s-1

» diff(D,3) %Tercera derivada de "D"ans =6

» diff(C,t) %Primera derivada con respecto a "t"ans =sin(abs(-s+t))+(s+t)*cos(abs(-s+t))*abs(1,-s+t)

La integración se logra con el comando int, donde la integral , se escribe

int(S,v,a,b). Si a y b no se especifican se obtiene una función primitiva de S; si v no se especifica, sucede igual que con diff. Cuando la integral no puede evaluarse directamente, se deja indicada o se expresa en términos de funciones especiales. Por ejemplo

» int(A,s)ans =(t-1)*s

» int(A,t)ans =1/2*t^2-t

» int(cos(t),0,pi)

» int(cos(t),0,s)ans =sin(s)

» M=int(exp(-t^2)) % erf es la función errorM =1/2*pi^(1/2)*erf(t)

Page 88: Guía de Matlab

» subs(M,6)ans = 0.886226925452758

Observemos también que las matrices pueden contener símbolos como elementos, por ejemplo

» S=[A B; C D]S =[ t-1, exp(3*t+1)][ (s+t)*sin(abs(-s+t)), s^3-s^2-s+1]

» d=simple(det(S))d =(s^3-s^2-s+1-exp(3*t+1)*sin(abs(-s+t)))*t-s^3+s^2+s-1-exp(3*t+1)*sin(abs(-s+t))*s

El manejo de estas matrices simbólicas es completamente análogo al de las ya estudiadas, pero debe tenerse cierto cuidado con los símbolos creados de esta manera ya que son por defecto número complejos. Así, si escribimos» S'ans =[ -1+conj(t), sin(abs(-s+t))*conj(s+t)][ exp(1+3*conj(t)), 1+conj(s^3-s^2-s)]

Obtenemos no sólo la transpuesta de la matriz, sino sus elementos conjugados, como lo indica la función conj. Para crear un objeto simbólico que represente un número real, se coloca esto como argumento adicional de las funciones sym ó syms, así

» syms n m real; f=sym('f','real');

La solución de ecuaciones o sistemas de ecuaciones se logra fácilmente con el comando solve, cuyo uso en profundidad, así como el de diff, int y dsolve se deja como consulta al lector. El ejemplo siguiente muestra cómo utilizar solve para resolver algunas ecuaciones:

Cabe hacer notar que en algunas sustituciones numéricas es posible que el resultado continúe siendo una variable sym, casos en los que conviene utlizarse eval para que se evalúen estas expresiones. Esto equivale a convertir una variable sym con sólo números, en su correspondiente número del tipo double.

Ejemplo 2-21Utilizando el comando solve, resolver las siguientes ecuaciones o sistemas de ecuaciones:a) b)

c)

Page 89: Guía de Matlab

Solucióna) Resolveremos la ecuación cuadrática respecto a x. Es evidente que existen dos soluciones analíticas, y ambas deben ser calculadas por solve. Para utlizar este comando, bien podríamos crear primero los símbolos involucrados en las ecuaciones, o escribir estas directamente en los argumentos como cadenas de caracteres28. Haciendo esto último, encontramos

» W=solve('a*x^2+b*x+c','x') % 'x' al final indica que se resuelve respecto a 'x'W =[ 1/2/a*(-b+(b^2-4*a*c)^(1/2))][ 1/2/a*(-b-(b^2-4*a*c)^(1/2))]

» class(W)ans =sym

b) Aquí la solución obtenida es numérica, pero la ecuación se copia de manera similiar

» solve('exp(x)=x-sin(x)+2') %el segundo argumento es aquí opcionalans =-2.5095147812379364096540276682961

» class(ans) %El resultado es aún simbólicoans =sym

c) Las tres ecuaciones se separan por comas, así como las variables en el orden en que se desea la solución. Debe haber tres argumentos de salida (uno por cada variable), y estos se colocan a la izquierda del igual, encerrados como un vector entre corchetes.

» [Y,X,Z]=solve('x^2+y^2+z^2=10','2*x-y*z=4','3*x+1=y','y','x','z');

Aquí el resultado es extenso, pues las operaciones se dejan indicadas y siguen siendo tipo sym, como verificamos escribiendo

» class(Y),class(X),class(Z)ans =symans =symans =sym

Como veremos a continuación, estas expresiones se convierten en números double evaluándolas con eval, así que la respuesta numérica la podemos hallar escribiendo

» Y=eval(Y)Y = 0.652318626380776

28 Si se copian las ecuaciones como símbolos, no van entre comillas y se ingresan despejadas, sin copiar “=0”.

Page 90: Guía de Matlab

0.106223568135152 -1.0126044305913 + 0.311612876116814i -1.0126044305913 - 0.311612876116814i

» X=eval(X)X = 2.95695587914233 1.31867070440546 -2.03781329177389 + 0.934838628350441i -2.03781329177389 - 0.934838628350441i

» Z=eval(Z)Z = -0.911532960721837 -2.87225070753154 2.55855850079336 + 0.867897748209717i 2.55855850079336 - 0.867897748209717i

Esto concluye el ejemplo.

Como acabamos de ver, en algunas ocasiones se presenta la necesidad de convertir un símbolo numérico a su equivalente número double. La manera de hacer esto es a través de la función eval, y el procedimiento funciona siempre que la expresión simbólica sólo contenga números, o de lo contrario puede producirce un error. El proceso contrario, la obtención de la versión simbólica de un número, se logra mediante el comando sym, y entonces no es necesario introducir el número como variable char. Por ejemplo

» a=sym(1/10) %Igual que sym('1/10')a =1/10

» class(a)ans =sym

De esta manera es posible evitar el error introducido en los cálculos numéricos, debidos a la limitada precisión del punto flotante. Podemos también redefinir temporalmente pi escribiendo

» pi=sym('pi')pi =pi

Para restaurar pi, podemos borrar la variable “pi” escribiendo

» clear pi %Restaura el valor numérico de pi

» pians = 3.14159265358979

» eval(a) % El resultado es del tipo "double"ans = 0.1

Page 91: Guía de Matlab

Si se desea ver un número con cierta cantidad de dígitos, entonces se emplea vpa. Por ejemplo

» vpa(pi,29) % pi con 29 dígitosans =3.1415926535897932384626433833

» vpa(sqrt(2),2) %La raíz de 2 con dos dígitosans =1.4

» class(ans) %El resultado es simbólicoans =sym

Se deja al lector la consulta de las ayudas respectivas, así como del comando digits, que se encuentra íntimamente realicionado con vpa. Aquí termina nuestro estudio introductorio de las variables simbólicas en Matlab. El lector debe tener presente que muchas de las funciones utilizadas en esta sección tienen una aplicación más general de lo que aquí se muestra, y es por ello que se le invita a consultar las ayudas respectivas.

2.5.6 Objetos tipo cellHasta ahora hemos tratado con diversas clases de variables, y hemos encontrado que todas ellas, salvo tal vez los objetos inline, aceptan una representación matricial. Sin embargo, el manejo matricial que hemos dado a estas variables tiene al menos estas dos limitaciones:

I) No es posible agrupar en una matriz más de una clase de variableII) Todos los elementos de una matriz son de tamaño unitario. Esto es, que un elemento no puede ser él mismo una matriz.

En esta sección estudiamos una nueva clase de variable: los arreglos rectangulares llamados cell.Los objetos tipo cell son una clase más general de matrices, y su importancia radica fundamentalmente en que no están sujetas a las limitaciones I y II. Así, por ejemplo, si A es un objeto cell de tamaño 2*2, entonces uno de sus elementos puede ser una matriz numérica de tamaño 5*3; otro una cadena de caracteres; un tercero, ser un objeto inline; e incluso un cuarto puede ser él mismo otro objeto tipo cell. Nótese que, aún cuando cada elemento pueda ser de tamaño y naturaleza diferente, es indispensable que cada fila posea igual cantidad de elementos, ya que se trata de arreglos rectangulares.

Los objetos cell pueden entenderse fácilmente como matrices, y para trabajar con ellos basta cambiar en la notación matricial precedente a los corchetes y paréntesis por las llaves “{ }”. Así, para crear un objeto cell, sus elementos se encierran entre llaves en lugar de corchetes; los elementos de una misma fila se separan por espacios o comas, y las filas mediante punto y coma. Por ejemplo

» A={1 3; -2 1} %Aquí cada elemento es una matriz double de 1*1A = [ 1] [3] [-2] [1]

» class(A)ans =cell

Page 92: Guía de Matlab

» size(A) %Esta función también funciona para objetos cellans = 2 2

Para que uno de los objetos sea una matriz, basta con encerrarlo entre corchetes

» B={'a' 3 1; [10 0 1;-3 -5 40] 4 3}B = 'a' [3] [1] [2x3 double] [4] [3]

Observemos que la matriz de 2*3 –que es tan grande como B- introducida se ha dejado indicada, lo cual se debe a que su forma y tamaño no la hace apta para mostrarla completa. Nótese que en B coinciden elementos double y char. Otros ejemplos son

» C={['abc;123'],eye(3),inline('x-sin(x)'),sym('w')} %Vector tipo cellC = 'abc;123' [3x3 double] [1x1 inline] [1x1 sym]

» D={rand(1,9); 1:5; {4 'x' -9}} %Vector columna tipo cellD = [1x9 double] [1x5 double] {1x3 cell }

En vista de que la finalidad de los arreglos cell es almacenar varios tipos de objetos, las operaciones matemáticas no están definidas para ellos; en efecto

» B+1??? Error using ==> +Function '+' not defined for variables of class 'cell'.

Como consecuencia, en esta sección estudiaremos únicamente la manipulación de los arreglos rectangulares y su contenido. Dos operaciones que sí son válidas son la transposición y la transjugación, como puede verificar el lector escribiendo C' y C.'.

Las mismas llaves que se emplean para crear objtetos cell, sirven para llamar a sus elementos, y gran parte de la notación matricial sigue siendo válida cambiando los paréntesis por llaves. Debe tenerse presente que cuando se escribe A{i,j}, se hace referencia al objeto que se encuentra en esa posición dentro de la estructura cell, y este objeto tiene su propia clase y tamaño. Por ejemplo

» A{2,1} %Segunda fila, primera columnaans = -2

» class(ans)ans =double

» C{2}ans = 1 0 0 0 1 0 0 0 1

Page 93: Guía de Matlab

El operador dos puntos tiene los usos ya vistos, pero el resultado a menudo no puede almacenarse en una sola variable. Por ejemplo

» B{2,:} %Segunda fila, todos los elementosans = 10 0 1 -3 -5 40ans = 4ans = 3

» B{:} %Todos los elementos de Bans =aans = 10 0 1 -3 -5 40ans = 3ans = 4ans = 1ans = 3

Aquí sucedió que, no siendo posible almacenar objetos de tan distinta naturaleza en una sola variable que no sea tipo cell29, éstos se han mostrado en varias variables. Por esta misma razón, se produce un error al escribir

» H=B{2,:}??? Illegal right hand side in assignment. Too many elements.

Si lo que se desea es aislar algunos elementos de una variable cell en otra, se usan paréntesis en lugar de corchetes. Por ejemplo

» H=B(2,:) %Segunda fila, tomada como "cell"H = [2x3 double] [4] [3]

» class(H)ans =cell

» W=D([2 3]) %Segundo y tercer elemento en "D"W = [1x5 double] {1x3 cell }

» class(W) %El resultado sigue siendo cellans =cell

29 En realidad, es posible almacenarlos también en ontras variables, pertenecientes a la clase struct (estructuras), las cuales se usan a menudo para almacenar bases de datos.

Page 94: Guía de Matlab

En realidad, la la notación A(i,j) cuando A pertenece a esta clase, hace referencia a un nuevo arreglo cell, formado con los elementos de A en las posiciones que indican i y j.

Cuando varios elementos de un objeto cell son de igual clase y tamaño, es posible almacenarlos en una matriz agrupándolos entre corchetes. Esta matriz se está formando por concatenación de los elementos de objeto tipo cell, y es por lo tanto válida la notación ya estudiada. Así, si tenemos

» S={eye(2),magic(2), rand(2); 'este es tipo char',zeros(2), ones(2)}S = [2x2 double] [2x2 double] [2x2 double] 'este es tipo char' [2x2 double] [2x2 double]

Podemos aislar los elementos tipo double en S, escribiendo

» S{[1 3:6]} %elementos 1º y 3º a 6ºans = 1 0 0 1ans = 1 3 4 2ans = 0 0 0 0ans = 0.444703364353194 0.791937037427035 0.615432348100095 0.921812970744803ans = 1 1 1 1

De modo que si agrupamos esta expresión entre corchetes, se crea la matriz

» K=[S{[1 3:6]}] %Los corchetes van fuera de las llavesK = Columns 1 through 3 1 0 1 0 1 4 Columns 4 through 6 3 0 0 2 0 0 Columns 7 through 9 0.444703364353194 0.791937037427035 1 0.615432348100095 0.921812970744803 1 Column 10 1 1» size(K),class(K)ans = 2 10ans =double

Page 95: Guía de Matlab

Esto mismo es válido siempre que cada elemento considerado sea del mismo tipo y su tamaño sea tal que puedan concatenarse; por ejemplo, dos vectores fila clase char pueden concatenarse de varias formas para originar distintas matrices

» [S{2};S{2}] % El ; separa dos filasans =este es tipo chareste es tipo char

» [S{2} ' - ' S{2}] %Concatenación en un vector filaans =este es tipo char - este es tipo char

En este último caso se interpuso la cadena de caracteres “ - ” entre ambos vectores.

La notación matricial de los objetos cell permite aislar el elemento en una posición, y utlizarlo para hacer otras operaciones. Por ejemplo, si tenemos

» F={inline('x^3-y^2'),magic(3); single([-8 0; pi 1/3]), sym('w')}F = [1x1 inline] [3x3 double] [2x2 single] [1x1 sym ]

Entonces podemos ailsar en R el elemento tipo inline escribiendo

» R=F{1}R = Inline function: R(x,y) = x^3-y^2

Y habremos creado una variable inline que puede manejarse como ya vimos

» R(2,3) %Reemplaza x=2, y=3ans = -1

Existe sin embargo una forma directa de evaluar la expresión inline contenida en F. Observemos que para evaluar esta expresión, hemos escrito R(2,3), pero resulta que a su vez es R=F{1}, por lo que podemos resumir estas dos instrucciones como

» F{1}(2,3)ans = -1

Donde vemos que primero se hace referencia al elemento inline como miembro de la estructura cell, y luego de ubicarlo se escribe lo que de él se requiere. Del mismo modo, la tercera columna de la matriz double en F{1,2} puede ailarse y transponerse en dos pasos escribiendo

» aa=F{1,2}aa = 8 1 6 3 5 7 4 9 2

» aa(:,3)'ans = 6 7 2

Page 96: Guía de Matlab

O en un paso escribiendo

» F{1,2}(:,3)' %O bien: F{3}(:,3)' ; (F{3}(:,3))'ans = 6 7 2

Y asímismo, un objeto simbólico puede crearse con el último elemento de F, escribiendo

» t=F{end}t =w

» y=t^2-int(log(t^2))y =w^2-log(w^2)*w+2*w

O en un paso, puesto que t=F{end}, escribimos

» y=F{end}^2-int(log(F{end}^2))y =w^2-log(w^2)*w+2*w

» class(y)ans =sym

Y como ya mencionamos antes, un objeto cell puede contener como elemento a otro objeto cell, de manera que si tenemos

» clear all; AA={4,{5 9; -1 {'fin'}}}AA = [4] {2x2 cell}

Podemos ir llamando sucesivamente sus elementos para transponer la cadena de caracteres, escribiendo

» a1=AA{2}a1 = [ 5] [ 9] [-1] {1x1 cell}

» a2=a1{4}a2 = 'fin'

» a3=a2{1}a3 =fin

» a4=a3'a4 =fin

Proceso en el que hemos creado las siguientes variables variables» whos

Page 97: Guía de Matlab

Name Size Bytes Class

AA 1x2 682 cell array a1 2x2 490 cell array a2 1x1 98 cell array a3 1x3 6 char array a4 3x1 6 char array

Grand total is 35 elements using 1282 bytes

Para hacer todo esto en un solo paso, bastaría con escribir

» a4=AA{2}{4}{1}'a4 =fin

Lo cual se hace ya que a4=a3', pero a3=a2{1}, y a su vez a2=a1{4}, que se obtiene como a1=AA{2}.

Con esta sencilla notación, es fácil redefinir un elemento de un objeto cell de modo análogo a como se hacía con las matrices. Por ejemplo, para cambiar el primer elemento de AA por la matriz mágica de tamaño 3, se escribe

» AA{1}=magic(3)AA = [3x3 double] {2x2 cell}

Y si se desea multiplicar por 5 la primera fila de esta matriz en AA{1}, se escribe

» AA{1}(1,:)=5*AA{1}(1,:)AA = [3x3 double] {2x2 cell}

Para reemplazar el elemento la cadena de caracteres 'fin' por su transpuesta, podría escribirse AA{2}{4}{1}=a4, o directamente

» AA{2}{4}{1}=AA{2}{4}{1}'AA = [3x3 double] {2x2 cell}

Operación que se verifica escribiendo

» AA{2}{4}{1}ans =fin

En cambio, la modificación de más de un elemento contiene complicaciones adicionales, ya que se produce un error cuando intentamos

» AA{1,:}=0??? Insufficient outputs from right hand side to satisfy comma separated list expansion on left hand side. Missing [] are the most likely cause.

Page 98: Guía de Matlab

Error que persiste cuando se colocan los corchetes que allí se sugieren. Dejaremos esta operación para cuando se halla visto la concatenación de arreglos cell

La concatenación de un arreglo cell es posible en Matlab, pero no es tan sencilla como las que ya se han estudiado. Antes, si teníamos la matriz

» A=[1:4; -4 2 0 0]A = 1 2 3 4 -4 2 0 0

Podíamos añadir una columna de cuatros escribiendo

» A=[A [4 4]']A = 1 2 3 4 4 -4 2 0 0 4

Sin que el uso de unos corchetes dentro de otros ocasionara inconvenientes. Esto era posible porque todos los elementos en A debían ser de tamaño unitario, y entonces el vector [4 4]' no podía interpretarse como un solo elemento, sino como los dos elementos de toda una columna. En cambio, cuando se trata de un objeto cell, este vector representa sólo un elemento, a menos que se indique lo contrario. De este modo, si sedeamos introducir la cadena columna {'más'; 1e+3} en la variable

» a={zeros(2), 'otro', inline('2^x')}a = [2x2 double] 'otro' [1x1 inline]

No podemos simplemente escribir

» a={a {'más'; 1e+3}}a = {2x2 cell} {2x1 cell}

Ya que cada uno de los dos términos se considera entonces como un elemento tipo cell. En efecto

» a{:}ans = [2x2 double] [ 3] 'otro' [1x1 inline]ans = 'más' [1000]

Sin embargo, recordemos que existe una forma alternativa de concatenar matrices, la cual estudiamos junto con la expansión escalar. En esta otra notación, siempre se especificaban las posiciones de la matriz que debían ser modificadas. Así, otra forma de concatenar A, sería

» A(:,5)=[4 4]' %Define el contenido de la quinta columnaA = 1 2 3 4 4 -4 2 0 0 4

Page 99: Guía de Matlab

Pero esta es justamente la notación que se requiere para concatenar objetos cell, ya que no deja dudas respecto qué es lo que se está definiendo (un elemento, o una columna, por ejemplo). Por lo tanto, la manera correcta de añadir esta tercera columna en a es

» a(:,3)={'más'; 1e+3} %define la tercera columnaa = [2x2 double] [ 3] 'más' 'otro' [1x1 inline] [1000]

Donde se ve que deben usarse siempre paréntesis en lugar de corchetes, pues se hace referencia al objeto cell como tal, y no a su contenido.

Nótse que las expresiones a{2} y a(2) son conceptualmente diferentes: las llaves hacen referencia al conenido de esa posición, sin tener en cuenta el arreglo al que pertenece, mientras que los paréntesis indican un subarreglo cell que se forma a partir del elemento en la segunda posición de a . Así, cuando escribimos

» a{2}ans =otro

El resultado es una variable char, que estaba contenida en la segunda casilla de a. Por el contrario, escribiendo

» a(2)ans = 'otro'

Se crea unl sub-arreglo cell que consiste en el segundo elemento de a.

Por esta razón, cuando se empleen paréntesis a la izquierda del igual para encerrar los subíndices de lo que se va a redefinir, aquello que se ubique a la derecha del igual debe ser un objeto cell. Por ejemplo, para cambiar el primer elemento en a por un 5, podríamos escribir a{1}=5. Pero si en lugar de llaves se usaran paréntesis, obtendríamos el error

» a(1)=5??? Conversion to cell from double is not possible.

Ya que “5” no es tipo cell, sino double. Debe pues escribirse este número como objeto cell, así

» a(1)={5} %Encerrarlo entre llaves lo hace tipo cella = [ 5] [ 3] 'más' 'otro' [1x1 inline] [1000]

De este modo, una expansión escalar de a sería

» a(3,1)={0}a = [ 5] [ 3] 'más' 'otro' [1x1 inline] [1000] [ 0] [] []

Page 100: Guía de Matlab

Donde se aprecia que en lugar de rellenarse con ceros, los objetos cell se completan con matrices vacías.

Esta nueva notación que emplea paréntesis en lugar de llaves es precisamente la que sirve para redefinir varios elementos de una sola vez, porque con ella damos a entender que se modifica el sub-arreglo cell A(i,j).

Por ejemplo, redifinimos la primera fila de a para que conste de matrices vacías escribiendo

» a(1,:)={[]} %Recuerde encerrar el elemento entre corchetesa = [] [] [] 'otro' [1x1 inline] [1000] [ 0] [] []

Los elementos en las posiciones 2, 3 y 4 se obtienen en una estrucutura cell mediante la expresión

» a([3 2 1],[1 2]) % Filas 3, 2, 1; Columnas 1,2ans = [ 0] [] 'otro' [1x1 inline] [] []

Para copiar el contenido de elementos en las posiciones 2, 5, y 7 en las posiciones 1, 4 y 9 se utilizan paréntesis, quedando la operación

» a([1 4 9])=a([2 5 7])a = 'otro' [1x1 inline] [] 'otro' [1x1 inline] [1000] [] [] []

Para redefinir la tercera fila, escribimos algo como

» a(3,:)={sym('y') nan -i*inf}a = Inf 'otro' [1x1 inline] [] 'otro' [1x1 inline] [ 1000] [1x1 sym] [ NaN] Inf [NaN -i]

Resultado que se ve algo confuso, pero que se ratifica con el tamaño de a

» size(a)ans = 3 3

Ahora que hemos visto el manejo de estos arreglos rectangulares, podemos manipular el argumento de salida del comandodo symvar. Por ejemplo, sea

» clear all, s=inline('(a1^2-a2^3)/(x+y)*exp(1+c*z)')s = Inline function: s(a1,a2,c,x,y,z) = (a1^2-a2^3)/(x+y)*exp(1+c*z)

Page 101: Guía de Matlab

» v=symvar(s)' %El resultado es un vector cell con elementos charv = 'a1' 'a2' 'c' 'x' 'y' 'z'

Formaremos por concatenación una función inline F que exprese la suma de los elementos en v. Para ello, observemos que dichos elementos son variables char, y como tales pueden concatenarse con otros caracteres en un vector fila, agrupándolos con corchetes. El vector resultant se convierte de char a inline de la manera que ya se ha visto.Para obtener el elemento i-ésimo en v, se escribe v{i}; el caracter “+” se escribe '+'. Por lo tanto, tenemos

» F=inline([v{1} '+' v{2} '+' v{3} '+' v{4} '+' v{5} '+' v{6}])F = Inline function: F(a1,a2,c,x,y,z) = a1+a2+c+x+y+z

Alternativamente, la concatenación pudo llevarse a cabo paso a paso en una variable intermedia G, así

» G=v{1}; %Primero se inicia G, y luego se va aumentando

» G=[G '+' v{2}]; G=[G '+' v{3}];G=[G '+' v{4}] ...;G=[G '+' v{5}];G=[G '+' v{6}]G =a1+a2+c+x+y+z

Finalmente se obtiene F a partir de la cadena de caracteres G» F=inline(G)F = Inline function: F(a1,a2,c,x,y,z) = a1+a2+c+x+y+z

Esta última forma es en realidad la más importante, pues se presta para ser realizada en un programa mediante cierto procedimiento iterativo llamado ciclo, como se verá en el siguiente capítulo.

Page 102: Guía de Matlab

2.6 Algunos comandos para graficar

Matlab es un Software que cuyas aplicaciones se enmarcan en tres grandes ejes, que son:

Programación: posibilidad de hacer cálculos numéricos, así como de crear y ejecutar algoritmos e incorporarlos como funciones.

Gráficas: incluye visualización de datos, presentación de gráficas y creación de entornos gráficos interactivos (GUI).

Interfaz con otros lenguajes de programación: interoperabilidad, extensibilidad. (Por ejemplo, se acopla con FORTRAN y C).

Hasta este momento sólo hemos operado a Matlab en virtud de la posibilidad que brinda para hacer cálculos. La creación de nuevas funciones es un tema del capítulo tercero, y en esta sección principia el estudio de un tema que será tratado en el capítulo cuarto: la creación de gráficas.La creación de gráficas y animaciones constituye una de las aplicaciones más importantes y acogedoras de Matlab, y en esta sección nos tratatremos con algunos comandos que permiten representar la información gráficamente la información. Matlab provee una variedad de funciones para anotar para visualizar los datos almacenados en vectores, así como funciones para hacer anotaciones en estas gráficas e imprimirlas; aquí aprenderemos tanto comandos para trazar curvas paramétricas en el plano y en el espacio (y aún superficies), así como comandos que sirven para etiquetar ejesm, colocar títulos, y demás anotaciones que suelen hacerse en las gráficas.El lector interesado puede ampliar estos temas revisando las ayudas correspondientes a los comandos listados en help matlab\graph2d, help matlab\graph3d y help matlab\specgraph. En particular, se recomienda la lectura del tutorial Using MATLAB Graphics , incluído en los vínculos de la ventana help desk.

2.6.1 El comando plotComenzamos nuestro estudio con las curvas bidimensionales, las cuales se construyen con plot a partir de los datos contenidos en vectores. Si se desea graficar una curva bidimensional de esta manera, primero se generan varios puntos de la misma y sus coordenadas se almacenan en dos vectores. Por ejemplo, supóngase que queremos graficar la función . Entonces creamos primero un vector con las abscisas de los puntos que se desean considerar. Por ejemplo, este vector puede ser

»A=linspace(-pi,2*pi,300);%Vector fila con 300 puntos entre -pi y 2*pi

Puesto que cada ordenada está relacionada con los elementos de A por la ecuación , el vector correspondiente se genera como

» B=sin(A);

Para crear una gráfica sencilla, basta entonces con escribir» plot(A,B)

Entonces se abre una nueva ventana titulada Figure No.1 que contiene unos ejes (llamados axes) en un fondo blanco, y dentro de los cuales se ubica una línea azul continua que representa la gráfica de la función para , tal como se aprecia en la Figura 2-12.

Page 103: Guía de Matlab

Acerca de la figura creada, podemos hacer las siguientes observaciones: Se ha abierto una nueva ventana, que dice contener una figura (figure). Esta

ventana tiene su propio menú y barra de herramientas, y su fondo es gris. En la ventana se encuentra una región blanca (axes) la cual contiene la gráfica

como tal. La línea (line) que representa los puntos indicados por los vectores, es de color

azul y de trazo continuo. Además no tiene un marcador (marker) que indique cuáles fueron estos puntos (por ejemplo, estrellas, cuadrados, puntos gruesos …)

Los ejes no están etiquetados, no existe cuadrícula, y tampoco título. Los límites inferior y superior del eje vertical están ceñidos a la curva. Esto

significa que corresponden a min(B) y max(B), respectivamente (en este caso -1 y +1).

Los límites inferior y superior del eje horizontal no están ceñidos a la curva, sino que se encuentran en los números enteros correspondientes a floor(min(A)) y ceil(max(A)). (En este caso -4 y +8)

El tamaño relativo de los ejes se ha escalado, alterando la apariencia real de la curva. Para este caso en particular, el trazo vertical de -4 a 1 mide lo mismo que el horizontal entre -4 y 8; es decir, este trazo se ha amplificado en un factor de

Page 104: Guía de Matlab

12/5. (Lo que significa que doce unidades del eje x miden lo mismo que 5 del eje y)

kjh

Page 105: Guía de Matlab

2.3 M-FilesLos archivos Tipo M contienen código en el lenguaje de Matlab, es decir, son archivos que contienen algoritmos aptos para ser ejecutados por Matlab. Estos archivos pueden crearse usando cualquier editor de texto y guardándolos con extensión *.m (por ejemplo, en el bloc de notas), siempre y cuando los comandos estén en el sencillo lenguaje de programación de Matlab. Existen dos clases sustancialmente diferentes de Archivos M: scripts (guiones) y funciones. Para explicar la diferencia entre ambos, haremos primero una reflexión acerca de las variables y el WS.Hemos dicho que cuando se realizan tareas desde la ventana de trabajo, las variables se creadas se almacenan en la memoria virtual WS. Ahora bien, este no es necesariamente el caso cuando se utiliza un archivo M. En tal caso, puede suceder que el algoritmo allí contenido utilice las mismas variables que se han creado desde la ventana de trabajo, o incluso que este cree nuevas variables en el WS las cuales pueden manipularse entonces desde la ventana de trabajo. Diremos entonces que se trata de un archivo script, y el resultado neto de ejecutar el programa es equivalente a copiar las mismas líneas correctamente separadas por comas (o punto y coma) en la ventana command window. Por otra parte, podría suceder que el archivo M utilizara sus propias variables por fuera del WS, y entonces no podríamos modificarlas desde la ventana de trabajo. Aún más, si existiera la variable en esta ventana, y el archivo M contuviese la instrucción

, entonces ambas variables serían en efecto distintas, y tras correr el programa del archivo M, aún encontraríamos , es decir, que la variable ha permanecido inalterada. Esta situación es la que se presenta con las funciones, las cuales pueden considerarse como cajas negras con argumentos de entrada y salida, de alguna manera independientes de la ventana command window.Hecha esta distinción, trataremos cada uno de ellos por separado.

2.2.1 Archivos ScriptEn un sentido estricto, puede decirse que son archivos que no aceptan argumentos de entrada ni poseen argumentos de salida, operando con los datos del WS. Al igual que las funciones, para crearlos basta con ir al Menú FileNewM-File. Entonces se abre el Editor de Matlab y se procede a escribir allí el algoritmo tal y como se haría en la ventana command window, con la diferencia de que ahora puede directamente cualquier línea, ya que presionar Enter no ejecuta las líneas. En cambio, es necesario grabar estos archivos para poder ejecutarlos. La extensión comúnmente utilizada es *.m