Vous êtes sur la page 1sur 29

Notas sobre MATLAB y OCTAVE

Tomás Chacón Rebollo, Eliseo Chacón Vera y Macarena Gómez Mármol


2
Capı́tulo 1

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.

1.2. Empezando la sesión de trabajo


Se empieza la sesión con la orden matlab (octave) y se termina la sesión con el
comando quit o exit.
Puede ser conveniente mantener activa la sesión de trabajo en una ventana y el
editor de texto en otra, para modificar ordenes que puedan ser introducidas mediante
ficheros de texto.

1.3. Introduciendo matrices


Esencialmente trabajamos con sólo un tipo de objeto, una matriz numérica con
posibles valores complejos. Todas las variables representan matrices. Matrices 1 × 1
se interpretan como escalares y matrices con sólo una fila o columna como vectores.
Las matrices se introducen de varias formas:

Mediante una lista explı́cita de elementos,

Mediante funciones construidas y ordenes internas,

Creando un fichero de texto con el editor,

Cargado de un fichero o aplicación externa.

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.

Se pueden usar números complejos. Por ejemplo:

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.

Los elementos de matrices y vectores se pueden referenciar con ı́ndices entre


paréntesis en la forma usual. Por ejemplo, A(2, 3) indica el valor en la segunda fila
y tercera columna de la matriz A y x(3) denota la tercera componente del vector x.
Matrices y vectores sólo aceptan enteros positivos como ı́ndices.
6 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE

1.4. Operaciones con escalares, vectores y matri-


ces
Las siguientes operaciones están disponibles:
+ suma
− resta
∗ multiplicación
∧ potencia
0
transpuesta conjugada
\ división por la izquierda
/ división por la derecha

Estas operaciones se aplican al caso escalar, vectorial y matricial de forma es-


tandard. Si las tallas de las matrices son incompatibles aparece un mensaje de error,
excepto en el caso de la operación de un escalar con una matriz, en donde cada
entrada de la matriz es operada con el escalar.
La “división de matrices” merece un comentario. Si A es una matriz cuadrada
invertible y b es un vector columna, respectivamente fila, entonces x = A\b es la
solución de A ∗ x = b y, respectivamente, x = b/A es la solución de x ∗ A = b.
En la división por la izquierda, si A es cuadrada, se factoriza usando eliminación
de Gauss y esos factores se usan para resolver A ∗ x = b. Si A no es cuadrada, se
factoriza usando la ortogonalización de Householder pivotando en las columnas y los
factores se usan para resolver el sistema en el sentido de los mı́nimos cuadrados. La
división por la derecha se define en términos de la división por la izquierda mediante
b/A = (A0 \b0 )0 .
Operaciones con vectores. Las operaciones matriciales de suma y resta operan
sobre las entradas de la matriz, pero las otras operaciones no lo hacen ası́, son
operaciones sobre matrices como conjunto. Es importante observar que estas otras
operaciones, ∗, ∧, \, y /, se pueden hacer operar sobre cada entrada de la matriz si
se las precede con un punto. Por ejemplo, [1,2,3,4].*[1,2,3,4] o [1,2,3,4].∧ 2
dan [1,4,9,16].

1.5. Sentencias, expresiones y variables


El lenguaje de MATLAB y OCTAVE se basa en expresiones; cualquier expresión
introducida se interpreta y se evalua. Las sentencias son normalmente de la forma
1.5. SENTENCIAS, EXPRESIONES Y VARIABLES 7

variable = expresión, o simplemente expresión.


Las expresiones se componen normalmente con operadores, funciones y nombres
de variables. La evaluación de la expresión produce una matriz, que entonces se
muestra en pantalla y se le asigna a la variable para su uso futuro. Si el nombre de
la variable y el signo = se omiten, entonces una variable ans (de answer) se crea
automáticamente y se le asigna el valor.

Una sentencia se termina normalmente con el control de carro (ENTER). Sin


embargo, se puede continuar en la siguiente lı́nea con tres o más puntos seguidos de
control de carro. Por otro lado, varias sentencias se pueden poner sobre la misma
lı́nea si se separan por punto y coma o coma.

