Documentos de Académico
Documentos de Profesional
Documentos de Cultura
(Curso 2019-20)
Máster Universitario en Ingenierı́a de Caminos, Canalaes y Puertos
Departamento de Matemática Aplicada II. Universidad de Sevilla
Manejo básico de comandos de Matlab y Octave
Contenidos
1 Elementos de Matlab y Octave. 1
2 Operaciones 7
3 Funciones internas 10
4 Gráficos en 2-D 12
5 Programación 15
A =[ 1 2 log(-1)
2+2*i pi cos(pi)]
produce la matriz
A =
1.0000 2.0000 0 + 3.1416i
2.0000 + 2.0000i 3.1416 −1.0000
que quedará guardada en memoria hasta que salgamos de Matlab y Octave con quit o ejecutemos
clear A.
Notemos que
√
1 - Existen variables preasignadas como i que es la unidad imaginaria i = −1, o como pi que
es el valor π de toda la vida (alias el área del cı́rculo de radio 1); También están preasignadas
1
√
j que es i = −1 y la variable eps que es la precisión del ordenador en el que trabajemos,
que en un PC su valor es 2−52 ≈ 2.22 × 10−16 (véase la Sección 6 más adelante). El valor de
todas ellas lo podemos cambiar asignando valores a voluntad. Por ejemplo j=5. Cualquier
otra variable (esto es, no preasignadas), se crea al darle un valor.
2 - Los elementos de una matriz A los podemos definir con expresiones como log(-1) o 2 + 2 ∗ i.
En la correspondiente componente de A se guardará el valor numérico de dichas expresiones.
3 - Al definir una matriz, es importante dejar espacios en blanco entre los distintos elementos de
una fila y no dejar espacios en blanco entre las diversas componentes de una expresión que
define un elemento. Si queremos dejar espacios en blanco para ver mejor lo que escribimos
o porque somos despistados, hay que separar
√ los elementos con comas, por ejemplo, para
1/3
introducir el vector fila (1 + π, 2 , 2 − 2) podemos por ejemplo escribir
Ejecútese el comando format long y a continuación tecléese A para ver el valor de A. Para
mayor comodidad volver al formato estándar con el comando format short;
En Matlab en ocasiones para visualizar matrices son útiles también los comandos
2 - Matlab y Octave almacenan con cada variable su dimensión y su carácter complejo o no.
La dimensión de una variable se obtiene con el comando size que produce un vector fila con
las dimensiones de la variable (pruébese size(A) y size(v)). El comando length produce
un escalar con la máxima dimensión de la variable (pruébese length(A) y length(v)). Para
ver todas las variables que hemos asignado se utiliza el comando who, y para obtener más
información sobre ellas se utiliza whos (who+size). En Matlab y Octave también podemos
ampliar las matrices orlándolas de igual manera que hacemos en la pizarra. Por ejemplo,
ejecútese
[real(A)
v]
ans =
2
1.0000 2.0000 0
2.0000 3.1416 −1.0000
4.1416 1.2599 0.5858
que efectivamente es la matriz formada con la parte real de A orlada con el vector fila v en
la ultima fila. Observemos también, que cuando ejecutamos un comando sin asignarlo a una
variable, el resultado se asigna a la variable ans. Hagamos ahora
D=ans
[real(A);v]
esto es, el punto y coma, al definir una matriz o vector, indica nueva fila. Esto permite
definir vectores columna en una sola lı́nea de comandos. Por ejemplo, para definir el vector
w = (1, 2, 3, 4)T podemos utilizar
w=[1; 2; 3; 4]
produciendo
w =
1
2
3
4
Aprovechamos para señalar que, como en otros lenguajes de programación, los elementos aij de
la matriz A se nombran en Matlab y Octave con A(i,j). Por ejemplo, si ejecutamos
D(3,1)
se produce el resultado
ans =
4.1416
Para orlar también se pueden asignar elementos que no estén en la matriz. Por ejemplo si ejecutamos
D(4,4)=1
se produce el resultado
D =
1.0000 2.0000 0 0
2.0000 3.1416 −1.0000 0
4.1416 1.2599 0.5858 0
0 0 0 1.0000
3
Nótese que al haber hecho una asignación, hemos ampliado la matriz D, no que la variable ans
contiene a la matriz orlada de D.
Hemos visto cómo se mencionan los elementos de una matriz, y dijimos al principio que los
vectores son un caso particular. Matlab y Octave, para comodidad nuestra, permiten (cosa por
otra parte natural) designar a los elementos de un vector con un solo ı́ndice. Ası́ debemos escribir
v(2) en lugar de v(1,2). De hecho,
v(2) + D(4,4)
produce
ans =
2.5929
Ya sabemos pues cómo referirnos a los elementos de un vector o de una matriz. Sin embargo,
y ésta es una gran ventaja de Matlab y de Octave, se dispone de notación para referirnos a las
columnas y filas de una matriz. Por ejemplo
D(1,:)
produce el resultado
ans =
1.0000 2.0000 0 0
D(:,1)
produce
ans =
1.0000
2.0000
4.1416
0
Podemos pues orlar la matriz D con sus propias filas y columnas. Por ejemplo
producirá
ans =
1.0000 2.0000 0 0 1.0000
2.0000 3.1416 −1.0000 0 2.0000
4.1416 1.2599 0.5858 0 4.1416
0 0 0 1.0000 0
1.0000 2.0000 0 0 27
4
Por último, mostramos cómo referirnos a submatrices que no sean un elemento, una fila o una
columna. La clave está en que en las componentes de una matriz podemos poner un vector; el
resultado será las filas (o columnas) que indiquen dicho vector. Por ejemplo, para obtener una
matriz que contenga las columnas 1 y 3 de D podemos ejecutar
I=[1 3]
D(:,I)
ans =
1.0000 0
2.0000 −1.0000
4.1416 0.5858
0 0
y con
D(I,:)
se obtiene
ans =
1.0000 2.0000 0 0
2.0000 3.1416 −1.0000 0
Nótese que no es necesario que el vector sea fila para nombrar columnas ni columna para nombrar
filas: en el último comando que hemos ejecutado, I es fila y lo hemos utilizado para nombrar filas.
También se pueden poner vectores en las dos componentes. Por ejemplo, ejecutando
J=[2 4]
D(I,J)
ans =
2.0000 0
3.1416 0
Si las filas o columnas van seguidas, podemos utilizar rangos. Por ejemplo para referirnos a las tres
primeras filas de la matriz D podemos escribir
D(1:3,:)
D(1:3,1:4)
5
obteniéndose en ambos casos
ans =
1.0000 2.0000 0 0
2.0000 3.1416 −1.0000 0
4.1416 1.2599 0.5858 0
De hecho, el comando
real(A) - D(1:2,1:3)
debe producir una matriz 2 × 3 de ceros.
Digamos para terminar que la sintaxis para describir un rango (que no es otra cosa que un vector
fila) entre los extremos e1 y e2 es
e1:e2
para el rango e1, e1 + 1, e1 + 2, . . . , e1 + [e2 − e1] ([·] indica parte entera), o bien
e1:h:e2
si el incremento h (que puede ser negativo) no es 1.
Ejercicio 2 ¿Cómo escribir con dos lı́neas de comando la matriz F = (eij )1≤ij≤4 a partir de la
matriz D = (dij )1≤ij≤4 de manera que eij = d4+1−i,4+1−j ? ¿Y con una sola lı́nea?
Matlab y Octave disponen de comandos para alterar vectores y matrices. Algunos de los
más útiles son los que a continuación describimos. Conviene que lea la ayuda de dichos comandos
para ver sus variantes y los comandos que más se relacionan con ellos.
6
2 Operaciones
Si el elemento básico de Matlab y Octave son las matrices, las operaciones que contemplan
Matlab y Octave (salvo alguna excepción) son siempre entre matrices. Por tanto las dimensiones
deben cuadrar. Hay dos excepciones importantes a esta regla. Una es la obvia de producto de una
matriz o vector por un escalar. La otra es que, para comodidad nuestra se permite sumar un escalar
y un vector o matriz, por ejemplo 1+v, entendiendo que se suma a cada componente del vector o
matriz el escalar en cuestión. Hay alguna más, que comentaremos más adelante. Con la matriz A
y el vector v que hemos introducido, no son posibles los productos vA ni Av, pero sı́ Av T . Este
último se ejecuta con el comando
A*v’
OJO, que el apóstrofe significa hermı́tico (transpuesto y conjugado). Esto es, cuando en Matlab
u Octave escribimos v’ nos referimos a v ∗ = v T .. En el caso que nos ocupa v es real, luego para
obtener v T nos da lo mismo escribir v’ que v.’, que en Matlab u Octave significa transpuesto.
Si v es complejo, el vector v T , aparte de v.’, también se puede obtener como conj(v’) o conj(v)’.
La notación de las operaciones elementales es la siguiente
+ − suma y resta,
∗ multiplicación
ˆ exponenciación (OJO: sólo matrices cuadradas)
\ / división
. ∗ .ˆ ./ multipl., exponenciación y div. componente a componente
mediante el comando
C=[ 1 1 1; 0 2 1; -1 1 1]
(nótese la nueva forma más cómoda de introducir una matriz separando las filas por “punto y
coma”) e introduzcamos el vector y = (3, 3, 1)T
y=[3 3 1]’
x=C\y
Esto es, \ es división por la izquierda. Nótese que, con las variables introducidas hasta ahora,
también podemos ejecutar C\A’
La solución z de zC = v se obtiene mediante el comando
z=v/C
7
Resumiendo: C\ equivale a multiplicar por la izquierda por C −1 y /C equivale a multiplicar por la
derecha por C −1 , esto es
x = C −1 y x=C\y
z = vC −1 z=v/C
x=inv(C)*y
z=v*inv(C)
x=Cˆ(-1)*y
z=v*Cˆ(-1)
Nótese que en el caso de escalares, la división por la izquierda y por la derecha produce el mismo
resultado.
IMPORTANTE: A efectos prácticos, y en especial con matrices grandes (ya veremos cómo se
obtienen) es siempre mejor utilizar / y \ que la potencia −1 o el comando inv. Se efectúan menos
operaciones y el resultado, en general, es menos sensible a errores de redondeo.
Las operaciones .*, ./ y .ˆ se efectúan entre matrices de igual dimensión componente a compo-
nente. Por ejemplo
[ 1 2 3].*[4 5 6]
produce el resultado
ans =
4 10 18
[4 5 6]./[1 2 3]
ans =
4 2.5000 2
[4 5 6].ˆ[1 2 3]
ans =
4 25 216
Mención especial merecen las cómodas excepciones de elevar una matriz componente a componente
a una constante, por ejemplo
[1 2 3].ˆ2
8
produce
ans =
1 4 9
y de dividir un escalar por cada una de las componentes de un vector, por ejemplo,
12./[1 2 3]
produce
ans =
12 6 4
Nota 1 Desde 2017, tanto Matlab como Octave permiten sumar un vector fila y uno columna.
La operació que se hace en Matlab u Octave al sumar un vector fila con uno columna es sumar
matrices formadas por la repetición del vector fila y la repetición del vector columna. Ası́ por
ejemplo,
devuelve
a =
1
2
3
b =
3 2 1
ans =
4 3 2
5 4 3
6 5 4
obtenemos
9
a =
1
2
3
b =
3
2
1
ans =
4
4
4
que, efectivamente, es el resultado de sumar
1 3
2 + 2 .
3 1
Ejercicio 3 Reducir mediante operaciones elementales las matrices C y D a forma triangular su-
perior con a lo sumo dos y tres lı́neas de comandos respectivamente.
3 Funciones internas
Ya hemos visto que, igual que otros lenguajes de programación, Matlab y Octave poseen fun-
ciones internas como cos o log. Quizá la ventaja más destacada sobre otros lenguajes de progra-
mación es que Matlab y Octave permiten evaluarlas sobre vectores o matrices (componente a
componente) con una sola instrucción. Por ejemplo
produce
ans =
1.0000 0.0000 −1.0000 0.0000
10
Por ejemplo para dibujar la función x log(x) en el intervalo [0 : 2] podemos hacer
x=[0:0.01:2];
plot(x,x.*log(x))
Ejercicio 4 Buscar una partición x del intervalo [0, π/2] mediante la cual al ejecutar el comando
plot(x,x.*sin(1./x))
Los comandos para las funciones trigonométricas e hiperbólicas (senos, cosenos, arcos senos,
cosenos hiperbólicos, argumentos y demás) son
sin, cos, tan, asin, acos, atan, atan2, sinh, cosh, tanh, asinh,
acosh, antanh
Matlab y Octave disponen además de las siguientes funciones elementales (no olvide mirar la
ayuda de dichas funciones para encontrar funciones similares)
11
besselj funciones de Bessel de primera especie,
bessely funciones de Bessel de segunda especie,
beta la función Beta,
gamma la función Gamma de Euler,
rat aproximación racional y por fracciones continuas,
Rx 2
erf la función de error erf(x) = √2π ∞ e−t dt.
erfinv su inversa,
ellipke integrales elı́pticas,
ellipj funciones elı́pticas de Jacobi.
Ejercicio 5 Curiosear con help algunas de estas funciones. Dibujar algunas de ellas.
OJO: Si A es una matriz, exp(A), log(A) y sqrt(A) calculan otra matriz con las exponenciales,
logaritmos y raı́ces cuadradas de los elementos de A, mientras que expm(A), logm(A) y sqrt(A)
calculan la exponencial, el logaritmo y la raı́z cuadrada respectivamente de A.
4 Gráficos en 2-D
Ya hemos visto el comando plot que dibuja parejas de vectores o (y esto es nuevo) un vector frente
a sus ı́ndices o la parte real e imaginaria de un vector. En esta sección veremos
Aparte de plot para dibujar tenemos, con la misma sintaxis, los comandos
que hacen lo mismo que plot con la diferencia de que o bien los dos ejes, o bien el eje horizontal
o bien el vertical se representan en escala logarı́tmica. Esto último es útil cuando las componentes
del vector que dibujamos tienen magnitudes muy diferentes
12
Ejercicio 6 Ejecutar los comandos siguientes.
x=[0:0.05:10];
y=exp(-x);
figure(1)
plot(x,y)
figure(2)
semilogy(x,y)
En el ejercicio anterior, vemos que el comando figure crea una nueva gráfica, o si ya existe,
pinta en la figura seleccionada. Ejecútese por ejemplo
figure(1)
title(’cambio de la temperatura frente al tiempo’)
o un tı́tulo a voluntad. Ya vemos pues cómo poner tı́tulo. Para poner las variables de los ejes, se
utilizan los comandos
xlabel e ylabel
Ejecútese por ejemplo.
ylabel(’grados C’)
Si ahora quisiésemos pintar otra gráfica junto a ésta (temperatura alcohol) para compararla, ya
sabemos que el comando plot dibuja la nueva borrando la vieja. Para sobreimprimir en un gráfico,
debemos decirle a Matlab u Octave que queremos conservar el gráfico mediante el comando
hold on
que mantiene el gráfico hasta que se ejecute hold off, que lo libera.
Antes de dibujar la nueva gráfica junto a la vieja, podemos plantearnos el cambiar de tipo de
lı́nea. Los tipos de lı́nea se representan con
’-’ (lı́nea continua, por defecto), eg. plot(x,y,’-’)
plot(x,y,’r:’)
13
Ejercicio 7 Dibujar junto a la gráfica anterior la de otra función.
También se pueden dibujar los vectores con sı́mbolos en vez de con lı́neas. Estos son
’*’ (asteriscos), eg. plot(x,y,’*’)
’+’ (cruces), eg. plot(x,y,’+’)
’x’ (aspas), eg. plot(x,y,’x’)
’o’ (cı́rculos), eg. plot(x,y,’o’)
que también se pueden acompañar de las letras para cambiar el colorı́n.
Para poner texto en el gráfico se utiliza el comando gtext, cuya sintaxis es
gtext(’texto que queramos poner’)
Al ejecutar el comando, la posición en la pantalla del ratón cambia de icono, en espera de que
apretemos el botón del ratón, sobre el gráfico, en cuya localización escribirá el texto.
Ejercicio 8 Marcar con sı́mbolos los puntos de las gráficas que corresponden al punto en el que el
valor de la temperatura es, aproximadamente, la mitad del valor máximo.
Por último, para imprimir, si tenemos acceso a una impresora, basta ejecutar el comando
print
En caso contrario, debemos ejecutar print con alguna opción y añadiendo el nombre de un fichero
para que el gráfico se vuelque a dicho fichero en el formato que le decimos con opción. Por ejemplo,
print -depsc dibujo.eps
guardará en el fichero dibujo.eps el dibujo (en nuestro caso el dibujo que hemos hecho con la
temperatura) en formato PostScript encapsulado, que es el adecuado para insertarlo en los ficheros
de TEX. Véanse las diversas opciones ejecutando help print. Un resumen de los comandos de
esta sección (y alguno más) es el que sigue.
plot dibuja el vector de ordenadas frente al de abcisas
loglog ı́dem pero en escala logarı́mica.
semilogx sólo las abicisas en escala logarı́timica
semilogy sólo las ordenadas en escala logarı́timica
clf borra el grafico
hold on permite dibujar sobre lo ya dibujado
hold off lo contrario de hold on
figure selecciona la figura que indiquemos
axis ajusta los ejes a los valores que impongamos
title escribe el tı́tulo que proprocionemos
xlabel e ylabel para indicar lo que representan los ejes
text permite escribir texto en el gráfico
gtext ı́dem pero donde indiquemos con el ratón
print imprime el gráfico o lo vuelca a un fichero
14
Otros comandos para realizar gráficos más particulares son los siguientes.
bar gráfico de barras
compass gráfico de números complejos como vectores planos
feather versión diferente de compass
fplot evalúa una función y dibuja el resultado
polar gráfico en coordenadas polarers
quiver gráfico de un campo de vectores
fill dibuja polı́gonos y los rellena de color
help graphics, help graph2d, help plottools, help specgraph y help graph3d,
proporcionan listados más completos de los comandos disponibles en Matlab para producir, mo-
dificar y manejar gráficos.
FPLOT Hemos visto la técnica para representar una función con el comando plot. También hemos
visto que funciones del tipo sen(1/x) son difı́ciles de representar adecuadamente con esta técnica.
El comando fplot busca automáticamente una red en la que la función se representa más fielmente.
Admite dos argumentos opcionales: uno es el color y tipo de lı́nea, por ejemplo ’g--’ para que
dibuje la función en verde y lı́nea discontinua; El otro argumento es una tolerancia sobre el diámetro
inferior de la red (por defecto Matlab utiliza TOL=2e-3 y Octave un valor mucho más pequeño).
Por ejemplo, ejecútense los comandos
Nótese que la función a representar debe ir entre apóstrofos o precedida de @(x) para indicar que
se trata de una función dependiente de x.
Para gráficos en tres dimensiones, véanse con help los comandos meshgrid, mesh, contour,
surf.
5 Programación
Matlab y Octave no sólo ejecutan sus comandos internos; también ejecuta comandos escritos
por nosotros mismos. Ello permite elaborar programas que, utilizando instrucciones de Matlab
ejecuten tareas no contempladas en los comandos. Pero,
OJO: Si una tarea se puede realizar con un comando interno de Matlab u Octave, este comando
casi siempre será más eficiente y más fiable que el que programemos nosotros. Hay dos razones para
ello:
1 - La mayor parte de los comandos de Matlab y Octave están en lenguaje máquina, mucho
más rápido que la traducción de los comandos del programa que escribamos nosotros.
15
2 - La elaboración de algoritmos es una tarea altamente profesional. Aunque las ideas matemáticas
subyacentes a un algoritmo sean sencillas, existen muchos componentes, no sólo propios del
Análisis Numérico, sino también de las Ciencias de la Computación que influyen en el resultado
y la eficacia de un algoritmo.
Existen casos en los que, o bien porque Matlab y Octave no disponen de comandos para
una tarea determinada, o bien porque éstos son inadecuados nos vemos en la obligación de elaborar
un programa. Debe saber sin embargo, en general, en todo lo referente al álgebra lineal, es difı́cil
que un programa elaborado por nosotros supere a los comandos de Matlab u Octave. En otros
campos, esta afirmación puede admitir matices.
Existen dos tipos de programas que se pueden hacer en Matlab u Octave.
2 - Funciones.
Los ficheros de comandos se crean escribiendo en un fichero los mismos comandos que ejecu-
tarı́amos en la ventana de comandos. Una de las diferencias más notables entre un M-file y una
función es que en el primero, las variables que se creen al ejecutarlo permanecen en memoria una
vez finalizada su ejecución, mientras que en una función son internas. En un fichero de comandos
todas las variables que se creen al ejecutarlo permanecen. Cuando se evalúa una función, todas las
variables que cree y utilice internamente no permanecen en la memoria de Matlab una vez que
la función ha devuelto su valor. Si en Matlab u Octave tenemos una variable, por ejemplo x,
y dentro de una función aparece una variable con el mismo nombre, ésta no tiene nada que ver
con la otra: si en la función se le asigna un valor, la variable original no cambia. En un fichero
de comandos esto no serı́a ası́: si en un M-file asignamos un valor a una variable y ya existe una
variable con el mismo nombre, el valor de la existente cambia. Este es uno de los peligros de los
M-files o ficheros de comandos: se debe tener cuidado en que las variables que utiliza el M-file
no coincidan en nombre con otras cuyo valor no queremos alterar. Es recomendable por tanto la
programación de funciones sobre la de M-files.
El formato de una función es
argsal = nombre(argent)
donde argsal son los argumentos de salida, argent son los argumentos de entrada, y nombre es el
nombre de la función. Por ejemplo, una función que suma los cuadrados de los primeros números
naturales tiene por listado
function s=suma_cuad(n)
s=sum([1:n].^2);
end
(el ”end” del final es opcional. En este caso, sólo hay un argumento de entrada, n y uno de salida,
s. Si escribimos dicho listado en un fichero de nombre suma quad.m, siempre que lo tengamos en
directorio de trabajo, al ejecutar en Matlab
suma_cuad(25)
16
obtenemos
ans =
5525
Una función que suma las potencias del orden que le digamos de los primeros números naturales
tiene el listado siguiente,
function s=suma_pot(n,e)
s=sum([1:n].^e);
end
En este caso, sólo hay un argumento de salida, s, y dos de entrada n y e, que deben ir separados
por comas. Escribiéndola en un fichero de nombre suma pot.m, al ejecutar en Matlab
suma_pot(25,3)
obtenemos
ans =
105625
Una función que suma las potencias del orden que le digamos de los primeros números naturales y
también los inversos de dichas potencias tiene el listado siguiente,
function [s,t]=suma_2pot(n,e)
s=sum([1:n].^e);
t=sum(1./[1:n].^e);
end
Como novedad en este caso, tenemos dos argumentos de salida, que deben ir separados por comas
y entre corchetes. Escribiéndola en un fichero de nombre suma 2pot.m, al ejecutar en Matlab
[f,g]=suma_2pot(25,3)
obtenemos
f =
105625
g =
1.2013
Para poder programar algo que no sea simplemente ejecutar uno o dos comandos, necesitamos
saber cómo se hacen
- ciclos for
- ciclos while
- bloques if
17
- operaciones de relación
for k=1:N
z(k)=sum(y(1:k);
z(k)=log(z(k))
end
Este ciclo coloca en la k-ésima componente del vector z el logaritmo de la suma desde uno hasta k
de las componentes de y y las muestra por pantalla a medida que se van creando (la tercera lı́nea no
lleva el punto y coma al final). Si sólo quisiésemos ver las componentes de z una sóla vez, podrı́amos
haberlo ejecutado con el comando
z=log(cumsum(y(1:N)))
for rango
expresiones y comandos
end
k=1;
suma=1;
sumav=0;
while sumav < suma
sumav=suma;
k=k+1;
suma=suma+1/k^2;
end
suma=sum(1./[1:1e8].^2)
while expresión
expresiones y comandos
end
Las expresiones y comandos internos del ciclo se ejecutarán mientras la expresión de la lı́nea del
while sea cierta.
18
Ejemplos de bloques if. Un bloque if permite que se ejecuten unos comandos dependiendo de
si el valor de una expresión es cierto o no. Veamos los tres tipos que hay. Mostramos primero un
bloque en el que si el valor de x es positivo, lo sustituye por su logaritmo.
if x > 0
x=log(x);
end
En el siguiente ejemplo, se coloca en z el módulo de x.
if x > 0
z=x;
else
z=-x
end
En el siguiente ejemplo, se coloca en z el signo de x
if x > 0
z=1;
elseif x < 0
z = −1;
else
z=0
end
En un bloque if se pueden poner tantas lineas elseif como queramos. Siempre un bloque if debe
terminar con end. Los bloques if de este ejemplo sólo hacen lo que queremos que hagan si x es
real. Modifı́quense para que no den lugar a resultados incorrectos si x es complejo.
En los ejemplos anteriores hemos visto algunos operadores de relación; mayor y menor. La
notación de los operadores de relación en Matlab y Octave es
< menor.
> mayor.
<= menor o igual
>= mayor o igual
== igual
˜= distinto.
Asimismo, desde el punto de vista lógico, 0 es falso, cualquier cantidad distinta de 0 es cierto, y
˜es negación1 . Ejecútense por ejemplo los comandos
find([1 0 3 0 5 0])
[f,I]=find(˜[1 0 3 0 5 0])
1
El sı́mbolo ˜tiene código ASCII 126.
19
6 Aritmética en Matlab y Octave
En Matlab y en Octave se sigue la práctica generalizada hoy dı́a de utilizar el sistema IEEE de
doble precisión, tanto para la representación de números en el ordenador como para la artimética.
Se trata de un sistema de coma flotante, en oposición a los sistemas de coma fija (con un número fijo
de decimales) como el que se utiliza en economı́a, con dos decimales para los céntimos. Detallamos
a continuación las caracterı́sticas más relevantes a los efectos de este curso del mencionado sistema
IEEE .
En dicho sistema, dado que no se pueden representar en el ordenador los infinitos números reales,
se consideran sólamente números de la forma
que se conocen como normalizados (también se consideran números no nomralizados que comentare-
mos más adelante) donde el exponente e es un número entero que satisface
b1 b2 . . . b52 .
Si todos los bits son cero, entonces f es cero, y si todos son cero menos el úlitmo, el valor de f es
2−52 , valor que recibe el nombre de épsilon de la máquina o del sistema de coma flotante,
M = 2−52 ,
pues tanto en el sistema IEEE de doble precisión que utilizan Matlab y Octave, como en otros
sistemas de coma flotante, M es la distancia de 1 al siguiente número positivo del sistema. En
Matlab y Octave el valor de M se obtiene con el comando eps o como indicamos a continuación.
x = 2.2204e-16
20
y al ejecutar
x - eps
obtenemos
ans = 0
El número normalizado positivo más pequeño se tiene cuando todos los bits bj son 0 y e = −1022,
y el más grande cuando todos los bj son iguales a 1 y e = 1023,
1
xmin = 2−1022 , xmax = (1 + (1 − ))21023
252
y en Matlab u Octove se obtiene con los comandos realmin y realmax. Ejecutando
obtenemos
x = 2.2251e-308
d1 = 0
x = 1.7977e+308
d2 = 0
Si bien, el sistem IEEE de doble precisión no contempla números más grande que el valor xmax =
(1 + (1 − 2152 ))21023 descrito anteriormente, sı́ contempla números positivos menores que el valor
xmin = 2−1022 mencionado. Ası́ por ejemplo, ejecutando
x=2*realmax, y=realmin/2
obtenemos
x =
Inf
y =
1.1125e-308
21
Comentamos ahora con algo de detalle el resultado de estos dos cálculos. Comenzamos con el
primero. Debemos saber el sistema IEEE aparte de los números descritos anteriormente, tiene
otros tres sı́mbolos, Inf, -Inf, y NaN (acrónimo del inglés ”not a number”). Los dos primeros se
asimilan a más infinito y menos infinito, respectivamente, y su aritmética es igual que la de los
lı́mites (∞ + ∞ = ∞, ∞ · ∞ = ∞, etc) y el tercero sirve para representar las indeterminaciones
similares que se obtiene en el cálculo de lı́mites, ası́ por ejemplo si en Matlab ejecutamos
Inf-Inf, Inf/Inf, 0/0
obtenemos en los tres casos la respuesta
ans =
NaN
A diferencia del resultado de 2*realmax, que se asimila a infinito, el de realmin/2 lo ha calculado
exactamente. La razón es que el estándar IEEE de doble precisión permite utilizar números no
normalizados, que son de la forma
±f 2−1022 ,
donde f es de la forma que indicamos en (2). El número positivo no normalizado más pequeño será
entonces 2−1022−52 = M 2emin . De hecho si ejecutamos
x = eps*2^(-1022), x/2
x = 4.9407e-324
ans = 0
y el valor
u = 2−53 ≈ 1.1102 × 10−16
se conoce como la unidad de redondeo. Se tiene por tanto
1
u = M .
2
Nótese que en la expresión (3) |δ| es el error relativo
|x̂ − x|
|δ| =
|x|
22
(el error relativo de una cantidad es la diferencia de su valor aproximado menos su valor exacto
divido por dicho valor exacto, todo ello en valor absoluto). En la expresión en (3), por tanto,
estamos diciendo que cualquier número real entre xmin y xmax se redondea en el sistema de coma
flotante con un error relativo inferior a la unidad de redondeo u = 2−53 .
Ejemplo 1 De igual manera que 1/3 tiene infinitas cifras decimales, 1/10 tiene infinitas cifras
binarias, por lo que en el ordenador dicho valor se aproxima por otro del sistema de coma flotante.
Ası́, si sumamos diez veces el valor 1/10 en Matlab u Octave obtenemos una cantidad ligeramente
inferior a 1. Ejecutando
sum((1/10)*ones(10,1)) - 1
ans = -1.1102e-16
En general, el error de redondeo no afecta de manera significativa a a los cálculos que se realizan
en la práctica, salvo que se acumule de manera desfavorable tras un número elevado de operaciones.
Sin embargo, hay casos (cierto que pocos) donde unas pocos o incluso una única operación puede
dar lugar a un error relativo no desdeñable. El más significativo de ellos es el de la cancelación
numérica, que se produce cuando se restan cantidades de magnitud similar, como mostramos a
continuación en el siguiente ejemplo
Ejemplo 2 (Cancelación numérica). Comentamos aquı́ un ejemplo similar al de [4]. Para calcular
las raı́ces de la ecuación de segundo grado ax2 + bx + c = 0, aprendimos en su dı́a que dichas raı́ces
son √ √
−b + b2 − 4ac −b − b2 − 4ac
x1 = , x2 = (4)
2a 2a
Ası́ mismo, puesto que ya sabemos que c/a coincide con el producto de las dos raı́ces, (c/a) = x1 x2 ,
podemos emplear las fórmulas siguientes
√
−b − sign(b) b2 − 4ac c
x1 = , x2 = (5)
2a ax1
Si aplicamos estas fórmulas cuando a = 1, b = −5 y c = 6, ejecutando en Matlab las instrucciones
a=1;b=-5;c=6; d=sqrt(b^2-4*a*c);
obtenemos la respuesta
23
x1 =
3
x2 =
2
x22 =
2
a=1;b=-12345678;c=-1; d=sqrt(b^2-4*a*c);
obtenemos la respuesta
x1 =
1.234567800000008e+07
x2 =
-8.102506399154663e-08
x22 =
-8.100000664200001e-08
esto es, la raı́z x2 calculada con el procedimiento en (4) y la calculada con el procedimiento (5)
difieren en la cuarta cifra decimal.
Lo que ha ocurrido es que puesto que |b| es mucho más grande que que |ac|, se tiene entonces
que √
b2 − 4ac ≈ |b| ,
con lo que con el procedimiento en (4) hemos restado dos números muy próximos, produciéndose
el fenómeno que se conoce como cancelación numérica.
Básicamente lo que ocurre en el fenómeno de la cancelación numérica es que si dos números x
e y coinciden en sus k primeros dı́gitos binarios (y por tanto son próximos), al redondearlos en el
sistema de coma flotante a
x̂ = x(1 + δx ), ŷ = y(1 + δy ), |δx | , |δy | ≤ u,
y restarlos a continuación, el número resultante x̂− ŷ solo tiene 52−k dı́gitos binarios (consecutivos)
que pueden ser no nulos (pues se han cancelado los k primeros que coinciden), con lo que al expresar
x̂ − ŷ = (x − y)(1 + δ),
24
sólo podemos garantizar
|δ| ≤ 2k u,
pero nada mejor. Si k es cercano a 52, perdemos, como vemos, mucha precisión.
Un procedimeinto práctico para mitigar el efecto de la cancelación numerica es calcular α1 − α2
como
α2 − α22
α1 − α2 = 1 ,
α1 + α2
pues en ocasiones α12 − α22 se puede calcular por otro procedimiento que no se vea afectado por el
fenómeno de cancelación numérica. Tal es el caso (tı́pico en muchos libros de texto) de α1 = 1 y
α2 = cos(θ) cuando |θ| es muy pequeño, pues en ese caso, α12 − α22 = 1 − cos2 (θ) = sen(θ), valor que
se puede calcular con la precisión de la máquina que estemos utilizando.
Más información y ejemplos sobre el sistema de coma flotante en Matlab pueden encontrarse
en [2, § 1.7]. Más información sobre la acumulación de errores se puede encontrar en las Lecciones 6
a 8 de [3] o en el Capı́tulo 2 de [1].
Bibliografı́a
[1] N. J. Higham, Accuracy and Stability of Numerical Algorithms. Second edition.. SIAM, Philadel-
phia (PA), 2002.
[2] C. B. Moler, Numerical Computing with Matlab. SIAM, Philadelphia (PA), 2004.
25