Académique Documents
Professionnel Documents
Culture Documents
Introducción a MATLAB y
OCTAVE
1.1. Introducción
MATLAB es un sistema interactivo, basado en el cálculo con matrices para
computación numérica y visualización en campos cientı́ficos y de la ingenierı́a. Se
pueden resolver problemas complejos con una implemetación más simple que la que
se usa en otros lenguajes de programcación como Fortran o C. Las últimas versiones
de MATLAB disponen de un conjunto de herramientas, toolboxes, que extienden
grandemente sus capacidades, aunque no van a ser precisas para nuestro trabajo en
este curso. Se pueden observar las capacidades de MATLAB con el comando demo.
El nombre de MATLAB proviene de MATrix LABoratory.
OCTAVE es lenguaje interactivo de alto nivel y que se distribuye gratuitamente,
a diferencia de MATLAB que necesita de la compra de una licencia, con las distintas
versiones de Linux. OCTAVE es muy compatible con MATLAB en el sentido de que
la mayorı́a de los códigos generados con MATLAB u OCTAVE funcionan en ambos.
En cuanto a las principales diferencias, a parte de los toolboxes, estas van a
aparecer en los detalles más exquisitos de presentación de gráficas que MATLAB
tiene. Pero la mayor parte de un código creado con uno de ellos debe de funcionar
en el otro.
En nuestra aula de informática, trabajaremos principalmente con MATLAB,
pero como ya hemos dicho anteriormente, se requiere una licencia. Esta licencia
estará disponible casi siempre. Pero, para aquellos momentos en los que no lo esté,
podremos usar OCTAVE. También podemos trabajar con OCTAVE exclusivamente
3
4 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE
si ası́ lo deseamos.
Este manual no pretende ser exhaustivo. Sólo una primera toma de contacto con
MATLAB/OCTAVE y una guı́a de consulta rápida para tener a mano. El comando
help nombre provee de información sobre cualquier función o comando. Por ejemplo,
help eig informa sobre la función autovalor eig.
A lo largo de estas notas nos referiremos a la sesión de trabajo, indistintamente
que sea en MATLAB u OCTAVE. Especificaremos la diferencia cuando sea preciso.
Por ejemplo,
A = [−1 2 3; 0 5 1; 7 − 2,3 9 ]
y
A= [
−1 2 3
0 5 1
7 −2,3 9 ]
1.3. INTRODUCIENDO MATRICES 5
crea una matriz 3 × 3 y se le asigna a la variable A. Los elementos dentro de una fila
también se pueden separar mediante comas en vez de espacios en blanco. Cuando los
números aparecan en forma exponencial, por ejemplo 3.12e-3, los espacios se deben
de evitar. Para introducir escalares, matrices 1 × 1, no es preciso el uso de corchetes.
A = [1 2; 3 4 ] + i ∗ [5 6; 7 8]
A = [1 + 5i 2 + 6i; 3 + 7i 4 + 8i ]
También en este caso se deben de evitar los espacios en blanco. Por ejemplo, 2 + 6i
y no 2 + 6 i. Como unidades imaginarias se pueden usar i o j. No es conveniente
usar i o j como variables para otro uso.
Para introducir matrices grandes, resulta mejor usar un fichero creado con un
editor de texto. Este fichero debe de consistir en una disposición rectangular con los
valores numéricos. Si denotamos por datos.ext (donde .ext es cualquier extensión,
que por cierto, no es necesaria), el comando load datos.ext leerá este fichero y lo
guardará en la variable datos.
Las funciones internas rand, magic y hilb, por ejemplo, proporcionan matrices
con las que se pueden experimentar. Para enteros n y m, la orden rand(n) crea
una matriz n × n con entradas aleatorias, uniformemente distribuidas entre 0 y 1,
mientras que rand(m,n) crea una matriz m × n. magic(n) crea una matriz entera
n × n que es un cuadrado mágico (filas, columnas y diagonales suman lo mismo);
hilb(n) crea la matriz de Hilbert n × n, que resulta ser la matriz mal condicionada
por excelencia. Por último, las matrices también se suelen generar mediante ciclos
de programación como el ciclo for.
x = [ ]; f or i = 1 : n, x = [x, i2 ], end,
o bien,
x = [ ];
for i = 1 : n
x = [x, i∧ 2]
end
1.7. FOR, WHILE, IF. RELACIONES 9
hacen lo mismo pero en sentido inverso. Observar que una matriz puede estar vacı́a
como indica la orden x = [ ]. Las sentencias
for i=1:m
for j = 1 : n
H(i, j) = 1/(i+j-1);
end
end
H
s = 0;
for c = A
s = s + sum(c);
end
calcula la suma de todas las entradas de la matriz A sumando todas las sumas de
sus columnas (Por supuesto, sum(sum(A)) realiza esta tarea más eficientemente).
En OCTAVE se suele terminar el ciclo for con endfor.
While. La forma general del ciclo while es
while (relación)
sentencias
end
n = 0;
while ( 2∧ n < a)
n = n + 1;
end
n
if (relación)
sentencias
end
if ( n < 0)
paridad = 0;
elseif ( rem(n, 2) == 0)
paridad = 2;
else
paridad = 1;
end
Observar que “=” se usa en una sentecia de asignación mientras que “==” se usa en
una relación. Las relaciones se pueden conectar o cuantificar mediante operadores
lógicos
& and, y
| or, o
∼, ! not, no.
1.7. FOR, WHILE, IF. RELACIONES 11
if ( A == B)
sentencias
end
if ( any(any(A ∼= B)))
sentencias
end
o bien
if ( A == B)
else
sentencias
end
if ( A ∼= B)
sentencias
end
no produce el efecto deseado puesto que las sentencias se ejecutarán sólo si cada
entrada correspondiente de A y B difiere. Las funciones any y all pueden ser usadas
de forma creativa para reducir relaciones matriciales a vectores o escalares. En el
ejemplo anterior, dos any son requeridos puesto que any es una operación vectorial.
12 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE
Por ejemplo, la máxima entrada de una matriz A viene dada por max(max(A)) en
vez de max(A).
Mucha de la potencia de MATLAB y OCTAVE proviene de sus funciones ma-
triciales. las más útiles son
eig autovalores y autovectores
chol factorización de Cholesky
svd descomposición de acuerdo a los valores singulares (SVD)
inv inversa
lu factorización LU
qr factorización QR
hess forma de Hessenberg
schur descomposición de Schur
expm exponencial de la matriz
sqrtm raiz cuadradad de la matriz
poly polinomio caracterı́stico
det determinante
size talla
norm norma-1, norma-2, norma-Frobenius, norma-∞
cond número de condición en la norma-2
rank rango
1.9. EDICIÓN Y RECUPERACIÓN DE COMANDOS EN LÍNEA 13
Las funciones pueden tener una salida simple o múltiple en cuanto al número de
argumentos. Por ejemplo, y = eig(A), o eig(A) produce un vector columna con
los autovalores de A mientras que [U, D] = eig(A) produce una matriz U cuyas
columnas son los autovectores de A y una matriz diagonal D con los autovalores de
A sobre su diagonal.
x = [0.0:0.1:2.0]’;
y = sin(x);
[x y]
Observar que, como sin opera entrada a entrada, genera un vector y del vector x.
También se puede usar las formas:
t = linspace(a, b, n)
t = logspace(a, b, n)
similar a linspace pero ahora se usan valores logarı́tmicamente espaciados desde 10a
a 10b . Si b = π los puntos son espaciados desde 10a y π.
Con los : también se puede acceder a submatrices de una matriz. Por ejemplo,
A(1 : 4, 3) es el vector columna con las primeras cuatro entradas de la tercera
columna de A. Con : se denota una fila o columna entera de la matriz: A(:, 3)
es la tercera columna de A, y A(1 : 4, :) son las primeras cuatro filas. Vectores
de enteros también se pueden usar para indexar los elementos de una matriz, ası́:
A(:, [2 4]) contiene como columnas la 2 y la 4 de A. Esta indexación se puede usar
en ambos lados de una sentencia de asignación: A(:, [2 4 5]) = B(:, 1 : 3) reemplaza
las columnas 2,4 y 5 de A con las tres primeras columnas de B. Las columnas
2 y 4 de A se pueden multiplicar por la derecha por la matriz 2 × 2 dada por
[1 2; 3 4] : A(:, [2, 4]) = A(:, [2, 4]) ∗ [1 2; 3 4].
Si x es un vector de n componentes se puede observar el efecto de x = x(n:-1:1)
y de y = fliplr(x) y y = flipud(x’).
Es evidente la ventaja que estos comandos de MATLAB y OCTAVE represen-
tan en comparación con lo que se precisa hacer en otros lenguajes como Pascal,
FORTRAN, o C para obtener el mismo resultado.
1.11. FICHEROS *.M (M-FILES) 15
function a = randint(m,n)
% RANDINT Genera aleatoriamente una matriz de enteros.
% randint(m,n) devuelve una matriz m × n con entradas
% entre 0 y 9.
a =floor(10*rand(m,n));
function a = randint(m,n,a,b)
% RANDINT Genera aleatoriamente una matriz.
% randint(m,n) devuelve una matriz m × n con entradas
% entre 0 y 9.
16 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE
Una vez estas órdenes son guardadas en un archivo stat.m, el comando [xm, xd] =
1.11. FICHEROS *.M (M-FILES) 17
stat(x), por ejemplo, asigna la media y la desviación estandard de las entradas del
vector x a xm y xd, respectivamente. Una asignación simple puede también hacerse
con una función con varios argumentos de salida. Por ejemplo, xm = stat(x) (sin
corchetes en torno a xm) asigna la media de x a xm.
La función stat ilustra algunas de las capacidades MATLAB y OCTAVE para
producir un código eficiente. Observar, por ejemplo, que x.∧ 2 es la matriz de los
cuadrados de las componentes de x, que sum es una función vectorial y que sqrt
es una función escalar. Además, la división en sum(x)/m es una operación matriz-
escalar. Por lo tanto, todas las operaciones están vectorizadas y los ciclos han sido
evitados.
Si no se es capaz de vectorizar algunos cálculos, se puede conseguir que los ciclos
for vayan más rápido mediante la predeterminación de vectores o matrices en los
que la salida se almacene. Por ejemplo,
M = magic(6);
E = zeros(6, 50);
for j = 1 : 50
E(:, j) = eig(M∧ i);
end
incluyendo la segunda orden, que usa la función zeros, el espacio para almacenar
E en memoria es predeterminado. Sin esto, se debe de redefinir la talla de E incre-
mentándola una columna en cada iteración y ralentizando la ejecución.
Algunos otros detalles más avanzados se ilustran en la siguiente función. Como
ya hemos mencionado, algunos de los argumentos de entrada en una función se
pueden hacer opcionales, por ejemplo tol en esta función, mediante el uso de nargin
(“número de argumentos de entrada”). La variable nargout se puede usar de forma
similar. Observar también como se usa el hecho de que una relación es 1 cuando
verdad y 0 cuando falsa. Cuando while o if evalua una relación, “no cero” sig-
nifica “true” y 0 significa “false”. Finalmente, la función feval permite tener como
variable de entrada la cadena de caracteres que denota otra función, ver también
eval.
% ciclo principal
while (abs(b − a) > 2,0 ∗ tol ∗ max(abs(b), 1,0))
c = a + 0.5*(b - a);
fc =feval(fun,c);
if (trace)
steps = [steps; [c fc]];
end
if ((f b > 0) == (f c > 0))
b = c;
fb = fc;
else
a = c;
fa = fc;
end
end
Algunas de las funciones son internas mientras que otras se distribuyen como ficheros
*.m. Con la orden type nombrefuncion se puede ver el contenido de la función
nombrefuncion.
El tiempo usado (en segundos) puede ser obtenido con las ordenes tic y toc;
tic empieza el reloj y toc devuelve el tiempo pasado. Por lo tanto, las ordenes
tic,
sentencias,
toc
Una vez que se ejecuta el formato, permanece hasta que se cambia. Las opciones
loose y compact son independientes de los otros formatos.
22 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE
Especial cuidado debe de tenerse con inf y NaN puesto que se propagan en las
operaciones matemáticas. Es decir, por ejemplo, un número sumado a NaN da
NaN, y no se nos avisa. La variable eps devuelve la diferencia entre 1.0 y el número
flotante inmediatamente superior, por lo tanto, da una idea de la precisión.
1.17. Gráficas
MATLAB y OCTAVE generan gráficas planas de curvas 2-D, 3-D y de superficies.
Los comandos principales para ello son plot, plot3, mesh, y surf en MATLAB
y gplot o plot, gsplot y mesh en OCTAVE. La forma de trabajar es similar.
Gráficas planas.
La orden plot crea gráficas lineales x-y; si x e y son vectores de la misma
longitud, la orden plot(x,y) abre una ventana y dibuja los elementos de x versus
los de y. Por ejemplo, se puede dibujar la función seno en el intervalo de -4 a 4 con
los comandos:
x = −4 : ,01 : 4; y = sin(x); plot(x, y).
El vector x es una partición del intervalo con separación entre puntos de 0.01 mien-
tras que y es un vector con los valores del seno en los nodos de la partición, la
función sin opera en cada componente del vector x.
Se pueden tener varias gráficas en distintas ventanas, siempre hay una que es la
activa. Por ejemplo, si la figura 1 es la activa, la orden figure(2) (o simplemente
figure) abre una segunda ventana que queda como la activa. La orden figure(1)
1.17. GRÁFICAS 23
x = -1.5:.01:1.5;
y = exp(-x.∧ 2);
plot(x,y)
Observar que se debe de preceder ∧ por un punto para asegurar que opera en cada
componente de x.
MATLAB tiene la función fplot para poder realizar la gráfica de una función.
2
Por ejemplo, para dibujar y = e−x primero se define la función en un fichero *.m,
llamado por ejemplo expnormal.m y conteniendo
function y = expnormal(x)
y = exp(-x.∧ 2);
Entonces la orden
f plot(0 expnormal0 , [−1,5, 1,5])
produce la gráfica.
Curvas paramétricas pueden ser también dibujadas. Por ejemplo,
t=0:.001:2*pi;
x=cos(3*t); y=sin(2*t);
plot(x,y)
Las gráficas pueden tener tı́tulos, los ejes pueden tener etiquetas y se puede poner
texto dentro de la figura. Los siguientes comandos toman una cadena de caracteres
como argumento
title dibuja titulo
xlabel etiqueta eje x
ylabel etiqueta eje y
gtext pone texto sobre la figura usando el ratón
text posiciona texto en las coordenadas
Por defecto, los ejes se escalan automáticamente. Esto se puede eliminar con el
comando axis. Algunas opciones de axis son:
axis([xmı́n ,xmáx ,ymı́n ,ymáx ]) pone los ejes según los lı́mites descritos
axis(axis) mantiene escala en las siguientes gráficas
axis auto devuelve al escalado automático
v = axis devuelve el vector v con la escala actual
axis square misma escala en ambos ejes
axis equal misma escala y marcas en ambos ejes
axis off elimina la escala y las marcas de los ejes
axis on devuelve la escala y marcas a los ejes
x=0:.01:2*pi; y1=sin(x);y2=sin(2*x);y3=sin(4*x);
plot(x,y1,x,y2,x,y3)
y segundo, formando una matriz Y con los valores funcionales como columnas
Otra forma es con la orden hold. La orden hold on congela la figura actual y la
gráfica siguiente se realiza sobre ella. Los ejes pueden ser reescalados de todas formas.
Con hold off se elimina la opción “hold.” Se pueden cambiar los tipos de lı́neas,
puntos y colores establecidos por defecto. Por ejemplo,
da una lı́nea discontı́nua y una de puntos para las dos primeras curvas mientras que
para la tercera el sı́mbolo + se pone en cada nodo. Los tipos de lı́nea y marcas son
Tipos de lı́nea: sólida (-), discontı́nua (--). puntos (:), punto lı́nea (-.)
Tipos de marcas: puntos (.),signo + (+), estrella (*), circulo (o), x (x)
Los colores se pueden especificar también para marcas y lı́neas
Colores: amarillo (y), magenta (m), cyan (c), rojo (r), verde (g), azul (b), blanco
(w), negro (k)
Por ejemplo, plot(x,y,’r--’) dibuja una lı́nea roja discontı́nua.
1.17. GRÁFICAS 25
La orden subplot puede ser usada para subdividir la pantalla y poder situar
varias gráficas dentro de una misma figura, ver help subplot.
Otras funciones para hacer gráficas 2-D y que se pueden explorar con la or-
den help son: polar, bar, hist, quiver, compass, feather, rose, stairs,
fill
Gráficas de curvas 3-D.
De forma análoga plot en 2-D, la orden plot3 produce curvas en tres di-
mensiones espaciales. Si x, y y z son tres vectores de la misma talla, la orden
plot3(x,y,z) produce una gráfica en perspectiva de la curva lineal a trozos que
pasa por los puntos del espacio 3-D de coordenadas x, y y z. Estos vectores se
definen usualmente de forma paramétrica. Por ejemplo,
xx = -2:.2:2;
yy = xx;
[x, y] = meshgrid(xx,yy);
26 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE
shading faceted,
shading interp,
shading flat
Sobre las superficies producidas con surf, interpolated y flat eliminan las lı́neas
de malla. Las ordenes shading, colormap y view deben de introducirse después del
comando surf.
El color de una superficie se controla con colormap. Valores posibles son: hsv
(defecto), hot, cool, jet, pink, copper, flag, gray, bone y se determinan
mediante colormap(cool).
La orden view se usa para especificar el punto de vista del objeto en coordenadas
esféricas o cartesianas, verhelp view.
Superficies definidas en forma paramétrica se pueden también obtener. Las fun-
ciones de MATLAB sphere y cylinder generan las superficies referidas (ver type
sphere y type cylinder). El siguiente ejemplo genera un toro:
if ( nargin < 3)
a = 1;
end
if ( nargin < 2)
n = 30;
end
if ( nargin < 1)
r =0.5;
end
theta = pi*(0:2:2*n)/n;
phi = 2*pi*(0:2:n)’/n;
xx = (a + r*cos(phi))*cos(theta);
yy = (a +r*cos(phi))*sin(theta);
zz = r*sin(phi)*ones(size(theta));
if ( nargout == 0)
surf(xx,yy,zz)
ar = (a + r)/sqrt(2);
axis([-ar,ar,-ar,ar,-ar,ar])
else
x =xx;
y = yy;
z = zz;
end
Son interesantes de explorar via help las funciones meshz, surfc, surfl, contour,pcolor
function xpunto=fcn(x,t)
xpunto = zeros(3, 1);
xpunto(1) = 77,27 ∗ (x(2) − x(1) ∗ x(2) + x(1) − 8,375e − 06 ∗ x(1)∧ 2);
xpunto(2) = (x(3) − x(1) ∗ x(2) − x(2))/77,27;
xpunto(3) = 0,161 ∗ (x(1) − x(3));
endfunction
function dx=xfun(x,t)
dx = −2 ∗ t. ∗ x(1).∧ 2;
x0 = 1;
tiempo = linspace(0, 1, 4);
[ t1, x1 ] = ode23(0 xf un0 , tiempo, x0);
[ t2, x2 ] = ode45(0 xf un0 , tiempo, x0);
[t1, x1, x2]