Si el último carácter de una sentencia es un punto y coma, la impresión en


pantalla del resultado de la evaluación de la sentencia no se efectua, aunque la
asignación si que se realiza. Esto es esencial si se pretende suprimir la salida por
pantalla de resultados intermedios.

Se distinguen las mayúsculas en los nombres de comandos, funciones y variables.


Por ejemplo, no es lo mismo solveUT que solveut.

La orden who (o whos) proporciona una lista de las variables actuales en la


memoria de trabajo de la sesión en curso. Una variable puede ser eliminada de la
memoria con el comando clear nombrevariable. El comando clear borra todas las
variable no permanentes de la memoria.

La variable permanentes eps (epsilon) da la unidad de redondeo de la máquina,


en torno a 10−16 en la mayorı́a de las máquinas. Resulta de utilidad cuando se quiere
especificar la tolerancia en la convergencia de un proceso iterativo.

Los procesos en marcha se pueden interrumpir en la mayorı́a de las máquinas


con la orden CTRL-C.
8 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE

1.6. Funciones para construir matrices


Algunas funciones de interés y utilidad son
eye matriz identidad
zeros matriz de ceros
ones matriz de unos
diag crea o extrae la diagonal
triu parte triangular superior de una matriz
tril parte triangular inferior de una matriz
rand matriz generada con entradas aleatorias
hilb matriz de Hilbert
magic cuadrado mágico

Por ejemplo, zeros(m,n) produce una matriz de ceros m × n y zeros(n) produce


una matriz cuadrada n×n. Si A es una matriz, zeros(size(A)) produce una matriz
de ceros con la misma talla que A.
Si x es un vector, diag(x) es la matriz con diagonal x; Si A es una matriz
cuadrada, diag(A) es un vector con la diagonal de A. Con diag(diag(A)) se obtiene
la matriz diagonal con la diagonal de A, el resto de elementos cero.
Las matrices se pueden construir con bloques. Por ejemplo, si A es una matriz
3 × 3, entonces
B = [A, zeros(3, 2); zeros(2, 3), eye(2)]
construye una matriz 5 × 5.

1.7. For, while, if. Relaciones


En su forma más básica, estas ordenes de control de flujo en funcionan como en
la mayorı́a de lenguajes de programación.
For. Por ejemplo, para n dado, las sentencias

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

produce un vector de n componentes y las sentencias

x = [ ]; f or i = n : −1 : 1, x = [x, i∧ 2], end

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

producen y muestran en pantalla la matriz de Hilbert m × n. El punto y coma ; en


las sentencias interiores es esencial para evitar la impresión en pantalla de cálculos
intermedios, aparte de acelerar el trabajo total. La última sentencia H muestra el
resultado final.
La sentencia for permite usar cualquier matriz como incremento en vez de
1:n. La variable contador simplemente asume consecutivamente los valores de cada
columna de la matriz. Por ejemplo,

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

Las sentencias se ejecutan repetidamente mientras que relación permanezca cierta.


Por ejemplo, dado un número a, las siguientes ordenes calculan y muestran el menor
entero no negativo n tal que 2n ≥ a:
10 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE

n = 0;
while ( 2∧ n < a)
n = n + 1;
end
n

En OCTAVE se suele terminar el ciclo while con endwhile.


If. La forma general de una sentencia simple if es

if (relación)
sentencias
end

Las sentencias se ejecutan sólo si la relación es verdadera. Una ramificación múltiple


también es posible:

if ( n < 0)
paridad = 0;
elseif ( rem(n, 2) == 0)
paridad = 2;
else
paridad = 1;
end

En una ramificación doble, se reemplaza elseif por else.


En OCTAVE se suele terminar el condicional if con endif.
Relaciones. Los operadores de relación son
< menor que
> mayor que
<= menor o igual que
>= mayor o igual que
== igual
∼= distinto.

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

Cuando se aplica a escalares, una relación es el escalar 1 o 0 dependiendo de si es


