MatlabOctave Aprender MatlabOctave en 25 Horas
MatlabOctave Aprender MatlabOctave en 25 Horas
MatlabOctave Aprender MatlabOctave en 25 Horas
TERESA ARIAS-MARCO
JOS LUIS BRAVO
IGNACIO OJEDA
M ISABEL PARRA
CONCHITA MARN
Editorial Tbar. Prohibida la reproduccin sin la autorizacin expresa de la editorial
ISBN
digital: 978-84-7360-472-7
ISBN
digital: 978-84-7360-472-7
Indice
1. Introducci
on a MATLAB/Octave
1.1. Primeros pasos . . . . . . . . . . . . . . . . .
1.2. Atajos de teclado. El comando help . . . . .
1.3. Escalares, operaciones aritmeticas y variables
1.4. Operadores y funciones . . . . . . . . . . . .
1.5. Gestion de cheros . . . . . . . . . . . . . . .
1.6. Ejercicios . . . . . . . . . . . . . . . . . . . .
1.7. Soluciones . . . . . . . . . . . . . . . . . . . .
2. Matrices y vectores
2.1. Denicion desde el teclado . . . . . . . . . . .
2.2. Otras formas de denir matrices y vectores .
2.3. Acceso a los elementos de una matriz . . . . .
2.4. Operaciones con vectores y matrices . . . . .
2.5. Calculos con polinomios . . . . . . . . . . . .
2.6. Resoluci
on de sistemas de ecuaciones lineales
2.7. Gestion de cheros de hojas de c
alculo . . . .
2.8. Ejercicios . . . . . . . . . . . . . . . . . . . .
2.9. Soluciones . . . . . . . . . . . . . . . . . . . .
3. Gr
acos
3.1. Creacion y manipulaci
on b
asica de gracos
3.2. Creaci
on especializada de gr
acos . . . . . .
3.2.1. Gr
acos 2D . . . . . . . . . . . . . .
3.2.2. Gr
acos 3D . . . . . . . . . . . . . .
3.2.3. Gr
acos Estadsticos . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
12
13
17
20
24
26
.
.
.
.
.
.
.
.
.
29
29
31
34
35
40
42
45
50
53
.
.
.
.
.
59
59
72
73
82
85
4. Introducci
on a la programaci
on
4.1. Scripts . . . . . . . . . . . .
4.2. Funciones . . . . . . . . . . . .
4.3. Estructuras de control . . . . .
4.4. Entrada y salida . . . . . . . .
4.5. Manejo de funciones . . . . . .
4.6. Ejercicios . . . . . . . . . . . .
4.7. Soluciones . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
91
93
97
97
100
104
109
112
114
116
143
Pr
ologo
Este libro surge a partir del material elaborado para impartir un curso
intensivo de MATLAB/Octave para profesores de la Universidad de Extremadura. La primera edici
on de este curso tuvo lugar en mayo de 2010 con una muy
buena acogida por parte de los profesores participantes, lo que propicio una
segunda edicion en 2011.
Los contenidos expuestos se presentan como un curso de auto-aprendizaje
de modo que el lector puede conseguir una vision global de las posibilidades
de este software al tiempo que puede ir ejercitandose en el uso del mismo. As,
es fundamental que se realice una lectura atenta delante de un ordenador con
MATLAB u Octave instalado.
El libro consta de dos partes bien diferenciadas. La primera parte, captulos del 1 al 4, corresponde a los aspectos generales e imprescindibles para el
manejo de MATLAB/Octave. Cada uno de los captulos de esta parte contiene una serie de ejercicios de auto-evaluacion a n de que el lector pueda
poner en practica los contenidos tratados. La segunda parte del libro muestra
algunos ejemplos concretos del uso de este software en el ambito academico
universitario.
Esperamos que esta obra contribuya a la difusion del uso del software matematico (representado aqu por MATLAB/Octave) como instrumento ecaz
de aprendizaje en
ambitos docentes y como herramienta fundamental para
abordar sin temor las matem
aticas.
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
Captulo 1
Introducci
on a
MATLAB/Octave
Este
y todos los dem
as captulos del manual estan pensados para ser trabajados delante de un ordenador con MATLAB u Octave instalado1 , y no
para ser ledos como una novela. En vez de eso, cada vez que se presente un
comando de MATLAB/Octave, se debe introducir el comando, pulsar la tecla
<intro> para ejecutarlo y ver el resultado. Mas a
un, se desea que se verique
el resultado. Aseg
urese de que se comprende perfectamente lo que se obtiene
antes de continuar con la lectura.
1.1.
Primeros pasos
Los primeros p
arrafos de esta secci
on, as como algunas frases aisladas en
las siguientes, est
an tomados, con ligeras variaciones, del libro de A. Quarteroni y F. Saleri C
alculo Cientco con MATLAB y Octave, citado en la
bibliografa; una fuente excelente para introducirse en el conocimiento de los
metodos numericos m
as usados en el c
alculo cientco.
MATLAB y Octave, los programas, son entornos integrados para el calculo
cientco y la visualizaci
on de datos. Ambos estan escritos en los lenguajes C
y C++.
1
Concretamente estas pr
acticas est
an realizadas para MATLAB 7.0 (R14) y Octave 3.2.3
10
MATLAB est
a distribuido por The MathWorks (http://www.mathworks.
com). El nombre proviene de MATrix LABoratory, pues originariamente fue
desarrollado para el c
alculo matricial. Octave, tambien conocido como GNU
Octave (http://www.gnu.org/software/octave/), es un software que se distribuye libremente sujeto a los terminos de la licencia GPL (GNU Public License).
A lo largo del manual haremos uso frecuente de la expresion comando de
MATLAB; en ese caso, MATLAB deber
a ser entendido como el lenguaje que
es el subconjunto com
un a ambos programas MATLAB y Octave.
Una vez llevada a cabo la instalaci
on, la ejecucion de MATLAB y Octave nos da acceso a un entorno de trabajo caracterizado por los indicadores
(prompt) >> y octave:1>, respectivamente.
Despues de presionar la tecla <intro> (enter, return), todo lo que este escrito a continuaci
on del indicador ser
a interpretado2 . Si la instruccion es incorrecta, MATLAB devuelve un aviso de error. En caso contrario, el comando
es ejecutado y si procede se mostrar
a una salida.
Ejemplo 1. Escribe 2 + 2 en el indicador de MATLAB, pulsa la tecla
intro y observa el resultado:
2+2
Escribe ahora pepe y pulsa intro
pepe
Que ha ocurrido?
Finalmente, el sistema devuelve el indicador para poner de maniesto que
esta preparado para un nuevo comando. En todo caso, conviene saber que
cualquier comando puede abortarse pulsando simultaneamente las teclas control (<ctrl>) y (<c>). Para cerrar una sesion de MATLAB se debe escribir
el comando quit (o exit) y pulsar la tecla intro <intro>. En adelante se
entendera que para ejecutar un programa o un comando se tiene que pulsar
2
Por tanto, un programa en MATLAB no necesita ser compilado como ocurre con otros
lenguajes (Fortran o C, por ejemplo).
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
11
<intro>. Adem
as, los terminos programa, funcion o comando se utilizaran de
forma equivalente.
Mas adelante veremos que la sintaxis de MATLAB no es muy distinta de
la de cualquier otro lenguaje; las diferencias seran las habituales, los smbolos
de continuacion, los comentarios, ... Veamos algunos de estos smbolos:
Las comillas simples o ap
ostrofes - sirven para introducir un texto literal.
Ejemplo 2. Escribe pepe
pepe
Observese que MATLAB no nos ha devuelto ahora un mensaje de error,
sino que ha devuelto como salida la variable por defecto ans (abreviatura de
answer) al igual que ocurri
o en el ejemplo 1 cuando escribimos 2 + 2. Si ahora
escribimos una cadena de caracteres (n
umero o comando) diferente, la variable
ans tomara este nuevo valor.
Ejemplo 3.
Bienvenido a la UEx
El porcentaje % es el smbolo usado para los comentarios. Todo lo que
esta por detras de este smbolo en una lnea es ignorado por el interprete.
Ejemplo 4.
2 + 2
% Esto es un comentario
Si a
nadimos tres puntos ... al nal de una lnea signica que se tomara la
siguiente lnea como continuaci
on.
Ejemplo 5.
2 + 2 ...
- 3
12
1.2.
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
13
Ejemplo 2.
sqrt(5)
% Ra
z cuadrada de 5
Utilizando la echa arriba podemos editar el comando sqrt(5), cambiar el 5 por un 4 y calcular as el valor de la raz cuadrada de 4.
sqrt(4)
MATLAB posee una amplia colecci
on de mensajes de ayuda. Si conoces
el nombre de un comando, se puede encontrar la sintaxis correcta para el
comando y ejemplos de su uso escribiendo help nombre comando.
Ejemplo 3.
help sqrt
help help
Una forma alternativa de obtener ayuda consiste en utilizar la tecla de
tabulacion <tab>:
Ejemplo 4. Escribe sq en la lnea de comandos y pulsa <tab> para
obtener la lista funciones y comandos que comienzan por sq. Obviamente sqrt es uno de ellos.
Finalmente, el comando lookfor nos muestra una lista de comandos en
cuyas explicaciones aparezca cadena de texto especicada.
Ejemplo 5.
lookfor square root
help lookfor
1.3.
14
A pesar de que en apariencia MATLAB usa cuatro cifras decimales para representar los n
umeros reales y complejos, la representacion interna del
n
umero se hace con 16 cifras decimales. De modo que lo que hemos visto es
simplemente uno de los varios posibles formatos de salida de MATLAB (el
utilizado por defecto). El mismo n
umero puede tener diferentes expresiones
decimales dependiendo de la declaraci
on especca de formato que se haga.
Ejemplo 2. Veamos distintas representaciones de 1/7
format
1/7
format
1/7
format
1/7
format
1/7
long
short e
long e
rat
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
15
quier n
umero que MATLAB pueda almacenar3 y juega el papel de innito,
mientras que la segunda representa lo que solemos denominar una indeterminacion (Not a Number).
Ejemplo 3.
1/0
0/0
Inf + 1
Las convenciones para las operaciones aritmeticas en MATLAB son similares a las de cualquier otro lenguaje de programacion. El orden de asociacion
de las operaciones es tambien el mismo. Primero operan las funciones matematicas elementales (senos, cosenos, logaritmos, ...), las multiplicaciones y
divisiones y luego las sumas y restas. Como es natural, los parentesis sirven
para modicar el orden normal de las operaciones a realizar.
Ejemplo 4. Calculemos
2
0,11/2
0,4
21/3
3(1 2i)
1/((2/0.1^(1/2))-(0.4/2^(1/3)))-3*(1-2i)
El comando = permite la asignaci
on de un valor (o de una cadena de
caracteres) a una variable dada.
Los n
umeros reales positivos m
as grande xmax y m
as peque
no xmin en MATLAB son
realmax y realmin, respectivamente. El n
umero m
as pr
oximo a uno dado x es x + eps(x).
Se puede comprobar que los n
umeros reales en MATLAB son m
as densos cerca de xmin y
menos densos cuando se aproximan a xmax .
16
quit = 5
quit
clear quit
quit
La funcion clear a secas cancela todas las asignaciones de valores a variables que hayamos realizado.
Los nombres de las variables pueden tener a lo sumo 63 caracteres alfanumericos (no se admiten ni tildes ni la letra n
y s el guion bajo ). Es
importante tener presente que el primer caracter siempre debe ser una letra y
que para MATLAB las letras may
usculas son distintas de las min
usculas.
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
17
Ejemplo 7.
a = 5
hola = 3
Hola
hola
a 1 = 12
2a = -3
a2 = -3
1.4.
who
whos
clear
who
Operadores de comparaci
on y l
ogicos. Algunas
funciones elementales
18
Ejemplo 1.
2 < 3
2 > 3
Ejemplo 2.
2 >= 3
4 >= 3
Inf == Inf+1
3 ~= 4
Los operadores l
ogicos de MATLAB son: & o and (conjuncion), | o or
(disyuncion), ~ (negaci
on l
ogica), xor (disyuncion exclusiva). Cuando se utilizan estos operadores, se eval
uan siempre ambos operandos. Sin embargo,
MATLAB ofrece la posibilidad de utilizar los operadores breves: &&, para la
conjuncion y || para la disyunci
on, que simplica la operacion de comparacion evitando operaciones innecesarias, y errores que se produciran caso de
evaluar incondicionalmente el segundo argumento (por ejemplo, para evitar la
division por cero, podemos utilizar (b~=0)&&(a/b>0)). Solo eval
uan el segundo operando en caso de ser imprescindible, cuando el resultado del primer
operando sea 1 para la conjunci
on o 0 para la disyuncion.
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
19
Ejemplo 3.
2 <= 3 &&
2 >= 3 &&
2 >= 3 ||
~(2 <= 3)
~(2 >= 3)
xor(2 <3,
xor(2 <3,
4 <5
4 <5
4 <5
2 >3)
2 >1)
raz cuadrada
valor absoluto o m
odulo
exponencial
logaritmo natural
logaritmo decimal
signo
sin
cos
tan
asin
acos
atan
seno
cos
tangente
arcoseno
arcocoseno
arcotangente
z = 2+3i
conj(z)
real(z)
imag(z)
angle(z)
compass(z)
20
Ahora podemos utilizar las operaciones y las funciones elementales introducidas arriba para construir nuevas funciones. Para ello denimos lo que se
conoce como una funci
on an
onima. Las funciones anonimas responden a la
siguiente sintaxis:
nombre funcion = @(argumentos) expresi
on
Veamos algunos ejemplos:
Ejemplo 5.
1.5.
Gesti
on de cheros
Todo trabajo que se realiza durante una sesion MATLAB, se puede escribir
en un archivo a modo de diario. Este archivo contendra una transcripcion
completa y literal de todos los comandos que ha interpretado MATLAB y
sus correspondientes respuestas. El contenido del archivo se puede editar con
cualquier procesador de textos.
Para iniciar un archivo de diario llamado, por ejemplo, prueba.txt , debemos escribir
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
21
diary prueba.txt
en la lnea de comandos de MATLAB y, como siempre, pulsar <intro>. Probablemente no se percibir
a ning
un cambio, pero el ordenador ha comenzado a
registrar todo lo que ocurre en la consola de MATLAB en el chero prueba.txt
%Esto se incluir
a en nuestro diario
En cualquier momento se puede suspender esta orden escribiendo
diary off
Escribiendo ahora diary on (o diary prueba.txt) se volvera a guardar
toda la sesion en el archivo de diario que previamente se haba creado, a
nadiendo la informaci
on nueva a continuaci
on de la ya registrada. Si hay un diario
activo al salir de MATLAB, el archivo de diario sera cerrado automaticamente.
Al salir de una sesi
on de MATLAB, los valores de todas las variables se
pierden. El archivo de diario s
olo mantiene un registro de lo que ha aparecido
en la pantalla, no se almacenan los valores de las variables. Si se desea, antes
de salir de MATLAB, se pueden guardar los valores actuales de las variables
en un archivo para su uso en una sesi
on futura. El siguiente comando guarda
los valores de todas las variables existentes en un archivo que llamaremos
mis datos.mat; por defecto, MATLAB (pero no Octave) a
nade la extension
.mat si no ha sido especicada.
save mis datos.mat
Los valores de todas las variables se guardaran en forma binaria (ilegible,
por tanto, para los seres humanos) en un archivo llamado mis datos.mat
dentro del directorio de trabajo. Para cargar estos valores de las variables en
una futura sesion de MATLAB se escribe
22
Ejemplo 1.
a = 1; b = sqrt(2); c = no se guarda;
save var ab.mat a b
clear
a
b
c
load var ab
a, b
c
Finalmente, podemos pedir a MATLAB que nos indique cual es el directorio de trabajo actual con la orden pwd y su contenido con la orden dir. El
contenido de un chero concreto se muestra con el comando type seguido del
nombre del chero. Tambien podemos borrar cheros del directorio de trabajo usando el comando delete y cambiar de directorio con el comando cd de
forma similar a como se haca en MS-DOS.
Ejemplo 2.
dir trab=pwd
dir
type var ab.mat
delete var ab.mat
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
dir
cd(C:\)
cd(home)
dir
pwd
cd(dir trab)
pwd
dir
23
% Si est
as usando Windows y hay unidad C.
% Si est
as usando Linux.
24
1.6.
Ejercicios
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
25
Ejercicio 6. Usando la ayuda de MATLAB (comando help), explica la diferencia entre los comandos floor, ceil, round y fix. Escribe tus explicaciones con comentarios, %, en la ventada de comandos e il
ustrarla con ejemplos
en MATLAB.
Ejercicio 7. Calcula el coseno de 43 grados [Pista: usa el comando help de
MATLAB para encontrar la funci
on apropiada]
diary off
26
1.7.
Soluciones
Ejercicio 1.
a = 1
a = 1
a = 2*a
a = 2
a = 2*a
a = 4
a = 2*a
a = 8
a = 2*a
a = 16
a = 2*a
a = 32
a = 2*a
a = 64
a = 2*a
a = 128
Ejercicio 2.
format long
776/7
ans=110.857142857143
8+5+7+1+4+2
ans=27
format short
Ejercicio 3.
x = 10^(-15);
((1+x)-1)/x
ans = 1.1102
Observamos que el resultado se desva en un 11 por ciento del valor esperado.
El problema es que estamos dividiendo por un n
umero muy proximo a cero.
A MATLAB/OCTAVE
CAPITULO 1. INTRODUCCION
27
Ejercicio 4.
a = 10^308; b = 1.1*10^308; c = -1.001*10^308;
a + (b + c) == (a + b) + c
Falso? Deberia ser cierto. Veamos que ha ocurrido:
a + (b + c)
ans = 1.0990e+308
(a + b) + c
ans = Inf
Al sumar a y b hemos sobrepasado el innito de MATLAB.
Ejercicio 5.
z = 3+i;
mod z = sqrt(z*conj(z))
mod z = 3.1623
abs(z)
ans = 3.1623
abs(z) == mod z
ans = 1
Ejercicio 6.
help floor
floor(x) el mayor n
umero entero menor o igual que x
help ceil
ceil(x) el menor n
umero entero mayor o igual que x
help round
round(x) es el n
umero entero m
as pr
oximo a x
help fix
fix(x) n
umero (entero) que est
a a la izquierda de la coma en la expresion
decimal de x
Ejercicio 7.
help cos
cos(x) calcula el coseno de x en radianes
help cosd
cosd(x) calcula el coseno de x en grados
28
cosd(43)
ans = 0.73135
29
Captulo 2
Matrices y vectores
Como ya mencionamos en el captulo anterior, MATLAB u Octave son
fundamentalmente programas para el c
alculo matricial. En realidad, todos
los datos son matrices, siendo los vectores y escalares casos particulares. Comenzaremos esta segunda sesi
on aprendiendo a introducir matrices y vectores
desde el teclado, para continuar, m
as adelante, con otras formas mas potentes
de denir matrices. Asmismo, experimentaremos con algunas de la funciones incorporadas en MATLAB, que lo convierten en una potente calculadora
matricial.
2.1.
Denici
on desde el teclado
30
31
De forma an
aloga a las matrices, es posible denir un vector la x (con
los n
umeros separados por comas o espacios en blanco) o un vector columna y
(con los n
umeros separados por puntos y coma). Para pasar de un vector la
a uno columna, basta con usar la funci
on traspuesta.
Ejemplo 5.
x=[1 2 3]
x
y=[1;4;7]
y
2.2.
Introducir matrices a traves del teclado solo es practico en algunas situaciones, por ejemplo cuando su tama
no es peque
no o no es necesario repetirlo
muchas veces.
MATLAB dispone de varias funciones orientadas a denir matrices y vectores de tipos particulares2 , algunas de las cuales son las siguientes:
eye
zeros
ones
rand
diag
linspace
:
matriz unidad
matriz de ceros
matriz de unos
matriz de n
umeros aleatorios entre 0 y 1
matriz diagonal o diagonal de una matriz
vector de partici
on de un intervalo
vector de sucesi
on aritmetica
Para obtener una lista de todas las matrices elementales escribir help elmat. Este comando no funciona en Octave.
Para obtener informaci
on detallada sobre una de dichas funciones en concreto, tanto en
MATLAB como en Octave, escribir help seguido del nombre de la funci
on.
32
x1=1:2:100
x2=2:2:100
Puede utilizarse con valores enteros y reales, positivos o negativos.
Ejemplo 3.
y=100:-10:1
z=0:pi/4:2*pi
Una opcion alternativa para generar vectores con valores igualmente espaciados es utilizar la funci
on linspace.
33
Ejemplo 4. Veamos c
omo generar los vectores de los ejemplos anteriores, utilizando linspace:
x=linspace(1,100)
x1=linspace(1,99,50)
% 50 particiones
x2=linspace(2,100,50)
y=linspace(100,10,10)
z=linspace(10,2*pi,9)
Ejemplo 5. Compara los vectores resultantes de las siguientes instrucciones:
x=1:3:10
y=linspace(1,10,4)
y de estas otras
x=1:4:10
y=linspace(1,10,3)
Finalmente, MATLAB tambien ofrece la posibilidad de denir una matriz
a partir de otra u otras, denidas previamente, recibiendo alguna de sus propiedades (por ejemplo el tama
no, su diagonal, ...), por composicion de varias
submatrices o modicando de alguna forma otra matriz.
Ejemplo 6.
A=rand(4)
B=diag(diag(A))
C=[A B]
D=[A;B]
E=[A,eye(4);zeros(4),B]
34
Una caracterstica peculiar de algunas funciones en MATLAB es que dependiendo del tipo de argumentos que reciban, as seran los valores de retorno,
determinandose en tiempo de ejecuci
on. Un ejemplo claro es la funcion diag,
que hemos utilizado en el ejemplo anterior para construir la matriz B. Al aplicarla sobre una matriz, devuelve un vector con su diagonal principal, mientras
que al aplicarla sobre un vector, nos devuelve la matriz diagonal. Por defecto,
dicha diagonal ser
a la principal, aunque admite un segundo argumento para
referirse a las diagonales secundarias.
2.3.
35
Ejemplo 2.
x(2:4)
A(1:3,[1,3,5])
A(:,1)
A(3,:)
A(1:2:6,:)=0
A(:,7)=7
% A~
nade una columna de sietes
A(2:2:6,:)=[]
2.4.
36
37
Ejemplo 4.
B=[-1,0,1,2;3,2,1,0;2,4,6,8]
x=[0;1;-1;0]
B*x
x*B
Ejemplo 5.
A=[1,2;3,4]
B=[-1,2;3,-4]
C=(A==B)
D=(A~=B)
C+D
Los operadores l
ogicos se combinan con los relacionales para poder comprobar el cumplimiento de condiciones m
ultiples.
38
% Dar
a error
(A>1/4)&(A<3/4)
(1/4<A<3/4)
Cuando una de estas funciones (excepto dot y cross) se aplica sobre una matriz, en
realidad, la respuesta es un vector la cuyas componentes son el resultado de aplicarla por
separado a cada columna de la matriz.
Ejemplo 7.
A=magic(5)
39
sum(A)
x=[-5,3,0,2,1,-2]
sum(x)
mean(x)
mean(x)
exp(x)
Cuando una funci
on tiene en su denici
on mas de un argumento de salida,
puede ser utilizada de varias formas. Las funciones max y min nos proporcionan
un ejemplo. Si utilizamos la funci
on en la forma max(x) MATLAB devuelve
el maximo valor de las componentes del vector, pero si utilizamos la forma
[m,i]=max(x), el valor m
aximo quedar
a almacenado en la variable m y la
posicion que ocupa en la variable i.
Ejemplo 8.
max(x)
[m,i]=max(x)
Algunas funciones especcas para el manejo de matrices son:
size
inv
rank
diag
det
da el n
umero de las y columnas
calcula la inversa de una matriz
rango
obtiene una diagonal
calcula el determinante de la matriz
40
Ejemplo 9.
D=eye(5)
B=diag([1,2,3,4],1)
C=diag([5,6,7,8],-1)
A=D+B+C
IA=inv(A)
A*IA
det(A)
rank(A)
size(A)
2.5.
C
alculos con polinomios
polyval
conv
deconv
polyder
41
% Multiplicaci
on de polinomios
[c,r]=deconv(p,q)
% Cociente de polinomios
polyder (p)
42
2.6.
Resoluci
on de sistemas de ecuaciones lineales
a11 x1
a21 x1
..
.
+
+
a12 x2
a22 x2
..
.
+ +
+ +
..
.
a1n xn
a2n xn
..
.
=
=
b1
b2
..
.
Ax = b
donde x y b son vectores columna y A una matriz. Una formulacion tan sencilla,
puede esconder complicaciones. Aparentemente, la solucion es:
x = A1 b
43
4x + 3y + 2z = 5
2x 7y + 2z = 7
3x + 2y + 8z = 3
A=[4 3 2; 2 -7 2; 3 2 8]
b=[5; -7; -3]
sol1=inv(A)*b
sol2=A\b
x + 2y = 2
x
= 0
y
= 0
A=[1 2; 1 0; 0 1]
b=[2; 0; 0]
sol=A\b
44
Ejemplo 3.
A=[1 2 3;4 5 6;7 8 9], b=[1;0;0]
A\b
x + 2y + 3z = 6
x+y+z = 1
A = [1, 2, 3; 1, 1, 1], b=[6;1]
x=A\b
H=null(A)
45
2.7.
Gesti
on de cheros de hojas de c
alculo
Como se coment
o en el primer captulo, vamos a mostrar el uso de una
serie de funciones de MATLAB para importar/exportar datos de/a cheros
de hojas de calculo. Las primeras csvread, csvwrite, dlmread y dlmwrite,
funcionan tanto en MATLAB como Octave, mientras que las dos u
ltimas,
xlsread y xlswrite, s
olo funcionan en MATLAB.
Ejemplo 1. Vamos a leer los datos del chero fichero.csv que puedes descargar en http://www.editorialtebar.com.
csvread(fichero.csv)
Si quieres puedes ver su contenido abriendo el chero con un editor de
texto cualquiera.
46
Ejemplo 2.
A = csvread(fichero.csv)
La variable A es una matriz, y como tal admite las funciones usuales
de las matrices. Por ejemplo podemos preguntarnos su tama
no:
size(A)
Es posible que no queramos importar todos los datos de un chero .csv.
Por ejemplo, ocurre a menudo que las primeras las o columnas corresponden
a los encabezados de una tabla. En casos como este, podemos jar a partir de
que la y columna exportaremos los datos.
Ejemplo 3. Supongamos que s
olo queremos importar las entradas
de nuestro chero fichero.csv que se encuentran por debajo de la
primera la y a la derecha de la segunda columna, en este caso escribiremos:
csvread(fichero.csv,1,2)
O si, por ejemplo, queremos excluir los datos de las dos primeras columnas, escribiremos:
csvread(fichero.csv,0,2)
Tambien podemos delimitar hasta que la y columna se exportaran los
datos de un chero .csv.
Ejemplo 4. Para importar las entradas de nuestro chero
fichero.csv que se encuentran entre la segunda y la cuarta la (ambas inclusive) y la primera y la tercera columnas (ambas inclusive),
escribiremos:
csvread(fichero.csv,1,0,[1,0,3,2])
En Octave: csvread(fichero.csv,[1,0,3,2])
47
Quiza la u
nica observaci
on a tener en cuenta es que podemos exportar
nuestros datos dejando las o columnas vacas arriba o a la izquierda, respectivamente; de tal modo que luego podamos editar el chero .csv creado para
a
nadir nombres a las las o columnas.
Ejemplo 6. Si, por ejemplo, quisieramos guardar el contenido de la
variable A reservando espacio para a
nadir una la y una columna posteriormente, bastara escribir
csvwrite(datosA.csv,A,1,1)
48
49
Al igual que ocurra con csvread y dlmread, podemos asignar a una variable el contenido numerico de una hoja de calculo de Excel.
Ejemplo 9. En nuestro ejemplo, para guardar los datos numericos de
nuestra hoja de c
alculo en una variable de MATLAB que llamaremos
datos, basta escribir:
datos = xlsread(excel);
Tambien podemos importar el texto de una hoja de calculo de Excel.
Ejemplo 10. Si queremos importar el contenido numerico y el texto
de nuestra hoja de c
alculo excel.xls y guardarlo en sendas variables
llamadas datos y texto, respectivamente, escribiremos:
[datos, texto] = xlsread(excel);
La primera variable contiene los datos numericos y la segunda el texto
contenido en nuestra hoja de c
alculo.
texto
Al igual que ocurra con la funci
on csvread podemos importar determinadas las o columnas de una hoja de c
alculo de Excel utilizando la funcion
xlsread. Dado que el uso es totalmente an
alogo al de csvread no pondremos
ning
un ejemplo ilustrativo. De igual modo, como el comando xlswrite funciona exactamente igual que csvwrite, tampoco propondremos ning
un ejemplo
para mostrar su uso. La u
nica diferencia es la salida, la funcion csvwrite genera un chero de datos separados por comas y la funcion xlswrite una hoja
de calculo de Excel. En todo caso, animamos al lector interesado a inventarse
y jugar con sus propios ejemplos.
50
2.8.
Ejercicios
1 0 0 0 0
(i) 0 1 0 0 0
0 0 1 0 0
(ii)
0
1
0
0
0
0
2
0
0
0
0
3
0
0
0
0
(iii)
0
0
0
0
1
0
0
1
0
1
0
2
0
0
1
3
1
2
1
A = 1 2 1
2
4
2
1 2 1
B = 1 4 1
2 4 2
1 2 1
C = 1 4 1
2 4 5
Ejercicio 5. Crear una matriz cuadrada 100 100 de valores aleatorios y determinar cuantos de ellos son mayores que 1/2. Puesto que rand genera n
umeros aleatorios distribuidos uniformemente en el intervalo (0,1), este n
umero
ser
a aproximadamente 100 100/2
4
51
p(x)
q(x)
3x + 2y z = 1
5x + y + 3z = 2
3y 4z
= 3
Ejercicio 8. Calcula el m
aximo autovalor y el autovector asociado (para ello,
utilizar el comando eig) a la matriz de coecientes del sistema anterior.
Ejercicio 9. Descarga el chero comprimido hipotecas.zip de http://www.
editorialtebar.com y descomprmelo donde MATLAB pueda encontrarlo.
Veras que hay seis cheros, tres est
an en formato .csv y otros tres en formato
.xls. Los cheros contienen los datos del n
umero e importe total (en miles de
euros) de hipotecas suscritas mensualmente entre enero de 2003 y diciembre
de 2008 en Badajoz (BA), C
aceres (CA) y Espa
na (ES).
Se pide:
1. Guarda en sendas variables de MATLAB los datos las hipotecas en Badajoz, Caceres y Espa
na.
52
2.9.
Soluciones
Ejercicio 1.
eye(3,5)
ans =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
diag([1,2,3],-1)
ans =
0 0 0 0
1 0 0 0
0 2 0 0
0 0 3 0
[zeros(4,1),[eye(3);1:3]]
ans =
0 1 0 0
0 0 1 0
0 0 0 1
0 1 2 3
Ejercicio 2.
round(10*rand(5,4)-5)
Ejercicio 3.
A = [1 2 1; -1 -2 -1; 2 4 2]
A =
1
2
1
1 2 1
2
4
2
rank(A), det(A), inv(A)
ans =
1
ans =
0
Warning: Matrix is singular to working precision.
53
54
ans =
Inf Inf Inf
Inf Inf Inf
Inf Inf Inf
B = [1, 2, 1; -1, 4, -1; 2, 4, 2]
B =
1 2
1
1 4 1
2 4
2
rank(B), det(B), inv(B)
ans =
2
ans =
0
Warning: Matrix is singular to working precision.
ans =
Inf Inf Inf
Inf Inf Inf
Inf Inf Inf
C = [1, 2, 1; -1, 4, -1; 2, 4, 5]
C =
1 2
1
1 4 1
2 4
5
rank(C), det(C), inv(C)
ans =
3
ans =
18
ans =
1,3333 0,3333 0,3333
0,1667
0,1667
0
0,6667
0
0,3333
Ejercicio 4.
x = linspace(0,2*pi,9);
D = [x, sin(x), cos(x)]
0
0,7071
1,0000
0,7071
0,0000
0,7071
1,0000
0,7071
0,0000
1,0000
0,7071
0,0000
0,7071
1,0000
0,7071
0,0000
0,7071
1,0000
Ejercicio 5.
M = rand(100);
N = M >= 1/2;
sum(sum(N))
ans =
5105
Ejercicio 6.
p = [3, 2, -1, 1]; q = [-7,3, 2, -15]; t = [3, 2, -15];
tt = [0, 3, 2, -15]
tt =
0 3 2 15
p+q+tt
ans =
4 8 3 29
conv(q,t)
ans =
21 5 117 86 60 225
[c,r] = deconv(p,q)
c =
-0.4286
r =
0 3,2857 0,1429 5,4286 R = roots(p)
R =
-1.1852
55
56
0.2593+0.4626i
0.2593-0.4626i
polyval(p,R)
ans =
1.0e-014*
0.8882
0.0222+0.0888i
0.0222-0.0888i
Ejercicio 7.
A = [3, 2, -1; 5, 1, 3; 0, 3, -4];
b = [1,-2,3];
u = A\b
u =
0,1429
0,1429
0,8571
A*u
ans =
1,0000
2,0000
3,0000
A*u - b
ans =
1.0e-015 *
0,222000
Ejercicio 8.
help eig
[V,D] = eig(A)
V =
0,5515 0,3940
0,2101
0,7949 0,7616 0,5160
0,2530 0,5146 0,8304
D =
57
CAPITULO 3. GRAFICOS
59
Captulo 3
Gr
acos
Antes de comenzar con este captulo , es importante saber que al ejecutar cualquier comando de tipo gr
aco, se obtiene una nueva ventana llamada
Figure 1 donde se dibuja el objeto o se realiza el cambio requerido. As, despues de ejecutar la primera orden gr
aca, organiza el escritorio de forma que
puedas ver a la vez, tanto la ventana de comandos de MATLAB/Octave como
la ventana Figure 1.
MATLAB tiene m
as y mejores opciones para las cuestiones gracas que
Octave y esto se observa claramente en las diferencias existentes entre la ventana Figure 1 de MATLAB y la de Octave. Por ello, aunque se indicaran
explicitamente las diferencias existentes entre MATLAB y Octave1 , sugerimos
que esta sesion se realice con MATLAB.
3.1.
Creaci
on y manipulaci
on b
asica de gr
acos
La forma m
as sencilla de dibujar una funcion de una variable es mediante
el uso de ezplot que tan s
olo necesita la expresion de la propia funcion que
se desea dibujar.
MATLAB indicar
a que la orden debe ejecutarse solamente en MATLAB y Octave
indicar
a que la orden debe ejecutarse s
olamente en Octave.
60
Ejemplo 1. Dibujemos la gr
aca de la funcion f (x) = x2 + x + 1:
ezplot(x^2+x+1)
Si el intervalo de denici
on por defecto no parece el mas adecuado,
podemos cambiarlo:
ezplot(x^2+x+1,[-2,2])
Tambien podemos utilizar una funci
on anonima como argumento
f= @(x) x^2+x+1;
ezplot(f,[-2,2]) % Dar
a error
Ahora, prueba escribiendo
f= @(x) x.^2+x+1;
ezplot(f,[-2,2])
Sabes por que dio error? Si no es as, no te preocupes pues lo entenderas en la siguiente secci
on.
Ejemplo 2. Dibujemos la gr
aca de la funcion
2
2
f (x, y) = x exp(x y ):
ezmesh(x*exp(-x^2-y^2))
Podemos cambiar el intervalo de denicion por defecto por un dominio
del tipo [2, 2] [2, 2] escribiendo
ezmesh(x*exp(-x^2-y^2),[-2,2])
o del tipo [2, 2] [5, 7] escribiendo
ezmesh(x*exp(-x^2-y^2),[-2,2,-5,7])
CAPITULO 3. GRAFICOS
61
62
La funcion grid controla la rejilla que genera cada uno de los ejes y la orden
view nos permite especicar el punto de observacion del objeto representado
en los gracos en tres dimensiones.
Ejemplo 4.
grid off % Elimina la malla.
grid on % Dibuja una malla en la gr
afica.
grid minor % Dibuja una malla m
as tupida.
grid off % Elimina la malla.
CAPITULO 3. GRAFICOS
63
A continuaci
on, indicamos que el punto de observacion del objeto sea
de 28 grados de rotaci
on horizontal (i.e. en el plano OXY ) con respecto
al eje OY y de 90 grados de elevaci
on vertical con respecto del plano
OXY .
view(28,90)
Los puntos de observaci
on por defecto en un espacio de dos y tres
dimensiones son respectivamente
view(2) % equivale a view(0,90)
view(3) % equivale a view(-37.5,30)
Para conseguir una interpretaci
on m
as clara del objeto representado se
puede a
nadir un ttulo y nombres a los ejes. Para ello, utilizaremos las funciones
title, xlabel, ylabel y zlabel.
Ejemplo 5.
title (Realizado con la funci
on ezmesh)
xlabel(Eje de Abcisas)
ylabel(Eje de Ordenadas)
zlabel(Eje 3D)
Ademas de los comandos descritos antes para etiquetar gracas, existe
la posibilidad de escribir una anotaci
on en cualquier otro lugar de la gura
mediante el uso de la funci
on text. Para ello, debemos escribir
text(X,Y,Z,{primera l
nea,segunda l
nea})
donde X, Y, Z denotan las coordenadas del punto (X, Y, Z) de la graca, en
este caso en tres dimensiones, donde se realiza la anotacion.
MATLAB/Octave por defecto interpreta todos los caracteres empezados
con una barra invertida \ como palabras clave en TeX. As, podemos introducir en los gracos caracteres especiales o letras griegas.
64
Ejemplo 6.
text(0.8,0.05,0.435,{<- Aqu
se encuentra ...
aproximadamente el m
aximo})
Te atreves a ndicar d
onde se encuentra aproximadamente el mnimo?
Pista: Quiz
as los comandos axis y view sean de utilidad.
Como ves, el uso de la funci
on text no es sencillo. Sin embargo, en el caso
dos dimensional y en MATLAB, la orden
text(X,Y,{primera l
nea,segunda l
nea}),
puede sustituirse por otra que utiliza la funcion gtext y obtener los mismos resultados de una forma m
as sencilla. Para ello, escribimos, solamente en
MATLAB,
gtext({primera l
nea,segunda l
nea})
en la ventana de comandos y cuando se abra la gura indicamos mediante un
clic del raton el lugar donde ha de ir el texto. En Octave esta implementado
a partir de la versi
on 3.2..
Ejemplo 7.
MATLAB ezplot(sin(x),[-pi,pi])
MATLAB gtext({-\pi \leq x \leq \pi})
Ahora selecciona en la gura el lugar donde quieres leer la anterior
informacion con un clic del rat
on.
Para representar datos gr
acamente con mayor calidad necesitamos tener
un mayor control sobre las opciones gr
acas. Las funciones get y set permiten conocer y manipular todas las opciones posibles sobre el aspecto de un
graco independientemente de la funci
on de MATLAB/Octave utilizada para
la representacion de datos. Adem
as, su funcionamiento es sencillo. Primero, al
mismo tiempo que se ejecuta el comando de dibujo para obtener la ventana
CAPITULO 3. GRAFICOS
65
Ejemplo 8.
Asignamos un nombre al gr
aco
p3=ezmesh(x*exp(-x^2-y^2));
Obtenemos todas las opciones posibles de control sobre el graco
get(p3)
Supongamos que queremos cambiar el aspecto y los colores de la supercie.
Obtenemos el valor actual de la opci
on FaceColor y lo guardamos en
FC
FC=get(p3,FaceColor)
Obtenemos todos los posibles valores que puede tomar la opcion FaceColor. Esta funci
on s
olo est
a disponible en MATLAB.
MATLAB set(p3,FaceColor)
Establecemos el intervalo de denici
on de los ejes para obtener una
mejor visualizaci
on de las siguientes ordenes
Octave axis([-4,4,-4,4,-0.5,0.5])
A continuaci
on, probamos los distintos valores hasta elegir el deseado.
En nuestro caso recuperaremos el original.
set(p3,FaceColor,none)
set(p3,FaceColor,flat)
set(p3,FaceColor,interp)
66
set(p3,FaceColor,texturemap)
set(p3,FaceColor,[0 0.5 1])
set(p3,FaceColor,[1 2 3])
Que ha ocurrido?Podras explicarlo?
set(p3,FaceColor,FC)
Las funciones get y set son realmente muy u
tiles pues no solo funcionan
sobre el graco dibujado sino tambien sobre cualquier accion que realicemos
sobre este. Tan s
olo hay que recordar que al mismo tiempo que se ejecuta
el comando de dibujo para obtener un resultado sobre la ventana Figure 1
debemos asignar un nombre a dicha acci
on. As, por ejemplo, si realizamos una
anotacion sobre el gr
aco y, despues, queremos modicar su posicion, estilo
de letra, tama
no,..... podremos hacerlo.
Ejemplo 9.
t=text(0.8,0.05,0.435,{<- Aqu
se encuentra ...
aproximadamente el m
aximo});
get(t) % Obtenemos todas las opciones posibles de control sobre la acci
on
Supongamos que queremos cambiar el tipo de letra.
FN=get(t,FontName) % Obtenemos el valor actual de la
opci
on FontName y lo guardamos en FN.
MATLAB set(t,FontName) % Intentamos obtener informaci
on sobre los posibles valores que puede tomar la opci
on
FontName.
A continuaci
on, probamos con distintos valores hasta elegir el deseado.
En nuestro caso recuperaremos el original.
CAPITULO 3. GRAFICOS
67
set(t,FontName,Times)
set(t,FontName,Arial)
set(t,FontName,Cambria)
set(t,FontName,FN)
Ahora cambia el color y el tama
no de la anotacion realizada en el
ejemplo anterior y, si es necesario, tambien su posicion. Finalmente,
vuelve al dibujo original.
En determinadas ocasiones es necesario dibujar mas de una graca en la
ventana Figure 1, para ello utilizaremos el comando hold. Ademas, cuando se dibuja m
as de una gr
aca utilizando los mismos ejes de coordenadas,
es necesario poder distingir entre las mismas. Utilizando la funcion legend,
podremos dar un nombre a cada una de las gracas dibujadas.
Ejemplo 10.
p1=ezplot(x*exp(-x^2));
hold on
p2=ezplot(x*exp(-x^2)+0.5);
axis auto
set(p2,Color,[0 1 0])
title(Uso del comando hold)
legend(Funci
on x*exp(-x^2),Funci
on x*exp(-x^2)+1)
set(p1,Color,[1 0 0])
hold off
Sin embargo, a veces nos ser
a de m
as utilidad dibujar gracas en diferentes
ventanas y poder manipularlas independientemente. Para ello, utilizaremos los
comandos figure, gcf, shg, clf y close.
El comando figure crea una nueva ventana graca, la activa y la trae al
68
Ejemplo 11.
p3=ezmesh(x*exp(-x^2-y^2));
Octave axis([-4,4,-4,4,-0.5,0.5])
figure
p4=ezmesh(x*exp(-x^2-y^2)+3);
Octave axis([-4,4,-4,4,2.5,3.5])
set(p4,EdgeColor,[0 0.5 1])
figure(4) %Elegimos el n
umero de la nueva ventana.
p5=ezmesh(x*exp(-x^2-y^2)-3);
Octave axis([-4,4,-4,4,-3.5,-2.5])
set(p5,FaceColor,[1 0.5 0])
figure
p6=ezmesh(x*exp(-x^2-y^2)+6);
Octave axis([-4,4,-4,4,5.5,6.5])
set(p6,EdgeColor,[0 1 0.5])
Cuando tenemos m
as de una ventana graca es conveniente saber como
manipularlas. El comando gcf (abreviatura de get current gure) nos devuelve el n
umero de la ventana gr
aca activa en ese momento. La funcion shg
(abreviatura de show graph) trae la ventana graca activa al frente de todas
(solamente disponible en MATLAB). Utilizando el comando clf (abreviatura de clear gure) podemos borrar el contenido de la ventana graca que
necesitemos sin cerrarla. Finalmente, utilizando close cerramos las ventanas
gracas que no necesitamos.
CAPITULO
GRAFICOS
CAP
ITULO 3.
3. GR
AFICOS
Ejemplo
Ejemplo 12.
12.
gcf
gcf
MATLAB
MATLAB shg
shg
Limpiamos la ventana activa
clf
clf
p7=ezmesh(x*exp(-x^2-y^2)-6);
p7=ezmesh(x*exp(-x^2-y^2)-6);
set(p7,FaceColor,[0.5 0 1])
set(p7,FaceColor,[0.5 0 1])
clf(2)
figure(2)
figure(2)
p8=ezplot(x*exp(-x^2));
set(p8,Color,[1
0.5 0])
p8=ezplot(x*exp(-x^2));
figure
set(p8,Color,[1 0.5 0])
p9=ezplot(x*exp(-x^2));
figure
set(p9,LineStyle,-.)
p9=ezplot(x*exp(-x^2));
figure(500)
set(p9,LineStyle,-.)
p10=ezplot(x*exp(-x^2));
figure(500)
set(p10,LineWidth,10)
p10=ezplot(x*exp(-x^2));
gcf
set(p10,LineWidth,10)
close
gcf
Cerramos la
la ventana
ventana Figure
activa 4
Cerramos
close
close(4)
MATLAB
close(1,3)
% Cerramos
las ventanas Figure 1 y
Cerramos la
ventana Figure
4
Figure 3
close(4)
69
69
70
CAPITULO 3. GRAFICOS
71
72
donde n indica el n
umero de la ventana Figure donde se encuentra el graco a
guardar y Extensi
on toma el valor -djpeg o -dpsc dependiendo de si deseamos guardar la imagen como un archivo jpeg o como un archivo ps. El archivo
generado se guarda en el directorio de trabajo con el nombre especicado en
Nombre.
Ejemplo 15.
dir
print(1,-dpsc,SinCos1) % Genera SinCos1.ps
print(1,-djpeg,SinCos2) % Genera SinCos2.jpeg
dir % Observa que se han creado dos nuevos archivos.
close
Utiliza los comandos introducidos hasta ahora para mostrar la graca
de la funcion x2 + x + 1 a t
u gusto. Finalmente guardala en formato
jpeg.
3.2.
Creaci
on especializada de gr
acos
CAPITULO 3. GRAFICOS
73
Ejemplo 1.
Podemos solicitar informaci
on de tipo general, sobre gracos 2D, sobre
gracos 3D o informaci
on especializada
MATLAB help graphics
MATLAB help graph2d
MATLAB help graph3d
MATLAB help specgraph
3.2.1.
Gr
acos 2D
Gr
acos elementales
La forma m
as sencilla de crear un gr
aco en MATLAB/Octave es unir
mediante lneas unos puntos del plano dados. Para ello, los puntos del plano
dados se interpretan como una lista de coordenadas (x, y) dadas y se crean
dos vectores: el vector X, formado por los valores que toma la coordenada x,
y el vector Y, formado por los valores que toma la coordenada y. Finalmente,
la funcion plot une los puntos (x, y) con segmentos lineales.
Ejemplo 2. Conexi
on de los puntos (1, 3), (4, 9) y (6, 4).
X=[1,4,6]; Y=[3,9,4];
plot(X,Y)
74
Ejemplo 4. Propagaci
on del SIDA.
meses =[20,21,24,26,29,31,35,37,41,45];
casos=[110,129,220,257,439,514,878,1029,1756,2057];
plot(meses,casos)
xlabel(Meses transcurridos desde enero de 1980)
ylabel(Numero de casos)
title(Propagaci
on del SIDA en EE.UU.)
Notar que tambien podemos representar las lneas que unen varios puntos
para crear polgonos y adem
as pintarlos utilizando la funcion fill.
Ejemplo 5. Conexi
on cerrada de los puntos (1, 3), (4, 9) y (6, 4).
X=[1,4,6,1]; Y=[3,9,4,3];
plot(X,Y)
Triangulo de vertices (1, 3), (4, 9) y (6, 4) con relleno de color [1 0 1].
fill(X,Y,[1 0 1])
CAPITULO 3. GRAFICOS
75
76
Ejemplo 7. Dibujamos la gr
aca de y = xex .
X=-3:.01:3;
Y=X.*exp(-X.^2);
Por que hay que poner los puntos antes de las operaciones?
plot(X,Y)
Sabras responder ahora a la pregunta formulada en el Ejemplo 1 de
la primera secci
on?
Algunas funciones gr
acas de MATLAB, como la que actualmente estudiamos plot, nos permiten simplicar el procedimiento de realizacion de cambios
sobre el aspecto de la gr
aca. Es decir, a veces podremos evitar el uso de
hold y, para ciertas propiedades podremos evitar el uso de las funciones get
y set. El uso del comando help nos permitira conocer las propiedades de
simplicacion que ofrece cada funci
on de dibujo graco.
Ejemplo 8.
Observar como la funci
on plot ofrece posibilidades, por ejemplo sobre
el color o tipo de linea, que no ofrece ezplot.
help plot
help ezplot
As, para cambiar el color o tipo de lnea con ezplot es necesario el uso
de set mientras que su uso puede ser evitado en el caso de dibujar con la
funcion plot. A continuaci
on, estudiaremos las posibilidades de simplicacion
mas relevantes que ofrece el comando plot con mas detalle.
A
nadiendo un par
ametro opcional al comando plot podemos controlar el
color y el estilo de lneas y puntos.
Las opciones predenidas para los colores son: b (azul), g (verde), r
(rojo), c (cian), m (magenta), y (amarillo), k (negro) y w (blanco). Las
CAPITULO 3. GRAFICOS
77
78
Ejemplo 11.
Representaci
on gr
aca de la inuencia que tienen las embarcaciones a
motor en la muerte de los manates.
matriculas=[13 21 24 16 24 20 15 34 33 33 39 43 50 47];
muertes = [447 460 481 498 513 512 526 559 585 614 ...
645 675 711 719];
plot(matriculas,muertes, bo)
xlabel(Embarcaciones matriculadas (en miles) desde ...
1977)
ylabel(Manat
es hallados muertos)
title(Mortalidad de los manat
es en Florida)
Finalmente, una de las propiedades de simplicacion mas interesantes de
plot es el poder evitar el uso del comando hold.
Ejemplo 12.
X=0:.5:20;
Y=exp(0.1*X);
Y1=Y.*sin(X); Y2=Y.*cos(X);
plot(X,Y,X,-Y,X,Y1,X,Y2)
plot(X,Y,kv,X,-Y,k^,X,Y1,ms:,X,Y2,co-)
Sin embargo, cuando utilicemos esta u
ltima opcion debemos llevar cuidado
pues el comando plot tiene otras propiedades de simplicacion graca especcas sobre el aspecto de la lnea. En el caso de MATLAB estas se asignaran a
todas las lneas del gr
aco y en el caso de Octave solo a algunas de ellas si
no se indican correctamente. Estas otras propiedades se especican mediante
parejas de nombre de la propiedad y su valor como se muestra en el siguiente
CAPITULO 3. GRAFICOS
79
ejemplo.
Ejemplo 13.
plot(X,Y1,ms:,X,Y2,co-)
Ahora, jamos el grosor de la lnea en pxeles.
plot(X,Y1,ms:,X,Y2,co-,LineWidth,2)
Ademas, jamos el tama
no del marcador.
plot(X,Y1,ms:,X,Y2,co-,LineWidth,2, ...
MarkerSize, 10)
Notar que en MATLAB las propiedades especicadas afectan a todas
las lneas mientras que en Octave solo afectan a la graca de Y2!
Sabes que hacer para que cada lnea tenga su propio grosor y ambas
se dibujen sobre los mismos ejes de coordenadas?
80
Representamos gr
acamente los resultados con escala lineal en ambos
ejes de coordenadas.
subplot(1,2,1)
plot(diametros,tasas,ro)
title(Grafica dN/dp versus p)
xlabel(Diametros p de las particulas)
ylabel(Densidad del tama~
no dN/dp)
Representamos gr
acamente los resultados con escala lineal en el eje
OX y escala logartmica en el eje OY .
subplot(1,2,2)
semilogy(diametros,tasas,b*)
title(Grafica SemiLog: dN/dp versus p)
xlabel(Diametros p de las particulas)
ylabel(Logaritmo de la densidad del tama~
no dN/dp)
Curvas en param
etricas
Veamos ahora c
omo se pueden representar curvas en el plano dadas en
forma parametrica, es decir, de la forma r(t) = (x(t), y(t)), t [a, b]. Para
ello, se utilizan principalmente los comandos plot y ezplot.
Ejemplo 15. Dibujamos la circunferencia unidad.
subplot(1,2,1)
ezc=ezplot(cos(t),sin(t));
CAPITULO 3. GRAFICOS
81
set(ezc,color,[1 0 1])
axis square
subplot(1,2,2)
t=0:.01:1;
plot(cos(2*pi*t),sin(2*pi*t),g)
axis square
Compara ambas gr
acas. C
omo es m
as sencillo elegir el color de la
graca? Que otras diferencias visuales observas? Si lo has realizado
con MATLAB, d
onde resulta m
as necesario forzar la misma escala en
ambos ejes de coordenadas?
Notar que hemos utilizado ; despues de la sentencia de ezplot. Sin embargo, la ventana gr
aca se ha abierto igualmente. El uso de ; tan solo suprime
el texto de salida en la ventana de comandos.
Una particularidad de las curvas en parametricas es que se pueden dibujar
sobre ellas los vectores velocidad, utilizando el comando quiver cuya sintaxis
para este caso es
quiver(r(t),r(t))
donde r (t) denota la derivada de r(t) respecto de t.
Ejemplo 16.
hold on
s=linspace(0,2*pi,20);
quiver(cos(s),sin(s),-sin(s),cos(s))
axis([-1.5,1.5,-1.5,1.5])
Notar que es mejor elegir un n
umero reducido de puntos con el comando linspace, pues este ser
a el n
umero de vectores que se dibujen.
82
3.2.2.
Gr
acos 3D
Curvas en el espacio
El comando m
as sencillo para dibujar curvas en el espacio es el ezplot3.
Sin embargo, al igual que ocurre con los comandos ezplot y plot, si utilizamos
el comando plot3 tendremos un mayor control sobre la curva.
Ejemplo 18.
close all
subplot(1,2,1)
ezplot3(cos(2*pi*t),sin(2*pi*t),t)
CAPITULO 3. GRAFICOS
83
subplot(1,2,2)
T=-2:0.01:2;
plot3(cos(2*pi*T),sin(2*pi*T),T,r)
Podras conseguir que ambas gr
acas sean exactamente iguales?
Pista: Comienza de la forma siguiente
subplot(1,2,1)
ezp=ezplot3(cos(2*pi*t),sin(2*pi*t),t,[-2,2]);
set(ezp,color,r)
Para dibujar gr
acos de funciones de dos variables, al igual que para funciones de una variable, en primer lugar hay que generar tablas de valores para
las variables x e y. en realidad, ahora lo que tenemos que hacer es generar
una malla sobre un rect
angulo del plano OXY . Para ello se utiliza el comando
meshgrid.
Una vez generada la malla hay dos comandos basicos para dibujar superces en el espacio tres dimensional: mesh y surf. Su u
nica diferencia es que con
mesh obtenemos una supercie mallada transparente y con surf la supercie
mallada es opaca.
Ademas, vimos que la forma m
as sencilla de dibujar una supercie era
con la funcion ezmesh ya que la malla se genera de forma automatica. Por
supuesto, existe el comando ezsurf cuya u
nica diferencia es que la supercie
se dibuja opaca en lugar de transparente.
84
Ejemplo 19. Gr
aca de la funci
on z = x2 y 2 en la region [2, 2]
[2, 2]
clf
subplot(2,2,2)
[x,y]=meshgrid(-2:0.5:2);
z=x.^2-y.^2;
mesh(x,y,z)
subplot(2,2,3)
ezsurf(x^2-y^2,[-2,2])
Ahora cambiamos la regi
on por [2, 2] [4, 4]
subplot(2,2,1)
ezmesh(x^2-y^2,[-2,2,-4,4])
subplot(2,2,4)
[X,Y]=meshgrid(-2:0.5:2,-4:0.3:4);
Z=X.^2-Y.^2;
surf(X,Y,Z)
Nota: Si no observas bien las diferencias maximiza la ventana Figure.
Si f (x, y) es un n
umero, el procedimiento
[X,Y]=meshgrid(x,y);
Z=f(X,Y);
no dene una matriz Z con las mismas dimensiones que X e Y. Esto se resuelve
escribiendo
Z=f(X,Y)+0.;
CAPITULO 3. GRAFICOS
85
3.2.3.
Gr
acos Estadsticos
A pesar de que no se puede decir que MATLAB sea el programa ideal para
hacer calculos relacionados con la Estadstica, dispone de algunos comandos
para generar gr
acos estadsticos como diagrama de sectores o barras e histogramas. Consideremos como ejemplo el n
umero de estudiantes titulados en
ciencias y letras en cinco universidades:
Universidades
Titulados en Ciencias
Titulados en Letras
A
B
C
D
E
100
60
90
20
40
90
120
30
125
80
Diagramas de sectores
El diagrama de sectores permite comparar las diversas opciones en un
crculo con sectores cuyo
angulo es directamente proporcional al porcentaje
de cada opcion. Los realizaremos utilizando el comando pie. Para obtener
86
Ejemplo 21.
x=[100 60 90 20 40];
pie(x)
legend(A,B,C,D,E)
Nota: Si la leyenda no aparece en un lugar adecuado en MATLAB
(pero no en Octave) podemos moverla utilizando el boton izquierdo
del raton.
title(Numero de estudiantes titulados en Ciencias)
MATLAB pie3(x)
MATLAB legend(A,B,C,D,E)
MATLAB title(\bf Numero de estudiantes titulados en ...
Ciencias)
Ademas, tanto para el comando pie, como para el comando pie3 existe la
posibilidad de resaltar porciones.
Ejemplo 22.
y=[1 0 0 1 0]; %Indicamos los datos a resaltar.
pie(x,y)
legend(A,B,C,D,E)
title(Numero de estudiantes titulados en Ciencias)
CAPITULO 3. GRAFICOS
87
MATLAB pie3(x,y)
MATLAB legend(A,B,C,D,E)
MATLAB title(\bf Numero de estudiantes titulados en ...
Ciencias)
Representa mediante un diagrama de sectores el n
umero de estudiantes
titulados en Letras por la Universidad XX. Ademas, comparalos con
los titulados en Ciencias utilizando el comando subplot.
Diagramas de barras
88
set(gca,xtick,1:length(x));
set(gca,xticklabel,x);
MATLAB subplot(2,2,2)
Octave subplot(1,2,2)
bar(y)
title(Barras Horizontales-Titulados en Ciencias)
set(gca,xtick,1:length(x));
set(gca,xticklabel,x);
MATLAB subplot(2,2,3)
bar3(y)
title(Barras Verticales 3D-Titulados en Ciencias)
set(gca,xtick,1:length(x));
set(gca,xticklabel,x);
MATLAB subplot(2,2,4)
bar3(y)
title(Barras Horizontales 3D-Titulados en Ciencias)
set(gca,xtick,1:length(x));
set(gca,xticklabel,x);
Ademas, podemos representar datos agrupados de manera que resulte facil
compararlos.
Ejemplo 24. Comparaci
on entre Titulados por Ciencias y por Letras.
clf
y=[100 90;60 120;90 30;20 125;40 80];
CAPITULO 3. GRAFICOS
89
MATLAB subplot(2,2,1)
Octave subplot(1,2,1)
bar(y), title(Barras Verticales)
legend(Titulados en Ciencias,Titulados en Letras)
MATLAB subplot(2,2,2)
Octave subplot(1,2,2)
barh(y), title(Barras Horizontales)
legend(Titulados en Ciencias,Titulados en Letras)
MATLAB subplot(2,2,3)
MATLAB bar3(y), title(Barras Verticales 3D)
MATLAB legend(Titulados en Ciencias,Titulados en ...
Letras)
MATLAB subplot(2,2,4)
MATLAB bar3h(x,y), title(Barras Horizontales 3D)
MATLAB legend(Titulados en Ciencias,Titulados en ...
Letras)
Averigua como modicar el ancho de las barras y cambialo a tu gusto
en los gracos del ejemplo anterior.
Histograma
90
CAPITULO 3. GRAFICOS
3.3.
91
Ejercicios
Ejercicio 4. Representa la gr
aca de f (x) = 3xex como mas te guste.
Ahora, usando el comando help aprende como usa MATLAB el comando
ginput. Finalmente, u
salo para indicar en la graca de f donde se encuentran
el maximo y el mnimo.
Ejercicio 5. Dibuja la curva en el espacio r(t) = (sin(t), cos(t), t). Ademas,
dibuja los vectores velocidad utilizando el comando quiver3. Utiliza la ayuda
para descubrir c
omo funciona y ten en cuenta lo aprendido sobre el comando
quiver.
NOTA: Aseg
urate que todos los vectores que denes tienen la misma dimensi
on. Te puede ayudar el comentario en el u
ltimo parrafo de la seccion 3.2.2.
Ejercicio 6. Representa la gr
aca de la funcion de dos variables z = sin(x)cos(y)
de forma adecuada. Ahora, descubre la funcion colormap y utilzala.
Ejercicio 7. Elige los comandos gr
acos de MATLAB adecuados para estudiar la producci
on de cereales en Espa
na, Alemania y Austria. Los datos son,
por supuesto cticios. los siguientes:
2
92
Espa
na
Alemania
Austria
trigo
cebada
avena
arroz
maz
100
50
90
20
40
90
120
30
125
80
6
13
2
15
9
si x < 0
x
f (x) =
1
si 0 x 1
x + 2 si 1 < x
Notar que es muy importante elegir una tabla de valores y una representacion
adecuadas para que aparezcan los aspectos mas representativos de la funcion.
En este caso, las discontinuidades.
diary off
CAPITULO 3. GRAFICOS
3.4.
Soluciones
Ejercicio 1.
p1=ezplot(1-x^2);
hold on
p2=ezplot(x^2-1);
axis auto
set(p2,Color,[1 0 0])
hold off
Ejercicio 2.
X=[-1,1,1,-1,-1];Y=[-1,-1,1,1,-1];
fill(X,Y,[0,1,0])
hold on
plot(X,Y,r-)
axis( [-2,2,-2,2])
hold off
Ejercicio 3.
P = [1,0;0,1;-1,0;0,-1;1,0];
plot(P(:,1), P(:,2))
hold on
t = linspace(0,2*pi);
plot(sin(t),cos(t))
hold off
Ejercicio 4.
ezplot(3*x*exp(-x^2))
axis([-8,8,-2,2])
help ginput
[X,Y] = ginput(2);
text(X(1),Y(1),<-- M
aximo)
text(X(2),Y(2),<-- M
nimo)
Ejercicio 5.
t = linspace(0,2*pi,20);
93
94
Ejercicio 6.
ezmesh(sin(x)*cos(y))
help colormap
colormap(cool)
colormap(summer)
Ejercicio 7.
A = [100, 90, 6; 50, 120, 13; 90, 30, 2; 20, 125, 15; 40, 80, 9]
plot(A(:,1),A(:,2))
hold on
plot(A(:,3),r)
plot(,A(:,4),g)
hold off
Otra forma:
subplot(1,3,1); bar(A(:,2))
subplot(1,3,2); bar(A(:,3))
subplot(1,3,3); bar(A(:,4))
close all
Ejercicio 8.
BA = csvread(hipoBA.csv);
CA = csvread(hipoCA.csv);
ES = csvread(hipoES.csv);
plot(BA(:,3))
hold on
plot(CA(:,3),r)
plot(ES(:,3),g)
hold off
Ejercicio 9.
ezplot(x^2,[-10,0])
CAPITULO 3. GRAFICOS
hold on
ezplot(1,[0,1])
ezplot(x+2,[1,10])
axis([-5,5,-1,10])
hold off
95
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
97
Captulo 4
Introducci
on a la
programaci
on
Al igual que los anteriores, este captulo esta pensado para ser trabajado
delante de un ordenador con MATLAB u Octave instalado. Sin embargo a diferencia de los captulos anteriores, no veremos comandos, sino como crear cheros que nos permitan automatizar el trabajo que queremos hacer. Para ello utilizaremos el editor de MATLAB (se accede a el a traves de Archivo>Nuevo
o pulsando el icono de nuevo documento). En el caso de Octave, cualquier
editor nos servir
a, por ejemplo gedit o notepad.
4.1.
Scripts
Al ser este un curso introductorio, no se asume que el alumno tenga conocimientos de programaci
on. Para aquellos lectores que los tengan, recomendamos
que miren la sintaxis de los distintos comandos de las tres primeras secciones
y comiencen por la secci
on 3.2.3.
Hasta ahora hemos visto c
omo utilizar MATLAB como una calculadora, las
funciones que soporta, el manejo de los vectores y matrices y la representacion
graca. En esta sesi
on aprenderemos c
omo organizar el trabajo de modo que
el ordenador realice toda una serie de tareas sin tener que ir introduciendo los
comandos uno a uno.
Un archivo de comandos es una serie de ordenes que se escriben en un ar-
98
chivo para usarlas siempre del mismo modo (por ejemplo, si queremos resolver
un problema complejo para varios conjuntos diferentes de datos sin tener que
escribir cada vez todas las
ordenes). MATLAB admite dos tipos de archivos
de comandos: scripts y funciones. En esta seccion veremos los scripts y
en la siguiente las funciones. Ambos tipos de archivos se pueden crear bien
con el editor de MATLAB ( en Archivo > Nuevo) o con un editor de texto
cualquiera. En todo caso hay que a
nadir al nal la extension .m.
Los archivos .m han de guardarse donde el programa pueda encontrarlos.
Esto puede ser en el directorio de trabajo o en cualquier directorio del path
(los directorios tambien se llaman carpetas). Puedes consultar cual es el actual
directorio con la orden pwd. Los directorios que estan actualmente en el path
se pueden consultar con path y para a
nadir un nuevo directorio se utiliza
addpath. Tambien pueden ambos modicarse desde el men
u Archivo de
MATLAB.
Ejemplo 1. Crea un directorio para trabajar y a
nadelo al path.
mkdir(prueba)
addpath(prueba)
Los scripts nos permiten agrupar un conjunto de ordenes de MATLAB y
ejecutarlas facilmente. El efecto de teclear el nombre del script en la ventana
de comandos es ex
actamente el mismo que si tecleasemos directamente cada
una de las lneas del chero.
Ejemplo 2. Abre un nuevo chero. Escribe en el el siguiente texto:
x=0:0.01:2;
y=cos(x).*sin(x);
plot(x,y)
Guardalo como ejemplo1.m en el directorio que has creado antes.
Ahora para ver lo que hace, vuelve a la consola de MATLAB y teclea
ejemplo1
Una ventaja de realizar los c
alculos mediante scripts en lugar de directamente en consola, es que se pueden realizar modicaciones (por ejemplo, si
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
99
100
utilizarse funciones. El u
nico caso en el que podra ser razonable utilizar
scripts en lugar de funciones es cuando queremos realizar una tarea peque
na
que no vamos a volver a hacer.
4.2.
Funciones
Como ya hemos visto, los scripts no son apropiados para escribir programas largos pues comparten variables con la consola. Para poder tener un
mayor control sobre las variables y poder reutilizar el codigo que escribamos,
utilizaremos las funciones. Las funciones son similares a los scripts salvo por
las siguientes caractersticas:
La primera lnea de una funci
on debe comenzar por function y la u
ltima
debe ser end.
Todos los datos que recibe o devuelve una funcion tienen que ser detallados en la primera lnea.
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
101
102
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
103
104
4.3.
Estructuras de control
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
105
106
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
107
if n==0
nfactorial=1;
else
nfactorial=n*factorial1(n-1);
end
end
Ahora, volvemos a la consola y probamos la funcion.
factorial1(0)
factorial1(5)
Las funciones recursivas son muy frecuentes en programacion porque permiten resolver programas muy complejos, pero su estudio y uso exceden los
objetivos de este curso.
Veamos ahora las estructuras de control que permiten la repeticion. Existen
dos tipos principales:
Repeticion de una serie de instrucciones para cada uno de los elementos
de un vector. A estos bucles se los denomina bucles for.
108
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
109
Como regla general, cada vez que en MATLAB creas que necesitas usar un
bucle for, piensa si puedes denir la operacion vectorialmente; sera mas corto,
m
as rapido y m
as claro. Por ejemplo, para calcular el n
umero de elementos
positivos de un vector v, se puede usar sum(v>0).
Veamos ahora los bucles while. Estos bucles se utilizan cuando no se sabe cuantas veces hay que repetir las instrucciones, solo que hay que hacerlo
mientras se cumpla una condici
on (o hasta que no se cumpla una condicion).
Ejemplo 6. Ve al editor, teclea las siguientes lneas y guardalo como
numeroveces.m. La funci
on rand genera una matriz (o un vector en
este caso) de n
umeros aleatorios entre 0 y 1.
function nveces=numeroveces(n,m)
% numeroveces(n,m)
% Devuelve cu
antas veces ha tenido que obtener n n
umeros
% aleatorios entre 0 y 1 para que su suma sea mayor que
% m.
if n<=m
nveces=0;
else
v=rand(n,1);
nveces=1;
while sum(v)<m
v=rand(n,1);
nveces=nveces+1;
end
end
end
Ahora, volvemos a la consola y probamos la funcion.
numeroveces(5,3)
4.4.
Entrada y salida
En esta secci
on veremos los comandos para que un script o funcion de
110
MATLAB lea o devuelva datos, por teclado/pantalla. Notese que hasta ahora
tenemos un modo de pasar o recibir datos de una funcion, y es a traves de
las variables de entrada y salida. Se recomienda que cuando se haga lectura/escritura de datos a traves del teclado/pantalla o de un archivo, se utilicen
o bien scripts o bien funciones especcas que solo hagan la lectura/escritura
de datos y la comprobaci
on de que son correctos.
Para pedir que el usuario entre datos por el teclado, usaremos el comando
input.
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
111
respuesta=Si;
v=[];
while respuesta==Si
respuesta = input(Mas datos?\ n [Si]: pulsa enter,\ n
[No]: pulsa cualquier tecla y enter\ n ,s);
if isempty(respuesta)
respuesta = Si;
end
if respuesta==Si
nuevoDato=input(Nuevo valor:);
v=[v nuevoDato];
end
end
end
Volvemos a la consola y probamos la funcion
vector = leevector
112
4.5.
Manejo de funciones
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
113
114
4.6.
Ejercicios
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
115
b
f (a) + 2 n1
k=1 f (a + kh) + f (b)
, h = (b a)/n.
f (x) dx h
2
a
Intentalo con un bucle for y sin bucle.
116
4.7.
Soluciones
Ejercicio 1.
ezplot(min(tan(x)^2,cos(x)),[0,2*pi])
Otra forma:
x = linspace(0,2*pi);
y = min(tan(x).^2,cos(x));
plot(x,y)
Ejercicio 2.
function A = ejer2(r)
A = pi*r^2;
end
Ejercicio 3.
function [A,P] = ejer3(r)
A = pi*r^2;
P = 2*pi*r;
end
Ejercicio 4.
v = rand(1,10);
arrayfun(@ejer2,v)
Ejercicio 5.
function c = ejer5(a,b)
if (a^2+b^2) >1 && b >0
c = a/b;
else
c = 0;
end
end
Ejercicio 6.
Usando un bucle for:
function w = ejer6(v)
n = length(v);
A LA PROGRAMACION
CAPITULO 4. INTRODUCCION
w = 0;
for i = 1:n
if v(i)>0
w = w+1;
end
end
end
Otra forma:
function w = ejer6b(v)
n = length(v);
w = 0;
for i = 1:n
w = w+(v(i)>0);
end
end
Sin usar bucle for:
function w = ejer6c(v)
w=sum(v>0);
end
Ejercicio 7.
function y = ejer7(x,y)
while (x>=y)
x = x/2;
end
y = x;
end
Ejercicio 8.
r = input(Introduce el radio: );
ejer2(r);
Ejercicio 9.
function D = ejer9(f,x,h)
D = (f(x+h)-f(x-h))/2*h;
end
117
118
Ejercicio 10.
function A = ejer10(f,a,b,n)
h = (b-a)/n;
k = 1:n-1;
A = (f(a) + 2*sum(f(a+k*h)) + f(b))*h/2;
end
119
Captulo 5
5.1.
La funci
on polyfit
120
gramos (mg) por gramo (g) de tejido. El resumen de los resultados obtenidos
vienen dados en la tabla siguiente:
TBT(mg/g)
TI
TBT(mg/g)
TI
Estos datos los puedes descargar del chero TI TBT.mat que esta en http:
//www.editorialtebar.com. Desc
argalo donde MATLAB pueda encontrarlo
y escribe:
load TI TBT
Recuerda que una vez cargado en MATLAB, puedes ver los nombres de las
variables usando who.
Pintemos ahora los pares de puntos (TI, TBT) con crculos azules (o como
t
u preeras) y de paso pongamos ttulo a la graca y a los ejes.
plot(TI,TBT,bo)
xlabel(Indice de espesor (TI))
ylabel(Concentracion de TBT)
title(Contaminacion marina)
hold on
121
teilung. Uber
Radioblei und Radium-Restaktivit
aten, Sitzungsberichte der Osterreichischen
Akademie der Wissenschaften, mathem.-naturw. Kl., Abt. IIa, 114 (1905), 11951220.
122
Tiempo (das)
Nivel de act. rel.
Estos datos los puedes descargar del chero radiactivo.mat que esta en
http://www.editorialtebar.com. Desc
argalo donde MATLAB pueda encontrarlo y escribe:
load radiactivo
Recuerda que una vez cargado en MATLAB, puedes ver los nombres de las
variables usando who.
Pintemos ahora los pares de puntos (tiempo, nivel) con cuadrados magenta
(o como t
u preeras) y tambien podemos aprovechar para poner nombres y
ttulos a nuestra gr
aca.
figure(1)
plot(tiempo,nivel,ms)
xlabel(Tiempo (en dias))
ylabel(Nivel de actividad relativa)
title(Datos de Meyer-v.Schweidler)
Veamos que ocurre cuando dibujamos (con cruces rojas, por ejemplo) nuestros pares de puntos con escala logartmica en el eje OY .
123
figure(2)
semilogy(tiempo,nivel,r+)
hold on
xlabel(Tiempo (en d
as))
ylabel(Log (nivel de actividad relativa))
title(Datos de Meyer-v.Schweidler (en escala ...
semilogaritmica))
125
Captulo 6
Autovalores y autovectores
Resumimos las ordenes elementales de MATLAB para calcular los autovalores y autovectores de una matriz cuadrada (diagonalizable) y las ilustramos
con algunos ejemplos elementales. Incluimos asimismo un ejemplo de aplicaci
on del calculo de autovalores y autovectores.
6.1.
La funci
on eig
Comencemos recordando que se entiende por matriz diagonalizable: diremos que una matriz cuadrada A Cnn es diagonalizable si existe una
matriz invertible P Cnn tal que
P 1 AP = D := diag(d1 , . . . , dn )
(6.1)
126
127
B = [1,-1,0;0,2,-3;0,0,3]
p = poly(B)
roots(p) % Autovalores de B
eig(B) % Sin variable de salida
d = eig(B) % Con una variable de salida
6.2.
Un ejemplo cl
asico
128
De tal forma que, por ejemplo, la probabilidad de que un hijo sea de clase
alta, media o baja cuando su padre es de clase baja viene dada por la u
ltima
columna de P. As, si p0 es el vector de las proporciones iniciales de hombres
de cada clase social, la proporci
on de hombres en cada clase social tras n
generaciones ser
a:
pn = P pn1 = P (P pn2 ) = . . . = P n p0 .
Un simple an
alisis de los autovalores y autovectores de P revela que P tiene
un u
nico autovector p cuyas coordenadas son positivas y suman 1. Veamos
como podemos calcularlo:
p0 = 0,25 ,
0,75
y veamos en una gr
aca que efectivamente la proporcion de poblacion en cada
clase se estabiliza con el tiempo.
>>
>>
>>
>>
>>
>>
>>
>>
>>
129
p0 = [0;0.25;0.75];
g = 10; % Numero de generaciones.
X = zeros(3,g);
X(:,1)=p0;
for t=2:g
X(:,t) = P*X(:,t-1);
end
plot(X)
legend(Clase alta,Clase media,Clase baja)
p10 = P^10*p0
err10 = norm(p10 - pinf)*100/norm(p10)
P100 = P^100*p0
err100 = norm(p100 - pinf)*100/norm(p100)
131
Captulo 7
7.1.
Creaci
on de animaciones
Para realizar animaciones utilizando Octave se recomienda seguir las indicaciones de Karol Krizka dadas en su web http://www.krizka.net/2009/11/06/
creating-animations-with-octave/
132
Es decir, veremos c
omo la ventana Figure va cambiando como consecuencia
de los comandos que se van ejecutando.
7.2.
Pelculas o MOVIES
133
7.3.
WINDOWS indicar
a que la orden debe ejecutarse solamente si el sistema operativo es
WINDOWS y LINUX indicar
a que la orden debe ejecutarse solamente si el sistema operativo
es LINUX.
134
function C=cama
% Animaci
on para recrear una cama el
astica.
[x,y]=meshgrid(-1:.1:1);
n=200; % N
umero de fotogramas.
for j=1:n
t=(2*pi/19)*(j-1);
z=2*sin(t)*exp(-x.^2-y.^2);
surf(x,y,z)
axis([-1,1,-1,1,-2,2])
C(j)=getframe(gcf); % Guardamos el fotograma j.
end
end
Ahora, guardamos el archivo creado con el nombre cama.m en el directorio
de trabajo y volvemos a la ventana de comandos de MATLAB.
movie(C,1,25)
movieview(C,Cama El
astica)
WINDOWS movie2avi(C,cama.avi,fps,25, ...
compression, Indeo3)
LINUX movie2avi(C,cama.avi,fps,25, ...
compression, None)
Creando un reloj
function R=reloj
% Animaci
on para ver girar las agujas de un reloj.
n=100; % N
umero de fotogramas.
for j=1:n
t=0:((2*pi)/1000):(2*pi);
plot(cos(t),sin(t)) % Dibujamos el reloj
axis square
hold on
horas=0:12;
plot(.9*cos(horas*2*pi/12),.9*sin(horas*2*pi/12),k*)
hor=pi/2-(j-1)*2*pi/(n-1); % horaria
plot([0 .5*cos(hor)],[0 .5*sin(hor)])
min=pi/2-(j-1)*12*2*pi/(n-1); % minutera
135
136
137
Captulo 8
Ecuaciones diferenciales
En este captulo veremos como resolver numericamente ecuaciones diferenciales. Por razones exclusivamente metodologicas, nos centraremos en
MATLAB, que tiene diferentes funciones para los distintos metodos de resolucion de ecuaciones diferenciales, mientr
as que Octave emplea esencialmente
una sola funcion.
8.1.
Las diversas funciones que tiene MATLAB para calcular de modo numerico
las soluciones de una ecuaci
on diferencial ordinaria son ode23, ode45, ode113,
ode15s, ode23s, ode23t, ode23tb. Vamos a utilizar ode45, esto es, el metodo
Runge-Kutta (4,5), por ser el que primero se debera probar. En caso de que
el metodo devuelva alg
un error o sea demasiado lento, se debera cambiar a
otro metodo de resoluci
on (la ayuda de MATLAB proporciona una muy buena
informacion sobre que metodo utilizar en cada caso).
Para pasar una ecuaci
on diferencial a MATLAB, debemos escribirla como
una ecuacion diferencial de primer orden, es decir, de la forma
x (t) = f (t, x(t)),
t R, x(t) Cn , f : R Cn Cn .
138
donde f es la funci
on que dene el lado derecho de la ecuacion, T es un vector
cuyos extremos son los instantes inicial y nal de tiempo y x0 es el valor de
x(t) en el instante inicial.
Consideremos la ecuaci
on logstica:
x = x(x 1).
Podemos calcular la soluci
on que comienza en t = 0, x = 1/2, entre t = 0 y
t = 1, con el comando
f=@(t,x) x*(x-1);
[T,X]=ode45(f,[0,1],[0.5]);
Y representarla
plot(T,X)
Puedes probar pintando ahora una gr
aca con las soluciones que comienzan
en t = 0 y x = 0.5, x = 0, x = 0.5, x = 1.
Para trabajar con ecuaciones de grado superior, debemos transformarlas
en un sistema equivalente. Veamos un ejemplo con el oscilador de Van der Pol:
x (t) (1 x2 (t))x (t) + x(t) = 0.
Mediante el cambio y(t) = x (t), tenemos
x (t) = y(t),
y (t) = (1 x2 )y x.
Escribimos el lado derecho como una funcion que recibe dos variables,
siendo la segunda un vector de longitud dos y devuelve un vector columna de
longitud dos.
mu=2;
f=@(t,x) [x(2),mu*(1-x(1)^ 2)*x(2)-x(1)];
Obtenemos la soluci
on determinada por la condicion inicial (x(0), y(0)) =
(0, 2):
[t,x]=ode45(f,[0,1000],[0;2]);
139
8.2.
m
c(x, t, u, ux )ut = xm
x f (x, t, u, ux ) + s(x, t, u, ux ),
x
140
u(t, 0) = 0, u(t, 1) = 0,
u(0, x) =
2x
.
1 + x2
Comparando la ecuaci
on anterior con la forma general que necesitamos para
MATLAB, tenemos:
c(t, x, u, ux ) = 1, f (t, x, u, ux ) = ux , s(t, x, u, ux ) = 0, m = 0.
y para las condiciones frontera:
v(x) =
2x
, pa(t, u) = u, qa(t) = 0, pb(t, u) = u 1, qb(t) = 0.
1 + x2
surf(x,t,u);
title(Superficie solucion.);
xlabel(Distancia x);
ylabel(Tiempo t);
141
BIBLIOGRAFIA
143
Bibliografa
1. G. Borrell i Nogueras, Introducci
on Informal a Matlab y Octave.
http://iimyo.forja.rediris.es/
2. R. Echevarra Lbano, Breves apuntes para comenzar con MATLAB.
http://personal.us.es/echevarria/documentos/APUNTESMATLAB.pdf
3. J. Garca de Jal
on, J.I. Rodrguez y J. Vidal, Aprenda Matlab como si estuviera en primero. http://mat21.etsii.upm.es/ayudainf/
aprendainf/Matlab70/matlab70primero.pdf
4. P. Howard, Partial Dierential Equations in MATLAB 7.0. Spring 2005
5. B. Hunt, R. Lipsman, J. Rosenberg, K. Coombes, J. Osborn y G. Stuck,
A guide to MATLAB for beginners and experienced users. Cambridge
University Press, Cambridge, 2006
6. R. Johnson, MATLAB Programming Style Guidelines. www.datatool.
com/downloads/matlab_style_guidelines.pdf
7. I. Ojeda Martnez de Castilla y J. Gago Vargas, Metodos matem
aticos
para estadstica. Manuales UEx, 58, 2008
8. A. Quarteroni y F. Saleri, C
alculo cientco con MATLAB y Octave.
Springer-Verlag Italia, 2006
9. G. W. Recktenwald, Numerical Methods with Matlab: Implementations
and Applications. Prentice-Hall 2001
144