Fractales con MATLAB®
Benjamín Dugnol Álvarez
[email protected]
Departamento de Matemáticas Universidad de Oviedo
Notas para uso de los alumnos de DAO (en construcción) Oviedo, Noviembre de 2000
1
CONTENIDO: Capítulo 0
Primer contacto con MATLAB Capítulo 1
Vectores y matrices en MATLAB Capítulo 2
Los tipos de datos en MATLAB Capítulo 3
Programación Capítulo 4
Gráficos 2D Capítulo 5
Gráficos 3D Capítulo 6
Interfaces gráficas de usuario (GUI)
2
Capítulo 0. Primer contacto con MATLAB Contenido: 0.1 Introducción 0.2 Tipos de datos fundamentales en MATLAB 0.3 El espacio de trabajo de MATLAB 0.4 Cálculos elementales con MATLAB 0.5 Utilización de funciones elementales pre-definidas 0.6 Manejo de ficheros 0.7 Resumen
3
0.1 Introducción.El MATLAB® es una herramienta interactiva y abierta para computación científica, programación y visualización de datos, desarrollada por The MathWorks, Inc. Originalmente, este sistema fué escrito por Cleve Moler, en 1980, en la Universidad de Mexico, en lenguaje Fortran: El objetivo perseguido era mejorar el interfaz de usuario con la librería de subrutinas LINPACK La versión actual está escrita en lenguaje C por The MathWorks Inc. Además de la herramianta principal (el MATLAB), este sistema está complementado por numerosas ‘Toolbox’, que lo especializan en diversos dominios de trabajo, desde el cálculo simbólico hasta el proceso de señales y de imágenes, pasando por las finanzas. Bajo Windows 95/98/NT, el programa se arranca desde la correspondiente ventana del menú Inicio, mostrando a continuación un ambiente gráfico denominado Ventana de Comandos de MATLAB. Aunque éste es el entorno habitual de trabajo, es posible construir interfaces gráficas de usuario (GUI), que permiten integrar la ejecución de múltiples tareas. Un ejemplo es la ventana MATLAB demos (Figura 2). La versión 5 contiene más de 500 funciones que son ejecutadas por medio de comandos. El entorno es abierto, entre otras razones, porque muchas de estas funciones se
Figura 1
integran en el sistema por medio de ficheros de texto, técnicamente denominados ficherosm. Por otra parte, el usuario puede construir sus propios ficheros-m, eventualmente agrupados en nuevos toolbox, añadiendo así nuevas funciones a las ya existentes,
4
convirtiendo la herramienta en un entorno de trabajo mejor adaptado a las necesidades del utilizador. Como acabamos de sugerir, algunas funciones de MATLAB no están soportadas por correspondientes ficheros-m: son funciones internas, incluidas en el kernel de MATLAB. Una de estas funciones responde al comando help, que proporciona ayuda en línea, y puede tener como argumentos a) cualquier otra función; b) un subdirectorio o ninguno. En este último caso muestra una serie de tópicos, clasificando los comandos de
Figura 2
Figura 3
5
acuerdo con su finalidad, lo que se consigue agrupando dichos comandos en un mismo subdirectorio. Naturalmente, podemos incluir help como argumento de help (Figura 3). El resultado es, como esperábamos, una explicación de la utilidad del comando help como ayuda en línea, junto con los argumentos que, eventualmente, pueden acompañarle. Es conveniente decir que lo que hace el comando help es leer las líneas de comentario que encabezan los ficheros-m, devolviéndolas como respuesta a la ventana de comandos de MATLAB. De esta forma, si nuestros propios ficheros-m requieren explicación sobre su finalidad e instrucciones de uso, el texto correspondiente deberá ser incluido como cabecera en aquellos, haciendo preceder en cada línea (de comentario) el carácter %. En la Figura 4 se muestra el fichero-m del comando help. Como se trata de una función interna, sólo contiene líneas de comentario. Otro procedimiento para obtener información es lookfor , que debe llevar como argumento una cadena de caracteres, y devuelve a la ventana de comandos de MATLAB una lista con todos los ficheros-m cuyas líneas de comentario (de cabecera) contienen a la citada cadena de caracteres. La Figura 5 muestra la respuesta de lookfor cuando se utiliza con el argumento wavelets. Es importante destacar que MATLAB es sensible al uso de mayúsculas o minúsculas. En general, los comandos se denominan mediante una cadena de caracteres que puede incluir letras (minúsculas) y números (no el primer carácter). El fichero-m correspondiente debe tener un nombre construido con la cadena que identifica al comando
Figura 4 con la extensión ‘.m’.
6
Figura 5 El abandono del programa MATLAB se puede hacer con los comandos exit , quit o abriendo el menú desplegable File y ejecutando la orden Exit MATLAB. Cuando se desea interrumpir una tarea antes de su término, se hace con la combinación ctrl-C.
0.2 Tipos de datos fundamentales en MATLAB Cuando se ejecuta el comando help datatypes , la respuesta es una lista de los comandos relacionados con todos tipos de datos y de las estructuras que se pueden manejar en MATLAB. En la versión 5.2 existen siete clases fundamentales de datos: double, sparse, char , cell, struct, uint8, inline
Estas clases no son sino diferentes formas de guardar información. Por el momento hablaremos de dos de ellas, que son double y char . La clase double es adecuada para representar cantidades numéricas, que pueden ser números enteros o racionales. Obsérvese que, a diferencia de lo que ocurre en FORTRAN y otros lenguajes de programación, para los enteros no se hace uso de una clase de datos diferenciada. La equivalencia es la de doble precisión en FORTRAN. Además de identificar clases de datos, double y char son órdenes de MATLAB que sirven para convertir los datos de una clase a otra, como veremos más adelante. Existen tres parámetros que gobiernan la precisión del trabajo numérico de MATLAB:
7
realmin
La más pequeña cantidad de punto flotante normalizada.
realmax La más grande cantidad de punto flotante normalizada. eps
Precisión relativa de punto flotante
2.2251e-308 1.7977e+308 2.2204e-016
Es posible obtener cantidades más pequeñas que realmin y más grandes que realmax, pero no se consideran numéricamente estables (normas IEEE). La cantidad eps se utiliza como tolerancia por defecto en diversas funciones de MATLAB. Con independencia de la representación interna de cada cantidad, se puede seleccionar el formato de visualización mediante el comando format, que permite, entre otras posibilidades, ver 4 dígitos después del punto decimal (format short, que es la opción por defecto), 15 dígitos (format long) o dos dígitos después del punto decimal (format bank). Para cantidades muy grandes o muy pequeñas, la opción e fuerza la aparición de la notación exponencial (format short e, format long e). La clase char se usa para almacenar cadenas de caracteres. Antes de seguir, conviene subrayar un concepto fundamental. La denominación MATLAB es un acrónimo de MATrix LABoratory. De aquí podríamos deducir que esta herramienta trabaja bien con matrices. Sin embargo, hay algo más: TODAS las clases de datos están organizadas como matrices. Por ejemplo, incluso en el caso de manejar una cantidad numérica, estamos manejando una matriz de una fila y una columna.
Figura 6
8
La introducción de valores en variables double o char se efectúa atribuyéndoles un nombre y, eventualmente, por asignación. Para construir el nombre de una variable se escribe una cadena de caracteres, letras minúsculas y mayúsculas y números, evitando comenzar por un número:
» cantidad=22.5 cantidad = 22.5000 » palabra='contenido del dato palabra' palabra = contenido del dato palabra Como es habitual en otros lenguajes, los valores de las cadenas de caracteres se entrecomillan. En la sección siguiente veremos cómo MATLAB almacena, durante el tiempo que dure la sesión de trabajo, los nombres y los valores de estas variables. El conjunto de caracteres válidos para construir nombres de variables incluye el carácter ‘_’. Como en la mayoría de los lenguajes de programación, en MATLAB existe un cierto número de nombres reservados, que caracterizan funciones o valores uso frecuente. En el párrafo 2 se ha hecho referencia a realmin, realmax y eps, y la tabla que sigue muestra otros nombres especiales que no deben ser usados como nombres de variables. Esta tabla no agota dichos nombres, entre otras razones porque faltan los nombres de las funciones de MATLAB.
9
Nombre reservado
Significado
Valor
pi
El número real π
3.1416
inf
infinito
∞
NaN
Not a Number
date
Fecha actual en formato dd-mmm-aaaa
clock
Fecha y hora actual en forma de vector
now
Fecha y hora actual en forma de cantidad numérica
i y j
Números complejos
nargin
Número de argumentos de entrada de una función
nargout
Número de argumentos de salida de una función
√ -1
Si a y b son la parte real e imaginaria del complejo z, se puede escribir indisstintamente z=a+bi o z=a+b*i.
0.3 El espacio de trabajo de MATLAB En cada sesión de MATLAB, queda almacenada en una parcela de memoria temporal la sucesión de líneas de comando en el orden en que son ejecutadas, junto con los nombre de los diferentes tipos de datos (variables) que se utilizan durante la sesión, con su correspondiente valor. Las funciones que precisan argumentos, deben obtener su valor mediante transferencia al ser ejecutadas o bien desde esta parcela de memoria del sistema que se denomina espacio de trabajo de MATLAB. Por ejemplo, considerando la sesión en la que introducimos las variables cantidad y palabra, podemos obtener el contenido del espacio de trabajo (a) ejecutando las órdenes whos, para nombres de variables y valor de las mismas), who, para denominaciones de variables solamente, y
10
(b) pulsando repetidamente la tecla (↑), para obtener los comandos sucesivos ejecutados durante la sesión, que se convierten, de este modo, en líneas editables. Además, no debemos olvidar la utilidad del portapapeles de Windows, que se puede usar en la ventana
Figura 7 de comandos de MATLAB. La orden clear permite borrar las variables (y sus contenidos) del espacio de trabajo. Si añadimos como argumento el nombre de una lista de variables, sólo esta lista resulta borrada. La orden clear all debe manejarse con mucha precaución. La orden save nombredesesión, guarda el espacio de trabajo en el disco, en un formato binario especial de MATLAB, con la extensión .mat, siendo el nombre por defecto matlab.mat. Una sesión guardada de esta forma, se puede cargar en el espacio de trabajo mediante la orden load seguida del nombre del correspondiente fichero .mat. Es posible, por otra parte, especificar los nombres de las variables que interesen, de forma que el resto se perderán al terminar la sesión. Finalmente mencionaremos que es posible hacer uso de formatos alternativos a los .mat (Para obtener más información, ejecútense las órdenes help save y help load) y ver la sección 0.6. Análogamente, la orden diary on almacena todas las líneas de comando emitidas a lo largo del desarrollo de una sesión, así como la mayor parte de los resultados obtenidos en el fichero de texto de nombre diary. Las sesiones sucesivas se añaden unas a continuación de otras. Esta observación es importante para la eventualidad de necesitar la ayuda de otro usuario con el fin de localizar la fuente de un error en una tarea de terminada, ya que es posible remitir la secuencia de líneas de comando a través de un correo electrónico. La orden diary off desactiva la escritura en el fichero, cuyo nombre es susceptible de ser cambiado.
11
0.4 Cálculos elementales con MATLAB Las operaciones elementales suma, multiplicación, división y cálculo de exponenciales, funcionan en principio con los símbolos a que estamos acostumbrados en otros lenguajes: Operación
Expresión en MATLAB
Suma
x+y
Diferencia
x-y
Multiplicación
x*y
División por la izquierda
x/y
División por la derecha
x\y
Expresión exponencial
x^y
En ausencia de paréntesis de asociación, la tabla siguiente muestra las prioridades de los distintos operadores en MATLAB: Prioridad
Operador
1
Paréntesis de asociación
2
Expresión exponencial, de izquierda a derecha
3
Multiplicación y división, de izquierda a derecha
4
Adición y sustracci
12
Por ejemplo, para determinar la superficie comprendida entre un cuadrado de lado la=2 y la circunferencia inscrita, podríamos escribir:
Figura 8
» area_e=la*la; » area_i=pi*(la/2)^2; » area_f=area_e-area_i area_f = 0.8584 Observamos la presencia del signo (;) a continuación de las dos primeras líneas. Esto impide que el sistema devuelva el resultado de cada operación, en este caso los valores de area_e y area_i. En la tercera línea de comando no aparece el signo (;), situación que provoca la aparición en pantalla del resultado area_f. Cuando se realiza una operación sin almacenar el resultado en una variable, éste aparece asociado con la variable genérica ans (contracción de answer). Sin embargo, las cosas no son (afortunadamente) tan sencillas en MATLAB. En el párrafo 2 pusimos de manifiesto que todas las clases de datos están organizadas como matrices, razón por la cual veremos que aparecen nuevas posibilidades cuando los cálculos se realizan sobre estructuras matriciales que no son 1x1.
13
0.5 Utilización de funciones elementales pre-definidas MATLAB contiene una colección de funciones pre-definidas que reciben argumentos reales o complejos. Estas funciones también se pueden utilizar con matrices, pero su funcionamiento es tan particular en este caso, que resulta preferible hacer un análisis separado. Función pre-definida
Tarea
abs(x)
Valor absoluto de x o módulo de x
angle(x)
Argumento de número (complejo) x
asin(x)
Arco del argumento cuyo seno vales x
asinh(x)
Inversa del seno hiperbólico de x
ceil(x)
Redondea el valor de x hacia +infinito.
conj(x)
Conjugado del número (complejo) x
cos(x)
Coseno de x (función circular)
erf(x)
Función de error
exp(x)
Valor de la exponencial de x
fix(x)
Redondea el valor de x hacia cero
floor(x)
Redondea el valor de x hacia -infinito
imag(x)
Parte imaginaria del número (complejo) x
log(x)
Logaritmo (neperiano) de x
real(x)
Parte real del número (complejo) x
round(x)
Redondea el valor de x hacia el entero más próximo
sign(x)
Igual a 1 si x>0, cero si x=0, -1 si x