verdadera o falsa. Se puede observar introduciendo 3 <5, 3 >5, 3 == 5, y 3 ==
3. Cuando se aplica a matrices de la misma talla, una relación será otra matriz de
la misma talla con 0’s y 1’s dando el valor de la relación en cada entrada. Intenta a
= rand(5), b = triu(a), a == b.
Una relación entre matrices se interpreta por while e if como verdadera si cada
entrada de la matriz relación es no cero. Por lo tanto, si se quieren ejecutar unas
sentencias cuando las matrices A y B son iguales se puede usar

if ( A == B)
sentencias
end

pero si se quieren ejecutar cuando A y B no lo son, se puede hacer como

if ( any(any(A ∼= B)))
sentencias
end

o bien

if ( A == B)
else
sentencias
end

Observar que la aparente

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

1.8. Funciones escalares, vectoriales y matriciales


Algunas funciones operan esencialmente sobre escalares, pero lo hacen elemento
a elemento cuando actuan sobre matrices. Las funciones más comunes son

sin asin exp abs round


cos acos log(base e) sqrt f loor
tan atan rem(resto) sign ceil

Otras funciones operan esencialmente sobre un vector, fila o columna y lo hacen


sobre una matriz m × n (m ≥ 2) haciendolo sobre cada columna, para devolver
un vector fila con los resultados de la aplicación de la función a cada columna.
Una acción sobre cada fila se puede obtener usando la transpuesta; por ejemplo,
mean(A’)’. Algunas de estas funciones son

max sum median any


min prod mean all

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.

1.9. Edición y recuperación de comandos en lı́nea


El cursor se puede posicionar sobre la lı́nea de edición de comandos con las
teclas de las flechas izquierda/derecha y de Backspace (o Delete). También se puede
intentar sobre un PC las teclas Home, End y Delete; sobre un sistema Unix o PC los
comandos Emacs Ctl-a, Ctl-e, Ctl-d y Ctl-k también funcionan; sobre otros sistemas,
ver help cedit o type cedit.
Es muy conveniente el uso de las teclas de las flechas arriba/abajo puesto que
permiten repetir o buscar comandos previos. Se puede recuperar un comando an-
terior y modificarlo para volver a ejecutarlo con una nueva variación. Para tareas
simples, esto puede ser más conveniente que usar un fichero del tipo *.m que requiere
moverse entre el editor de texto y la sesión de trabajo, ya lo veremos más adelante.
Por ejemplo, para observar el costo de calcular la inversa de matrices de varias tallas
se puede ejecutar mediante la recuperación, modificación y ejecución las órdenes

a = rand(8); f lops(0), inv(a); f lops

Si se quieren comparar las gráficas de las funciones y = sin(m x) e y = sin(n x) en


el intervalo [0, 2π] para varios m y n, uno puede hacer lo mismo con los comandos:

m=2; n=3; x=0:.01:2*pi;


y=sin(m*x); z=cos(n*x);
plot(x,y,x,z)

1.10. Submatrices la notación :


Vectores y submatrices se usan frecuentemente para conseguir manipular datos
u objetos de forma compleja. Los dos puntos : (que se usan para generar vectores y
referenciar submatrices) y la indexación mediante vectores de enteros son clave en
la manipulación de estos datos u objetos. El uso creativo de estas facilidades para
14 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE

vectorizar operaciones permite minimizar el uso de ciclos (que frenan la rapidez de


MATLAB y OCTAVE) y crear códigos simples y de fácil lectura.
La expresión 1:5 es el vector fila [1 2 3 4 5]. Ni los números ni el incremento
necesitan ser enteros. Por ejemplo, 0,2 : 0,2 : 1,2 da [0.2, 0.4, 0.6, 0.8, 1.0,
1.2], y 5 : −1 : 1 es [5 4 3 2 1]. La siguientes órdenes generan una tabla de senos.

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)

que genera el vector de a a b con n (entero) número de elementos. Se incluye a y


b. Si a > b se almacenan en orden decreciente y si n no aparece, se usa por defecto
n = 100.

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

1.11. Ficheros *.m (M-files)


