1
MATLAB MATLAB es un entorno de programación que combina cálculo numérico, creación y visualización de gráficos y un lenguaje de programación de alto nivel orientado al cálculo matricial, su más potente aplicación. La biblioteca de funciones incorporadas de MATLAB es muy extensa e incluye, además, herramientas de cálculo específicas llamados Toolboxes; entre otras, dos especialmente útiles: disttool, un entorno gráfico que representa la función de distribución de densidad o la función de distribución acumulada de varias funciones de distribución de uso frecuente en Estadística y randtool, un potente generador de números aleatorios. Los cálculos pueden efectuarse directamente desde el teclado, como si de una calculadora de bolsillo se tratara, o bien mediante programas. Las prestaciones de MATLAB son muy numerosas y completas, sin embargo, por razones de espacio y tiempo lo que sigue es un resumen forzosamente limitado a los comandos y operaciones más frecuentes. Quienes, movidos por la curiosidad o la motivación, deseen profundizar más en el manejo de MATLAB deberán consultar la Guía del Usuario (un grueso volumen) o la ayuda incorporada (“Help”) del programa mismo. 1 CONCEPTOS BÁSICOS MATLAB funciona desde WINDOWS en los ordenadores PC compatibles del laboratorio de Astrofísica y en el aula de Informática de la Facultad. Para ponerlo en marcha se activa el correspondiente icono en el administrador de programas (hay un acceso directo), se abre entonces una ventana llamada Ventana de Comandos en la que se teclean los comandos. En la parte superior de la ventana aparece un menú con las cinco opciones: File, Edit, Options, Windows y Help algunas de cuyas funciones tienen un significado similar al de otros programas (abrir y cerrar ficheros de programas, cortar, copiar pegar, etc.); otras se comentarán a lo largo de este texto y todas ellas las debe explorar el lector. Aquellos lectores que se enfrenten por primera vez a MATLAB encontrarán especialmente interesantes los comandos intro y demo. Si escribimos “intro” y pulsamos ↵ se activa una demostración de las posibilidades generales del programa, en la que pantalla a pantalla se explican los conceptos básicos y característicos de MATLAB y nos dará, por tanto, una visión global y rápida (dura sólo unos pocos minutos) que contribuirá a entender mejor el programa. La opción demo son demostraciones sobre temas muy concretos de MATLAB (trazado de gráficos, operaciones con matrices, funciones especiales, etc.). Se accede a ellas escribiendo demo ↵ y siguiendo las instrucciones que aparecen en pantalla. En general: Los comandos se ejecutan escribiendo su nombre en la línea de comandos (señalada con el símbolo ») y pulsando ↵ a continuación. Veamos ahora unas cuantas normas generales: 1.- Los comandos MATLAB se escriben siempre con minúsculas. 2.- Los nombres de las variables se pueden escribir con mayúsculas o minúsculas, pero las entiende como diferentes, es decir, temp y Temp serían dos variables diferentes que pueden albergar valores distintos. 1
2
3.- La asignación de valores a las variables de tipo escalar (los vectores y matrices se comentarán más adelante) se hace de la forma: nombre-de-variable = valor-numérico[;]. Los corchetes ([ ]) indican que el signo “;” es optativo; si no se escribe “;”se repite en pantalla el nombre y valor de la variable (eco de pantalla). 4.- Unidad de trabajo. Con frecuencia necesitaremos leer datos de (o escribir resultados en) un fichero externo; conviene, por tanto, tener activada permanentemente la unidad de trabajo (a:, c:, etc.) que será aquella donde se encuentren los datos (o donde se desee guardar los resultados). Esto se hace con el comando cd u:\subdirectorio: donde u: es la unidad. Si no se efectúa esta operación el directorio de trabajo es: C:\MATLAB\BIN, que no debemos utilizar para nuestros trabajos. 5.- Contenido del directorio de trabajo. Usaremos el comando: dir dir *.dat o dir a*.*
y aparecerá una lista completa de los ficheros que contiene. También podemos usar comodines: mostraría sólo los ficheros con extensión DAT o los que su nombre empezara por A, respectivamente.
Los comandos cd o dir son de los pocos comandos de DOS que pueden usarse en el entorno MATLAB. Si, estando en este entorno, hay necesidad de usar comandos DOS podemos hacerlo anteponiendo el símbolo !. Por ejemplo: ! copy c:\nombre.ext a:\. 6.- Los comandos de carácter general who, whos y clear. En una sesión de trabajo se definen numerosas variables, las podemos ver todas ejecutando: who
aparece en pantalla una lista completa de los nombres de éstas que ya están definidas y cuyos nombres no debemos volver a usar salvo que deseemos redefinirlas. El comando
whos
además de los nombres nos indica la dimensión (“1 by 1”, para escalares, “m by n”, para matrices m×n), el número de datos que alberga dicha variable, el tamaño (en bytes), la densidad y si es o no variable compleja. El comando
clear [nombre] borra la variable llamada nombre; si omitimos éste, se borran todas las variables. 7.- Los comandos de ayuda help y lookfor. De utilidad cuando no recordamos la sintaxis correcta o el nombre de un comando: help nombre-del-comando: aparecerá en la pantalla toda la información disponible sobre dicho comando acompañada en algunos casos de
2
3
ejemplos. Puede suceder, también, que; en este caso usaremos la instrucción lookfor texto
En caso de que hayamos olvidado incluso el nombre: El “texto” contiene la palabra, palabras o sílabas que suponemos deben figurar en la definición de lo que estamos buscando.
Ejemplo: supongamos que no conocemos, o hemos olvidado, el nombre del comando que calcula el producto vectorial de dos vectores pero sí sabemos que existe tal comando, elegimos como texto o palabra clave “prod” y escribimos lookfor prod. Aparecería en la pantalla el siguiente texto como resultado: CROSS CUMPROD DOT PROD KRON BOXUTIL
Vector cross product. Cumulative product of the elements. Vector dot product. Product of the elements. Kronecker tensor product. Produces a single box plot.
observamos que “prod” aparece en el texto explicativo formando parte de las palabras “product” y “produces”; también en los comandos CUMPROD y PROD; ninguno de estos dos nos sirven, ya que, como se ve, el comando buscado es CROSS. Si ahora escribimos help cross ↵, completaríamos la información sobre su sintaxis y demás circunstancias. Hay que manejar con un poco de cuidado el comando lookfor, ya que si el “texto” es demasiado general o ambiguo MATLAB respondería con un número abrumador de páginas (pantallas) de texto lo que nos supondría un trabajo y un tiempo excesivos. Obviamente, podríamos hallar la descripción del comando cross “navegando” por la opción Help del menú, pero esto suele llevar más tiempo. 2 ESCALARES, VECTORES, MATRICES 2.1 Escalares Ya hemos visto antes cómo se asignan valores a una variable, añadamos ahora que el carácter entero, real, complejo o alfanumérico de una constante o variable queda determinado por la forma misma en que se escribe ese dato. x=-3
Número entero negativo
y = 3.27
Número real positivo
z=2-3i
Numero complejo
s=’Orión’
Variable alfanumérica. Las comillas son obligatorias y los espacios en blanco también son caracteres. Para conocer más detalles sobre las funciones de variables alfanuméricas, consultar la ayuda ejecutando help strfun.
3
4
MATLAB representa los números con cuatro cifras decimales salvo que se le indique otra cosa. Las formas alternativas de representación se eligen pulsando con el ratón (o teclas Alt+O) en el menú: Options y Numeric Format: se desplegará un submenú con las siguientes opciones: Short (default): Long: Hex: Bank: Plus:
representación con cuatro cifras decimales 15 dígitos decimales formato hexadecimal 2 decimales escribe +, - o espacio en blanco para cantidades positivas, negativas o cero respectivamente Short e y Long e: notación exponencial, e±xx, con 4 ó 15 dígitos decimales respectivamente; Rational: aproxima un número real mediante el cociente de dos enteros, por ejemplo π=355/113). Para más información sobre los formatos ejecutar help format 2.2 Vectores: Hay tres formas de crear vectores: 1) Vectores con cualesquiera componentes:
Se crean escribiendo entre corchetes ,[ ], sus componentes separadas por espacios en blanco (al menos uno). Así se escribiría: v=[1 2.5 -3.2]
El vector fila v=(1, 2.5, 3.2)
v= [1 ; 2.5 ; -3.2]
El mismo v expresado como vector columna. Obsérvese que ; actúa como delimitador de las columnas
v=[1 ↵ 2.5 ↵ -3.2]
Otra forma válida de expresar v como vector columna
z=[-1.5 ↵ sqrt(2) ↵ sin(pi/4)]
Componentes de z definidas por funciones MATLAB.
En este último ejemplo “sqrt(x)” es la raíz cuadrada de x y “pi” es el número π. En general, el punto y coma dentro de los corchetes, tanto en vectores como en matrices, actúa como separador de filas. Un vector fila se convierte en vector columna (y viceversa) mediante la operación algebraica de la transposición, que en MATLAB se denota mediante el apóstrofo ‘; así y = x’ indica que el vector y es el transpuesto del vector x.
4
5
2) Vectores con componentes equiespaciadas: x=1:4
generaría el vector x=(1,2,3,4), donde se supone que el valor del equiespaciado es 1, por defecto.
x=0 : 0.25 : 1
el intervalo o equiespaciado vale 0.25 en este caso, obtendríamos x=(0,.25,.5,.75,1). Se admite también intervalos negativos, por ejemplo: x=4:-1:1, daría x=(4,3,2,1).
3) Usando las funciones espaciadoras de datos: x=linspace(a,b,n): crea un vector de n componentes, la primera vale a y la última vale b. y=logspace(a,b,n): similar a la anterior sólo que se tomarían n puntos espaciados logarítmicamente entre 10ª y 10b. Si no se especifica el número de puntos se toma por defecto n=100 en linspace y n=50 en logspace. 2.3 Matrices: Se puede generar matrices de cuatro formas diferentes: 1): a=[1 2 3 ; 4 5 6 ; 7 8 9] Especificando el valor de cada elemento y delimitando las filas (;) a=[1 2 3 ↵ Equivalente a la anterior 456↵ 7 8 9] 2) Mediante un fichero .M (véase más adelante): a=matriza Suponemos que existe en el directorio activo un fichero llamado matriza.m que contiene el texto: a=[1 2 3 ; 4 5 6 ; 7 8 9] u otra definición equivalente 3) Leyéndola directamente de un fichero de datos con el comando load: load tabla1.dat
carga el contenido de tabla1.dat en una variable que se llama tabla1
Esta última es la forma más útil y sencilla -también la más frecuente- ya que permite cargar un gran volumen de datos almacenados en un fichero ASCII normal, en este ejemplo llamado tabla1.dat, que contiene los datos que nos interesan en forma de tabla de n filas y m columnas. Lo que MATLAB hace es cargar el contenido de tabla1.dat en una variable que se llama de la misma forma que el fichero origen (y suprimiendo la extensión “dat”); en lo sucesivo los datos del fichero se podrán manejar a nuestra conveniencia en la forma de una variable matricial aritmética (de dimensión m×n) llamada tabla1. Precisamente el hecho de que tabla1 sea una matriz pone una severa limitación a la estructura del fichero tabla1.dat y es que éste ha de contener sólo números separados por espacios, para conformar una estructura de filas y columnas; ni signos ni caracteres alfabéticos, tampoco huecos en los lugares en los que tendrían que figurar números, nada que sea ajeno a una matriz numérica.
5
6
2.4 Manipulación de vectores y matrices • Los elementos de una matriz (o vector) se identifican por sus subíndices escritos entre paréntesis; sea el vector x=[1 2 -3 5], si escribimos x(3) ↵ el programa responderá escribiendo en pantalla -3. • Se puede añadir elementos a una matriz (o vector), por ejemplo haciendo x(6)=-4, con lo que x valdría ahora x=[1 2 -3 5 0 -4]. La dimensión ha crecido hasta el valor 6 para adaptarse al nuevo elemento, y como hemos definido sólo x(6), x(5) ha tomado el valor cero. • También puede construirse matrices más grandes usando como elementos otras matrices menores; por ejemplo, si la matriz A es:
1 2 3 A= 4 5 6 7 8 9 y deseamos ampliarla con una fila más, digamos: r=[10 11 12], escribiremos A=[A;r] con lo que la matriz A redefinida queda: 1 2 3 4 5 6 A= 7 8 9 10 11 12 • Es posible extraer matrices de otras más grandes, usando el signo ‘dos puntos’ (:). Por ejemplo: B=A(1:3,:) hace que la matriz B se forma con las filas 1 a 3 y todas las columnas de la matriz A, o sea B quedaría como la matriz A inicial. c1=A(:,1) será el vector formado por la primera columna de A. Asímismo x=A(:) sería el vector columna formado por todos los elementos de la matriz A leidos por columnas , o sea, x transpuesto, x’, sería: x’=[1 4 7 10 2 5 8 11 3 6 9 12] 3 OPERADORES Y OPERACIONES Una de las ventajas de MATLAB es la posibilidad de efectuar cálculos en paralelo. Esto significa que si a dos variables x e y se les ha asignado un único valor numérico a cada una, el producto de x por y se realizará de la forma habitual, es decir, como el producto de dos números cualesquiera; en cambio si se han definido como matrices (en la forma que se ha explicado en el apartado 2) el resultado será otra matriz que MATLAB calculará automáticamente si ambas matrices son algebraicamente multiplicables, en caso contrario nos avisará del error cometido. Lo mismo cabría decir para las demás operaciones algebraicas elementales, como veremos con más detalle a continuación. Los operadores de MATLAB, al igual que los de otros lenguajes de programación, son de tres tipos: aritméticos, relacionales y lógicos.
6
7
OPERADORES: Aritméticos: Asignación = Suma + Resta Producto * Producto elemento a elemento .* Potenciación ^ Potenc. elemento a elemento .^ División (1) / División elemento a elemento ./ División por la izquierda (2) \
Relacionales y lógicos < Menor que <= Menor o igual a > Mayor que >= Mayor o igual a == Igual a ~= Distinto de & AND lógico | OR lógico ~ NOT (complemento lógico)
(1): Si A y B son matrices, la división A/B significa: A/B=C, con C=A*B-1, suponiendo que B-1 exista y sea multiplicable por la izquierda por A (división por la derecha). (2) Si A es una matriz (n×n) y B es un vector columna de dimensión n u otra matriz de n filas y cualquier número de columnas, entonces X=A\B es la solución de la ecuación A*X=B
+, -, *, / y ^
tienen su significado habitual cuando los operandos son escalares y también cuando son matriciales, (en este último caso han de cumplirse las correspondientes reglas algebraicas de cada operación)
.*, ./ y .^
actúan sobre vectores o matrices pero operando elemento a elemento, es decir, si a y b son los vectores: a=(a1,a2) y b=(b1,b2) entonces a.^2=(a12,a22) y también a.* b=(a1*b1, a2*b2).
Para más información sobre operadores y caracteres especiales seleccionar Help en el menú, después Table of contents y se desplegará una lista en la que hay que activar OPS. 4 REPRESENTACIÓN GRÁFICA Se hace, en general, con el comando plot, el cual tiene las siguientes formas y opciones: plot(x,y):
Dibuja el vector y (ordenada) frente al vector x (abscisa) enlazando con una línea cada punto. Si x e y son matrices, dibujará las filas o columnas que se le indiquen.
plot(y):
Dibuja el vector y frente a su índice. Si y es complejo, plot(y) es equivalente a plot(real(y),imag(y)).
plot(x,y,s):
Permite el trazado con varios tipos de líneas, símbolos para los puntos y colores que están especificados en la variable alfanumérica s que tiene 1, 2 o 3 caracteres siguientes: y (amarillo), m (magenta), c (azul turquesa [cyan]), r (rojo), g (verde), b (azul), w (blanco) y k (negro) para los colores; para los datos,
7
8
trazados punto a punto: . (punto), o (círculo), x, +,*; por último, para el aspecto de las líneas: - (línea continua). : (puntos), -. (rayas y puntos), – (rayas discontinuas). Por ejemplo, plot(x,y,’b+’)dibujaría cada dato con el signo “+” en azul sin enlazarlos con líneas, es decir, cada dato aislado; plot(x,y,’b’) dibujaría los datos enlazados por una línea de color azul. Obsérvese que por ser s una variable alfanumérica, sus argumentos han de escribirse entre apóstrofos (‘). Crea un diagrama de barras del vector y en las posiciones fijadas por el vector x con los símbolos especificados por s, tal como se explicó antes). Todos los comandos del tipo plot(…) comentados anteriormente pueden transformarse en sus equivalentes bar(…).
bar(x,y,s):
plot(x1,y1,s1, x2,y2,s2, x3,y3,s3,…) combina varios dibujos en una misma gráfica, cada uno de ellos definido por su tripleta (x,y,s). Permite dibujar n figuras dispuestas en forma de mosaico, donde i y j representan, respectivamente, el índice de la fila y de la columna donde se va a trazar cada gráfico. La secuencia subplot-plot se escribirá n veces, tantas como figuras han de representarse.
subplot(n,i,j),plot(…):
Ejemplo:, si se desea dibujar 6 figuras ordenadas en 3 filas y 2 columnas escribiremos: subplot(6,1,1),plot(x1,y1,s1)↵ para la Fig.1 subplot(6,1,2),plot(x2,y2,s2)↵ para la Fig.2 subplot(6,2,1),plot(x3,y3,s3)↵ para la Fig.3 ……………………………………………….. subplot(6,3,2),plot(x6,y6,s6)↵ para la Fig.6 El comando plot elige los colores de forma automática en el orden especificado anteriormente, salvo que se le indique otra cosa. Si sobre una gráfica se dibujan más de ocho curvas -agotando, por tanto, la gama disponible de colores-, se comienza otro nuevo ciclo siguiendo el mismo orden. Modificación del aspecto de un dibujo: semilogx(…)
Es lo mismo que plot(…), excepto que usa una escala logarítmica (en base 10) en el eje x; semilogy(…) es su análogo para el y.
8
9
loglog(…):
Es lo mismo que el anterior con escalas logarítmicas (en base 10) en los ejes x e y a la vez.
grid on, grid off:
Pone (on) o quita (off) una retícula (en x e y) en los dibujos en dos o tres dimensiones. Si se escribe sólo grid alterna los dos estados, es decir, quita la retícula si existía o viceversa.
clf, clf reset:
Borra la figura. Si se añade reset, restituye, además, a sus valores por defecto todas las propiedades de la figura, excepto la posición.
cla, cla reset:
Lo mismo que en el caso anterior, pero actuando sólo sobre los ejes.
hold on, hold off:
La opción on hace que se mantenga un dibujo ya existente con todas sus propiedades, de forma que la siguiente gráfica se superponga a la anterior. La opción off vuelve todos los parámetros a sus valores por defecto, y el siguiente dibujo borraría el anterior. Si se escribe sólo hold, se conmuta entre los dos estados.
xlabel(‘texto’):
Pone un texto en el eje x; análogamente, ylabel(‘texto’) para el eje y y si se dibuja en 3-D, zlabel(‘texto’) para el tercer eje.
title(‘texto’):
Añade un texto en la parte superior del dibujo en 2D 3-D.
text(x,y,’texto’):
Escribe un texto en la posición especificada por las coordenadas x,y en las unidades reales de los ejes. Si se trata de un dibujo en 3-D la sintaxis de esta instrucción sería text(x,y,z,’texto’).
axis([xmin xmax ymin ymax]):
Establece la escala de los ejes entre los valores mínimo y máximo para x e y que se le indican. Lógicamente, si se trata de un dibujo en 3-D, habría que completar esta instrucción en la forma: axis([xmin xmax ymin ymax zmin zmax]). Si se escribe axis(‘auto’), la escala vuelve a tomar los valores por defecto que son xmin=min(x) etc. axis(‘equal’), hace que los “ticks” que señalan los intervalos sean de igual tamaño en los ejes x e y. Con ello se consigue que plot(sin(x),cos(x)) tenga el aspecto de un círculo en vez de un óvalo. axis(‘off’), suprime los ejes y sus etiquetas, solo mantiene la curva o los puntos; se restituyen los ejes con axis(‘on’). Estas son las opciones más frecuentes 9
10
pero hay más, para verlas todas en detalle escribir: help axis ↵. Cuando se dibuja por primera vez una figura, MATLAB la sitúa en el primer plano, es decir, aparece inmediatamente a la vista; no sucede lo mismo con la siguiente figura que se trace (tanto si se ha hecho uso o no de las opciones hold on o hold off), y parece que el programa no ha obedecido al comando plot. El dibujo sí se ha hecho, lo que sucede en este caso es que está “detrás” de la pantalla de comandos; para llevarla al primer plano basta con activar la opción Windows del menú (o pulsar Alt+W), entonces se despliega un submenú con las opciones: 1 Figure No. 1 y 2 MATLAB Command Window y señalaremos lo que en cada caso proceda. Obsérvese que en la parte superior de la pantalla en la que aparecen los gráficos hay otra barra de menú con las opciones: File, Edit, Windows, y Help. Las dos últimas (Windows y Help) ofrecen prácticamente las mismas funciones que sus homónimas de la pantalla de comandos; File, permite crear nuevas figuras, cerrar la pantalla gráfica, establecer los parámetros de la impresora o salir de MATLAB; Edit permite borrar la figura (Clear Figure), copiar las opciones de ésta (Copy Options) o copiar (Copy) en el portapapeles la figura dibujada; esta última opción es especialmente útil, porque permite exportarla a otros textos (por ejemplo a un documento WORD) pulsando Ctrl+v, Paste o comando equivalente. 5 FUNCIONES, BUCLES Y BIFURCACIONES 5.1 Funciones Nos referiremos en primer lugar a las funciones incorporadas (funciones de biblioteca). La gama de éstas es amplísima en MATLAB y, por las razones de espacio antes indicadas, nos vamos a ceñir en este resumen a las más corrientes. La lista completa de funciones aparece pulsando en el menú Help y luego Index (haciendo “click” con el ratón sobre cada nombre aparece automáticamente la explicación de su funcionamiento). Están agrupadas por temas, como puede verse pulsando en el menú Help y después Table of contents, que se refieren al código de color, demostraciones, funciones matemáticas, etc. Los grupos o temas más importantes y sus correspondientes funciones son las siguientes: ANÁLISIS DE DATOS: Operaciones básicas sobre un vector x: Componente máxima max(x) Componente mínima min(x) Valor medio mean(x) Mediana median(x) Desviación típica std(x) Ordenación (ascendente) sort(x) sum(x) Suma de los elementos de x Producto de los elementos prod(x) cumsum(x) Suma acumulativa de los elementos cumprod(x) Producto acumulativo de los elementos Integración numérica (método trapezoidal) trapz(x,y)
10
11
Operaciones con vectores: Producto vectorial cross(x,y) Producto escalar dot(x,y) Correlaciones: corrcoef(x) Coeficientes de correlación Matriz de covarianza cov(x) FUNCIONES MATEMÁTICAS ELEMENTALES: Trigonométricas: sin, cos, tan, sec, cosec, cot(x) asin, acos, atan, atan2, asec, acsc, acot(x) sinh, cosh, tanh, sech, csch, coth(x) asinh, acosh, atanh, asech, acsch, acoth(x)
Trigonométricas directas Trigonométricas inversas Hiperbólicas directas Hiperbólicas inversas
Exponenciales: exp(x) log(x) log10(x) sqrt(x)
Exponencial Logaritmo neperiano Logaritmo base 10 Raíz cuadrada
Complejas: abs(z) angle(z) conj(z) imag(z) real(z)
Valor absoluto Ángulo de fase Complejo conjugado Parte imaginaria Parte real
Numéricas: fix(x) floor(x)
Parte entera de un número Redondeo al entero más próximo hacia -∞ Redondeo al entero más próximo hacia +∞ Redondeo al entero más próximo Resto de la división de dos números Función signo
ceil(x) round(x) rem(x,y) sign(x) MANIPULACIÓN DE MATRICES: Matrices elementales: zeros(M) ones(M) eye(M) rand(M,N) randn(M,N) ans
Matriz de ceros Matriz de unos Matriz identidad Números aleatorios uniformemente distribuidos Números aleatorios normalmente distribuidos Última respuesta 11
12
Constantes especiales: pi i,j inf NaN
3.1415926535897.... Unidad imaginaria Infinito Not-a-Number. Es el resultado que da MATLAB de una operación no definida como p. ej. 0.0/0.0
Hora y fecha: clock cputime date etime tic,toc
Vector: [Año mes día hora minuto segundo] Tiempo usado por la CPU (segundos) Fecha en formato dd-mm-aa Función tiempo transcurrido (ver help) Funciones de cronometraje (ver help)
Manipulación de matrices diag reshape tril triu
: Crea o extrae una matriz diagonal (ver help) Cambia el tamaño de una matriz (ver help) Extrae la parte triangular inferior (ver help) Extrae la parte triangular superior (ver help)
FUNCIÓN DE FUNCIÓN. PROCESOS NUMÉRICOS NO LINEALES: ode23 ode23p ode45 quad quad8 fmin fmins fzero fplot
Solución de ecuaciones diferenciales (Runge-Kutta 2º y 3º orden) Ídem y dibuja la solución Solución de ecuaciones diferenciales (Runge-Kutta 4º y 5º orden) Integración numérica con la regla de Simpson Integración numérica por cuadratura de Newton-Côtes Mínimo local de una función de una variable Mínimo local de una función de dos variables Halla el cero de una función de una variable Representa la gráfica de una función
Para familiarizarse con cada una de las funciones anteriores debemos conocer bien todas sus posibilidades, para obtener más información usar el comando help seguido del nombre de la función. 5.2 Bucles Los hay de dos tipos: bucles FOR y bucles WHILE. a) El bucle FOR es equivalente a su homónimo de BASIC y muy similar al DO de FORTRAN. Su sintaxis es: (i) for i=valor-inicial : intervalo : valor-final (instrucciones) end Ejemplos: for i = 1:n, 12
13
for j = 1:n, a(i,j) = 1/(i+j-1); end end (ii) for s = 1.0 : -0.1 : 0.0 , {instrucción} , end obsérvese que en el primer ejemplo aparecen sólo dos parámetros a continuación de for, en este caso se entiende por defecto que se han dado los valores inicial y final de i y que el intervalo (el parámetro que falta) es igual a 1. En el segundo ejemplo aparece explícitamente el valor del intervalo que, en este caso, por ser negativo realiza una secuencia decreciente. b) El bucle WHILE tiene la siguiente sintaxis: while expresión lógica, instrucciones end mientras la expresión lógica tenga el valor “verdadero”, ejecutará todas las instrucciones comprendidas entre las líneas while y end. 5.3 Bifurcaciones Al igual que en otros muchos lenguajes de programación, el comando if ejecuta un conjunto de sentencias cuando se cumplen ciertas condiciones. Su sintaxis es: if proposición-lógica {sentencias} end la proposición-lógica es, normalmente, una expresión que contiene los operadores ==, <, >, <=, >=, o ~=. El siguiente ejemplo ayudará a entender el funcionamiento de este comando: if i == j a(i,j) = 2; elseif abs(i-j) == 1 a(i,j) = -1; else a(i,j) = 0; end 6 FICHEROS-M: PROGRAMAS MATLAB se usa frecuentemente en modo interactivo, es decir, se escribe una línea de comandos, se pulsa la tecla ↵, y aparece inmediatamente el resultado en pantalla. MATLAB también puede ejecutar secuencias de comandos que están almacenadas en ficheros. Ya vimos en § 2, que se puede acceder a ficheros de datos invocándolos con el comando load y especificando su nombre y extensión (esta última puede ser cualquiera con tres caracteres), sin embargo los ficheros que contienen
13
14
sentencias MATLAB han de llevar obligatoriamente la extensión .m acompañando a su nombre, razón por la que se les llama “ficheros M”. Un fichero M consiste, por tanto, en una secuencia de comandos que pueden incluir referencias a otros ficheros M y se crean con cualquier programa editor o procesador de textos. Los hay de dos tipos: ficheros de texto y ficheros de funciones; los primeros realizan automáticamente secuencias largas de comandos, los últimos desempeñan un papel parecido al de los subprogramas en FORTRAN. Ficheros de texto Cuando se llama a un fichero de texto, MATLAB ejecuta los comandos que contiene y éstos operan globalmente con los datos existentes en el espacio de trabajo. Esto último quiere decir que si, por ejemplo, una variable cualquiera posee un valor dado (digamos x=-7.89) y después ejecutamos un programa de texto en el que se modifica ese valor (por ejemplo, redefiniendo x en la forma x=π/4), es este último valor el que prevalece, borrándose el que tenía anteriormente. Veamos el siguiente ejemplo: el fichero de texto llamado series.m contiene los comandos necesarios para calcular el valor aproximado del número π mediante la serie
π2 = 6
1 2 i =1 i ∞
en la que la suma, en vez de extenderse al infinito se trunca en un número entero n cuyo valor lo decide el programador y lo introduce manualmente (por teclado). El programa es como sigue % % Series % n=input( ' Introducir el valor de n: ' ) % s=0; for i=1:n s=s+1/i^2; end y=sqrt(6*s) % Valor calculado de π err=abs(y-pi) % Diferencia entre el valor calculado y el de MATLAB end en el anterior programa interesa destacar dos detalles hasta ahora no comentados: 1º) %: este símbolo indica que lo que se encuentra a su derecha es un comentario y por lo tanto no se compilará. Puede estar en el medio de una línea o registro, como se ve en la línea que define la variable y y en la que le sigue 2º) input( ‘texto’ ): queda a la espera de un dato que se le va a suministrar a través del teclado (en este caso el valor de n); el texto, que ha de escribirse entre apóstrofos, aparecerá en la pantalla y sirve como recordatorio del nombre de la variable a la que se va dar el valor.
14
15
Por último, si series.m está en el subdirectorio de trabajo, series es ya un comando más. Ficheros de función Son aquellos ficheros M que al principio de la primera línea contienen la palabra clave function. Difiere de un fichero de texto en que hay que pasarle parámetros (los de entrada de la función) y en que las variables definidas y manejadas dentro del fichero de función son locales y no interfieren con las que se estén considerando en el espacio de trabajo. Los ficheros de función son útiles para crear funciones de MATLAB, además de las ya existentes en la biblioteca interna. Como se ve, estos ficheros son muy parecidos al subprograma FUNCTION de FORTRAN. Ejemplo: function y=mean(x) % MEAN: valor medio % Para vectores: mean(x) da el valor medio % Para matrices; mean(x) es un vector fila que contiene el valor medio % de cada columna % [m,n]=size(x); if m==1 m=n; end y=sum(x)/m Para ejecutar este programa basta con escribir mean(parámetro), teniendo cuidado de que el “parámetro” ha sido definido previamente; por ejemplo si queremos que el programa calcule la media de los enteros desde1 hasta 99, escribiríamos z=1:99 mean(z) ↵ y aparecería en pantalla: ans
=50
size(A)
Da la dimensión de la matriz A (número de filas y columnas, en ese orden) escribiéndolos en pantalla.
[m,n]=size(z)
Almacena el resultado anterior en las variables m y n, respectivamente.
length(x)
Da la longitud (número de componentes) del vector .
7 OTROS PROCEDIMIENTOS ÚTILES EN MATLAB Veamos, para finalizar, algunos procedimientos de uso frecuente en el cálculo numérico, lo que nos permitirá comentar algunos comandos y funciones no descritos en los párrafos anteriores.
15
16
Guardar resultados en ficheros Se hace con el comando save con las siguientes posibilidades: SAVE fname X Y Z
Guarda en el fichero llamado fname las variables X, Y, Z,… en código binario
SAVE fname X Y Z -ascii
Lo guarda como fichero en código ASCII (por lo tanto es legible por cualquier programa) usando un formato de 8 dígitos
SAVE fname X Y Z -ascii -double
Los datos se expresan con 16 dígitos
SAVE fname X Y Z -ascii -double -tabs
Los guarda tabuladores
delimitándolos
con
El guión que precede a los parámetros ascii, double y tabs es obligatorio. Las posibilidades de almacenaje de resultados no se agotan con este comando, el lector puede consultar a través del correspondiente help los comandos: diary, fwrite, fprintf e imwrite. Ajuste de polinomios polyfit(x,y,n)
Halla los coeficientes (que aparecerán escritos en pantalla) del polinomio p(x) de grado n que ajusta por mínimos cuadrados los datos p(xi)=yi,.
c=polyfit(x,y,n)
En este caso, los coeficientes quedan guardados en la variable c (la primera componente es el coeficiente de xn, la última el de x0).
y=polyval(p,x)
Halla el valor del polinomio para un x dado; p es el vector de longitud n+1 (n es el grado del polinomio) cuyos elementos son los coeficientes de éste: y = p(1)*xn + p(2)*xn-1 + ... + p(n)*x + p(n+1). Si x es una matriz o un vector, el polinomio se evalúa para todos los puntos de x.
roots(c)
Halla las raíces del polinomio cuyos coeficientes son los elementos del vector c (como antes, c1 es el coeficiente de xn, etc.).
Resolución de sistemas lineales Un sistema lineal puede escribirse de la forma: Ax=b, donde x es el vector (columna) de las incógnitas y A es la matriz de los coeficientes. La resolución de este sistema es sumamente sencilla y rápida en MATLAB haciendo: x=A\b, como ya se ha visto anteriormente (§ 3: Operadores). Obviamente, A tiene que ser una matriz no singular.
16
17
Integración numérica y=quad(' f' ,a,b)
Calcula el valor aproximado de la integral de la función f(x) entre los límites (a,b) usando la fórmula de Simpson. f es el nombre de una función (que, por lo tanto, ha de expresarse entre apóstrofos ‘) que está definida en un fichero M de función.
y=quad8(' f' ,a,b)
Igual que la anterior pero usando el método de cuadratura de Newton-Côtes.
En ambos casos, si el resultado fuera y=inf, (infinito) querría decir que no se ha logrado convergencia o que y es una integral singular. Si los parámetros de entrada a y b son vectores, y será otro vector (de resultados) de la misma dimensión. Resolución de ecuaciones diferenciales La función ode23 integra un sistema de ecuaciones diferenciales usando un método de Runge-Kutta con fórmulas de 2º y 3º orden. Su sintaxis es: [x,y] = ode23(' yprima' , x0, xfinal, y0) • yprima: es el nombre del fichero M donde están definidas las funciones que constituyen el sistema (o la única función si la ecuación diferencial es de primer orden). • x0, xfinal: valores inicial y final de la variable independiente, definen el dominio de integración. • y0: el vector cuyas componentes son las condiciones iniciales. • [x,y]: y es la solución en forma de vector columna para los valores especificados por el también vector columna x cuyos valores están comprendidos entre x0 y xfinal con espaciado fijado automáticamente por MATLAB. Si se trata de una ecuación diferencial de primer orden, x0, xfinal, e y0 son escalares. La gráfica del resultado puede verse haciendo plot(x,y). Ejemplo: La ecuación diferencial de 2º orden d2x/dt2 + (x2-1)dx/dt + x = 0, con las condiciones iniciales: x=0, dx/dt=0.25 para t=0. Si nombramos las variables en la forma: x=x2, dx/dt=x1, entonces la ecuación anterior equivale al sistema:
x1 = x1 (1 − x 22 ) − x 2
;
x 2 = x1
El fichero M con la definición de las funciones se va a llamar vdpol y su contenido será: function xdot=vdpol(t,x) xdot=zeros(2,1) % Matriz 2×1 de ceros (vector columna) xdot(1)=x(1).*(1-x(2).^2)-x(2); xdot(2)=x(1); para resolver la ecuación escribiremos: t0=0; tf=20;
17
18
x0=[0 0.25]; % Condiciones iniciales [t,x]=ode23(‘vdpol’,t0,tf.x0) plot(t,x) Se puede resolver la ecuación diferencial y trazar su gráfica simultáneamente usando la función ode23p (con los mismos parámetros) pero definiendo previamente los ejes con el comando axis y escribiendo posteriormente hold. Se obtiene más precisión usando la función ode45 análoga a la anterior (y con los mismos parámetros), la diferencia es que utiliza un algoritmo de Runge-Kutta de 4º y 5º orden. Estadística La herramienta disttool es un entorno gráfico que representa funciones densidad (pdf) o funciones de distribución acumulada (cdf) de las distribuciones más usuales en estadística. Pulsando disttool y ↵ se abre una pantalla gráfica que contiene diferentes ventanas: una que permite seleccionar el modo pdf o cdf, otra que despliega un amplio menú de distribuciones (normal, binomial, t de Student, etc.) y otras donde se seleccionan los valores numéricos de los diferentes parámetros (media, desviación típica,…); hay -además- una ventana para seleccionar el valor de la variable independiente x y otra ventana que nos da el valor de la densidad de probabilidad en la opción pdf (valor de la ordenada de la función de distribución correspondiente a x) o el valor de la integral entre -∞ ∞ y x en la opción cdf (probabilidad de que X sea menor o igual que x). Estas funciones existen también fuera del entorno disttool como funciones de MATLAB. La lista de funciones de distribución acumulada (cdf) es la siguiente: betacdf: binocdf: chi2cdf: expcdf: fcdf: gamcdf: geocdf:
distribución beta binomial chi cuadrado exponencial F gamma geométrica
hygecdf: normcdf: poisscdf: tcdf: unidcdf: unidfcdf: weibcdf:
hipergeométrica normal Poisson t de Student uniforme (discreta) uniforme (continua) Weibull
existen además sus correspondientes funciones inversas (betainv,… etc) y las de distribución de probabilidad (betapdf,… etc). Para ver el significado, parámetros y sintaxis consultar sus respectivos help. Generación de números aleatorios De forma análoga al caso anterior, ejecutando randtool se abre otra pantalla gráfica que nos proporciona conjuntos de números aleatorios que siguen diferentes distribuciones a elegir a través de la correspondiente ventana: beta, binomial, chi-2, exponencial, F, gamma, geométrica, hipergeométrica, normal, de Poisson, t de Student, uniforme y uniforme discreta. Una gráfica muestra los resultados y las diferentes ventanas permiten seleccionar el tamaño del conjunto de números aleatorios (ventana sample) y el intervalo (ventana number). Cada vez que se pulsa en la ventana resample, aparece una nueva muestra de números. Pulsando en la venta output, la última muestra se almacena en la variable temporal ans y se exporta al programa MATLAB, haciendo desde éste último x=ans, quedará guardado en el vector x el último conjunto de números aleatorios obtenido.
18