———————————————————–
Curso introductorio de MATLAB
r———————————————————–
Ren´
e Escalante
Universidad Sim´
on Bol´ıvar
CURSO INTRODUCTORIO DE MATLAB
Ren´e Escalante c
2006 EDITORIAL EQUINOCCIO
Todas las obras publicadas bajo nuestro sello han sido sometidas a un proceso de arbitraje. Valle de Sartenejas, Baruta, Edo. Miranda
Apartado postal 89000, Caracas 1080-A, Venezuela Tel´efono (0212)9063160/3162/3164, fax (0212)9063159 Hecho el dep´osito de ley
Reservados todos los derechos
Coordinaci´on editorial: Carlos Pacheco
Producci´on: Margarita Oviedo y Nelson Gonz´alez Diagramaci´on: Ren´e Escalante
Dise˜no de portada: Grisel C. Boada Jim´enez Correcci´on: Jos´e Manuel Guilarte
ISBN 980-237-239-0
Dep´osito legal LF24420053782279
Contenido
Prefacio iii
I
Nociones de MATLAB
1
1 Primeros pasos con MATLAB 3
1.1 C´alculos con MATLAB . . . 6
1.2 Arreglos . . . 9
1.3 Funciones . . . 13
1.4 Pr´actica adicional . . . 20
2 Capacidades gr´af icas elementales 25 2.1 Gr´aficas en dos dimensiones . . . 25
2.2 Gr´aficas en tres dimensiones . . . 28
2.3 La impresi´on . . . 30
2.4 Pr´actica adicional . . . 31
II
M´
etodos num´
ericos con MATLAB
33
3 Algebra lineal num´´ erica 35 3.1 Operaciones y funciones matriciales . . . 353.2 Resoluci´on de un SEL y el n´umero de condici´on . . . 35
3.3 C´alculo de autovalores . . . 38
3.4 Pr´actica adicional . . . 39
4.2 Ajuste por m´ınimos cuadrados . . . 48
4.3 Interpolaci´on polinomial . . . 49
4.4 Pr´actica adicional . . . 51
5 Integraci´on y diferenciaci´on num´ericas 55 5.1 Funciones de cuadratura . . . 56
5.2 Derivaci´on num´erica . . . 56
5.3 Pr´actica adicional . . . 57
6 Ecuaciones diferenciales ordinarias 59 6.1 EDO de primer orden . . . 59
6.2 EDO de orden mayor . . . 61
6.3 Problemas con valores en la frontera . . . 62
6.4 Pr´actica adicional . . . 63
III
T´
opicos adicionales
67
7 Matem´aticas simb´olicas 69 7.1 Variables simb´olicas . . . 697.2 Un poco de calculus . . . 70
7.3 Algunas manipulaciones algebraicas . . . 74
7.4 Un poco de ´algebra lineal . . . 75
7.5 Gr´aficas de funciones . . . 77
7.6 Un poco de ecuaciones diferenciales . . . 77
7.7 M´as matem´aticas simb´olicas . . . 78
7.8 Pr´actica adicional . . . 78
8 M´as MATLAB 81 8.1 “Toolboxes” . . . 81
8.2 Cambios en MATLAB . . . 83
8.3 Tablas de funciones MATLAB . . . 84
Referencias 99
Prefacio
Curso introductorio de MATLABr, que tiene sus ra´ıces en el texto MATLABr B´asico1, pretende ser una obra de consulta r´apida y estudio pr´actico, dirigida a los estudiantes de ingenier´ıa y ciencias b´asicas, as´ı como al profesional que desee actualizar sus conocimientos en el ´area del c´alculo cient´ıfico a trav´es del uso de la herramienta de trabajo denominada MATLAB2. El prop´osito de este libro es el de ayudar al lector a iniciarse en MATLAB, sin pretender ser un sustituto de la documentaci´on MATLAB.
El ambiente de trabajo MATLAB, desarrollado por The MathWorks, Inc., es f´acil de aprender y usar; es adem´as potente, exacto, robusto y r´apido. Integra c´alculo, visualizaci´on gr´afica y programaci´on en un ambiente abierto y flexible.
La elaboraci´on de este trabajo ha tenido como base la experiencia del autor, durante los ´
ultimos nueve a˜nos, en la utilizaci´on del MATLAB como una herramienta fundamental, tanto en la docencia (en el dictado de cursos de pregrado, postgrado, extensi´on y tesis dirigidas) como en diferentes aplicaciones y trabajos de investigaci´on, todos en el ´area de c´omputo cient´ıfico.
Abarca la obra tres partes: la primera, consistente en una introducci´on a los coman-dos MATLAB y a sus capacidades gr´aficas; la segunda es una revisi´on de algunos m´etodos num´ericos elementales a trav´es del uso pr´actico del MATLAB, y una tercera parte conformada por algunos temas adicionales. Las “Pr´acticas adicionales”, al final de cada cap´ıtulo desde el 1 hasta el 7, pueden tambi´en considerarse como “proyectos” que, en el desarrollo de un curso dado, el instructor tome en cuenta asignar, seg´un sea su estrategia de trabajo.
Adem´as de tratar de mantener un enfoque aplicado, ha existido por parte del autor la intenci´on de que este peque˜no manual est´e dirigido principalmente a la ense˜nanza de las matem´aticas b´asicas de la ingenier´ıa, por lo que se ha a˜nadido un cap´ıtulo sobre matem´aticas simb´olicas (el cap´ıtulo 7), incluido en la tercera parte. Por ´ultimo, en el cap´ıtulo 8, corres-pondiente al final de la tercera parte, y a manera de ap´endice de las anteriores, se listan
funciones y operadores MATLAB, as´ı como algunos recursos adicionales y cambios intro-ducidos en diferentes versiones del software. En este sentido, hay que mencionar que, si bien el texto est´a pensado para trabajar con las herramientas m´as elementales que propor-ciona MATLAB (presentes en casi todas las versiones), tambi´en procuramos realizar, sobre la marcha, observaciones relativas a algunas facilidades y caracter´ısticas que involucran a las versiones m´as recientes, tales como la 6.0, 6.5 y 7.0.
En el texto se citan adem´as algunas referencias de obras b´asicas de publicaci´on reciente, tanto del ´area de las matem´aticas num´ericas como del propio MATLAB (las mismas se en-cuentran incluidas al final de la obra). A˜nadimos tambi´en referencias a sitios web, donde se ofrecen tutoriales de introducci´on al uso del MATLAB.
Las palabras que en el texto aparecen escritas en la fuente “typewriter” (por ejemplo,
help), representan funciones o comandos MATLAB que el usuario puede escribir (tambi´en pueden ser las salidas producidas por el mismo MATLAB).
Dependiendo del tiempo disponible, se puede abarcar todo el material en un curso de unas treinta horas, o bien se puede disponer muy bien de las dos primeras partes (que incluyen tambi´en ejercicios) en un curso de unas veinticuatro horas. Se recomienda encarecidamente al lector usar el computador al mismo tiempo que va leyendo el texto, sinti´endose libre de experimentar con los ejemplos y ejercicios.
Deseo agradecer a la Editorial Equinoccio por permitirme llevar a feliz t´ermino el presente proyecto. Asimismo, deseo agradecer muy especialmente a los diferentes revisores an´onimos por sus muy valiosas sugerencias. En el autor est´a el sincero deseo de que este material cumpla con su objetivo esencial de lograr un mayor acercamiento y mejor comprensi´on de las matem´aticas a trav´es del uso del MATLAB. En este sentido, todo comentario que permita mejorar en alg´un sentido lo aqu´ı expresado ser´a bienvenido.
R. E.
Parte I
Cap´ıtulo 1
Primeros pasos con MATLAB
En un ambiente tipo Windows, hacemos un doble ‘click’ sobre el ´ıcono de MATLAB (o de STUDENT-MATLAB) y obtenemos una ventana con el cursor en ‘>>’ (o en ‘EDU>>’). En un sistema Unix tenemos acceso a MATLAB a trav´es del comando matlab.
En realidad MATLAB tiene una amplia interfaz gr´afica de usuario. Al comenzar MATLAB, aparecer´a la ventana MATLAB con algunas subventanas y barras de men´us (ver la figura 1.1). Las instrucciones y expresiones MATLAB se escribir´an en la ventana de comandos (o “Com-mand Window”). Inmediatamente podremos escribir las funciones que expondremos a con-tinuaci´on.
>> quit
o bien,
>> exit
Una de las funciones m´as usadas es la de help seguida del nombre de alguna otra funci´on o comando espec´ıfico. Por ejemplo,
>> help help
o bien,
>> help quit
Podr´ıamos tambi´en obtener ayuda directamente (o en l´ınea) presionando la tecla F1 o selec-cionandoHelpdel men´u desplegable (en ambos casos se abre la ventana de ayuda). En lugar del comando help tambi´en podemos escribir docen la ventana de comandos.
Otra forma de acceder a las ayudas en l´ınea es a trav´es del uso de los comandoshelpwin
(que abre una ventana de ayuda para el MATLAB), helpdesk (usa un “internet browser” para buscar informaci´on y acceder a la documentaci´on en l´ınea) ylookfor palabra(encuentra la primera l´ınea de texto correspondiente a las ayudas que contienen en esa l´ınea la palabra buscada).
Otra cosa que al inicio es importante conocer es la versi´on con que estamos trabajando. Escriba ver.
El comandowhatmuestra una lista de archivos MATLAB en el directorio actual de trabajo. El comando who (o mejor whos) mostrar´a una lista de las variables usadas en el espacio actual de trabajo (o “workspace”).
El comandodisppuede usarse para mostrar mensajes o datos en la pantalla. Por ejemplo, ensaye
>> disp(pi)
o bien,
>> disp(‘Esta es una prueba para disp.’)
El comando demogu´ıa al usuario por algunas demostraciones de c´omo trabaja MATLAB. Con MATLAB podemos introducir datos por el teclado usando el comando input:
Una vez que se escriba el valor del radio (seguido de return), la entrada es guardada en r. Tambi´en una cadena de caracteres puede escribirse desde el teclado:
>> z = input(‘Su primer apellido es:’,‘s’)
El segundo argumento representa la entrada por el teclado de una cadena de caracteres. Para imprimir mensajes y n´umeros podemos usar fprintf. Por ejemplo:
>> fprintf(‘El volumen de la esfera es: %13.6f.\n’,vol)
%13.6f es el formato y es similar a F13.6 en FORTRAN. \n crea una l´ınea nueva. Con el comandofprintfpodemos escribir la salida formateada en un archivo. El nombre del archivo estar´a incluido en el argumento; por ejemplo,
>> fprintf(‘archi’,‘Volumen = %13.6f.\n’,vol)
escribir´a la salida en el archivo archi. Si el archivo no existe se crea uno nuevo, pero si existe, entonces, la salida se a˜nade al mismo.
Si usamos el comando savetodas las variables ser´an guardadas en el archivomatlab.mat. El comando load recuperar´a toda la informaci´on guardada. Podemos asignar un nombre al archivo que contenga nuestros datos; por ejemplo,
>> save misvaria
guarda todas las variables en el archivo misvaria. Cuando queremos recuperar las variables simplemente escribimos:
>> load misvaria
Si solamente necesitamos guardar algunas variables escribimos, por ejemplo:
>> save misvaria x y z
As´ı, las variables x, y, z ser´an guardadas en el archivo misvaria. Todas las variables se guardar´an en doble precisi´on binaria. Cuando necesitemos recuperar los datos escribimos (sin los nombres de las variables):
>> load misvaria
ASCII, load nombre.dat recuperar´a los datos en una variable llamada nombre (si el archivo ASCII contiene una tabla de n´umeros, la variable ser´a una matriz del mismo tama˜no que la tabla).
El ejecutar comandos directamente desde el teclado puede ser adecuado cuando lo que escribimos es poco, o cuando queremos ensayar algunas ideas de manera interactiva. De otro modo, el usuario debe crear un M-archivo tipo script o un M-archivo tipo function, ya que los M-archivos (“M-files”) pueden ser guardados en disco y pueden editarse todas las veces que sean necesarias. Un M-archivo puede referenciar a otros M-archivos, incluso a ´el mismo de manera recursiva.
Cuando unscriptes ejecutado, las sentencias en el M-archivo suelen no verse por pantalla. Sin embargo, con el comando echo onlas sentencias son mostradas de manera que el usuario pueda ver qu´e parte del M-archivo est´a ejecut´andose. Para no mostrar las declaraciones del M-archivo escribamos echo off.
El signo % en un M-archivo indica que cualquier sentencia despu´es de este signo sobre la misma l´ınea es un comentario, y es, por lo tanto, ignorado en los c´alculos.
diary on guarda en un archivo llamado diary toda la informaci´on introducida por el teclado, as´ı como la mayor´ıa de la salida por pantalla, ydiary offtermina con este proceso. Si el archivodiaryya existe, la salida por pantalla es a˜nadida al archivodiary. Otro nombre, que no sea diary, puede especificarse para el archivo escribiendo el mismo despu´es dediary. Sinonuoff, y escribiendodiarysolamente, conmutamosdiary onydiary off. El archivo as´ı creado puede editarse m´as tarde o puede, simplemente, imprimirse como un archivo de texto.
1.1
C´
alculos con MATLAB
Comencemos por evaluar, por ejemplo, Volumen = 4
3πr
3, con r = 3.
Los comandos a escribir son:
>> r = 3;
>> vol = (4/3)*pi*r^3;
>> r = 3; vol = (4/3)*pi ... *r^3;
(Nota: Una instrucci´on puede continuarse en la l´ınea siguiente escribiendo tres puntos al final de la l´ınea.)
Bloque if - else:
La sentencia if termina siempre con la sentencia end. Ejemplos:
1. Si R es mayor que cero:
>> R = 3;
>> if R > 0, area = pi*R^2; end
2. Si R es igual a cero:
>> R = 3;
>> if R == 0, area = pi*R^2; end
3. Si R es diferente de cero:
>> R = 3;
>> if R ~= 0, area = pi*R^2; end
“Mayor o igual” y “menor o igual” son, respectivamente, ‘>=’ y ‘<=’. Los operadores l´ogicos “and” y “or” se escriben ‘&’ y ‘|’, respectivamente.
La sentencia if puede usarse con elseo elseif. Por ejemplo:
>> R = 3;
Nombre de la variable Signif icado Valor
eps Epsilon de la m´´ aquina 2.2204e-16
pi π 3.14159...
i,j Imaginarios √−1
inf Infinito ∞
NaN No un n´umero
date Fecha
clock Fecha y hora
flops Cantidad de operaciones
(Obsoleto a partir de MATLAB 6)
nargin No. de arg. de entrada de una func.
nargout No. de arg. de salida de una func. Tabla 1.1: Algunos n´umeros y nombres de variables.
En MATLAB las variables y arreglos no tienen que ser declarados. Cualquier nombre puede usarse, aunque debemos procurar evitar las situaciones de incompatibilidad con MATLAB. El nombre de una variable, funci´on o comando difiere del nombre que obtenemos si cambiamos alguna de sus letras min´usculas por su correspondiente may´uscula (o viceversa). Si el nombre de una variable (y su correspondiente signo ‘=’) es omitido, autom´aticamente se crea una variable ans (de “answer”) a la que se le asigna la respuesta generada. Algunos n´umeros y nombres de variables aparecen en la tabla 1.1.
(Actividad: Con ayuda del comando help, explore el uso de las variables que aparecen en la tabla 1.1.)
Para borrar una o varias variables usamos el comando clear seguido del nombre de las variables. Si no sigue ninguna variable despu´es de clear se borrar´an todas las variables.
En MATLAB podemos usar los lazos for/end y while/end. Por ejemplo, calculemos el volumen de la esfera parar = 1,2,3,4,5:
>> for r = 1:5
vol = (4/3)*pi*r^3; disp([r,vol])
end
>> r = 0; >> while r < 5
r = r + 1;
vol = (4/3)*pi*r^3; disp([r,vol])
end
O de manera decreciente:
>> for r = 5:-1:1
vol = (4/3)*pi*r^3; disp([r,vol])
end
En MATLAB los n´umeros se muestran por defecto con cinco d´ıgitos. No obstante, los mismos n´umeros pueden mostrarse con 16 d´ıgitos usando el comandoformat long. Para regresar al anterior formato usamos el comandoformat short. Por ´ultimo, para representar los n´umeros en formato de punto flotante podemos escribir format short e, o bienformat long e. (Actividad: Con el comando help explore el comando format.)
1.2
Arreglos
En MATLAB los arreglos pueden introducirse de diferentes maneras. A saber, a trav´es de una lista de elementos de manera expl´ıcita, generando las entradas por medio de comandos y funciones, creando un archivo con un editor local, o simplemente cargando los elementos del arreglo desde archivos de datos externos o aplicaciones (ver Using MATLAB o la ayuda en l´ınea).
En MATLAB un arreglo unidimensional representa un vector fila o un vector columna. Una variablex puede definirse como un vector fila:
>> x = [0,0.1,0.2,0.3,0.4,0.5];
Para imprimir, por ejemplo, la segunda entrada dexescribimosx(2)(seguido de ‘enter’) para obtener:
ans =
Una forma equivalente en que podemos definir x es:
>> for i=1:6
x(i) = (i-1)*0.1; end
Podemos definir elementos adicionales, por ejemplo,
>> x(7) = 0.6;
La definici´on de un vector columna es similar a la de un vector fila excepto porque las entradas est´an separadas por ‘;’. Si colocamos una prima ’ inmediatamente despu´es del vector obtenemos su traspuesta.
Si no recordamos el tama˜no de un vector, podemos escribir:
>> length(x)
Y si escribimos
>> size(x)
MATLAB nos devolver´a dos n´umeros: el primero representa al n´umero de filas, y el segundo al n´umero de columnas de x.
Los vectores y y x pueden ser sumados, restados, multiplicados y divididos t´ermino a t´ermino si usamos las operaciones:
>> z = x + y >> z = x - y >> z = x .* y >> z = x ./ y
En MATLAB, un arreglo bidimensionalrepresenta una matriz, y la definimos al especificar sus entradas. Por ejemplo:
>> A = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9];
escribiendo A obtenemos:
A =
Una fila o columna de un arreglo bidimensional puede expresarse, por ejemplo, como A(1,:)
yA(:,3)que representan la primera fila y la tercera columna de la matrizA, respectivamente. Los elementos dentro de una fila de una matriz pueden estar separados por espacios en blanco o por comas. En el caso de que alguna entrada est´e expresada en forma exponencial (por ejemplo, 5.67e-6) debemos evitar los espacios en blanco. Una matriz o un vector (arreglo unidimensional) s´olo acepta ´ındices que sean enteros positivos.
Para poder acceder al ´ultimo elemento de una matriz usamosend como sub´ındice (lo que permite ir al ´ultimo elemento del arreglo sin tener que saber de antemano el tama˜no del mismo). Por ejemplo, si
>> x = 3:45-sqrt(100); >> x(end)
ans =
35
>> x(end - 7)
ans =
28
Si consideramos la matriz1
>> A = [spiral(4) [.1; .2; .3; .4]]
A =
7.0000 8.0000 9.0000 10.0000 0.1000 6.0000 1.0000 2.0000 11.0000 0.2000 5.0000 4.0000 3.0000 12.0000 0.3000 16.0000 15.0000 14.0000 13.0000 0.4000
Entonces,
>> A(end, end)
ans =
0.4000
>> A(end-3:end,end-2:end)
ans =
9.0000 10.0000 0.1000 2.0000 11.0000 0.2000 3.0000 12.0000 0.3000 14.0000 13.0000 0.4000
Dos arreglos bidimensionales A y B pueden ser sumados, restados, multiplicados y divididos t´ermino a t´ermino si usamos las operaciones:
>> C = A + B >> C = A - B >> C = A .* B >> C = A ./ B
Asumiendo queA y B son matrices del mismo tama˜no, las entradas de las mismas pueden ser comparadas en unif:
1. if A == B se satisface solamente si A(i,j) = B(i,j) para todas las entradas. 2. if A >= B se satisface solamente si A(i,j) >= B(i,j)para todas las entradas.
3. if A ~= Bse satisface solamente siA(i,j) ~= B(i,j) para por lo menos una entrada. MATLAB permite el uso de los n´umeros complejos en la mayor´ıa de sus operaciones y fun-ciones. Dos maneras de representar matrices complejas son:
Nota: Deben evitarse los espacios en blanco en la representaci´on de n´umeros complejos en una matriz. Adem´as, i ´o j pueden usarse para la parte imaginaria. Sin embargo, si i y j
son usados como variables y se reescriben sus valores, podemos definir una nueva parte imaginaria con, por ejemplo, ii = sqrt(-1).
En los lenguajes de programaci´on corrientes los n´umeros se clasifican en varias categor´ıas tales como de precisi´on simple, de precisi´on doble, real, entero o complejo. En MATLAB todas las variables son tratadas en doble precisi´on (en FORTRAN, por ejemplo, las variables reales y las complejas no pueden compartir las mismas subrutinas, en MATLAB esto no importa).
En MATLAB pueden considerarse tambi´en arreglos de dimensi´on mayor que dos.
MATLAB opera de manera eficiente con matrices del tipo “sparse” o dispersas(matrices con la mayor´ıa de sus entradas iguales a cero). Verhelp sparse y help full.
1.3
Funciones
MATLAB tiene numerosas funciones matem´aticas. Las funciones MATLAB tienen dos im-portantes diferencias con respecto a otros lenguajes de programaci´on (como FORTRAN o C), las cuales son:
1. Las funciones matem´aticas trabajan con variables complejas sin discriminaci´on alguna. 2. Las funciones matem´aticas trabajan con argumentos que son vectores y matrices. Hay funciones en MATLAB que operan esencialmente sobre escalares, pero cuando las apli-camos a una matriz operan sobre cada uno de sus elementos (como por ejemplo, log, log10,
round,sin,cos,tan,asin,acos,atan, rem,abs,ceil,exp,sign,sqrt,floor, entre otras). Otras funciones MATLAB operan b´asicamente sobre un vector (fila o columna), pero act´uan sobre una matriz m×n (m > 2), operando sobre las columnas para obtener un vector fila que es el resultado de su aplicaci´on sobre cada columna (el resultado an´alogo sobre las filas puede obtenerse usando la traspuesta de la matriz original). Algunas de estas funciones son:
max, min, sort, any, all, median, mean, std, prod y sum. As´ı, por ejemplo, el lector puede comprobar que la mayor entrada de una matriz dada A es max(max(A)) y no max(A).
En la tabla 1.2 mostramos algunas funciones MATLAB (en el cap´ıtulo 7 presentamos muchas m´as).
Funciones elementales Descripci´on
abs(x) Valor absoluto dex angle(x) Six es real, angle = 0.
Six =√−1,angle = π2
sqrt(x) Ra´ız cuadrada dex real(x) Parte real compleja
imag(x) Parte imag. compleja
conj(x) Conjugado complejo
sign(x) +1 si x >0; -1 si x < 0
exp(x) Exponencial en base e
log(x) Log en base e
log10(x) Log en base 10
rem(x,y) Resto dex/y
sort(x) Ordena los elementos de un arreglo en orden ascendente
cross(x,y) Producto cruz
dot(x,y) Producto escalar
max(x) M´aximo elemento del vector x min(x) M´ınimo elemento del vectorx rand(n) Genera una matriz nxn de
n´umeros aleatorios
rand(‘seed’,k) Genera un n´umero aleatorio con la semillak >1
ceil(x) Redondea al mayor entero
fix(x) Parte entera
floor(x) Redondea al menor entero
round(x) Redondeo al entero m´as cercano
Funciones trigonom´etricas Descripci´on
sin(x) Seno
cos(x) Coseno
asin(x) Inversa del seno
acos(x) Inversa del coseno
atan2(y,x) Arctangente del 4to. cuadrante
−π atan2(y,x) π
atan(x) −π2 atan(x) π2 sinh(x) Seno hiperb´olico
cosh(x) Coseno hiperb´olico
tanh(x) Tangente hiperb´olica
asinh(x) Inversa del seno hiperb´olico
acosh(x) Inversa del coseno hiperb´olico
atanh(x) Inversa de la tangente hiperb´olica
An´alisis de datos Descripci´on
corrcoef(x) Coeficientes de correlaci´on
cov(x) Matriz de covarianza
cplxpair(x) Ordena en pares conjug. compl.
cumprod(x) Producto acumulado
cumsum(x) Suma acumulativa
hist(x) Histograma
mean(x) Media
median(x) Mediana
prod(x) Producto de elementos
randn(x) Nros. aleatorios distrib. normalm.
sum(x) Suma los elementos de un arreglo
subspace(A,B) Angulo entre dos subespacios´
Las funciones en MATLAB, que son guardadas aparte como M-archivos, son equivalentes a las subrutinas en otros lenguajes.
Consideremos ahora una funci´on (M-archivo) para la siguiente ecuaci´on:
f(x) = 3x
4+ 8x3 −4x+ 5
x3+ 5x+ 6e−2x .
Si suponemos que guardamos el M-archivo con el nombre deejerc1.m, entonces escribimos:
function y = ejerc1(x)
y = (3*x.^4 +8*x.^3 -4*x+5) ./ (x.^ 3+5*x+6*exp(-2*x));
Una vez hayamos guardado el M-archivo, el mismo puede usarse en otro M-archivo. El comando:
>> y = ejerc1(4)
produce
y =
15.1068
Y si el argumento es una matriz, como en:
>> ejerc1([1,2;3,4])
el resultado ser´a tambi´en una matriz:
ans =
1.7616 6.0188 10.7581 15.1068
Las variables en un archivo tipo function son locales por defecto. Sin embargo, una variable puede ser declarada global (ver help global).
Una funci´on puede tener tambi´en m´ultiples argumentos de salida. Consideremos, como ejemplo de este caso, una funci´on que eval´ua la media y la desviaci´on est´andar de un conjunto de datos (ver el ejemplo despu´es de escribirhelp function). Podemos escribir:
function [media,desvst] = medi_st(x) n = length(x);
media = sum(x)/n;
Despu´es de guardar este programa comomedi_st, lo podemos usar en, por ejemplo,
>> x = [1 5 3 4 6 5 8 9 2 4]; >> [m,s] = medi_st(x)
que produce (al escribir primero m y luego s):
m =
4.7000
s =
2.3685
Como un sencillo y ´ultimo ejemplo consideremos la siguiente funci´on2:
function y = randint(m,n,a,b)
% RANDINT Genera de manera aleatoria una matriz % randint(m,n) genera una matriz mxn con entradas % entre 0 y 9.
% randint(m,n,a,b) genera una matriz mxn con entradas % entre a y b.
if nargin < 3, a = 0; b = 9; end y = floor((b-a+1)*rand(m,n)) + a;
Esta funci´on debemos guardarla con el nombre randint.m(que corresponde al nombre de la funci´on). Observemos quenargin(el n´umero de argumentos de entrada, escribahelp nargin) permite establecer un valor por defecto de una variable de entrada omitida, como tal es el caso con a y b en el ejemplo.
De esta manera podemos crear nuevas funciones, las cuales tendr´an el mismo estatus que otras funciones MATLAB. M´as a´un, podemos usar los comandos type y help, como mostramos a continuaci´on.
>> type randint
2Ejemplo tomado de la referencia [22], que es una excelente introducci´on al uso del MATLAB, contiene
´
function y = randint(m,n,a,b)
% RANDINT Genera de manera aleatoria una matriz % randint(m,n) genera una matriz mxn con entradas % entre 0 y 9.
% randint(m,n,a,b) genera una matriz mxn con entradas % entre a y b.
if nargin < 3, a = 0; b = 9; end y = floor((b-a+1)*rand(m,n)) + a; >> help randint
RANDINT Genera de manera aleatoria una matriz randint(m,n) genera una matriz mxn con entradas entre 0 y 9.
randint(m,n,a,b) genera una matriz mxn con entradas entre a y b.
Nota: A partir de MATLAB 6.x, el manejador de una funci´on dada (“function handle”) es una referencia a la misma funci´on que puede tratarse como una variable. De manera que puede copiarse, almacenarse en una matriz (no num´erica), ubicarse en un arreglo, etc. Para ello, podemos usar el comando feval; as´ı, por ejemplo,
k = @cos
y = feval(k,0)
es lo mismo que k(0) o y = cos(0). Tambi´en podemos usar un ‘string’ como en
y = feval(’cos’,0)
No obstante, el m´etodo del manejador de funciones es m´as general. Ver tambi´en la§8.2. Una funci´on an´onima (“anonymous function”) se puede definir a trav´es una expresi´on de una l´ınea (en lugar de requerir un M-archivo). Ensayemos escribir, por ejemplo,
>> f = @(x) x.^3 - pi*x - cos(7*x)
Y luego puede probar
La sintaxis general para una funci´on an´onima es
handle = @(arg1, arg2, . . . ) expresi´on
Por ejemplo,
>> norma2 = @(x,y,z) sqrt(x^2 + y^2 + z^2)
Ahora, ensaye escribir
>> norma2(1,1,1)
y compare con
>> norm([1 1 1])
El comando inline le permite almacenar una funci´on como un objeto (simb´olico). Ver
help inline, help symvar y el cap´ıtulo 7). Por ejemplo, si f(x) = (x+ 2)(x−2), podemos definir esta par´abola como
>> f = inline(’(x+2).*(x-2)’)
f =
Inline function: f(x) = (x+2).*(x-2)
Podemos realizar algunas evaluaciones:
>> f(5)
ans =
21
>> f(0:6)
ans =
Los objetos tipo “inline” pueden usarse en lugar de otras variables:
>> x = linspace(-5,5); >> plot (x,f(x))
>> hold on
>> plot (x,f(x-3)) >> grid
(Nota: La funci´onlinspacegenera un vector fila con 100 entradas igualmente espacia-das entre sus dos argumentos. Para saber acerca de las funciones plot y hold ver el cap´ıtulo que sigue, § 2.1.)
1.4
Pr´
actica adicional
Ejercicio 1:
Algunos simples esquemas “while-loops” pueden aplicarse para obtener informaci´on acerca del sistema en punto flotante con que cada uno de nosotros trabaja.
a) Escribir un script que asigne a p el entero positivo m´as peque˜no tal que 1 +1/2p = 1. b) Escribir unscript que asigne a q el entero positivo m´as peque˜no tal que 1/2q = 0.
c) Escribir un script que asigne a r el entero positivo m´as peque˜no tal que 2r = inf
(cuando hayoverflow MATLAB produce el valor especialinf).
Nota: En MATLAB eps representa el “´epsilon de la m´aquina” (alrededor de 10−16 en la mayor´ıa de las m´aquinas); es decir, representa la precisi´on de punto flotante de la computadora que se est´a usando (es la distancia de 1.0 al n´umero siguiente m´as grande en punto flotante). Es ´util cuando queremos especificar la tolerancia para la convergencia de procesos iterativos.
Ejercicio 2:
Ejercicio 3:
Problema clave: “Un hombre puso una pareja de conejos en un lugar cerrado. ¿Cu´antas parejas de conejos tendr´a al cabo de un a˜no si cada mes una pareja f´ertil engendra una nueva pareja, que a partir del segundo mes se vuelve f´ertil?”
a) Denotemos por fn el n´umero de pares de conejos despu´es de n meses. Encuentre una expresi´on matem´atica que permita calcular fn a partir de fn−1 y fn−2.
b) ¿Qu´e hubiera sucedido si en el enunciado anterior no se hubiera especificado “un mes” como el tiempo necesario para que cada nueva pareja nacida alcanzara la madurez? c) Escriba un M-archivo tipo function que genere un vector que contenga los primeros n
n´umeros generados por el problema clave.
d) ¿Cu´al es el ´ındice del n´umerofnm´as grande que pueda representarse (aproximadamente) como una cantidad MATLAB en doble precisi´on sin alcanzar el overflow3?
e) Escriba las dos matrices:
>> A = [1 1; 1 0]; >> X = [1 0; 0 1];
Luego introduzca la declaraci´on:
>> X = A*X
Presione de manera repetida la tecla up arrow, seguida por la tecla Enter. ¿Qu´e sucede? ¿Reconoce los elementos de las matrices generadas? ¿Cu´antas veces podr´ıamos repetir esta iteraci´on antes de que X alcance el overflow?
Ejercicio 4:
Defina una funci´on cuya entrada consista de dos pares de puntos en el plano y cuya salida sea, bien alg´un punto de intersecci´on de los segmentos que esos puntos definen o bien la informaci´on de que los segmentos en cuesti´on no se cortan en punto alguno.
3Se suele traducir como “desbordamiento”, y ocurre “cuando los datos resultantes de una entrada o
proce-samiento requieren m´asbitsde los que han sido proporcionados por elsoftwareo elhardwarepara almacenar
Entrada: P1, P2, P3 y P4, donde cada uno es un punto en el plano, es decir, un vector con dos componentes.
Salida: Las coordenadas de alg´un punto de corte entre los segmentos “P1-P2” y “P3-P4” o el mensaje de que no existe ning´un punto de corte entre los segmentos.
Pruebe su funci´on con los siguientes ejemplos:
Ejemplos P1 P2 P3 P4 1 (0,0) (5,5) (5,0) (0,5) 2 (1,1) (3,3) (6,0) (0,6) 3 (2,2) (2,4) (1,5) (3,5) 4 (1,4) (4,1) (3,2) (2,3) 5 (-1,0) (3,0) (0,-3) (0,3) 6 (1,0) (4,3) (3,3) (1,2) 7 (1,1) (2,2) (3,3) (4,4) 8 (1,0) (4,3) (2,2) (6,6) 9 (0,0) (3,3) (3,3) (5,5) 10 (2,3) (5,0) (3,2) (4,1) 11 (2,3) (5,0) (3.5, 1.5) (3.5, 1.5)
(Nota: Siempre es importante documentar lo mejor posible nuestros programas.)
(Propuesto por el Prof. J. Renom. Notas de clases de c´omputo cient´ıfico. Departamento de C´omputo Cient´ıfico y Estad´ıstica, Universidad Sim´on Bol´ıvar, Sartenejas, 2004.)
Ejercicio 5:
Supongamos que tenemos una fuente de calor de 200◦C y dos tipos de aislantes: el primero puede reducir el calor en 20◦C por cada mil´ımetro de espesor y el segundo, un 15 % por cada mil´ımetro de espesor. Escribir un script que permita hallar el m´ınimo espesor necesario de cable aislante para reducir la temperatura por debajo de 30◦C.
Ejercicio 6:
Comenzando con un entero positivo n, escriba un script que genere una sucesi´on a partir de las siguientes reglas: si n = 1, parar; si n es par, reemplazarlo con n/2; si n es impar, reemplazarlo por 3n+ 1. Corra el programa para algunos valores de n (por ejemplo, para
n= 7,27,379,1845,3001). ¿Cu´antos pasos m´as son necesarios para terminar la sucesi´on si n
llega a ser (en alg´un momento de este proceso) una potencia de 2?
Ejercicio 7:
positivos dados (no arreglos). Si los n´umeros no son enteros positivos debe mostrarse un mensaje de error. Utilice aqu´ı los comandos mod y break.
Ejercicio 8: (Propuesto en [16].)
Cap´ıtulo 2
Capacidades gr´
af icas elementales
MATLAB puede producir gr´aficas de curvas en el plano, y gr´aficas de curvas y superficies en tres dimensiones (mallas). Los comandos b´asicos que aqu´ı consideraremos son plot, plot3,
mesh, surfy light.
2.1
Gr´
af icas en dos dimensiones
Six y y son vectores de igual longitud, el comando plot(x,y)crea una ventana y traza una gr´afica de los elementos dex contra los de y. Escribamos, por ejemplo,
>> x = -5:0.01:5; y = sin(2*x); plot(x,y)
(Nota: Cuando usamos signos de dos puntos para separar tres n´umeros, se generar´an valores entre el primer n´umero y el tercero, usando el segundo n´umero como incremento.) Observemos que la distancia entre entradas consecutivas del vector x (0.01 en nuestro ejemplo) debe escogerse lo suficientemente peque˜na para que la curva muestre una apariencia de continuidad.
Ejercicio 1: Graficar la funci´ony=sen(x)e−x2 en el intervalo [−3,3] (recordar el uso de .*
y .^). Utilizar luego el comando zoom (ver help zoom).
Ejercicio 2: Es un hecho conocido que, si tomamos un n´umero suficiente de t´erminos, entonces las sumas parciales nk=0xkk! del desarrollo de Taylor de ex convergen. Escriba un
script que explore esto, graficando el error relativo de las sumas parciales como una funci´on den50, para distintos valores de x: 10, 5, 1, -1, -5, -10. (Nota: Use el comandosemilogy, el cual es ´util cuando representamos n´umeros cuyo rango var´ıa demasiado; para m´as detalles consultar el help de MATLAB.)
comando figure. Si, por ejemplo, “figure No. 1” es la figura actual, entonces el comando
figure (o figure(2)) crea una nueva ventana con la segunda figura, y pasa ´esta a ser la figura actual (el comando figure(1) mostrar´a la primera figura y pasa a ser de nuevo la figura actual).
Otra opci´on consiste en mostrar varias gr´aficas superpuestas en una misma ventana (en un mismo sistema de ejes coordenados). El comando hold permite hacer esto. Escribamos primero hold on (o hold) antes de los comandos plot subsiguientes, y luego escribamos el comando hold off (o hold) para liberar la condici´on. Tambi´en podemos graficar varias curvas en un solo sistema coordenado usando el mismo comando plot. Por ejemplo, el siguiente scriptlo hace as´ı:
x = 0:0.01:3*pi; y1 = sin(x); y2 = sin(2*x); y3 = sin(3*x);
plot(x,y1,x,y2,x,y3)
O bien,
x = 0:0.01:3*pi;
y = [sin(x)’ , sin(2*x)’ , sin(3*x)’]; plot(x,y)
seg´un muestra la figura 2.1.
El comandolegendcrea una leyenda en la figura actual de trabajo que permite identificar los diferentes gr´aficos (ver help legend). Otros comandos que siguen al plot y que tienen un ‘string’ como argumento son: title (el t´ıtulo del gr´afico),xlabel (la etiqueta para el eje
x), ylabel (la etiqueta para el eje y), gtext (coloca un texto sobre el gr´afico con la ayuda del mouse), text (coloca un texto en las coordenadas que se especifiquen), grid (muestra una cuadr´ıcula sobre la gr´afica actual) yaxis(aunque por defecto los ejes son autoescalados, este comando permite personalizar el escalamiento de los ejes).
(Actividad: Con ayuda del comando help, explore estos comandos.)
MATLAB tiene un comando para obtener f´acil y eficientemente la gr´afica de una funci´on. Consideremos, por ejemplo, la funci´on del ejercicio 1 y definamos un M-archivo tipofunction
que llamaremos ejerc1.m (¡hag´amoslo!), entonces el comando
Figura 2.1: Podemos graficar varias curvas en el mismo sistema coordenado. o simplemente,
>> fplot(’sin(x).*exp(-x.^2)’,[-3,3])
producir´a la gr´afica sobre el dominio indicado.
Tambi´en podemos graficar curvas definidas param´etricamente. Por ejemplo, ensaye los comandos
>> t = 0:0.001:2*pi; x = cos(5*t); y = sin(4*t); plot(x,y)
(Actividad: Con ayuda del comande help plot, explore c´omo usar la funci´on plot para obtener diferentes tipos de l´ıneas, s´ımbolos y colores cuando realicemos nuestras gr´aficas con MATLAB.)
El comando subplot particiona una figura de manera tal que gr´aficas m´as peque˜nas son ubicadas en una figura (en un arreglo de gr´aficas). Para una informaci´on m´as detallada puede escribir help subplot.
Otras funciones ´utiles para obtener gr´aficas en el plano son: polar, bar, hist, fill,
quiver, stairs, rose, feather y compass. El lector puede explorar estas funciones v´ıa el comando help.
2.2
Gr´
af icas en tres dimensiones
Si x, y y z son tres vectores de igual longitud, el comando plot3(x,y,z) produce curvas en el espacio tridimensional. Por lo general, estos vectores se definen de manera param´etrica. Por ejemplo,
t = 0:0.001:20*pi;
x = cos(t); y = sin(t); z = t.^3;
plot3(x,y,z), title(’Helice’), xlabel(’x’), ... ylabel(’y’), zlabel(’z’)
representa una h´elice que se comprime sobre el planoxy(ver figura 2.2). Al igual que en el caso bidimensional, aqu´ı tambi´en podemos usar los comandos para identificar los ejes (incluyendo
zlabel) y el comando axis.
Figura 2.2: H´elice comprimi´endose sobre el plano xy.
El comando mesh nos permite trazar una superficie (una malla) en tres dimensiones. Para trazar la gr´afica de una funci´on z = f(x, y) sobre un rect´angulo, definimos primero los vectores x1 y y1 que dan las particiones de los lados del rect´angulo. Luego, la funci´on
x1 = -2:0.2:2; y1 = x1; [x,y] = meshgrid(x1,y1); z = exp(-x.^2-y.^2); mesh(z)
que traza la gr´afica de z =e−x2−y2 en [−2,2]×[−2,2].
(Asignaci´on: Probemos este ejemplo con el comandosurf en lugar demesh. Este comando produce una superficie con facetas, ver help surf.)
Los comandos shading y colormapest´an asociados con diferentes matices y colores. Hay tres opciones para el primero:
shading faceted, shading interp y shading flat. Para el segundo comando hay varias posibilidades:
colormap(hsv) (por defecto), colormap(hot), colormap(cool),
colormap(jet), colormap(gray), etc. (ver help colormap y colorbar). (Asignaci´on: Experimentar con la superficie anterior usando estos comandos.)
Nota: Los comandosshading y colormap se escriben despu´es del comando surf.
El comando view puede usarse para especificar, tanto en coordenadas cartesianas como esf´ericas, el punto de vista desde el cual el objeto tridimensional va a ser visualizado. Probe-mos, por ejemplo, con view(0,90) en la ´ultima figura generada. Para ver una informaci´on m´as detallada acerca del uso de este comando recomendamos revisar la ayuda de MATLAB. Para este comando tambi´en es v´alida la nota anterior.
Ejercicio 3: La funci´on MATLAB peaks genera una interesante superficie. Experimente sobre esta superficie usando los comandos shading, colormap, view y rotate3d (usar el comando help cuando sea necesario).
Podemos usar tambi´en fuentes de luz con el comando light. Use este comando para a˜nadir una fuente de luz a la superficie peaks (ver figura 2.3).
Tambi´en podemos graficar superficies definidas param´etricamente. Ensaye las funciones
sphereandcylinder, y note que generan las gr´aficas de las correspondientes superficies (ver
type sphere y type cylinder).
Otras funciones relacionadas y que podemos explorar v´ıa helpson: meshz, surfc,surfl,
contour y pcolor.
Figura 2.3: La superficie ‘peaks’ con escala de grises y una fuente de luz.
lector revisar el Using MATLAB Graphics y el documento en l´ınea Creating Graphical User Interfaces. Ver tambi´en [17]. ¡Escriba guide!.
2.3
La impresi´
on
Usando el comando print de MATLAB podemos f´acilmente obtener una impresi´on de la gr´afica actual de trabajo. Si solamente escribimos el comando print, se env´ıa la figura actual a la impresora por defecto.
El M-archivo printopt nos permite especificar las opciones que por defecto puede usar el comando print. Si se desea, editando este archivo, se pueden cambiar las opciones por defecto (ver help printopt).
El comandoprint archivoguarda la gr´afica actual (con el nombre designadoarchivo) con el formato de archivo por defecto (usualmente PostScript). Por ejemplo,
print grafica6
crea un archivo PostScript grafica6.ps para la figura actual de trabajo, la cual puede imprimirse posteriormente. Si el nombre del archivo ya existe, el mismo ser´a reescrito, a menos que usemos la opci´on append. As´ı, por ejemplo,
a˜nade la gr´afica actual al archivo ya existentegrafica6.ps. De esta forma, podemos guardar varias gr´aficas en un s´olo archivo.
Las opciones “-d” y “-f” denotan un dispositivo (“device”) y una figura (“figure”), res-pectivamente. Por ejemplo,
print -deps - f2 grafica5
guarda en el archivo PostScript encapsuladografica5.eps el gr´afico “Figure No. 2”, aunque no sea la figura actual.
Podemos crear un M-archivo para guardar una figura que m´as tarde podemos cargar a fin de generar nuevamente la figura. El comando
print -dmfile grafic6
crea un M-archivo que contiene la informaci´on necesaria para despu´es reproducir la figura. A trav´es del uso del help se pueden ver muchas otras opciones para el uso pr´actico del comando print.
2.4
Pr´
actica adicional
Ejercicio 1: Graficando matrices.
Si el argumento del comando plotes una matriz, MATLAB usar´a las columnas de la matriz para graficar un conjunto de l´ıneas (una por columna). Pruebe escribir:
>> A = [1 2 3 4; 2 3 4 5; 3 4 5 6] >> plot(A), grid
MATLAB tambi´en grafica las columnas de una matriz respecto a los ´ındices de una fila. Por ejemplo, ensaye escribir:
>> x = [1 3 7 12] >> plot(A,x), grid
¿Podr´an graficarse las columnas de una matriz respecto a otra? Experimente. Explore con
help plot y doc plot.
Podemos usar la funci´onmeshgrid para generar dos matrices x y y. En efecto:
Podemos adem´as definir la superficie z =x2+y2, que no es m´as que la distancia de cada punto (x, y) al origen (en realidad, al evaluar z obtendremos otra matriz). A continuaci´on, grafiquemos la superficie z como una funci´on de x y y. Por ´ultimo, expanda el dominio de trabajo al incrementar los datos de entrada usando meshgrid, para luego obtener una nueva gr´afica (que ser´ıa la de un cono con v´ertice en el origen).
Ejercicio 2:
Hay varias formas de graficar una superficie tridimensional con MATLAB. Consideramos aqu´ı dos tipos de gr´aficas: la gr´afica de malla (mesh) y la gr´afica de superficie (surf). Es-criba un script que trace las gr´aficas de malla y de superficie de la funci´on de dos variables
z =f(x, y) = 1/(1 +x2+y2) (aqu´ı,x = -2:0.1:2; y = -1:0.1:2). Use tambi´en los coman-dos meshgrid, title (para identificar las gr´aficas), xlabel, ylabel y zlabel.
Ejercicio 3:
Parte III
Cap´ıtulo 7
Matem´
aticas simb´
olicas
El “Toolbox” de matem´atica simb´olica (“Symbolic Math Toolbox”), que utiliza el kernel del Maple Vr, nos permite efectuar c´alculo simb´olico desde el MATLAB (sin abandonar el ambiente de trabajo MATLAB).
Muchas funciones de este “Toolbox” tienen los mismos nombres que sus contrapartes num´ericas. MATLAB selecciona la correcta dependiendo del tipo de entrada asignada a la funci´on. Escribir, por ejemplo, help eig y help sym/eig muestra la ayuda para la funci´on num´erica para autovalores y su contraparte simb´olica, respectivamente.
7.1
Variables simb´
olicas
Con el comando symspodemos declarar una variable como simb´olica. Por ejemplo,
>> syms x
crea una variable simb´olicax. Por otra parte, Mapler tiene su propio espacio de trabajo, por lo que los comandosclearoclear xno borran esta declaraci´on; ellos s´olo limpian la variable MATLAB x, pero no la variable de Maple. No obstante, el comando clear all borra todas las variables, tanto las de MATLAB como las de Mapler.
Las variables simb´olicas pueden construirse a partir de variables num´ericas que ya existen. Esto lo hacemos usando la funci´onsym. Por ejemplo, podemos escribir
>> x = 2/5; >> y = sym(x)
O bien, podemos hacer
Los comandos symsy symtienen muchas opciones.
(Asignaci´on: Ensayemos escribir help syms y help sym.)
7.2
Un poco de
calculus
La funci´onlimitnos permite calcular l´ımites simb´olicos de algunas expresiones. Por ejemplo, podemos escribir
>> syms x h n
>> limit((1 + x/n)^n, n, inf)
Tambi´en podemos ensayar:
>> limit((sin(x+h) - sin(x))/h,h,0)
La funci´on diff calcula la derivada simb´olica de una funci´on definida por una expresi´on simb´olica. Por ejemplo,
>> syms x
>> f = x^5 * exp(x); >> diff(f)
produce la derivada simb´olica def con respecto ax (en la misma notaci´on del MATLAB):
ans =
5*x^4*exp(x)+x^5*exp(x)
Tambi´en podemos calcular derivadas parciales. Por ejemplo,
>> syms x y
>> f = x^5 + x*y;
>> diff(f) %con respecto a x (por defecto)
ans =
5*x^4+y
ans =
5*x^4+y
>> diff(f,y)
ans =
x
Los dos primeros c´alculos corresponden al c´alculo de ∂f∂x, y el ´ultimo, al c´alculo de ∂f∂y. Podemos obtener tambi´en la segunda derivada. Por ejemplo,
>> syms x y
>> f = x^5 + x*y; >> diff(f,x,2)
ans =
20*x^3
Usando la funci´on int, podemos intentar calcular la antiderivada de una funci´on definida a trav´es de una expresi´on simb´olica. Por ejemplo,
>> syms x y alfa
>> int(cos(x*y - alfa),alfa)
ans =
-sin(x*y-alfa)
Por supuesto que existir´an situaciones en las que int no nos permitir´a obtener un resultado en t´erminos de funciones elementales. Ensaye escribir:
>> int(exp(-x^2))
>> int(sqrt(1 + x^3))
Su resultado est´a dado en t´erminos de la funci´on EllipticF, la cual est´a definida por una integral (hacer tambi´en pretty(int(sqrt(1 + x^3)))).
La funci´on pretty mostrar´a una expresi´on simb´olica m´as f´acil de leer (otros formatos en los que podemos mostrar una expresi´on simb´olica son: latex,ccode yfortran). Ensayemos escribir:
>> syms x y alfa >> f = x/(alfa*x + y) >> pretty(f)
>> g = int(f) >> pretty(g)
Tambi´en podemos trabajar con integrales definidas. Por ejemplo, podemos escribir
>> int(cos(x),0,pi) %con respecto a x por defecto,
o bien,
>> int(cos(alfa),alfa,0,pi) >> int(exp(-x^2),0,inf)
Aunque los resultados obtenidos son simb´olicos, la funci´ondoublelos convierte en num´ericos (MATLAB). Por ejemplo, el resultado de la ´ultima integral es1/2*pi^(1/2), pero si hacemos
double(ans) obtenemos el resultado num´erico MATLAB 0.8862. Tambi´en podemos usar la funci´on vpa (“variable precision arithmetic”) para transformar la expresi´on en un n´umero simb´olico de precisi´on arbitraria. Por ejemplo, podemos ensayar escribir:
>> vpa(ans,30)
para obtener el resultado con 30 d´ıgitos significativos:
ans =
.886226925452758013649083741670
Ejercicio 1: Realizar un estudio comparativo de estas t´ecnicas (a trav´es del an´alisis de algunos ejemplos) con las funciones de integraci´on num´ericas de MATLAB, quad y quad8
(ver cap´ıtulo 5).
>> taylor(sin(x) + exp(x))
muestra el desarrollo de Maclaurin de 5to. orden que aproxima a sen(x) + ex. Asimismo, el comando
>> taylor(sin(x) + exp(x^2),10,x,pi/2)
muestra el desarrollo de Taylor de grado 10, que aproxima a sen(x) + ex2, alrededor del punto
x0 =π/2.
A trav´es del uso de la funci´on eval, podemos evaluar num´ericamente una expresi´on simb´olica. Por ejemplo,
>> syms x y
>> z = x^3 + sin(x*y); >> x = 5;
>> eval(z)
ans =
125+sin(5*y)
>> y = 7; >> eval(z)
ans =
124.5718
Ensaye escribir tambi´en:
>> z = x^3 * exp(7*x); >> w = diff(z)
>> v = vectorize(w) >> x = 0:.1:1; >> eval(v)
7.3
Algunas manipulaciones algebraicas
La expresi´on solve(F) tratar´a de encontrar los valores de la variable simb´olica para la cual la expresi´on simb´olica F es cero. Por ejemplo,
>> syms x y z
>> X = solve(x^2 - z*y)
X =
[ (y*z)^(1/2)] [ -(y*z)^(1/2)]
>> pretty(X)
[ 1/2 ] [(y z) ]
[ ]
[ 1/2] [-(y z) ]
Otros ejemplos son:
>> Y = solve(cos(x) - x^3)
Y =
.86547403310161444662068590118623 >> Z = solve(x^2 - z*y,z)
Z =
x^2/y
2 x
----y
Si queremos resolver una ecuaci´on cuyo lado derecho es diferente de 0, colocamos la expresi´on entre comillas. Por ejemplo,
>> X = solve(’exp(x) = (x - 1)^2’)
X =
[ -2*lambertw(-1/2*exp(1/2))+1]
[ 0]
>> vpa(X)
(Actividad: Revisar, con la ayuda de algunos ejemplos, las diferentes posibilidades desolve; ver help solve.)
Para ver c´omo podemos resolver un sistema no lineal usandosolve, ensayemos por ejemplo con las siguientes l´ıneas:
>> E1 = ’x^2 + y^2 + z^2 = 1’; >> E2 = ’x + y + z = 1’;
>> E3 = ’y - z = 1’;
>> [X, Y, Z] = solve(E1, E2, E3)
7.4
Un poco de ´
algebra lineal
Podemos representar matrices en forma simb´olica. Por ejemplo, si
>> a = eye(5)
Entonces,
>> A = sym(a)
[ 1, 0, 0, 0, 0] [ 0, 1, 0, 0, 0] [ 0, 0, 1, 0, 0] [ 0, 0, 0, 1, 0] [ 0, 0, 0, 0, 1]
es la expresi´on simb´olica de la matriz original. La funci´on numeric(A) la transforma nue-vamente a num´erica. Usando sym tambi´en podemos generar matrices simb´olicas. Podemos ensayar:
>> syms a b c
>> D = [a^2 + b,cos(a + b);sin(a - b),b^2 - a]
D =
[ a^2+b, cos(a+b)] [ sin(a-b), b^2-a]
Las operaciones algebraicas con matrices simb´olicas las realizamos de la misma forma como lo har´ıamos con MATLAB.
Algunas funciones matriciales simb´olicas1 son:
det, ’ , inv, null, colspace, eig, poly, svd, jordan.
Ejercicio 2: Use las funcioneseigysvdpara calcular los autovalores, autovectores y valores singulares de las matrices magic(n), con n igual a 5, 6 y 7.
Ejercicio 3: Use solve(det(A)) para determinar los valores de s para los cuales la matriz
A = [0 1 s;1 s 1;s 1 0]
es singular.
Ejercicio 4: Use la funci´on solvepara resolver el sistema de ecuaciones lineales
⎛ ⎜ ⎜ ⎝
4 3 0 3 4 −1 0 −1 4
⎞ ⎟ ⎟ ⎠ ⎛ ⎜ ⎜ ⎝ x y z ⎞ ⎟ ⎟ ⎠= ⎛ ⎜ ⎜ ⎝ 24 30 −24 ⎞ ⎟ ⎟ ⎠.
7.5
Gr´
af icas de funciones
En el “Toolbox” de matem´atica simb´olica la funci´onezplotnos permite graficar una funci´on a partir de su definici´on simb´olica. Por ejemplo,
>> syms x
>> ezplot(60*x/(x^2 - 1)) >> ezplot(pi/(1 + 20*exp(-x)))
El dominio puede modificarse usando un segundo argumento de entrada. Por ejemplo,
>> ezplot(x*sin(1/x))
>> ezplot(x*sin(1/x),[-1/2,1])
Aqu´ı ezplot procura realizar una selecci´on razonable del eje y. Sin embargo, podemos modificar los l´ımites del intervalo seleccionando Edit, seguido de Axes Properties, en la ventana de la ´ultima figura.
(Actividad: Con fines did´acticos resulta ´util utilizar el comando funtool sin argumentos. Explore su uso y escriba help funtool para revisar detalles adicionales.)
7.6
Un poco de ecuaciones diferenciales
A trav´es del uso de la funci´on dsolve buscamos resolver ecuaciones diferenciales ordinarias (EDOs). D es el operador diferencial simb´olico. Por ejemplo,
>> y = dsolve(’Dy = x^3*y’, ’x’)
produce la soluci´on
y =
C1*exp(1/4*x^4)
>> pretty(y)
4 C1 exp(1/4 x )
>> y = dsolve(’Dy = x^3*y’, ’y(0)=1’, ’x’)
Tambi´en podemos usar operadores diferenciales simb´olicos de orden mayor: D2, D3, ..., para intentar resolver ODEs de orden mayor. Por ejemplo,
>> y = dsolve(’D2y + y = x^3’, ’y(0)=1’, ’Dy(0)=1’, ’x’)
Podemos adem´as incursionar en la resoluci´on de sistemas de EDOs. Por ejemplo,
>> E1 = ’Dx = y + z’; >> E2 = ’Dy = x + z’; >> E3 = ’Dz = x + y’;
>> [x, y ,z] = dsolve(E1, E2, E3)
(aqu´ı se asume que x, y, z dependen de la variable independiente t, y como funci´on de la misma se mostrar´a la soluci´on del sistema).
(Actividad: Explorar help dsolve odoc dsolve.)
7.7
M´
as matem´
aticas simb´
olicas
Este “Toolbox” contiene muchas otras funciones, que abarcan transformadas de Fourier y Laplace, funciones especiales, conversiones, herramientas pedag´ogicas y funciones que per-miten el acceso a Maple. En particular, la funci´on mfun nos permite trabajar con muchas funciones especiales que MATLAB no tiene (podemos escribir mfunlist para ver una lista de estas funciones). La funci´on maple nos permite usar expresiones en el lenguaje propio de Maple, lo que nos da un acceso completo a su funcionalidad (hacerhelp maple odoc maple
para ver los detalles).
Para una breve y muy instructiva explicaci´on sobre el “Symbolic Math Toolbox” el lector puede consultar cualquiera de las referencias [4], [10] y [23]. Para una revisi´on m´as detallada sobre este “Toolbox” y el “Extended Symbolic Math Toolbox”2 puede visitar el web site de “The MathWorks” (o consultar directamente [12]).
7.8
Pr´
actica adicional
Ejercicio 1: Ecuaci´on diferencial log´ıstica3 [10, p´ag. 232].
2El mismo permite el acceso a un importante n´umero de procedimientos especializados de Maple.
a) Resuelva la ecuaci´on diferencial
d
dty(t) =cy−by
2,
donde cy b son escalares arbitrarios.
b) Ahora resuelva el PVI asociado cony(0) = 0.01,c= 10 y b= 1.
c) Verifique que la soluci´on encontrada en b) satisface la condici´on inicial y la ecuaci´on diferencial (ayuda: pueden usarse las funciones MATLAB subs, diffy simplify).
Ejercicio 2: La ecuaci´on del p´endulo.
Ya en el ejercicio 3, § 6.4, pedimos resolver num´ericamente esta ecuaci´on. Trataremos ahora de encontrar su soluci´on general (expl´ıcita) usando dsolve. ¿Qu´e observa en la salida? En el caso de que θ sea peque˜no, sen(θ)≈θ, intente entonces encontrar la soluci´on general de la EDO θ(t) +θ(t) = 0, as´ı como su soluci´on particular cuando θ(0) =θ(0) = 1.
Ejercicio 3: La transformada de Fourier [9, §20.36].
Latransformada de Fourier (revise conhelp el uso y sintaxis defourier) y la transformada inversa de Fourier (hacer help ifourier) se definen por:
F(ω) =
∞
−∞
f(t)e−iωtdt y f(t) = 1 2π
∞
−∞
F(ω)eiωtdt,
respectivamente. Las transformadas de Fourier e inversa de Fourier son muy usadas en an´alisis de circuitos para determinar las caracter´ısticas de un sistema en los dominios del tiempo y la frecuencia. MATLAB usa las funciones fourier y ifourierpara transformar expresiones entre dominios.
a) Defina (simb´olicamente) la funci´onf(t) =te−π t2 y calcule su transformada de Fourier. A continuaci´on calcule la transformada inversa de Fourier (de F(ω)). ¿Qu´e observa? (Nota: MATLAB usa ‘w’ para representar simb´olicamente a ω.)
b) En muchas ocasiones, cuando se usa la transformada de Fourier para resolver problemas de ingenier´ıa, las expresiones consideradas pueden incluir dos tipos de funciones, a saber: la funci´on escal´on o de Heaviside u(t) y la funci´on impulso o de Dirac δ(t). Examine el contenido de las ayudas help Heaviside y help Dirac. Calcule la derivada de la funci´on escal´on, ¿qu´e obtuvo? Considere ahora la funci´on f(t) = −e−tu(t) +πδ(t); al igual que en a), encuentre las transformadas de Fourier e inversa de Fourier.
b <0. Tambi´en denominada la curva de Pearl-Reed, pertenece a una de las clases de curvas conocidas como
Cap´ıtulo 8
M´
as MATLAB
Para un an´alisis detallado del error local, el error global y la estabilidad num´erica de los m´etodos num´ericos vistos usando MATLAB (as´ı como para revisar otros m´etodos), ver la obra de Van Loan [16].
El libro de C. Moler,Numerical Computing with MATLAB[18], es una excelente referencia que complementa y extiende el tratamiento aqu´ı realizado (incluye los t´opicos de ´algebra lineal, interpolaci´on, estimaci´on de ra´ıces, m´ınimos cuadrados, cuadratura, ecuaciones diferenciales, n´umeros aleatorios, an´alisis de Fourier y visualizaci´on gr´afica).
Para una referencia completa y actualizada respecto al uso y aplicaci´on de las capacidades gr´aficas del MATLAB, el lector puede consultar el documento “Using MATLAB Graphics” (m´as de 700 p´aginas), que puede encontrar en [15].
Hay muchas caracter´ısticas y funciones MATLAB que no podemos exponer en esta breve introducci´on, por lo que en este cap´ıtulo trataremos de mostrar algunas de ellas.
8.1
“Toolboxes”
Aparte de las funciones tabuladas en § 3, existen muchas otras que forman parte de colec-ciones especializadas de M-archivos para resolver tipos de problemas particulares, denomi-nados “toolboxes”, los cuales son opcionales y pueden estar disponibles o no, dependiendo de las necesidades locales del grupo de investigadores en donde est´e instalado el MATLAB1. Los “toolboxes” representan el esfuerzo de muchos investigadores de primera l´ınea en sus respectivas ´areas. Las funciones de un “toolbox” se encuentran, por lo general, en un solo directorio, est´an bien documentadas e incluyen demos. Algunos de estos “toolboxes” son:
1Es decir, un “toolbox” es una colecci´on de funciones que extienden las capacidades de MATLAB en un
• Communications Toolbox
• Control System Toolbox
• Data Acquisition Toolbox
• Datafeed Toolbox
• Financial Toolbox
• Financial Time Series Toolbox
• Frequency Domain System Identification Toolbox
• Fuzzy Logic Toolbox
• GARCH Toolbox
• Higher-Order Spectral Analysis Toolbox
• Image Processing Toolbox
• LMI Control Toolbox
• Mapping Toolbox
• Model Predictive Control Toolbox
• μ-Analysis and Synthesis Toolbox
• NAGr Foundation Toolbox
• Neural Network Toolbox
• Optimization Toolbox
• Partial Differential Equation Toolbox
• QFT Control Design Toolbox
• Quantized Filtering Toolbox
• Robust Control Toolbox
• Spline Toolbox
• Statistics Toolbox
• Symbolic Math Toolbox
• System Identification Toolbox
• Wavelet Toolbox.
Tambi´en est´a disponible Simulinkr, un sistema interactivo para modelar y simular sistemas
din´amicos no-lineales en un ambiente gr´afico.
Si escribimos ver obtendremos la lista de los “toolboxes” instalados en nuestro sistema (cada uno con su versi´on), los cuales podemos explorar v´ıa el comando help o simplemente consultando la correspondiente documentaci´on.
8.2
Cambios en MATLAB
Los cambios introducidos en nuevas versiones de MATLAB incluyen nuevas caracter´ıscas en el lenguaje, nuevas funciones y modificaciones de la sintaxis.
As´ı, por ejemplo, en el MATLAB 5.3 los nombres de las funciones fmin, fmins y nnls
pasan a escribirse como fminbnd, fminsearch y lsqnonneg, respectivamente.
A partir de la versi´on 6 MATLAB incluye importantes caracter´ısticas en relaci´on con versiones anteriores; algunas de ellas son:
• Los c´alculos matriciales est´an basados en LAPACK, y no en LINPACK como era antes.
• A consecuencia del cambio a LAPACK, la funci´onflops ya no est´a operativa.
• Algunos de los argumentos de la funci´oneigs se han cambiado (pasa a ser una interfaz de ARPACK, en lugar de ser un M-archivo).
• Se ha introducido el denominado manejador de funciones (“function handle”) para pasar las funciones como argumentos (el cual se prefiere al paso de los nombres de las funciones en “strings”). Para una informaci´on m´as completa ver help function_handle.
• La funci´on de cuadratura quad8 ha sido reemplazada por quadl. La tolerancia por defecto para quad es ahora del orden deeps, en vez de 10−3 como era antes.
• A fin de explotar el manejador de funciones se ha cambiado la manera en que las funciones ODE son referenciadas (ya no se usa el formato “ODE file”, documentado en elhelp odefile).
• A partir del MATLAB 6.5 se encuentra disponible el “solver” DDE23, utilizado para resolver ecuaciones diferenciales con retardo (“delay differential equations”, DDEs). Para obtener informaci´on adicional sobre c´omo resolver DDEs con MATLAB puede consultar el art´ıculo [21].
Para un estudio amplio del MATLAB 7 (pero, sin ser exhaustivo) y sus ventajas comparativas con el MATLAB 6 y el MATLAB 5, recomendamos el libro de Higham y Higham [10].
MATLAB 7 incluye nuevas y destacadas mejoras en la programaci´on y el rendimiento del c´odigo, tales como matem´aticas de n´umeros enteros y de precisi´on simple, “breakpoints” condicionales, ejecuci´on de celdas en el editor y M-Lint para la revisi´on del c´odigo. Tambi´en incluye nuevas funcionalidades importantes para la visualizaci´on de datos tales como he-rramientas para la creaci´on de gr´aficos de forma interactiva o la posibilidad de generar au-tom´aticamente c´odigo M a partir de los mismos.
8.3
Tablas de funciones MATLAB
En la tabla 8.1 (p´agina 98) mostramos una lista, algo m´as extensa, de funciones y operadores MATLAB agrupados por categor´ıas2.
Nota: No mostramos en la tabla 8.1 las funciones y matrices especiales que ya tabulamos en las secciones 1.3 y 3.1, tablas 1.2 y 3.1, respectivamente.
(Actividad: Con ayuda del comando help de MATLAB, explore el uso de las funciones mostradas en la tabla 8.1.)
Hay muchos tutoriales sobre MATLAB en la web, algunos de ellos est´an disponibles en [1].
Categor´ıa: Arreglos y Descripci´on: matrices
disp Visualiza un arreglo
display Visualiza un arreglo
isempty Verdadero para un arreglo vac´ıo
isequal Verdadero si los arreglos son iguales
islogical Verdadero para un arreglo l´ogico
isnumeric Verdadero para un arreglo num´erico
issparse Verdadero para una matriz ‘sparse’
length Longitud de un vector
ndims Dimensi´on de un arreglo
numel N´umero de elementos
size Tama˜no de una matriz
blkdiag Construye matriz diagonal por bloques a partir de sus argumentos de entrada
cat Concatenaci´on de arreglos
cumprod Producto acumulativo de las entradas
cumsum Suma acumulativa de las entradas
diag Matrices diagonales y diagonales de una matriz
end Ultimo ´ındice´
find Encuentra los ´ındices de los elementos distintos de cero
fliplr Produce un ‘giro’ en la direcci´on izq./der. de las columnas de una matriz dada
flipud Produce un ‘giro’ arriba/abajo
flipdim Produce un ‘giro’ respecto a una dim.
horzcat Concatenaci´on horizontal
ipermute Inverso de permute
kron Producto tensorial de Kronecker
linspace Genera un vector de nodos igualmente espaciados
logspace Vector de puntos logar´ıtmicamente igualmente espaciados
meshgrid Genera matrices X y Y para gr´aficas en tres dimensiones
ndgrid Arreglos para funciones de n variables e interpolaci´on n-dim.
permute Permuta las dimensiones de un arreglo multidimensional
prod Producto de las entradas de un arreglo
repmat Genera una gran matriz con copias de una matriz dada
rot90 Rota una matriz dada 90 grados
sortrows Ordena por filas en orden ascendente
sqrtm Ra´ız cuadrada de una matriz dada
tril Parte triangular inf. de una matriz dada
triu Parte triangular sup. de una matriz dada
vertcat Concatenaci´on vertical
Categor´ıa: ´Algebra lineal Descripci´on:
cond N´umero de condici´on
condeig N´umero de condici´on para autovalores
det Determinante
norm Norma matricial o vectorial
normest Estimaci´on de la norma 2 matricial
null Espacio nulo