Se pueden ejecutar una serie de comandos almacenados en un fichero grabado
en disco. Estos ficheros se denominan “M-files”porque los terminamos en .m (esto
es obligatorio en MATLAB y opcional en OCTAVE). La mayor parte del trabajo
consiste en crear y refinar archivos *.m mediante un editor de texto.
Existen dos tipos de ficheros *.m: (script files) archivos con el guión de las or-
denes a realizar, son los programas principales y archivos para definir funciones
(function files).
Programas principales. Los programas principales, o script files (archivos con el
guión) están formados por una secuencia de comandos y sentencias. Si por ejemplo, lo
llamamos ejemplo.m, la orden ejemplo hará que todas las sentencias en ejemplo.m
se ejecuten por orden de aparición dentro del archivo. Las variables en un programa
principal son globales y cambiarán el valor de las variables con el mismo nombre que
ya existan en el entorno de trabajo, o en la memoria de la sesión de trabajo actual.
Estos archivos guión se pueden usar para introducir datos en una gran matriz;
Ası́ los errores en una entrada particular son fácilmente corregibles.
Un archivo *.m puede referenciar otros *.m incluyendose a sı́ mismo recursiva-
mente.
Archivos de función. Los archivos de función extienden las capacidades de MAT-
LAB u OCTAVE en el sentido de que se pueden crear nuestras propias funciones
para nuestro problema particular, y que se pueden usar después como cualquier otra
función. Las variables en un archivo función son por defecto locales. Veamos un
ejemplo:

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));

Una versión más general es:

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

% rand(m,n,a,b) devuelve entradas entre a y b.


if ( nargin < 3)
a = 0;
b = 9;
end
a = floor((b-a+1)*rand(m,n)) +a;

Estas ordenes se deben de guardar en un archivo con el nombre randint.m (que


corresponde con el nombre de la función). La primera lı́nea lleva la palabra clave
function que declara el nombre de la función, los argumentos de entrada y de salida;
sin esta lı́nea el fichero serı́a un programa principal ( script file) más. Opcionalmente,
en OCTAVE se terminan los archivos de funciones con la palabra clave endfunction.
El sı́mbolo % indica que el resto de la lı́nea es un comentario. MATLAB y
OCTAVE ignorarán el resto de las lı́neas que empiecen con % (OCTAVE también
acepta # para los comentarios). Además, las primeras lı́neas de comentario, que
documentan el fichero *.m, están disponibles como ayuda usando help stat. La
documentación de un fichero *.m debe de realizarse siempre.
La orden z = randint(4,5) pasa los valores 4 y 5 a las variables m y n en la función
y la salida de la función se le pasa a la variable z. Puesto que las variables en un
fichero de función son locales, sus nombres son independientes de las otras m, n que
puedan ya existir en el entorno de trabajo actual.
Observar que el uso de nargin (“número de argumentos de entrada”) permite
dar un valor por defecto a una variable de entrada omitida, como por ejemplo lo son
a y b. Una función puede tener también varios argumentos de salida. Por ejemplo:

function [media, stdev] = stat(x)


% STAT Media y desviación estandard
% para un vector x, stat(x) devuelve la media de x.
% [media, stdev] = stat(x) media y desviación estandard.
% Para una matrix x, stat(x) actua en cada columna.
[m n] = size(x);
if ( m == 1)
m = n; % caso de un vector fila
end
media = sum(x)/m;
stdev = sqrt(sum(x.∧ 2)/m - media.∧ 2);

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.

function [b, steps] = bisect(fun, x, tol)


% BISECT da el cero de una función de una variable via bisección.
% bisect(fun,x) devuelve un cero de la función.
% fun es una cadena de caracteres con el nombre de la función;
% Normalmente las funciones son definidas en ficheros *.m.
18 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE

% x es un valor inicial. El valor devuelto es cercano


% a un punto donde fun cambia de signo. Por ejemplo ,
% bisect(’sin’,3) es pi. Observemos las comillas entorno a sin.
%
% Un tercer argumento de entrada determina una tolerancia, la
% precisión relativa del resultado (por defecto: eps).
% Un segundo argumento de salida opcional da una matriz
% con la traza de los pasos; las filas son [c f(c)].
% Inicialización
if ( nargin < 3)
tol = eps;
end
trace = (nargout == 2);
if ( x ∼= 0)
dx = x/20;
else
dx = 1/20;
end
a = x - dx;
fa = feval(fun,a);
b = x + dx;
fb = feval(fun,b);
% Se busca cambio de signo.
while ( (f a > 0) == (f b > 0))
dx = 2,0 ∗ dx;
a = x - dx;
fa =feval(fun,a);
if ( (f a > 0) ∼= (f b > 0))
break
end
b = x + dx;
fb = feval(fun,b);
end
if (trace)
steps = [a fa; b fb];
end
1.12. CADENAS DE CARACTERES, MENSAJES DE ERROR, ENTRADA 19

% 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.

1.12. Cadenas de caracteres, mensajes de error,


entrada
Las cadenas de caracteres se introducen entre comillas simples. Por ejemplo, s
= ’Esto es una prueba’ asigna el texto a la variable s.
Mensajes de texto se pueden mostrar en MATLAB y OCTAVE mediante la fun-
ción disp. Por ejemplo: disp(’Hola que tal?’) Los mensajes de error se muestran
mejor con la función error error(’Perdon, la matriz debe de ser simetrica’)
puesto que dentro de un fichero *.m para la ejecución.
Mensajes de texto también se muestran en OCTAVE mediante la orden printf.
Por ejemplo, printf(’Hola que tal?\n’). La opción al final \n representa el salto
a una nueva lı́nea.
En un fichero *.m el usuario puede ser requerido a introducir datos con la
función input. Por ejemplo, la orden iter = input(’Introduce el número de
iteraciones: ’) muestra el mensaje, interrumpe la ejecución hasta que el usuario
20 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE

introduce un dato y presiona la tecla de retorno. Entonces la ejecución se resume y


el valor se ha asignado a iter.

1.13. Trabajando con archivos *.m


Es mejor crear o editar para modificar un fichero *.m sin salir de la sesión actual
de trabajo, puesto que si salimos perderiamos todas las variables activas en esa
sesión.
Esto se puede realizar mediante la orden !. Si precedemos de !, cualquier comando
de sistema, este se puede realizar sin salir de la sesión de trabajo. Si por ejemplo,
usamos el editor de texto vi, la orden >> vi rotar.m nos permitirá editar el
archivo rotar.m. Despues de salir del editor, volveremos a la sesión de trabajo
donde la dejamos.
Sin embargo en sistemas permitiendo tareas múltiples es preferible mantener los
dos activos, MATLAB u OCTAVE y el editor de texto. Posiblemente, cada uno de
ellos en una ventana distinta.
El comando pwd devuelve el nombre de el directorio de trabajo presente y con
cd es posible cambiarlo. Con dir o ls se pueden listar los contenidos del directorio
de trabajo y con what se muestran sólo los archivos *.m. Las comandos delete y
type se pueden usar para borrar archivos o mostrarlos en pantalla respectivamente.
Los archivos *.m deben de estar en un directorio accesible a MATLAB y OCTAVE.
Todos los *.m en el directorio de trabajo actual lo son. La lista de directorios en el
camino de búsqueda se obtiene con la orden path. Este comando se puede usar para
incluir o eliminar directorios del camino de búsqueda, ver help path

1.14. Comparando la eficiencia de algoritmos: flops,


tic y toc
Dos medidas de la eficiencia de un algoritmo son el número de operaciones en
coma flotante (flops) realizados y el tiempo empleado.
La función flops guarda un total de los flops realizados. El comando flops(0)
(que no flops = 0) inicializa flops a 0. Entonces, poniendo flops(0) inmediata-
mente antes de ejecutar un algoritmo y flops justo después da el número de flops
realizados en el algoritmo. Por ejemplo, el número de flops requerido para resolver
1.15. FORMATOS DE SALIDA 21

un sistema lineal mediante eliminación de Gauss se puede obtener con:

f lops(0), x = A\b; f lops

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

devuelven el tiempo gastado en la ejecución de sentencias. Por ejemplo, con:

tic, x = A\b; toc

se obtiene el tiempo usado en resolver el sistema lineal. Como ejemplo, se puede


comparar en cuanto a flops y tiempo con la orden x = inv(A)*b;.
Se debe observar que en las máquinas en las que se comparte el tiempo de cálculo
con otros usuarios, el tiempo pasado no es una buena referencia, puesto que depende
de lo ocupado que esté el computador en ese momento.

1.15. Formatos de salida


Todos los cálculos se realizan en doble precisión, pero el formato de salida en
pantalla se puede controlar con los siguientes comandos

format short 4 decimales (por defecto)


format long 14 decimales
format short e notación cientı́fica con 4 decimales
format long e notación cientı́fica con 15 decimales
format rat aproximación por el cociente de enteros
format hex formato hexadecimal
format loose introduce lı́neas en blanco en la salida (por defecto)
format compact elimina las lı́neas en blanco en la salida (recomendada)

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

1.16. Variables Especiales y Constantes


Ya hemos visto el uso de las variables de valor fijo (predeterminado) i, j. Existen
otras más

i,j,I,J unidad imaginaria −1
pi número π
e número e
eps precisión en operaciones de punto flotante
realmax mayor número real positivo representable (1.7977e+308)
realmin menor número real positivo representable (2.2251e-308)
inf, -inf números fuera del rango representable
NaN Not a Number. Resultado de operaciones sin sentido como 0/0

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

mostrará la figura 1 y la pondrá como activa. La orden gcf devuelve el número de


la figura activa.
2
Otro ejemplo, y = e−x en el intervalo -1.5 a 1.5:

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 ejemplo, la orden title(’Aproximacion por minimos cuadrados’) da un


tı́tulo a la gráfica. La orden gtext(’El punto’) permite situar interactivamente
el texto en la figura con el ratón. Para situar texto en unas determinadas coorde-
nadas, se usa text (ver help text). La orden grid muestra lı́neas de malla sobre
la figura actual.
24 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE

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

La orden axis debe de darse después de la orden plot.


Dos formas de obtener gráficas múltiples dentro de una misma figura son, primero

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

x=0:.01:2*pi; Y=[sin(x)’, sin(2*x)’, sin(4*x)’];


plot(x,Y)

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,

x=0:.01:2*pi; y1=sin(x); y2=sin(2*x); y3=sin(4*x);


plot(x,y1,’–’,x,y2,’:’,x,y3,’+’)

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,

t=.01:.01:20*pi; x=cos(t); y=sin(t);


z=t.∧ 3;
plot3(x,y,z)

produce una hélice comprimida cerca del plano x-y.


Como en el caso de curvas en el plano, se pueden usar tı́tulos y etiquetas para
los ejes, incluyendo ahora el eje z con zlabel. También el comando axis se puede
usar, aunque ahora para prescribir las escalas de los ejes necesitaremos 6 valores.
Superficies 3-D.
La orden mesh(z) crea una gráfica 3-D en perspectiva de los elementos de la
matriz z. La malla base es rectangular en el plano x-y y se define con los ı́ndices de
la matriz mientras que la superficie con los valores de Z para cada par de ı́ndices
También se puede usar el comando surf. Intenta surf(eye(10)) y mesh(eye(10)).
Para dibujar la función z = f (x, y) sobre un rectángulo, primero definimos los
vectores xx e yy que proporcionan la partición sobre los lados del rectángulo. Con
la función meshgrid (meshdom en OCTAVE) se crea la matriz x, donde cada fila
es xx y la longitud de cada columna es la de yy. Similarmente se crea la matriz
y, cada columna iguala a yy, como sigue: [x,y] = meshgrid(xx,yy); Entonces se
calcula la matriz z, obtenida evaluando f en sobre cada entrada de las matrices x e
y. Entonces usamos mesh o surf.
2 2
Por ejemplo, si z = e−x −y y el dominio es [−2, 2] × [−2, 2] haremos:

xx = -2:.2:2;
yy = xx;
[x, y] = meshgrid(xx,yy);
26 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE

z = exp(-x.∧ 2 - y.∧ 2);


mesh(z)

Se pueden reemplazar las tres primeras lı́neas con

[x, y]= meshgrid(-2:.2:2, -2:.2:2);

Intentalo con surf en vez de mesh.


El sombreado de las superficies se fija con la orden shading. Hay tres opciones:
faceted (defecto), interpolated y flat. Se seleccionan con la orden

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:

function [x,y,z] = toro(r,n,a)


% TORO Genera un toro
% toro(r,n,a) genera un toro con radio central a
% y radio lateral r. n es el número de
% caras sobre la superficies. Valores por defecto son
% r = 0.5, n = 30, a = 1.
%
% [x,y,z] = toro(r,n,a) genera tres (n+1)-(n+1)
% matrices y surf(x,y,z) produce el toro.
%
% Ver también SPHERE, CYLINDER
1.18. ECUACIONES DIFERENCIALES ORDINARIAS 27

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

1.18. Ecuaciones Diferenciales Ordinarias


Queremos ahora resolver ecuaciones de la forma
d
x(t) = f (x(t), t), para t ≥ t0, x(t = t0) = x0
dt
que se denominan Ecuaciones Diferenciales Ordinarias con un valor inicial.
OCTAVE posee una funcion interna construida para la resolución de este tipo
de problemas y es la función lsode. Su forma general es : lsode(f cn, x0, t, tcrit ).
La función lsode(f cn, x0, t, tcrit ) devuelve una matriz de x como función de t,
dado el dato inicial del sistema x0. Cada fila en x corresponde a un valor de t. Ası́ la
primera fila corresponde con x0.
28 CAPÍTULO 1. INTRODUCCIÓN A MATLAB Y OCTAVE

El primer argumento f cn es la cadena de caracteres que representa la función f .


Debe de ser de la forma
xpunto = f cn(x, t)
donde xdot y x son vectores y t es un escalar. El cuarto argumento, tcrit es opcional
y se suele usar para indicar un tiempo máximo a partir del cual no se debe de
resolver la ecuación. Resulta útil ante problemas como singularidades y puntos de
discontinuidad. Por ejemplo,

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

con la condición inicial x0 = [ 4; 1,1; 4 ]. El sistema se puede integrar con

t = linspace(0, 500, 1000);


y = lsode(0 f cn0 , x0, t);

Se podrá observar un cambio brusco de la solución entre t = 0 y t = 5 y en torno


a t = 305. Un conjunto de puntos, o de tiempos t más eficiente es

t = [ 0, logspace(−1, log10(303), 150), logspace(log10(304), log10(500), 150) ];

MATLAB posee varias funciones internas para la resolución de Ecuaciones Difer-


enciales Ordinarias con un valor inicial. Nosotros usaremos ode23 y ode45. Estas
funciones emplean métodos de integración del tipo de Runge-Kutta explı́citos. ode23
emplea una fórmula de tipo (2,3) para obtener una precisión media, mientras que
ode45 emplea una fórmula de tipo (4,5) para obtener una gran precisión.
La forma general es

[ t, x ] = resolutor(f cn, tiempo, x0)

El primer argumento f cn es la cadena de caracteres que representa la función f


y debe de ser de la forma
xpunto = f cn(x, t)
donde xdot y x son vectores y t es un escalar. La variable tiempo representa el
intervalo de integración y x0 es el vector de datos iniciales. Si tiempo contiene más
1.18. ECUACIONES DIFERENCIALES ORDINARIAS 29

de dos elementos, entonces el resolutor devuelve los valores calculados de x en esos


valores como tiempos. Por ejemplo, para buscar la solución de
d
x(t) = −2 t x2 , x(0) = 1,
dt
en los tiempos t = 0, 0,25, 0,5, 0,75, 1 usamos lo siguiente:

function dx=xfun(x,t)
dx = −2 ∗ t. ∗ x(1).∧ 2;

la ecuación se puede integrar con

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]

la última orden crea una tabla con los resultados.

Vous aimerez peut-être aussi