Introducci´on a MATLAB

Julio Ben
´
ıtez L
´
opez, Jos
´
e Luis Hueso Pagoaga
Departamento de Matem´atica Aplicada
Universidad Polit´ecnica de Valencia
´
Indice.
0. Informaci´on General. v
1. Perdiendo el miedo. 1
1.1. Mandatos b´asicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Constantes y cadenas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4. Funciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5. N´ umeros Complejos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.6. Vectores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.7. Matrices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.8. Polinomios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.9. Gr´aficos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.9.1. Curvas planas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.9.2. Curvas en el espacio. . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.9.3. Superficies en el espacio. . . . . . . . . . . . . . . . . . . . . . . . 16
2. Aprendiendo a programar 19
2.1. Archivos.m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2. Bucles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3. Condicionales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.3.1. La condici´on if . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.3.2. La condici´on while . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3. Soluciones a algunos ejercicios. 35
A. M´ınimos cuadrados. 39
B. Fractales. 45
3
´
Indice.
4
0. Informaci´on General.
Este texto no tretende ser m´as que unos breves apuntes para presentar el programa
MATLAB y su lenguaje de programaci´on. Para una informaci´on m´as completa puede
utilizarse los manuales [1] o [2]. Estas notas est´an elaboradas, en su mayor´ıa, a partir
de [3]. La versi´on de MATLAB usada es la 5.3 para Windows 95.
MATLAB (MATrix LABoratory) es un programa orientado al c´alculo con matrices,
al que se reducen muchos de los algoritmos que resuelven problemas de Matem´atica
Aplicada e Ingenier´ıa.
MATLAB ofrece un entorno interactivo sencillo mediante una ventana en la que pode-
mos introducir ordenes en modo texto y en la que aparecen los resultados. Los gr´aficos
se muestran en ventanas independientes. Cada ventana dispone de una barra de men´ us
que controla su funcionalidad.
Aprenderemos a asignar, borrar, guardar y recuperar variables, utilizar las funciones
incorporadas y, m´as adelante, a definir funciones nuevas. MATLAB opera directamente
con n´ umeros complejos y con n´ umeros reales como caso particular.
Lo que distingue a MATLAB de otros sistemas de c´alculo es su facilidad para trabajar
con vectores y matrices. Las operaciones ordinarias, suma, producto, potencia, operan
por defecto sobre matrices, sin m´as restricci´on que la compatibilidad de tama˜ nos en cada
caso.
Entes matem´aticos como los polinomios son tratados por MATLAB como vectores,
gracias al hecho de que se suman y multiplican por escalares de la misma forma que
´estos. La multiplicaci´on y divisi´on entera de polinomios se efectan mediante ´ordenes
espec´ıficas, as´ı como la evaluaci´on o derivaci´on de un polinomio.
Una de las caracter´ısticas m´as destacables de MATLAB es su capacidad gr´afica. Ex-
plicaremos algunos comandos gr´aficos para representaci´on de funciones de una o dos
variables en distintos sistemas de coordenadas.
v
0. Informaci´on General.
MATLAB dispone de mandatos propios de un lenguaje de programaci´on para efectuar
bucles y bifurcaciones condicionales y puede ejecutar las ´ordenes contenidas en ficheros
grabados en ASCII mediante un editor como el bloc de notas o el editor de ficheros de
´ordenes incorporado.
Al escribir, por ejemplo, la suma de dos matrices como A+B obtenemos un c´odigo
m´as claro y conciso que en otro lenguaje de programaci´on, sin bucles innecesarios y de
ejecuci´on mucho m´as r´apida.
Desde ahora y en adelante, destacaremos en Courier las ´ordenes que pueden intro-
ducirse en MATLAB tal y como aparecen o incorporarse a un fichero de ´ordenes. En
Courier cursiva indicamos par´ametros de algunas ´ordenes, que deben sustituirse por
un dato apropiado en cada caso. Se debe interpretar el inductor >> como una invitaci´on
a escribir en MATLAB lo que aparece a continuaci´on del mismo.
vi
1. Perdiendo el miedo.
1.1. Mandatos b´asicos.
Al abrir el programa, MATLAB sugiere comenzar con la demo o con ´ordenes de ayuda.
help nos da una lista de temas sobre los que hay informaci´on de ayuda. helpwin abre
una ventana de ayuda que es ´ util para consultar informaci´on sobre rdenes de MATLAB
sin interferir con la ventana principal. help tema explica sucintamente el tema elegido.
As´ı, por ejemplo,
>> help demo
explica brevemente el comando demo o
>> help cos
explica la funci´on cos (el coseno de un ´angulo). A prop´osito, MATLAB distingue entre
may´ usculas o min´ usculas. Por ejemplo:
>> Help demo
da un mensaje de error pues Help no es una orden de MATLAB y help s´ı. Para evitar
que MATLAB diferencie entre may´ usculas y min´ usculas teclearemos
>> casesen off
Obviamente, el comando contrario ser´a casesen on.
Otro comando ´ util es lookfor tema de b´usqueda. As´ı, por ejemplo, si queremos
averiguar los comandos relacionados con la funci´on seno, teclearemos
>> lookfor sine
El mandato dir lista los ficheros del directorio actual. Pru´ebese dir a:
Uno de los mandatos m´as ´ utiles de MATLAB es diary, que permite guardar en un
fichero todo el texto que aparece en la ventana de comandos. Si se tiene un diskette en
la unidad a:, se puede escribir
>> diary a:taller.txt
y todo lo que salga en pantalla se grabar´a en un fichero taller.txt justo cuando se vuelva
a introducir el mandato diary. Para a˜ nadir m´as texto en una misma sesi´on al diario
1
1. Perdiendo el miedo.
creado se usa diary on al principio de lo que se quiera grabar y diary off al final (en
este momento se graba realmente).
El mandato % convierte en comentario lo que se escriba a continuaci´on. Es decir,
MATLAB ignora lo que viene a continuaci´on del comando %.
>> % Esto es un comentario
Con las teclas del cursor [↑] y [↓] se recuperan los mandatos antes escritos, evitando
as´ı tener que reescribir ´ordenes iguales o parecidas. Tambi´en se puede “copiar” con el
rat´on texto de cualquier sitio y “pegar” en la (´ unica) l´ınea de mandatos activa, eligiendo
estas opciones en el men´ u de edici´on. Vale usar [Ctrl]+C y [Ctrl]+V con el mismo fin.
Otro comando ´ util a la hora de manejar funciones definidas por el propio usuario es
path. Este comando controla los directorios donde MATLAB “puede leer” las funciones
que maneja. Inicialmente, MATLAB no “puede manejar” funciones escritas en un diskette
insertado en la unidad a: Para que s´ı las pueda manejar, se escribir´a
>> path(path,’a:’)
path por s´ı s´olo muestra los directorios en los que MATLAB busca los comandos. Tam-
bi´en se puede controlar el path mediante el men´ u: File y a continuaci´on Set Path...
1.2. Variables.
MATLAB puede usarse como calculadora (¡aunque sea infrautilizar MATLAB !). Los
signos +, -, *, / y ^ denotan las operaciones aritm´eticas de suma, resta, multipli-
caci´on, divisi´on y elevaci´on a una potencia. Si el resultado de una operaci´on no es
asignado a ninguna variable, MATLAB lo asigna a la variable del sistema ans
1
. As´ı
mismo se pueden usar los par´entesis () para concatenar expresiones, no as´ı los corchetes
[] que est´an reservados para introducir vectores y matrices. As´ı, por ejemplo:
>> 3*((1+3)^(1/2))
proporciona, obviamente, ans = 6.
En MATLAB las variables se asignan de modo natural. Basta escribir un nombre
de variable, a continuacin el signo = y luego el valor que toma esa variable. Para
aceptar, como siempre, hay que pulsar [Intro]. Escribiendo s´olo el nombre de una variable
previamente asignada, MATLAB devuelve su valor. Por ejemplo, se puede escribir
>> a = 3, b = 4
y a continuaci´on
>> a+b.
Para conservar este resultado se hace
1
Del ingl´es answer.
2
1.3. Constantes y cadenas.
>> c = ans
o mejor a´ un
>> c = a+b
directamente.
Si se pone un “punto y coma”, tras la asignaci´on no se muestra el resultado por
pantalla. Naturalmente, la asignaci´on no resulta afectada. Esta forma de proceder
resulta ´ util en la elaboraci´ on de resultados que requieran c´alculos intermedios. Por
ejemplo, la orden
>> d=(a+b)^2;
calcula el valor de d; pero no lo muestra en pantalla.
La orden who lista las variables definidas y con la orden whos obtenemos adem´as el
tipo de variable y su tama˜ no. Se puede acceder a trav´es del men´ u e incluso modificar
los valores existentes: File y a continuaci´on Show Workspace. Para modificar las
variables una vez abierto el workspace browser, no tenemos m´as que pinchar en cada
variable.
clear sin argumentos elimina todas las variables. clear c elimina la variable c.
Las variables de una sesi´on se pueden grabar en un fichero en disco. La orden
>> save a:taller
guarda los nombres y los valores de las variables actualmente definidas en un fichero
en a: llamado taller.mat. MATLAB a˜ nade autom´aticamente la extensi´on mat y as´ı
identifica el formato de estos ficheros. Si se borran las variables:
>> clear, who
se pueden recuperar ahora o en otra sesi´on con la orden
>> load a:taller
De nuevo mediante el men´ u File tambi´en se pueden ejecutar los comandos load y
save.
1.3. Constantes y cadenas.
MATLAB utiliza ciertos nombres de variable para fines especiales, como i o j, que
designan ambas a la unidad imaginaria o pi, para el n´ umero π. El n´ umero e, base de los
logaritmos neperianos, no est´a preasignado, pero se obtiene f´acilmente como exp(1)
2
.
2
El uso de la funci´on exp (exponencial) ser´a explicado en la secci´on siguiente.
3
1. Perdiendo el miedo.
La precisi´on relativa en operaciones de coma flotante se llama eps. En realidad eps
es el mayor positivo que cumple 1+eps = 1. El resultado de 1/0 en MATLAB es Inf y
el de 0/0, NaN
3
.
Se pueden utilizar estos nombres de variables preasignadas para almacenar otros
valores, prevaleciendo esta ´ ultima asignaci´on sobre el valor por defecto de MATLAB .
Por ejemplo, si no se utilizan n´ umeros complejos, no hay inconveniente en representar
por i y j los ´ındices de fila y columna de una matriz. Igualmente se podr´ıamos llamar
eps a una cantidad utilizada como criterio de convergencia, pero en general conviene
evitar equ´ıvocos empleando otros nombres de variable.
Internamente MATLAB trabaja con mucha precisi´on, aunque por defecto muestra los
resultados con cuatro decimales. La apariencia de los resultados se modifica por medio
del men´ u o con la orden format: Por ejemplo, format long aumenta el n´ umero de
decimales visibles.
>> format long, pi
format short vuelve al estado inicial. format rat aproxima el resultado por un co-
ciente de enteros peque˜ nos. Se pueden explorar otras opciones con help format.
Podemos usar tambi´en cadenas de caracteres para manejar texto en funciones de
MATLAB . Para introducir una cadena, basta escribir el texto entre comillas.
>> ’Esto es una cadena’
Un texto sin comillas produce error porque MATLAB lo interpreta como un nombre de
variable o funci´on.
>> Hola
produce el error
??? Undefined function or variable Hola.
1.4. Funciones.
MATLAB lleva incorporadas una cantidad considerable de funciones. Su sintaxis es
la siguiente: Para una funci´on de una variable y de una salida es
variable de salida = nombre de funcion(variable de entrada)
y si x
1
, , x
n
son n variables de entrada e y
1
, y
m
son m variables de salida:
[y1, ... , ym] = nombre de funcion(x1, ..., xn)
MATLAB reconoce las funciones matem´aticas elementales:
3
Del ingl´es Not a Number.
4
1.4. Funciones.
Funciones Trigonom´etricas
Funci´on Sintaxis Ejemplo
Si se escribe equivale al resultado
seno sin(X) sin(pi) sen π 0
coseno cos(X) cos(-pi) cos(−π) -1
tangente tan(X) tan(pi/4) tg(π/4) 1
secante sec(X) sec(pi/3) sec(π/3) 2
cosecante csc(X) csc(pi/4) cosec(π/4) 1.4142 (=

2)
cotangente cot(X) cot(pi/6) cotg(π/6) 1.7321 (=

3)
Funciones Trigonom´etricas Inversas
Funci´on Sintaxis Ejemplo
Si se escribe equivale al resultado
arcoseno asin(X) asin(1) arcsen 1 1.5708 (=π/2)
arcocoseno acos(X) acos(1) arccos 1 0
arcotangente atan(X) atan(Inf) “arctg(∞)” 1.5708 (=π/2)

Exponenciales
Funci´on Sintaxis Ejemplo
Si se escribe equivale al resultado
exponencial exp(X) exp(1) exp 1 2.7183 (=e)
logaritmo neperiano log(X) log(exp(2)) log(e
2
) 2
logaritmo decimal log10(X) log10(1000) log
10
(1000) 3
logaritmo en base 2 log2(X) log2(1/4) log
2
(1/4) -2
ra´ız cuadrada sqrt(X) sqrt(9)

9 3
Hay muchas m´as funciones que se pueden consultar tecleando help elfun. Aparte
de estar el nombre en ingl´es (por ejemplo, el seno es sin (del ingl´es sine)), hay que tener
en cuenta unos peque˜ nos detalles para evitar errores al usar funciones:
• Las funciones trigonom´etricas tienen el argumento en radianes.
• MATLAB reserva log para el logaritmo neperiano, coherentemente con el uso ha-
bitual en matem´atica superior, pero en contraste con la pr´actica en ingenier´ıa en
donde son m´as usados el logaritmo decimal o el de base 2.
Se pueden ver otras funciones disponibles con help specfun.
5
1. Perdiendo el miedo.
MATLAB dispone de una orden para dibujar f´acilmente funciones: es el comando
ezplot. Se escribe ezplot y a continuaci´on la expresi´on algebraica de la funci´on que se
desea dibujar entre comillas. Por ejemplo, si se quiere dibujar la funci´on f(x) =
x
3
+1
x
definida en [−2, 2] se ecribir´a:
>> ezplot(’(x^3+1)/x’,[-2,2])
Se recomienda escribir help ezplot y comprobar los ejemplos aqu´ı propuestos.
La orden fplot proporciona m´as opciones para controlar el aspecto de la gr´afica
obtenida. Por ejemplo, permite representar varias funciones a la vez
4
.
>> fplot(’[sinh(x),cosh(x),tanh(x)]’,[-2,2])
>> grid, axis equal
1.5. N´ umeros Complejos.
Los n´ umeros complejos se introducen tal y como se escriben en matem´aticas, uti-
lizando i o j para la unidad imaginaria. Por ejemplo:
>> z = 3 + 4i
Obs´ervese que no es necesario poner el signo de multiplicaci´on, *, entre el 4 y la i.
MATLAB trabaja por defecto con complejos, incluidas las funciones exp, sin, cos
que se eval´ uan sin m´as: exp(i*pi). Por supuesto tiene implementadas las funciones
b´asicas de los complejos:
Funciones Complejas
Funci´on Sintaxis Ejemplo
Si se escribe equivale al resultado
Parte real real(X) real(1+2i) Re(1 + 2i) 1
Parte imaginaria imag(X) imag(1+2i) Im(1 + 2i) 2
Conjugado conj(X) conj(1+2i) 1 + 2i 1 −2i
M´odulo abs(X) abs(1+2i) [1 + 2i[ 2.2361 (=

5)
Argumento angle(X) angle(1+2i) arg(1 + 2i) 1.1071 (=arctg 2)
Se pueden dibujar n´ umeros complejos mediante plot y compass:
>> plot(1+2i,’*’)
>> compass(1+2i)
Ejercicio 1: Representa las potencias de exponente 1, 2, 3 ... del complejo
z = 1+i. Usar la orden hold depu´es de obtener el primer gr´afico para que los siguientes
se dibujen en la misma ventana sin borrar los previos.
4
El comando grid dibuja el “mallado” de la gr´afica y el comando axis controla los ejes de coordenadas.
Se recomienda usar el comando help para estas ´ordenes.
6
1.6. Vectores.
1.6. Vectores.
Para introducir vectores en MATLAB se escriben sus componentes entre corchetes.
Separando las componentes con comas o espacios obtenemos un vector fila. Separ´andolas
por punto y coma o por medio de la tecla [Intro], obtenemos un vector columna. Por
ejemplo:
u = [1 2 3], v = [1,2,3] % Vectores fila
w = [1;2;3] % Vectores columna
z = [1
2
3]
Es muy frecuente tener que editar vectores con componentes equiespaciadas, por
ejemplo, para crear una tabla de valores de una funci´on. Con a:h:b se crea un vector
de componentes que van de a hasta b y distan h cada una de la siguiente. La orden
linspace(a,b,n) crea n t´erminos en progresi´on aritm´etica, desde a hasta b.
>> v= 0:0.1:1
>> w=linspace(0,1,11)
linspace(a,b) crea un vector con n = 100 elementos.
La norma (eucl´ıdea) de un vector se calcula con el comando norm. Si se introduce
>> norm([1,2,3])
produce 3.7417 (=|(1, 2, 3)| =

1
2
+ 2
2
+ 3
2
). Adem´as de esta norma, con MAT-
LAB se pueden manejar otro tipo de normas, como la norma 1, norm(v,1), o la norma
infinito o supremo, norm(v,inf).
7
1. Perdiendo el miedo.
La funci´on length devuelve el n´ umero de componentes de un vector.
La suma (o resta) de dos vectores del mismo tama˜ no se efect´ ua con MATLAB es-
cribiendo u + v (u-v para la resta). Para multiplicar un vector u por un escalar a, se
pone
>> a*u.
En ocasiones hay que multiplicar dos vectores elemento a elemento y eso MATLAB
lo hace con la versi´on “punto” del producto. Por ejemplo:
>> u=[1 2 3]; v=[4 5 6];
>> u.*v
produce el vector [4 10 18]. Sin embargo, la orden u*v, produce un mensaje de error,
ya que MATLAB aplica el producto matricial y los tama˜ nos no son coherentes. El “punto”
antepuesto a las operaciones *, ^, / significa “hacer dichas operaciones coordenada a
coordenada”. Por ejemplo, almacenando en un vector los 10 primeros naturales
>> N=1:10;
podemos
5
calcular los 10 primeros cubos con N.^3 o las 10 primeras potencias de 2 con
2.^N.
Ejercicio 2: Obtener 1, 1/2, 1/3, ..., 1/10.
Ejercicio 3: Obtener 10, 9/2, 8/3, ..., 2/9, 1/10. Sugerencia: Cuando se intro-
ducen vectores mediante v=a:h:b, el paso h debe ser negativo, si a > b.
Una caracter´ıstica destacable de MATLAB es que eval´ ua una funci´on sobre todas las
componentes de un vector simult´aneamente, lo cual es muy pr´actico, por ejemplo, para
construir tablas de funciones o representarlas gr´aficamente.
5
Si se introducen vectores mediante : y se escribe s´olamente v=a:b, esto equivale a decir que la
separaci´on de las componentes de v es 1, es decir v=a:1:b.
8
1.7. Matrices.
>> x = -2:0.1:2
>> y = exp(x)
>> plot(x,y)
La siguiente tabla muestra algunas de las funciones para vectores m´as usuales. Los
ejemplos son para u = (1, 2, 3) y v = (4, 5, 6).
Funciones Vectoriales
Funci´on Sintaxis Ejemplo
Si se escribe equivale al resultado
Transpuesta X’ u’ (1, 2, 3)
t

¸
1
2
3

Suma de
componentes sum(X) sum(u) 1+2+3 6
Producto de
componentes prod(X) prod(v) 4 5 6 120
Producto escalar dot(X,Y) dot(u,v) 'u, v` 32
Producto vectorial cross(X,Y) cross(u,v) u ∧ v (-3,6,-3)
Voltear de
derecha a izquierda fliplr(X) fliplr(u) (3,2,1)
Voltear de
arriba a abajo flipud(X) (flipud(v’))’ (6,5,4)
Observar que el producto vectorial s´olo est´a definido para vectores de IR
3
.
Ejercicio 4: Calcular la suma de los cuadrados de los mil primeros naturales.
Ejercicio 5: Dado un vector v, calcular la media aritmetica de sus componentes.
Ejercicio 6: Calcular la siguiente expresi´on:
15
¸
n=1
sen

2πn
15

.
1.7. Matrices.
Por defecto, MATLAB trabaja con matrices. Esto supone la ventaja substancial de
no tener que declarar tipos de variable ni tama˜ nos de fila o columnas para trabajar
tanto con matrices de n´ umeros reales o complejos como con vectores o escalares, que se
consideran casos particulares de matrices.
Las matrices se escriben por filas. Los elementos de una fila se separan por “comas”
y las distintas filas por “puntos y comas”.
9
1. Perdiendo el miedo.
>> A = [1,2;3,4]
Lo mismo que con vectores, podemos tambi´en separar los elementos de una fila con
espacios y las filas pulsando la tecla [Intro].
>> B = [-1 -2
-3 -4]
El elemento en la fila i y la columna j de la matriz A es A(i,j). Se pueden modificar
componentes de una matriz. Por ejemplo, para cambiar el elemento (2, 1) de A por 0
hacemos:
>> A(2,1) = 0
A(i,:) denota la fila i de la matriz A. An´alogamente, A(:,j) es la columna j de A.
En ocasiones resulta c´omodo construir una matriz a base de bloques. Con tal de que
sus tama˜ nos sean coherentes, basta escribir los bloques por filas, como si se tratase de
elementos individuales. Por ejemplo:
>> M = [A,B;B,A]
Para extraer una submatriz, se indican las filas y columnas de que se compone.
>> M41 = M(1:3,2:4)
Las filas o columnas no tienen por que ser consecutivas:
>> fil = [1,2,4]; col = [1,3,4];
>> M32 = M(fil,col)
La funci´on size devuelve un vector de dos componentes que son el n´ umero de filas
y el n´ umero de columnas de la matriz:
>> [filas,columnas] = size(M)
El comando diag tiene dos comportamientos distintos, seg´ un si el argumento es
una matriz o un vector. diag (matriz) produce un vector cuyas componentes forman
la diagonal principal de la matriz. diag (vector) produce una matriz diagonal cuya
diagonal principal es el vector.
>> v=[1 2 3]; A=diag(v)
>> B=[1 2;3 4]; w=diag(B)
El comando diag en realidad tiene dos argumentos de entrada: diag(vector, k) (k es
un entero que denota la posici´on del vector, k = 0 es la diagonal principal, k > 0 por
encima y k < 0 por debajo). Tambi´en se puede usar como diag(matriz, k). Observar
como
>> v=[1 1 1]; A=diag(v,-1)+2*diag([v 1])+diag(v,1)
produce una matriz de bandas.
Ejercicio 7: ¿Qu´e calcula en realidad el siguiente comando
>> prod(diag(A))-prod(diag(flipud(A)))
para matrices de orden 2?
10
1.7. Matrices.
La suma, resta, o multiplicaci´on se efect´ ua de la manera obvia (siempre que los
´ordenes de las matrices lo permitan):
>> A + B, A-B, 5*A, A*B, A^2
La inversa de una matriz A se puede escribir o bien A^(-1) o usando la funci´on inv:
inv(A). MATLAB usa m´etodos num´ericos estables (eliminaci´on gaussiana). det(A) pro-
porciona el determinante. rank(A) estima el rango de A.
MATLAB interpreta A/B como AB
−1
e interpreta A ` B como A
−1
B. Asimismo, la
soluci´on del sistema Ax = b, que formalmente es x = A
−1
b, se obtiene en MATLAB con
A ` b. Bien entendido que la soluci´on no se obtiene calculando la inversa de A, sino
aplicando m´etodos num´ericamente m´as eficientes (ver help slash).
Para multiplicar dos matrices elemento a elemento, se usamos las variantes “punto”
de las operaciones correspondientes. Observar la diferencia entre
>> A*B, A.*B, A^-1, A.^-1
Si A es una matriz real, A’ es la transpuesta de A. En el caso complejo, A’ es la
transpuesta conjugada. La transpuesta sin conjugar se obtiene con A.’
Ejercicio 8: Dada una matriz A, calcular la traza (¡sin usar el comando trace!)
MATLAB tiene varias funciones que facilitan la edici´on de matrices de uso frecuente.
Matrices Especiales
Funci´ on Sintaxis
Matriz identidad de orden n eye(n)
Matriz nula de orden n m zeros(n,m)
Matriz de unos de orden nula n m ones(n,m)
Matrices aleatorias de orden n m rand(n,m)
El comando rand produce n´ umeros aleatorios uniformemente distribuidos en [0, 1].
randn produce n´ umeros aleatorios seg´ un N(0, 1), la distribuci´on normal de media 0 y
desviaci´on t´ıpica 1.
Se pueden consultar m´as tipos de matrices especiales (por ejemplo de Van der Monde,
Hilbert, ... ) con el comando help elmat.
Ejercicio 9: Simular 10 lanzamientos de un dado. Se pueden consultar las funciones
de redondeo mediante lookfor round, en concreto la parte entera es floor.
Ejercicio 10: Si se eligen dos n´ umeros x, y ∈ [0, 1] al azar, la probabilidad de que
x
2
+ y
2
≤ 1 es
π
4
. Elegir 1000 puntos (x
i
, y
i
) al azar, contar cu´antos de ellos cumplen
x
2
+ y
2
≤ 1, sean n, y aproximar π por 4
n
1000
.
11
1. Perdiendo el miedo.
Ejercicio 11: Construir el bloque de Jordan de orden 10 asociado al valor propio 5.
Ejercicio 12: Construir la siguiente matriz de Jordan:

J
1
O
O J
2

, donde J
1
y J
2
son dos bloques de Jordan, el primero de orden 10 asociado a 5 y el segundo es de orden
7 y asociado a -2.
MATLAB posee adem´as un n´ umero considerable de funciones avanzadas para matri-
ces: Por ejemplo, calcular el espacio nulo, la norma, la exponencial, las factorizaciones
LU, de Cholesky, QR, valores y vectores propios, ... Cons´ ultese help matfun para una
mayor informaci´on.
1.8. Polinomios.
MATLAB se vale de vectores para manejar los polinomios. Para ello considera las
componentes de un vector como coeficientes de un polinomio, ordenados de mayor a
menor grado. As´ı, por ejemplo, el vector p = [2 -5 0 -7], representa al polinomio
p(x) = 2x
3
−5x
2
−7.
El valor del polinomio p en un punto se halla con polyval. Por ejemplo, la orden
polyval(p,3) eval´ ua el polinomio en x
0
= 3.
Ejercicio 13: Calcular la suma 1 +
1
3
+
1
3
2
+ +
1
3
10
por lo menos de dos maneras
distintas.
Esta funci´on, como muchas de MATLAB , puede evaluarse sobre un vector. Por
ejemplo, si, se desea hacer una tabla de 20 valores del polinomio x
3
− 1 en el intervalo
[−1, 1] se escribir´a:
>> p=[1 0 0 -1]; x=linspace(-1,1,20); y=polyval(p,x); tabla=[x;y]
La gr´afica e obtiene con plot(x,y).
Las ra´ıces de un polinomio (reales y complejas e incluso con las multiplicidades
correspondientes ) se obtienen inmediatamente con roots. Para hallar las ra´ıces de
x
4
−2x
3
+ 2x
2
−2x + 1 hacemos:
>> r = roots([1 -2 2 -2 1])
Rec´ıprocamente, dado un vector r, poly(r) es el polinomio con coeficiente director
unidad cuyas ra´ıces son las componentes del vector.
>> poly(r)
Las operaciones de suma, resta y producto por un escalar de polinomios corresponden
exactamente con las mismas operaciones de vectores. El producto de polinomios se hace
con la orden conv y la divisi´on con resto se hace con
12
1.9. Gr´aficos.
[cociente,resto] = deconv( dividendo,divisor)
Ejercicio 14: Calcular (x + 1)
4
.
Ejercicio 15: Sean p(x) = x
4
−x, q(x) = x
2
+x+1. Hallar el cociente, C(x), y el resto,
R(x) de la divisi´on eucl´ıdea p/q. A continuaci´on comprobar que p(x) = C(x)q(x)+R(x).
1.9. Gr´aficos.
Hemos utilizado ya algunas ´ordenes gr´ aficas de MATLAB , como fplot o ezplot para
representar expresiones algebraicas, compass y plot para representar n´ umeros comple-
jos. Veremos alg´ un comando m´as para representar funciones a partir de su expresi´on en
coordenadas cartesianas, polares y param´etricas, valores almacenados en una matriz y
funciones de dos variables.
1.9.1. Curvas planas.
La orden plot(x,y) representa los pares (x
1
, y
1
), (x
2
, y
2
), , (x
n
, y
n
), siendo x =
(x
1
, x
2
, , x
n
) e y = (y
1
, y
2
, , y
n
). Hemos usado ya este comando para representar
funciones: Por ejemplo, si deseamos representar p(x) = x
3
− x en el intervalo [−1, 2]
podemos hacer
>> p=[1 0 -1 0]; x=linspace(-1,2); y=polyval(p,x);
>> plot(x,y)
Por defecto, plot une puntos consecutivos mediante un segmento. A˜ nadiendo un tercer
argumento, modificamos el color y el estilo del trazo. As´ı, con
>> plot(x,y,’*’)
visualizamos los puntos que determinan el polinomio del ejemplo anterior.
Con help plot vemos las distintas combinaciones de car´acteres v´alidas como tercer
argumento de esa funci´on.
La orden title sirve para poner un t´ıtulo al gr´afico. Igualmente podemos poner
t´ıtulos en los ejes con xlabel e ylabel. El argumento de estas funciones ha de ser una
cadena o una variable de este tipo.
>> title(’Mi polinomio’)
>> xlabel(’Abscisas’), ylabel(’Ordenadas’)
13
1. Perdiendo el miedo.
Podemos a˜ nadir cualquier texto sobre el gr´afico sin m´as que indicar la posici´on en que
debe aparecer, bien mediante coordenadas o con el rat´on. Para escribir la palabra
M´aximo en el punto de coordenadas (1.5, 2) utilizamos
>> text(1.5,2,’M´aximo’)
Tambi´en podemos situar el texto con el rat´on
>> gtext(’M´ınimo’)
Otra posibilidad ´ util es la de extraer valores del gr´afico. ginput(n) forma una matriz
de 2 columnas y n filas, de modo que cada fila es d´onde pinchamos con el rat´on en la
gr´afica.
Ejercicio 16: Dibujar la gr´afica de la funci´on f(x) =
log x
x
en el intervalo [1, 4] y
mediante el comando ginput estimar cu´al es el extremo.
Para dibujar una curva en coordenadas polares se usa el comando polar. Por ejem-
plo, la ecuaci´on de la rosa de 5 p´etalos es ρ(θ) = sen(5θ), θ ∈ [0, 2π]. Su representaci´on
en MATLAB se obtiene con.
>> z = 0:pi/300:pi; r = sin(5*z); polar(z,r)
14
1.9. Gr´aficos.
Para representar una curva en param´etricas se procede del modo siguiente: Por
ejemplo, la ecuaci´on de la cicloide es α(t) = (1 −cos t, t −sen t), t ∈ [0, 6π] se representa
por medio de
>> t = linspace(0,6*pi);
>> x = t-sin(t); y = 1-cos(t);
>> plot(x,y)
Para que vea mejor, se puede escribir axis equal.
1.9.2. Curvas en el espacio.
Para representar una curva en el espacio (en param´etricas), α : [t
0
, t
1
] → IR
3
, α(t) =
(x(t), y(t), z(t)), se usa el comando plot3. Para dibujar dos h´elices entrelazadas
α(t) = (sen t, cos t, t), β(t) = (−sen t, −cos t, t), t ∈ [0, 4π],
se escribe
>> t=linspace(0,4*pi);
>> x=sin(t);y=cos(t);z=t;
>> plot3(x,y,z,’r’,-x,-y,z,’b’)
Para dibujar una trayectoria helicoidal sobre una superficie c´onica:
>> t = linspace(0,10*pi);
>> x = t.*sin(t); y = t.*cos(t);
>> plot3(x,y,t)
El comando view sirve para situar el “punto de vista”. La sintaxis es view(azimut,
elevaci´on) (ambos en grados sexagesimales). Azimut es el ´angulo de rotaci´on horizontal
y elevaci´on es el vertical. Unos comandos m´as interactivos (con el rat´on) son rotate3d
y zoom en ´este ´ ultimo se manejan los dos botones del rat´on.
15
1. Perdiendo el miedo.
1.9.3. Superficies en el espacio.
La idea b´ asica para representar funciones de dos variables es evaluarlas en un conjunto
de puntos del plano XY formando una malla rectangular, almacenar estos valores en
una matriz y utilizar ´ordenes de MATLAB que representan estos valores como alturas
sobre el plano y mediante colores o curvas de nivel.
Para representar z = xy en el rect´angulo [−1, 1] [−1, 1] se procede de la manera
siguiente:
>> x = -1:0.1:1; y = -1:0.1:1;
>> z = y’*x; % Columna x Fila = Matriz cuadrada
>> surf(x,y,z) % Superficie de placas
>> mesh(x,y,z) % Mallado de la superficie
>> contour(x,y,z) % Curvas de nivel
>> surfl(x,y,z) % Superficie suavizada
>> surfc(x,y,z) % Superficie y curvas de nivel
>> waterfall(x,y,z) % Cortes verticales
Ejercicio 17: Representar la funci´on z = sen x cos y en [0, 2π] [0, 2π].
No siempre es tan f´acil disponer los valores de la funci´on en una matriz z de modo
que la posici´on en la matriz corresponda con las coordenadas del punto (x, y). MATLAB
nos ayuda con la orden meshgrid, que a partir de un conjunto de valores de x y otro de y,
crea dos matrices, X e Y , con las coordenadas de los puntos de la malla. La matriz z se
obtiene evaluando la funci´on que se desea representar sobre el par de matrices obtenidas.
Hay que tener cuidado en emplear las versiones “punto” de las operaciones producto,
cociente y potencia, pues la funci´on act´ ua elemento a elemento.
Si se desea representar la cu´adrica z = x
2
−y
2
en [−1, 1] [−1, 1]:
>> x = -1:0.1:1; y = -1:.1:1;
>> [X,Y] = meshgrid(x,y) % Truco!
>> z = X.^2 + Y.^2; % !Ojo al punto!
>> surfc(x,y,z)
Ejercicio 18: Representar un sombrero:
f(x, y) =
cos

x
2
+y
2
4

3 + x
2
+ y
2
, f : [−5, 5] [−5, 5] → IR.
Sugerencia: Para evitar duplicar c´alculos utilizar una variable auxiliar, aux = x
2
+y
2
.
16
1.9. Gr´aficos.
El aspecto de la superficie puede modificarse de varias maneras. Aparte de los co-
mandos vistos para curvas en el espacio, rotate3d y zoom, est´an los siguientes: Para
crear una malla transparente hacemos
>> mesh(x,y,z), hidden off
Con hidden on volvemos al estado normal en el que se ocultan las l´ıneas posteriores.
Las opciones de sombreado muestran u ocultan la malla sobre la superficie.
>> surf(x,y,z), shading flat % sin malla
>> shading interp % color degradado
>> shading faceted % losetas con borde
El color se cambia con colormap que tiene algunas opciones predefinidas (ver la
ayuda de graph3). Por ejemplo colormap summer
La funci´on pcolor muestra un rect´angulo coloreado seg´ un el valor que se representa.
pcolor(x,y,z)
Jugando con las opciones de sombreado y a˜ nadiendo curvas de nivel en negro, creamos
un mapa f´ısico:
>> hold, shading interp, contour(x,y,z,’k’), hold
La letra k en la instrucci´on de contour indica el color con el cual queremos dibujar
las curvas de nivel: blacK. Si en cambio queremos mostrar las curvas de nivel sobre la
superficie, hacemos lo mismo con surf y contour3
>> surf(x,y,z), shading interp, hold contour3(x,y,z,’k’), hold
Generar superficies de revoluci´on es muy f´acil con MATLAB . Basta crear un vector
con los radios de la superficie a intervalos regulares del eje de revoluci´on y utilizar la
funci´on cylinder. La sintaxis es
cylinder(vectorderadios, numerodepuntosdelacircunferencia)
17
1. Perdiendo el miedo.
Veamos algunos ejemplos:
>> r=2*ones(1,10); cylinder(r)
>> r=2*ones(1,10); cylinder(r,50)
>> r = 1:-.1:0; cylinder(r,100)
Ejercicio 19: La ecuaci´ on de un toro de radio mayor R y menor r (centrado en el
origen), es en ecuaciones cil´ındricas: ρ(z) = R ±

r
2
−z
2
, z ∈ [−r, r]. Observando que
el toro es una superficie de revoluci´on, usar el comando cylinder para dibujar un toro
cuando R = 4, r = 1.
M´as f´acil a´ un, desde luego, es dibujar una esfera: sphere
18
2. Aprendiendo a programar
2.1. Archivos.m
En estas dos ´ ultimas horas aprenderemos (m´ınimamente) a usar el lenguaje de pro-
gramaci´o de MATLAB para crear nosotros mismos funciones.
La programaci´on en MATLAB se efect´ ua mediante ficheros.m. Son simplemente
ficheros de texto que contienen ´ordenes de MATLAB . Su uso requiere:
• Editar el fichero con el editor de MATLAB o con un editor ASCII.
• Guardarlo con extensi´on .m.
• Indicar a MATLAB d´onde est´a el archivo con path(path,’direcci´on’).
• Ejecutarlo escribiendo en la l´ınea de ´ordenes el nombre de fichero y los par´ametros
de entrada necesarios.
Como ejemplo creamos un fichero que calcula la suma y resta de dos matrices: En el
men´ u File se elige New M-file para entrar en el editor de MATLAB y en ´el escribimos
el siguiente texto:
function [suma,resta] = sumres(A,B)
% Datos de entrada: Dos matrices A y B.
% Salida: Dos matrices: sum = A+B, res = A-B.
suma = A+B;
resta = A-B;
• Se graba en a: con el nombre sumres.m
• Se indica la ruta para llegar al fichero: path(path,’a:’)
• Se ejecuta: [M,N] = sumres(eye(2),eye(2))
• Obs´ervese la importancia de las primeras l´ıneas: help sumres
19
2. Aprendiendo a programar
El fichero sumres.m es un archivo de funci´on, al incluir en la primera l´ınea la palabra
clave function. La sintaxis es la siguiente: Si x
1
, , x
m
son los argumentos de entrada
e y
1
, , y
m
son los argumentos de salida
function [y1, ..., ym]=nombre de funci´on (x1, ..., xn)
Es aconsejable que el nombre de la funci´on coincida con el nombre del fichero .m
La orden type(fichero) muestra en pantalla el listado del programa. Podemos
escribir type sumres. Hay muchas funciones implementadas en MATLAB que podemos
ver su listado. Por ejemplo, type hilb muestra en pantalla c´omo formar la matriz de
Hilbert.
Veamos un ejemplo m´as complicado: Aunque ya sepamos dibujar curvas param´etricas
en el espacio (plot3), veamos otra manera: La proyecci´on isom´etrica, es una aplicaci´on
lineal, p, de IR
3
a IR
2
tal que p(e
1
) = (cos 210
o
, sen 210
o
), p(e
2
) = (cos 330
o
, sen 330
o
),
p(e
3
) = (0, 1). Luego la proyecci´on de (x, y, z) se puede calcular

−cos(π/6) cos(π/6) 0
−sen(π/6) −sen(π/6) 1

¸
x
y
z

function dibuja(v)
% dibuja curvas 3D en proyecci’on isom’etrica.
% Ejemplo: H’elice a(t)=(cost,sent,t/4)
% t=0:0.05:8*pi;
% x=cos(t);
% y=sin(t);
% z=t/4;
% v=[x;y;z];
% dibuja(v)
% Inicializa la matriz proyecci’on
iso=[-cos(pi/6) cos(pi/6) 0;-sin(pi/6) -sin(pi/6) 1];
% Misma escala, borra los ejes y superpone varios gr’aficos.
axis(’equal’)
axis off
hold on
% Dibuja el eje x
20
2.1. Archivos.m
xmax=max(v(1,:));
xm=[xmax;0;0];
m=1.2*iso*xm;
plot([0,m(1)],[0,m(2)],’b’)
text(m(1),m(2),’x’)
% Dibuja el eje y
ymax=max(v(2,:));
ym=[0;ymax;0];
m=1.2*iso*ym;
plot([0,m(1)],[0,m(2)],’b’)
text(m(1),m(2),’y’)
% Dibuja el eje z
zmax=max(v(3,:));
zm=[0;0;zmax];
m=1.2*iso*zm;
plot([0,m(1)],[0,m(2)],’b’)
text(m(1),m(2),’z’)
% Dibuja la curva en 3d
m=iso*v;
x=m(1,:);
y=m(2,:);
plot(x,y)
Una versi´on matricial (m´as compacta) del programa anterior es la siguiente. (La
forma de ejecutar la funci´on es exactamente la misma que la anterior)
function iso(v)
% dibuja curvas 3D en proyecci’on isom’etrica.
iso=[-cos(pi/6) cos(pi/6) 0;-sin(pi/6) -sin(pi/6) 1];
axis(’equal’)
axis off
hold on
% dibuja ejes
ejes=diag(max(v’));
m=1.2*iso*ejes;
compass(m(1,:),m(2,:),’b’)
text(m(1,:),m(2,:),[’x’;’y’;’z’])
21
2. Aprendiendo a programar
% dibuja la curva
m=iso*v;
plot(m(1,:),m(2,:),’r’)
Ejercicio 20: Calcular la suma de los n primeros naturales.
Ejercicio 21: Elaborar un archivo .m para calcular S(n) = 1 +
1
2
2
+
1
3
2
+ +
1
n
2
. Y
comprobar que para valores “grandes” de n, S(n) ·
π
2
6
.
Ejercicio 22: Sea A una matriz real de orden 2. Se puede medir intuitivamente el
condicionamiento de la matriz A observando la elipse A(S), donde S es ¦(x, y) ∈ IR
2
:
|(x, y)| = 1¦ (Esta elipse es la c´onica de ecuaci´on X
t
(AA
t
)
−1
X supuesta A invertible, si
no lo fuese, entonces ¡A(S) es un segmento!). Cuanto m´as achatada sea esta elipse, peor
es el condicionamiento de A. Elaborar un programa que calcule el n´ umero de condici´on
de una matriz A (cond) y que dibuje la c´onica A(S).
Hay una forma r´apida en MATLAB para contar el n´ umero de operaciones efectuadas.
(Lo que nos puede decidir entre varios algoritmos diferentes). Si escribimos
>> flops
MATLAB nos proporciona el n´ umero de operaciones en coma flotante efectuadas desde
que hemos iniciado MATLAB . Por tanto la mejor manera para contar el n´ umero de
operaciones de un cierto n´ umero de instruciones es la siguiente
operaciones hasta ahora = flops
Instrucciones
numero de operaciones = flops - operaciones hasta ahora
Por ejemplo podemos estimar el n´ umero de operaciones para elevar una matriz de orden
n al cuadrado de la manera siguiente:
function operaciones=estima(n)
% estima(n). Estima el numero de operaciones para calcular el
% cuadrado de una matriz de orden n
a=rand(n);
operaciones=flops;
a^2;
operaciones=flops-operaciones;
El siguiente ejercicio muestra un ejemplo sencillo de c´omo se obtienen n´ umero de
operaciones diferentes al calcular lo mismo.
Ejercicio 23: Dado un vector v = (v
1
, v
2
, v
3
, , v
n
) podemos construir el vector de
22
2.1. Archivos.m
sumas acumuladas mediante

¸
¸
¸
¸
¸
1 0 0 0
1 1 0 0
1 1 1 0

1 1 1 1

¸
¸
¸
¸
¸
v
1
v
2
v
3

v
n

.
La matriz se puede implementar usando tril(ones(n))
1
. Elaborar un archivo .m para
calcular el vector de sumas acumuladas y contar el n´ umero de operaciones. Repetir lo
mismo mediante la orden cumsum.
Una de las ventajas de las funciones de MATLAB es que podemos usar funciones
implementadas por nosotros mismos para elaborar otro tipo de programas. El siguiente
ejemplo es t´ıpico:
Se trata de evaluar de forma aproximada por el m´etodo del punto medio una integral
definida. Para ello escribimos dos programas, uno donde se almacena el integrando y
el otro en donde se describe el m´etodo. Y as´ı cuando queramos modificar el integrando
solo modificamos el fichero donde lo tengamos almacenado y no en donde est´a imple-
mentado el m´etodo, ganando considerablemente en claridad: Si queremos calcular de
forma aproximada

1
0
sen x
x
dx, guardamos en el fichero f.m el integrando
function y=f(x)
% Aqu’i almacenamos una funci’on y=f(x).
y=sin(x)./x;
y en otro fichero; por ejemplo integral.m el m´etodo:
function I=integral(a,b,n)
% --- Calcula la integral por el m’etodo del punto medio ---
% integral(a,b,n):
% a:extremo inferior. b:extremo superior. n:n’umero de divisiones.
h=(b-a)/n;
x=a+h/2:h:b-h/2;
I=h*sum(f(x));
Ejercicio 24: Elaborar un programa para calcular una integral definida por el m´etodo
de los trapecios. Si se divide [a, b] en la partici´on equiespaciada por h, a = x
0
< a +h =
x
1
< a + 2h = x
2
< < x
n
= b, la integral aproximada es
I ·
h
2
(f(x
0
) + 2f(x
1
) + + 2f(x
n−1
) + f(x
n
)) .
1
Los comandos tril y triu forman matrices triangulares inferior y superior respectivamente.
23
2. Aprendiendo a programar
Intentar evaluar

1
0
sen x
x
dx. Sugerencia: Al intentar evaluar la funci´on f(x) =
sen x
x
en x = 0, hay un problema de indeterminaci´on. En este caso se resuelve f´acilmente
modificando ligeramente la funci´on: sin(x+eps)./(x+eps).
2.2. Bucles.
Un bucle es un conjunto de operaciones, del cual sabemos que se va a ejecutar una
cantidad concreta de veces. Por ejemplo, si queremos formar el vector v = (1, 2, , n)
(de una manera poco eficiente) podemos ejecutar
Hacer desde i=1 hasta n → v(i)=i → siguiente i
La sintaxis correcta es (inicializando el vector v)
n=100;
v=zeros(1,n);
for i=1:n
v(i)=i;
end
En lo posible se evitar´a el uso de bucles en MATLAB ; ya que suponen un excesivo
gasto de tiempo. Por ejemplo, lo anterior simplemente se implementar´ıa como v=1:100.
Otro ejemplo: Los dos siguientes calculan la suma de los n primeros cuadrados
function s=suma(n) function s=suma(n)
s=0; s=sum((1:n).^2);
for i=1:n
s=s+i^2;
end
El programa sin usar bucles gana en legibilidad y en tiempo, como se muestra en el
siguiente ejercicio:
Ejercicio 25: Usar los comandos tic y toc para contar el tiempo de ejecuci´on y
comprobar que para los bucles el tiempo es mayor. La forma de usar estos comandos es
tic operaciones toc.
Un ejemplo un poco m´as complicado de utilizaci´on de bucles es el siguiente que
muestra la bola unidad en IR
2
para diferentes tipos de normas (¡e incluso la norma
infinito!)
24
2.2. Bucles.
function bola(p,intentos)
% --- bola(p,intentos) ---
% BOLA Una demostraci’on de la forma de la bola unidad en R2.
% La norma es ||(x,y)|| = (x^p+y^p)^(1/p). (p puede ser Inf!)
% intentos: el n’umero de vectores que se dibujan
clf %sirve para borrar cualquier gr’afico anterior.
axis(’square’);axis([-1.0 1.0 -1.0 1.0])
plot([-1.0 1.0],[0 0],’b-’,[0 0],[-1.0 1.0],’b-’) %dibuja los ejes
hold on
axis(’equal’)
theta=linspace(0,2*pi,intentos+1); %Calcula ’angulos equiespaciados
theta=theta(1:length(theta)-1);
x=cos(theta); %Calcula los vectores
y=sin(theta);
M=[x;y];
norma=zeros(1,length(theta)); %Inicializa el vector de normas
for k=1:length(theta) %Calcula la norma p de cada vector
norma(k)=norm(M(:,k),p);
end
x=x./norma; y=y./norma; %Normaliza
plot(x,y,’ko’) %Dibuja en la punta del vector un c’irculo negro
Tambi´en es posible anidar un bucle dentro de otro. En muchas ocasiones esto es
especialmente ´ util para definir matrices. Por ejemplo, la matriz de Hilbert se define
como h
ij
=
1
i+j−1
. Podemos elaborar el siguiente programa:
function H=mihilb(n)
H=zeros(n);
for i=1:n
for j=1:n
H(i,j)=1/(i+j-1);
end
end
Aunque, repetimos, es preferible, si se puede, evitar el uso de bucles: Escr´ıbase type
hilb para observar c´omo se puede implementar la matriz de Hilbert sin uso de bucles.
El paso de los bucles no tiene por qu´e ser 1, Puede ser cualquier n´ umero real (incluso
negativo), como muestra el siguiente programa que calcula la soluci´on de Ax = b, siendo
A una matriz triangular superior de orden n con ning´ un elemento nulo en la diagonal
25
2. Aprendiendo a programar
principal y b un vector columna. Estos sistemas se resuelven primero hallando x
n
, luego
x
n−1
y as´ı sucesivamente. Supuestos hallado hasta x
k+1
, entonces
x
k
=
b
k

¸
n
j=k+1
a
kj
x
j
a
kk
,
el sumatorio se puede implementar f´acilmente como la fila k de A por el vector x columna.
function x=sr(A,b)
% x=sr(A,b)
% resuelve el sistema Ax=b por substituci’on regresiva
% A ha de ser una matriz triangular superior cuadrada
% con ning’un 0 en la diagonal principal.
% b debe ser un vector columna
n=length(A);
x=zeros(n,1);
for k=n:-1:1
x(k)=(b(k)-A(k,:)*x)/A(k,k);
end
A la hora de elaborar programas en MATLAB conviene tener en cuenta una serie de
cuestiones para agilizar el rendimiento:
• Elegir algoritmos num´ericamente robustos. Hay que tener en cuenta que MATLAB
trabaja con precisi´on finita. Por ejemplo
>> (100+1e-15-100)*1e32
>> (100-100+1e-15)*1e32
producen ¡0 e 10
17
! respectivamente.
• Evitar en lo posible el uso de bucles, si se pueden usar funciones de tipo vectorial.
(Antes de las dos sentencias se ha ejecutado clear all)
>> S=0;tic;for k=1:10000;S=S+k;end;toc
>> tic;S=sum(1:10000);toc
• Dimensionar previamente los vectores. Si ha medida que funciona un programa, un
vector se obliga a que cambie la dimensi´on, MATLAB ralentiza considerablemente
el proceso: (Ejecut´andose previamente clear all)
>> tic;for k=1:10000;v(k)=2*k-1;end;toc
>> tic;v=zeros(1,10000);for k=1:10000;v(k)=2*k-1;end;toc
>> tic; v=1:2:20000; toc
26
2.3. Condicionales.
2.3. Condicionales.
Si queremos usar una instrucci´on, no un n´ umero predeterminado de veces (instrucci´on
for), sino hasta que se satisfaga determinada condici´on; hemos de usar los condicionales
if y while.
2.3.1. La condici´on if
Una estructura de control ´ util es la bifurcaci´on condicional if. Las instrucciones que
contienen if se ejecutan si se satisface la condici´on. Si ´esta no se verifica, se produce
un salto hasta la orden siguiente a end.
La sintaxis de la bifurcaci´on condicional if es la siguiente:
if condici´on
instrucciones
end
La instruci´on if se suele usar junto con else: Esta ´ ultima instrucci´on permite
introducir instrucciones que se ejecutan si la condici´on es falsa. La sintaxis es
if condici´on
instrucciones si la condici´on es cierta
else
instrucciones si la condici´on es falsa
end
Veamos algunos detalles sint´acticos a la hora de establecer condiciones. MATLAB
reconoce expresiones l´ogicas asoci´andoles el valor 1 si son ciertas y 0 si son falsas (¡de
manera vectorial!). Por ejemplo, si a = (−1, 0, 1) y si b = (0, 1, −1); entonces
Igualdades: a==0 devuelve [0 1 0]. Observar que la asignaci´on se realiza con =; mien-
tras que la comparaci´on con ==.
Desigualdades: • a>0 devuelve [0 0 1].
• a>=0 devuelve [0 1 1].
• a~=0 devuelve [1 0 1]. El s´ımbolo ~ se introuduce con [ALT]+126.
Operadores l´ogicos: Conjunci´on (a>=0)&(b>0) devuelve [0 1 0].
Disyunci´on (a>0)&(b<=0) devuelve [1 0 1].
Disyunci´on exclusiva xor((a==1),(b>=-1) devuelve [1 1 0].
Negaci´on ~(a==1) devuelve [1 1 0].
Veamos un ejemplo sencillo: Dado un n´ umero r, decidir si es entero o no:
27
2. Aprendiendo a programar
function esentero(r)
if r==floor(r)
disp(’es entero’)
else
disp(’no es entero’)
end
Por supuesto los condicionales se pueden anidar uno dentro de otro.
Ejercicio 26: Modificar el programa anterior para decidir si un n´ umero es par o no,
s´olo en el supuesto de que sea entero.
El siguiente fichero dibuja una superficie tubular de radio R alrededor de la curva
α(t) = (x(t), y(t), z(t)).
Las l´ıneas 11 – 13 muestran una utilidad t´ıpica del condicional if mediante la variable
nargin (=Number of ARGuments IN; por supuesto, tambi´en est´a la variable nargout).
La l´ınea 23 calcula los vectores (almacenados en v) que forman la poligonal asociada
a la curva; que aproximan a los vectores tangentes a la curva. Ahora hay que construir
circunferencias perpendiculares. Las l´ıneas 25 – 32 calculan las coordenadas esf´ericas
(α = latitud; β = longitud) del vector v/|v|. Si
v
|v|
= (cos αcos β, cos αsen β, sen α),
es f´acil comprobar que
w
1
= (sen αcos β, sen αsen β, −cos α), w
2
= (sen β, −cos β, 0)
forman una base ortonormal del plano ortogonal a v. Por tanto
w = w
1
cos θ + w
2
sen θ, θ ∈ [0, 2π]
28
2.3. Condicionales.
describe la circunferencia de radio 1 centrada en el origen perpendicular a v.
´
Este es el
objeto de las l´ıneas 33 – 35. El resto del programa es f´acil de entender.
1 function gusano(xc,yc,zc,R,ntheta)
2 % function gusano(Xc,Yc,Zc,R,ntheta)
3 %
4 % --- Dibuja una superficie tubular ---
5 % sobre la curva [Xc Yc Zc] con radio transversal R.
6 % La curva debe tener al menos dos puntos.
7 % ntheta es el numero de puntos de cada circunferencia transversal.
8 % Por defecto ntheta=12.
9
10 %preparaci’on
11 if nargin==4
12 ntheta=12;
13 end
14 h=2*pi/ntheta;
15 theta=(0:h:2*pi)’;
16 ct=cos(theta);
17 st=sin(theta);
18 n=length(xc);
19 X=zeros(n,ntheta+1);Y=X;Z=X;
20
21 %Construye n-1 c’irculos perpendiculares a cada segmento
22 for i=1:n-1
23 v=[xc(i+1)-xc(i),yc(i+1)-yc(i),zc(i+1)-zc(i)];
24 V=norm(v);
25 salfa=v(3)/V;
26 calfa=sqrt(v(1)*v(1)+v(2)*v(2))/V;
27 sbeta=0;
28 cbeta=1;
29 if calfa~=0
30 sbeta=v(2)/V/calfa;
31 cbeta=v(1)/V/calfa;
32 end
33 x=+ct*salfa*cbeta+st*sbeta;
34 y=+ct*salfa*sbeta-st*cbeta;
35 z=-ct*calfa;
36 X(i,:)=x’;Y(i,:)=y’;Z(i,:)=z’;
37 end
38
39 %Mueve y escala los c’irculos
29
2. Aprendiendo a programar
40 for i=1:n-1
41 X(i,:)=X(i,:)*R+xc(i);
42 Y(i,:)=Y(i,:)*R+yc(i);
43 Z(i,:)=Z(i,:)*R+zc(i);
44 end
45 X(n,:)=X(n-1,:);
46 Y(n,:)=Y(n-1,:);
47 Z(n,:)=Z(n-1,:);
48 surf(X,Y,Z);
Ejercicio 27: Modificar el fichero previo para elaborar un programa que dibuje la
superficie tubular alrededor de la curva α(t) = (x(t), y(t), z(t)), t ∈ [a, b] con radio
variable R : [a, b] → IR
+
. Por ejemplo el dibujo para la curva α(t) = (cos t, sen t, 0),
t ∈ [0, 2π], R(t) = 0.7 −
0.6

t, debe ser
2.3.2. La condici´on while
Si se quiere repetir un conjunto de instrucciones no un n´ umero determinado de veces,
sino hasta que se cumpla una determinada condici´on, lo m´as adecuado es usar la senten-
cia while. Las instrucciones que contiene el while se repiten hasta que se satisfaga la
condici´on. Si ´esta no se verifica, se produce un salto hasta la orden que sigue al while.
Para que el bucle no sea indefinido, las instrucciones del while modifican la condici´on,
de modo que en alg´ un momento deje de verificarse. La sintaxis es la siguiente:
while condici´on
instrucciones
end
Veamos un ejemplo sencillo: Dado > 0, encontrar el menor natural n tal que
π
2
6

n
¸
k=1
1
k
2
<
30
2.3. Condicionales.
function n=mierror(epsilon)
% n=mierror(epsilon)
% Dado epsilon>0 halla el menor natural n tal que
% pi*pi/6-(1+1/4+1/9+...+1/n*n)< epsilon
S=0;
k=1;
sumaexacta=pi^2/6;
while sumaexacta-S>epsilon
S=S+1/k^2;
k=k+1;
end
n=k-1;
El siguiente ejemplo muestra c´omo se puede generar una sucesi´on de punto fijo. Dado
una funci´on f y una estimaci´on a de la ra´ız de f(x) = x, se estudia la convergencia de la
sucesi´on formada por x
n+1
= f(x
n
). Hay que escribir antes en un fichero .m la funci´on
f.
function pfijo(a,precision,itermax)
% calcula y dibuja los primeros iterados de punto fijo de la funcion f
% La sintaxis es:
% pfijo=(a,precision,itermax)
% a = Punto inicial,
% precision = Precisi’on deseada,
% itermax = N’umero m’aximo de iteraciones.
x=[a];
contador=1;
while abs(a-f(a)) > precision & contador < itermax
b=f(a);
x=[x,b];
a=b;
contador=contador+1;
end
n=length(x)-1;
if (contador==itermax | abs(a)==inf)
disp(’No converge’)
else
disp(’Soluci’on: ’)
a
disp(’Iteraciones: ’)
n
31
2. Aprendiendo a programar
end
if abs(a)~=Inf
disp(’Pulse una tecla’)
pause
minx=min(x);
maxx=max(x);
rango=maxx-minx;
u=linspace(minx-0.1*rango,maxx+0.1*rango,100);
v=f(u);
hold off
plot(u,v,’k’)
hold on
plot(u,u,’r’)
title(’Funcion y=f(x) en negro, y=x en rojo.’)
for k=1:n-1
line([x(k),x(k+1)],[x(k+1),x(k+1)])
line([x(k+1),x(k+1)],[x(k+1),x(k+2)])
end
hold off
end
Por ejemplo, para la ecuaci´on cos x = x se puede ver que el m´etodo converge hacia
la ra´ız ξ = 0.7385.
Ejercicio 28: Modificar el fichero de punto fijo anterior para implementar el m´etodo
de Newton.
Ejercicio 29: Comprobar que las sucesiones de punto fijo para las ecuaciones
sen(πx) = x; 4x(1 −x) = x,
con punto inicial x
0
∈ [0, 1] tienen un car´acter ca´otico.
La sucesi´on
x
0
= 0.5, x
n+1
= λx
n
(1 −x
n
), n ∈ IN
tiene un comportamiento ca´otico para algunos valores de λ ∈ [0, 4]. Para valores de λ
cercanos a 0, la sucesi´on converge a un valor, para λ ∈ [3, 3.4] (aproximadamente) la
sucesi´on a la larga oscila hacia dos valores, y el comportamiento para λ cercano a 4 es
completamente imprevisible. El comportamiento ca´otico se puede comprobar mediante
el ejercicio siguiente:
Ejercicio 30: Consideremos la sucesi´on x
0
= 0.5, x
n+1
= λx
n
(1 −x
n
) para λ ∈ [0, 4].
Para el estudio “a la larga” de la sucesi´on se va a tomar los t´erminos (x
30
, x
60
), y se
32
2.3. Condicionales.
dibujar´an los puntos (λ, x
i
) para λ ∈ [0, 4], i = 30, , 60. Elaborar un programa en
donde se estudie dicho comportamiento. El pseudoc´odigo ser´ıa el siguiente:
Datos de entrada: a, b ([a, b] subintervalo de [0,4]).
λ = (a, a + h, a + 2h, , a + nh = b) (para un h peque˜ no).
Para i = 1 hasta i = n hacer
x = 0.5
Calcular los 60 primeros t´erminos de la sucesi´on x
n
.
Dibujar (λ, x
j
) para j = 30, , 60.
fin para el bucle de i.
La siguiente figura muestra el comportamiento para λ ∈ [2, 4]:
Tambi´en se puede estudiar el comportamiento ca´otico de la siguiente sucesi´on: x
n+1
=
λsen(πx
n
), λ ∈ [0, 1] y x
0
= 0.5.
33
2. Aprendiendo a programar
34
3. Soluciones a algunos ejercicios.
2: 1./(1:10)
3: (10:-1:1)./(1:10)
4: sum(1:1000)
5: sum(v)/length(v)
6: sum(sin(linspace(2*pi/15,2*pi,15)))
8: sum(diag(A))
9: floor(6*rand(1,10))+1
10: Se pueden generar 1000 pares de n´ umeros mediante
>> A=rand(2,1000);
Formemos una matriz correspondiente a x
2
+ y
2
:
>> B=A(1,:).^2+A(2,:).^2;
Los pares tales que x
2
+ y
2
< 1 cumplen [x
2
+ y
2
] = 0; los otros cumplen [x
2
+ y
2
] = 1.
Luego
>> n=1000-sum(floor(B));
y as´ı
>> aproximapi=4*n/1000
11: v1=ones(1,10); v2=5*ones(1,9); J=diag(v1)+diag(v2,1)
12: v1=ones(1,10); v2=5*ones(1,9); J1=diag(v1)+diag(v2,1)
w1=ones(1,7); v2=(-2)*ones(1,6); J2=diag(w1)+diag(w2,1)
J=[J1 zeros(10,7);zeros(7,10) J2]
13: p=ones(1,11);suma=polyval(p,1/3)
o tambi´en
sum((ones(1,11)/3).^(0:1:10))
14: p=[1 1]; q=conv(p,p); r=conv(q,q)
Observar que, aunque correcta, la siguiente expresi´on es inferior, ya que en ´esta
(1 + x)
2
es calculado 2 veces en vez de 1 s´ola vez.
35
3. Soluciones a algunos ejercicios.
p=[1 1]; r = conv(conv(p,p),conv(p,p))
15: p=[1 0 0 -1 0]; q=[1 1 1]; [C R] = deconv(p,q)
tienequedar0 = conv(C,q)+R-p
18: Se puede representar de esta manera:
>> x=-10:0.1:10;
>> y=x;
>> [X,Y]=meshgrid(x,y);
>> aux=X.^2+Y.^2;
>> numerador=cos(aux/4);
>> denominador=3+aux;
>> z=numerador./denominador;
>> surf(x,y,z)
19: Usamos dos veces cylinder pues hay que representar dos funciones (para el m´as
y para el menos de la ra´ız):
>> z = -1:.1:1;
>> r1 = 4 + sqrt(1-z.^2);
>> r2 = 4 - sqrt(1-z.^2);
>> cylinder(r1), hold, cylinder(r2), hold
20: El siguiente programa calcula la suma de los n primeros naturales:
function s=suma(n)
% Calcula la suma de los n primeros naturales
v=1:n;
s=sum(v);
21: El siguiente programa calcula s = 1 +
1
2
2
+
1
n
2
y
π
2
6
−s.
function [s,error]=sinv(n)
% Calcula s=1+1/2+...+1/(n*n) y pi*pi/6-s.
v=1./((1:n).^2);
s=sum(v);
error=pi^2/6-s;
22: Un punto arbitrario de A(S) es A(cos θ, sen θ), donde θ ∈ [0, 2π]. As´ı:
function condi(A)
theta=linspace(0,2*pi);
X=[cos(theta);sin(theta)];
Y=A*X;
title(cond(A))
plot(Y(1,:),Y(2,:))
23: Se puede implementar por medio de:
36
function [w1,n1,w2,n2]=suma(v)
% w:=sumas acumuladas de las dos maneras.
% n1:=numero de operaciones sin usar cumsum
% n2:=numero de operaciones usando cumsum
op=flops;
n=length(v);
a=tril(ones(n));
w1=a*v;
n1=flops-op;
op=flops;
w2=cumsum(v);
n2=flops-op;
24: Una vez creado el archivo f.m en donde se almacena el integrando, la f´ormula
de los trapecios se elabora:
function I=trapecio(a,b,n)
h=(b-a)/n;
x=a:h:b;
y=f(x);
I=h*(sum(f(x))+f(a)+f(b));
26: Hay que anidar condicionales:
function par(r)
if r==floor(r)
if r==2*floor(r/2)
disp(’es par’)
else
disp(’no es par’)
end
end
27: No hay m´as que modificar las l´ıneas 41–43, por ejemplo la 41 ser´ıa
X(i,:)=X(i,:)*R(i)+xc(i);
30: Si dividimos el intervalo [a, b] en 100 subintervalos:
function caos(a,b)
hold on
lambda=linspace(a,b);
for i=1:100
x=0.5;
for j=1:60
x=lambda(i)*x*(1-x);
37
3. Soluciones a algunos ejercicios.
if j>29
plot(lambda(i),x)
end
end
end
38
A. M´ınimos cuadrados.
´
Este y el siguiente ap´endice constituyen algunos ejemplos m´as o menos complicados
de una utilizaci´on (m´as bien pedag´ogica) de MATLAB .
El ajuste de datos por el m´etodo de los m´ınimos cuadrados es muy importante, a la
par que bastante bien estudiado. MATLAB dispone de una funci´on polyfit que imple-
menta dicho m´etodo. En el programa adjunto se proporciona una manera alternativa.
Obs´ervese el comando menu para crear men´ us interactivos. La orden strvcat con-
catena cadenas verticalmente.
function ajuste
% Realiza el ajuste por minimos cuadrados mediante
% Rectas, Hiperplanos, Polinomios, exponenciales.
ayuda=strvcat(’Si la tabla de datos es’,...
’ ’,...
’x : x1 x2 ... xn’,...
’y : y1 y2 ... yn’,...
’ ’,...
’Cuando le pregunte vector x, introduzca’,...
’ ’,...
’[x1 x2 ... xn]’,...
’ ’,...
’Analogo para y’,...
’ ’,...
’Pulse una tecla’);
K = MENU(’Elija una opcion’, ...
’Ajuste por rectas: y=a+bx’, ...
’Ajuste por polinomios: y=a0+a1*x+...+am*x^m’, ...
’Ajuste exponencial: y=a*e^(bx)’);
if K==1
clc
J = MENU(’Elija una opcion’, ...
’Ayuda’, ...
39
A. M´ınimos cuadrados.
’Calculos’);
if J==1
clc
disp(ayuda)
J=2;
pause
end
if J==2
clc
x=input(’vector x? ’);
y=input(’vector y? ’);
flag=0;
aju1(x,y,flag)
end
end
if K==2
clc
J = MENU(’Elija una opcion’, ...
’Ayuda’, ...
’Calculos’);
if J==1
clc
disp(ayuda)
pause
J=2;
end
if J==2
clc
x=input(’vector x? ’);
y=input(’vector y? ’);
m=input(’grado del polinomio? ’);
aju2(x,y,m)
end
end
if K==3
J = MENU(’Elija una opcion’, ...
’Ayuda’,...
’Calculos’);
if J==1
clc
disp(ayuda)
pause
40
end
clc
x=input(’vector x? ’);
y=input(’vector y? ’);
y=log(y);
flag=1;
aju1(x,y,flag)
end
Este fichero “llama” a aju1.m que es utilizado para el ajuste por rectas (flag=0) y
exponenciales (flag=1) y tambi´en a aju2.m que es el ajuste para polinomios.
function aju1(x,y,flag)
clc
if length(x)~=length(y),
error(’Las dimensiones de x e y deben coincidir.’)
end
mediax=mean(x);
mediay=mean(y);
varianzax=varianza(x);
covarianzaxy=covar(x,y);
pendiente=covarianzaxy/varianzax;
if flag==0
disp(’Si sale [a b c], la recta es y=a+b(x-c)’)
end
if flag==1
disp(’Si sale [a b c], la curva es y=a*e^(b(x-c))’)
end
[mean(y) pendiente mean(x)]
disp(’Pulse una tecla para ver el error y el Indice de determinacion’)
pause
varianzay=varianza(y);
disp(’Error cuadratico:’)
length(x)*(varianzax*varianzay-covarianzaxy^2)/varianzax
disp(’Indice de determinacion’)
(covarianzaxy^2)/(varianzax*varianzay)
if flag==0
disp(’Pulse una tecla para ver la grafica’)
pause
hold on
plot(x,y,’o’)
minimox=min(x);
41
A. M´ınimos cuadrados.
maximox=max(x);
t=[minimox maximox];
y=mean(y)*[1 1]+pendiente*(t-mean(x)*[1 1]);
plot(t,y)
end
if flag==1
disp(’Pulse una tecla para ver la grafica’)
pause
hold on
plot(x,exp(y),’o’)
minimox=min(x);
maximox=max(x);
t=linspace(minimox,maximox);
yt=exp(mean(y))*exp(pendiente*(t-mediax*ones(1,length(t))));
plot(t,yt)
end
Para dibujar la recta se aprovecha que basta hallar dos puntos y unirlos. En este
archivo se llaman a dos funciones para calcular la varianza y la covarianza:
function z = covar(x,y)
xy=x.*y;
z=mean(xy)-mean(x)*mean(y);
function y=varianza(x)
auxiliar=x-mean(x)*ones(1,length(x));
auxiliar=auxiliar.^2;
y=mean(auxiliar);
El ajuste por polinomios est´a implementado en la siguiente funci´on: Es f´acil probar
que si p(x) = a
0
+ a
1
x + + a
m
x
m
es el polinomio que mejor ajusta a los datos
x = (x
1
, , x
n
), y = (y
1
, , y
n
), entonces

¸
¸
¸
1 E(x) E(x
m
)
E(x) E(x
2
) E(x
m+1
)

E(x
m
) E(x
m+1
) E(x
2m
)

¸
¸
¸
a
0
a
1

a
m

=

¸
¸
¸
E(y)
E(yx)

E(yx
m
)

;
donde E(Z) indica la media aritm´etica de la variable Z, que en MATLAB se escribe como
mean(Z). Como la matriz suele estar mal condicionada; pero es definida positiva; para
resolver el sistema se hace la factorizaci´on de Cholesky: chol.
42
function aju2(x,y,m)
clc
if length(x)~=length(y),
error(’Las dimensiones de x e y deben coinidir.’)
end
if m==length(x) | m>length(x)
m=length(x)-1;
end
matriz=zeros(m+1,m+1);
for i=1:m+1
for j=1:m+1
matriz(i,j)=mean(x.^(i+j-2));
end
end
b=zeros(m+1,1);
for i=2:m+1
b(i)=mean(y.*(x.^(i-1)));
end
clc
disp(’Si la solucion es [a0 a1 ... am]’)
disp(’ es a0+a1*x+...+am*x^m’)
R=chol(matriz);
u=R’\b;
s=(R\u)’;
disp(’Pulse una tecla para saber el error cuadratico’)
pause
disp(’Error= ’)
s=fliplr(s);
p=polyval(s,x);
(norm(p-y))^2
disp(’Pulse una tecla para ver la grafica’)
pause
hold on
plot(x,y,’o’)
xmin=min(x);
xmax=max(x);
t=linspace(xmin,xmax);
yt=polyval(s,t);
plot(t,yt)
43
A. M´ınimos cuadrados.
44
B. Fractales.
En este ap´endice usaremos las capacidades gr´aficas de MATLAB para poder dibujar
algunos fractales conocidos, como el tri´angulo de Sierpinsky, la curva de Koch o el de
Mandelbrot. Todos los fundamentos matem´aticos de que se compone este ap´endice est´an
extra´ıdos de [4].
En primer lugar construiremos algunos fractales cl´asicos mediante la teor´ıa de los
sistemas de funciones iteradas. Definimos el siguiente conjunto:
/(IR
n
) = ¦K ⊂ IR
n
, K = ∅, K compacto¦.
Se define
d
H
(A, B) = max¦max
a∈A
d(a, B), max
b∈B
d(b, A)¦.
Se puede probar f´acilmente que esta aplicaci´on es una m´etrica, la llamada m´etrica de
Hausdorff, y no es tan sencillo probar que (/(IR
n
), d
H
) es completo. Por otra parte,
dadas
f
i
: IR
n
→ IR
n
, i = 1, , n,
aplicaciones contractivas de raz´on r < 1, entonces
F : /(IR
n
) → /(IR
n
), F(K) =
n
¸
i=1
f
i
(K)
es una aplicaci´on contractiva de raz´on r < 1. Por el teorema del punto fijo, la sucesi´on
(K
n
)

n=1
en el espacio /(IR
n
) dada por K
n+1
= F(K
n
) converge hacia un compacto K
F
no vac´ıo sin importar el valor inicial de la sucesi´on. Adem´as se tiene F(K
F
) = K
F
; es
decir
K
F
=
n
¸
i=1
f
i
(K
F
).
A (f
i
)
n
i=1
le llamaremos en lo sucesivo sistema de funciones iteradas y al compacto K
F
atractor para el sistema de funciones o fractal autosemejante.
Utilicemos MATLAB para generar gr´aficamente fractales de esta manera: Los com-
pactos en IR
2
los vamos a discretizar usando matrices cuadradas de ceros y unos. Si k es
45
B. Fractales.
el tama˜ no de una matriz T, querr´a decir que el compacto estar´a incluido en [0, k] [0, k],
y si T(i, j) = 1, quiere decir que el punto (i, j) est´a en dicho compacto y T(i, j) = 0 en
otro caso. El programa siguiente usa la funci´on sfi.m que es d´onde est´a implementado
el sistema de funciones iteradas:
function fractal(T,n)
% Construye fractales mediante un SFI.
% T una matriz cuadrada que representa (0s y 1s) el termino inicial
% n el numero de iterados. (se recomienda n<10)
% Si se quiere modificar el fractal hay que modificar el SFI.
colormap(prism)
k=length(T);
M=zeros(k);
for i=1:n
titulo=strcat(’Iteracion:’,num2str(i));
pcolor(T’)
shading(’flat’)
axis(’equal’)
title(titulo)
M=sfi(T);
T=M;
pause
end
A continuaci´on implementaremos el sistema de funciones iteradas. Como ejemplo,
implementaremos el siguiente:
f
1
(x, y) =
1
2
(x, y), f
2
(x, y) =
1
2
(x, y) + (
k
2
, 0), f
3
(x, y) =
1
2
(x, y) + (
k
4
,
k
2
).
Es evidente que f
i
son aplicaciones contractivas de raz´on 1/2, y que f
i
(K) ⊂ [0, k]
2
para
culquier compacto K ⊂ [0, k]
2
. Obs´ervese el uso de ceil para asegurar que los ´ındices
de la matriz sean enteros entre 0 y k.
function y=sfi(T)
% Implementa un SFI
k=length(T);
y=zeros(k);
for f=1:k
for c=1:k
if T(f,c)~=0
i1=ceil(f/2);
i2=ceil(c/2);
46
y(i1,i2)=1;
i1=ceil(f/2+k/2);
i2=ceil(c/2);
y(i1,i2)=1;
i1=ceil(f/2+k/4);
i2=ceil(c/2+k/2);
y(i1,i2)=1;
end
end
end
Se muestra varias gr´aficas para mostrar, como partiendo de algunos compactos, la
sucesi´on converge siempre al tri´angulo de Sierpinski. Se ejecuta fractal(T,6).
T=eye(100)+flipud(eye(100));
a=zeros(100); u=ones(1,100); a(1,:)=u; a(99,:)=u; a(:,1)=u’; a(:,99)=u’;
Se puede implementar f´acilmente el siguiente sistema fundamental de funciones:
f
1
(v) =
1
3
v, f
2
(v) =
1
3
G
π/3
(v) + u
2
, f
3
(v) =
1
3
G
−π/3
(v) + u
3
, f
4
(v) =
1
3
v + u
4
,
47
B. Fractales.
donde G
α
indica el giro de ´angulo α y u
2
= (k/3, 0), u
3
= (k/2, k

3/6), u
4
= (2k/3, 0).
Que como se ver´a, permite dibujar la curva de Koch:
Ahora representaremos el conjunto de Mandelbrot. Sea c ∈ CI , y sea f
c
: CI → CI dada
por f
c
(z) = z
2
+ c. Consideremos la sucesi´on S(c) = (0, f
c
(0), f
2
c
(0), ), es decir la
´orbita de 0 para el sistema din´amico generado por f
c
.
Se puede definir el conjunto de Mandelbrot como
´ = ¦c ∈ CI : S(c) no diverge a ∞¦.
Se puede demostrar que S(c) diverge a ∞ si y s´olamente si alg´ un punto de la ´orbita
tien m´odulo mayor o igual que 2. Este resultado nos permite representar el conjunto
de Mandelbrot. Simplemente se calculan los 100 primeros t´erminos de la ´orbita. El
Pseudoc´odigo es el siguiente:
Elegir rect´angulo del plano complejo
z = 0, j = 0.
Tomar c ∈ CI puntos de este rect´angulo.
Mientras j < 100 y [z[ < 2 hacer
z
1
= z
2
+ c, z = z
1
, j = j + 1.
Si [z[ < 2, dibujar c.
El programa (aprovechando que MATLAB posee aritm´etica compleja) es
function mandel(a,b,c,d)
% Representa el conjunto de Mandelbrot en [a,b]x[c,d].
hold on
vreal=linspace(a,b);
vimag=linspace(c,d);
for h=1:100
for k=1:100
48
z=0;
j=0;
c=vreal(h)+i*vimag(k);
while j<100 & abs(z)<2
z1=z^2+c;
z=z1;
j=j+1;
end
if abs(z)<2
plot(vreal(h)+i*vimag(k))
end
end
end
La siguiente figura se ha obtenido ejecutando mandel(-2,0.5,-1.25,1.25).
49
B. Fractales.
50
Bibliograf´ıa usada.
[1] Duane Hanselman, Bruce Littlefield. The MathWorks Inc. The student edition of
MATLAB : Version 5: User’s guide. Prentice Hall. 1997.
[2] The MathWorks Inc. The student edition of MATLAB 5.3: for Windows 95/N.
Prentice Hall. 1999.
[3] Jos´e Luis Hueso. Matem´atica Aplicada; Pr´acticas con MATLAB . Universidad
Polit´ecnica de Valencia. 1999.
[4] Miguel de Guzm´an, Miguel
´
Angel Mart´ın, Manuel Mor´an, Miguel Reyes. Estruc-
turas fractales y sus aplicaciones. Editorial Labor. 1993.
51

´ Indice.

0. Informaci´n General. o 1. Perdiendo el miedo. 1.1. Mandatos b´sicos. . . . . . . . . a 1.2. Variables. . . . . . . . . . . . . 1.3. Constantes y cadenas. . . . . . 1.4. Funciones. . . . . . . . . . . . . 1.5. N´meros Complejos. . . . . . . u 1.6. Vectores. . . . . . . . . . . . . . 1.7. Matrices. . . . . . . . . . . . . . 1.8. Polinomios. . . . . . . . . . . . 1.9. Gr´ficos. . . . . . . . . . . . . . a 1.9.1. Curvas planas. . . . . . 1.9.2. Curvas en el espacio. . . 1.9.3. Superficies en el espacio. 2. Aprendiendo a programar 2.1. Archivos.m . . . . . . . . 2.2. Bucles. . . . . . . . . . . . 2.3. Condicionales. . . . . . . . 2.3.1. La condici´n if . . o 2.3.2. La condici´n while o

v 1 1 2 3 4 6 7 9 12 13 13 15 16 19 19 24 27 27 30 35 39 45

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

3. Soluciones a algunos ejercicios. A. M´ ınimos cuadrados. B. Fractales.

3

´ Indice.

4

0. Informaci´n General. o
Este texto no tretende ser m´s que unos breves apuntes para presentar el programa a MATLAB y su lenguaje de programaci´n. Para una informaci´n m´s completa puede o o a utilizarse los manuales [1] o [2]. Estas notas est´n elaboradas, en su mayor´ a partir a ıa, de [3]. La versi´n de MATLAB usada es la 5.3 para Windows 95. o MATLAB (MATrix LABoratory) es un programa orientado al c´lculo con matrices, a al que se reducen muchos de los algoritmos que resuelven problemas de Matem´tica a Aplicada e Ingenier´ ıa. MATLAB ofrece un entorno interactivo sencillo mediante una ventana en la que podemos introducir ordenes en modo texto y en la que aparecen los resultados. Los gr´ficos a se muestran en ventanas independientes. Cada ventana dispone de una barra de men´s u que controla su funcionalidad. Aprenderemos a asignar, borrar, guardar y recuperar variables, utilizar las funciones incorporadas y, m´s adelante, a definir funciones nuevas. MATLAB opera directamente a con n´meros complejos y con n´meros reales como caso particular. u u Lo que distingue a MATLAB de otros sistemas de c´lculo es su facilidad para trabajar a con vectores y matrices. Las operaciones ordinarias, suma, producto, potencia, operan por defecto sobre matrices, sin m´s restricci´n que la compatibilidad de tama˜os en cada a o n caso. Entes matem´ticos como los polinomios son tratados por MATLAB como vectores, a gracias al hecho de que se suman y multiplican por escalares de la misma forma que ´stos. La multiplicaci´n y divisi´n entera de polinomios se efectan mediante ´rdenes e o o o espec´ ıficas, as´ como la evaluaci´n o derivaci´n de un polinomio. ı o o Una de las caracter´ ısticas m´s destacables de MATLAB es su capacidad gr´fica. Exa a plicaremos algunos comandos gr´ficos para representaci´n de funciones de una o dos a o variables en distintos sistemas de coordenadas.

v

sin bucles innecesarios y de a o ejecuci´n mucho m´s r´pida. por ejemplo. o a a Desde ahora y en adelante. Se debe interpretar el inductor >> como una invitaci´n o a escribir en MATLAB lo que aparece a continuaci´n del mismo. En o Courier cursiva indicamos par´metros de algunas ´rdenes. o MATLAB dispone de mandatos propios de un lenguaje de programaci´n para efectuar o bucles y bifurcaciones condicionales y puede ejecutar las ´rdenes contenidas en ficheros o grabados en ASCII mediante un editor como el bloc de notas o el editor de ficheros de o ´rdenes incorporado. destacaremos en Courier las ´rdenes que pueden introo ducirse en MATLAB tal y como aparecen o incorporarse a un fichero de ´rdenes. Al escribir.0. Informaci´n General. que deben sustituirse por a o un dato apropiado en cada caso. la suma de dos matrices como A+B obtenemos un c´digo o m´s claro y conciso que en otro lenguaje de programaci´n. o vi .

o help nos da una lista de temas sobre los que hay informaci´n de ayuda.txt y todo lo que salga en pantalla se grabar´ en un fichero taller. helpwin abre o una ventana de ayuda que es util para consultar informaci´n sobre rdenes de MATLAB ´ o sin interferir con la ventana principal. Pru´bese dir a: e Uno de los mandatos m´s utiles de MATLAB es diary. A prop´sito. ı. teclearemos o >> lookfor sine El mandato dir lista los ficheros del directorio actual. Si se tiene un diskette en la unidad a:.txt justo cuando se vuelva a a introducir el mandato diary. Perdiendo el miedo. si queremos ´ u ı. que permite guardar en un a ´ fichero todo el texto que aparece en la ventana de comandos. >> help demo explica brevemente el comando demo o >> help cos explica la funci´n cos (el coseno de un ´ngulo). MATLAB sugiere comenzar con la demo o con ´rdenes de ayuda. Por ejemplo: u u >> Help demo da un mensaje de error pues Help no es una orden de MATLAB y help s´ Para evitar ı. a Al abrir el programa. Mandatos b´sicos. a Otro comando util es lookfor tema de b´squeda. 1. se puede escribir >> diary a:taller. que MATLAB diferencie entre may´sculas y min´sculas teclearemos u u >> casesen off Obviamente. averiguar los comandos relacionados con la funci´n seno. As´ por ejemplo. el comando contrario ser´ casesen on. MATLAB distingue entre o a o may´sculas o min´sculas.1. Para a˜adir m´s texto en una misma sesi´n al diario n a o 1 .1. help tema explica sucintamente el tema elegido. As´ por ejemplo.

Si el resultado de una operaci´n no es o o o o asignado a ninguna variable. b = 4 y a continuaci´n o >> a+b. obviamente. ans = 6. Inicialmente. As´ ı mismo se pueden usar los par´ntesis () para concatenar expresiones.’a:’) path por s´ s´lo muestra los directorios en los que MATLAB busca los comandos. Variables. eligiendo estas opciones en el men´ de edici´n.1. no as´ los corchetes e ı [] que est´n reservados para introducir vectores y matrices. se escribir´ ı a >> path(path. Es decir. como siempre. El mandato % convierte en comentario lo que se escriba a continuaci´n. MATLAB puede usarse como calculadora (¡aunque sea infrautilizar MATLAB !). Este comando controla los directorios donde MATLAB “puede leer” las funciones que maneja. u o Otro comando util a la hora de manejar funciones definidas por el propio usuario es ´ path. *. Perdiendo el miedo. Para conservar este resultado se hace 1 Del ingl´s answer. Para aceptar.. evitando as´ tener que reescribir ´rdenes iguales o parecidas. MATLAB no “puede manejar” funciones escritas en un diskette insertado en la unidad a: Para que s´ las pueda manejar. resta. a continuacin el signo = y luego el valor que toma esa variable. e u o 1. Escribiendo s´lo el nombre de una variable o previamente asignada. MATLAB devuelve su valor. se puede escribir >> a = 3.. Vale usar [Ctrl]+C y [Ctrl]+V con el mismo fin. As´ por ejemplo: a ı. >> 3*((1+3)^(1/2)) proporciona. MATLAB lo asigna a la variable del sistema ans1 . hay que pulsar [Intro]. o MATLAB ignora lo que viene a continuaci´n del comando %. Tambi´n se puede “copiar” con el ı o e rat´n texto de cualquier sitio y “pegar” en la (´nica) l´ o u ınea de mandatos activa. o >> % Esto es un comentario Con las teclas del cursor [↑] y [↓] se recuperan los mandatos antes escritos. Basta escribir un nombre de variable. multiplie caci´n. -. Tamı o bi´n se puede controlar el path mediante el men´: File y a continuaci´n Set Path.2. Por ejemplo. / y ^ denotan las operaciones aritm´ticas de suma. Los signos +. En MATLAB las variables se asignan de modo natural. e 2 . divisi´n y elevaci´n a una potencia. creado se usa diary on al principio de lo que se quiera grabar y diary off al final (en este momento se graba realmente).

Se puede acceder a trav´s del men´ e incluso modificar n e u los valores existentes: File y a continuaci´n Show Workspace. >> c = ans o mejor a´n u >> c = a+b directamente. base de los u u logaritmos neperianos. la asignaci´n no resulta afectada.3. Si se pone un “punto y coma”. como i o j. pero no lo muestra en pantalla. Las variables de una sesi´n se pueden grabar en un fichero en disco. who se pueden recuperar ahora o en otra sesi´n con la orden o >> load a:taller De nuevo mediante el men´ File tambi´n se pueden ejecutar los comandos load y u e save. no tenemos m´s que pinchar en cada a variable. MATLAB utiliza ciertos nombres de variable para fines especiales. Naturalmente. La orden who lista las variables definidas y con la orden whos obtenemos adem´s el a tipo de variable y su tama˜o. calcula el valor de d. MATLAB a˜ade autom´ticamente la extensi´n mat y as´ n a o ı identifica el formato de estos ficheros. Constantes y cadenas. La orden o >> save a:taller guarda los nombres y los valores de las variables actualmente definidas en un fichero en a: llamado taller. Por ´ o a ejemplo. tras la asignaci´n no se muestra el resultado por o pantalla.1.mat. para el n´mero π. Para modificar las o variables una vez abierto el workspace browser. Si se borran las variables: >> clear. pero se obtiene f´cilmente como exp(1)2 . Esta forma de proceder o resulta util en la elaboraci´n de resultados que requieran c´lculos intermedios. clear sin argumentos elimina todas las variables. a a 2 El uso de la funci´n exp (exponencial) ser´ explicado en la secci´n siguiente. no est´ preasignado. clear c elimina la variable c. la orden >> d=(a+b)^2.3. Constantes y cadenas. 1. que designan ambas a la unidad imaginaria o pi. El n´mero e. o a o 3 .

La apariencia de los resultados se modifica por medio del men´ o con la orden format: Por ejemplo. >> format long. basta escribir el texto entre comillas.. .. >> ’Esto es una cadena’ Un texto sin comillas produce error porque MATLAB lo interpreta como un nombre de variable o funci´n. MATLAB lleva incorporadas una cantidad considerable de funciones. prevaleciendo esta ultima asignaci´n sobre el valor por defecto de MATLAB . · · · ym son m variables de salida: [y1. Perdiendo el miedo. xn) MATLAB reconoce las funciones matem´ticas elementales: a 3 Del ingl´s Not a Number. format rat aproxima el resultado por un cociente de enteros peque˜os.4. El resultado de 1/0 en MATLAB es Inf y el de 0/0.. La precisi´n relativa en operaciones de coma flotante se llama eps. . ´ o Por ejemplo. format long aumenta el n´mero de u u decimales visibles. Su sintaxis es la siguiente: Para una funci´n de una variable y de una salida es o variable de salida = nombre de funcion(variable de entrada) y si x1 . si no se utilizan n´meros complejos. · · · . Se pueden utilizar estos nombres de variables preasignadas para almacenar otros valores. Internamente MATLAB trabaja con mucha precisi´n.. NaN3 . Igualmente se podr´ ıamos llamar eps a una cantidad utilizada como criterio de convergencia.. Se pueden explorar otras opciones con help format. En realidad eps o es el mayor positivo que cumple 1+eps = 1. xn son n variables de entrada e y1 . 1. e 4 . . o >> Hola produce el error ??? Undefined function or variable Hola. Funciones.1. Para introducir una cadena. pi format short vuelve al estado inicial. n Podemos usar tambi´n cadenas de caracteres para manejar texto en funciones de e MATLAB . no hay inconveniente en representar u por i y j los ´ ındices de fila y columna de una matriz. ym] = nombre de funcion(x1. aunque por defecto muestra los o resultados con cuatro decimales. pero en general conviene evitar equ´ ıvocos empleando otros nombres de variable.

7321 (= 3) Funciones Trigonom´tricas Inversas e Funci´n o arcoseno arcocoseno arcotangente ··· Sintaxis Ejemplo Si se escribe equivale asin(X) asin(1) arcsen 1 acos(X) acos(1) arccos 1 atan(X) atan(Inf) “arctg(∞)” ··· ··· ··· Exponenciales Ejemplo Si se escribe equivale exponencial exp(X) exp(1) exp 1 logaritmo neperiano log(X) log(exp(2)) log(e2 ) logaritmo decimal log10(X) log10(1000) log10 (1000) logaritmo en base 2 log2(X) log2(1/4) log2 (1/4) √ ra´ cuadrada ız sqrt(X) sqrt(9) 9 Funci´n o Sintaxis al resultado 2. coherentemente con el uso habitual en matem´tica superior. Aparte a de estar el nombre en ingl´s (por ejemplo. 5 .5708 (=π/2) ··· Hay muchas m´s funciones que se pueden consultar tecleando help elfun. e • MATLAB reserva log para el logaritmo neperiano. pero en contraste con la pr´ctica en ingenier´ en a a ıa donde son m´s usados el logaritmo decimal o el de base 2. hay que tener e e en cuenta unos peque˜os detalles para evitar errores al usar funciones: n • Las funciones trigonom´tricas tienen el argumento en radianes.4. Funciones.7183 (=e) 2 3 -2 3 al resultado 1. el seno es sin (del ingl´s sine)). Funciones Trigonom´tricas e Funci´n o seno coseno tangente secante cosecante cotangente Sintaxis sin(X) cos(X) tan(X) sec(X) csc(X) cot(X) Ejemplo Si se escribe equivale sin(pi) sen π cos(-pi) cos(−π) tan(pi/4) tg(π/4) sec(pi/3) sec(π/3) csc(pi/4) cosec(π/4) cot(pi/6) cotg(π/6) al resultado 0 -1 1 2 √ 1.4142 (= √2) 1. a Se pueden ver otras funciones disponibles con help specfun.5708 (=π/2) 0 1.1.

. MATLAB dispone de una orden para dibujar f´cilmente funciones: es el comando a ezplot. sin. 2] se ecribir´: a >> ezplot(’(x^3+1)/x’. 4 El comando grid dibuja el “mallado” de la gr´fica y el comando axis controla los ejes de coordenadas. incluidas las funciones exp.2]) >> grid.[-2. Usar la orden hold depu´s de obtener el primer gr´fico para que los siguientes e a se dibujen en la misma ventana sin borrar los previos.5. del complejo z = 1 + i. *. ı La orden fplot proporciona m´s opciones para controlar el aspecto de la gr´fica a a 4 obtenida..1071 (=arctg 2) Se pueden dibujar n´meros complejos mediante plot y compass: u >> plot(1+2i.1. o 6 . si se quiere dibujar la funci´n f (x) = x x o definida en [−2.2]) Se recomienda escribir help ezplot y comprobar los ejemplos aqu´ propuestos. Por ejemplo.’*’) >> compass(1+2i) Ejercicio 1: Representa las potencias de exponente 1.[-2. Por ejemplo: >> z = 3 + 4i Obs´rvese que no es necesario poner el signo de multiplicaci´n. >> fplot(’[sinh(x). N´meros Complejos. permite representar varias funciones a la vez . u Los n´meros complejos se introducen tal y como se escriben en matem´ticas. Se escribe ezplot y a continuaci´n la expresi´n algebraica de la funci´n que se o o o 3 +1 desea dibujar entre comillas. 3 . cos que se eval´an sin m´s: exp(i*pi).tanh(x)]’. utiu a lizando i o j para la unidad imaginaria. a Se recomienda usar el comando help para estas ´rdenes. e o MATLAB trabaja por defecto con complejos. Por supuesto tiene implementadas las funciones u a b´sicas de los complejos: a Funciones Complejas Funci´n o Parte real Parte imaginaria Conjugado M´dulo o Argumento Sintaxis Si se escribe real(X) real(1+2i) imag(X) imag(1+2i) conj(X) conj(1+2i) abs(X) abs(1+2i) angle(X) angle(1+2i) Ejemplo equivale Re(1 + 2i) Im(1 + 2i) 1 + 2i |1 + 2i| arg(1 + 2i) al resultado 1 2 1 − 2i √ 2.2361 (= 5) 1. Perdiendo el miedo. axis equal 1. Por ejemplo. 2. entre el 4 y la i.cosh(x).

b) crea un vector con n = 100 elementos.inf). 2. desde a hasta b.3]) 7 . La norma (eucl´ ıdea) de un vector se calcula con el comando norm. Si se introduce √ produce 3. Separ´ndolas a por punto y coma o por medio de la tecla [Intro].6. v = [1. con MATa LAB se pueden manejar otro tipo de normas. Adem´s de esta norma. como la norma 1. obtenemos un vector columna. >> norm([1.n) crea n t´rminos en progresi´n aritm´tica.1:1 >> w=linspace(0. La orden linspace(a.6. e o e >> v= 0:0. Para introducir vectores en MATLAB se escriben sus componentes entre corchetes.7417 (= (1. norm(v. Con a:h:b se crea un vector o de componentes que van de a hasta b y distan h cada una de la siguiente. 1. Vectores.2. Por ejemplo: u = [1 2 3].3] % Vectores columna z = [1 2 3] Es muy frecuente tener que editar vectores con componentes equiespaciadas. Separando las componentes con comas o espacios obtenemos un vector fila. Vectores.b. para crear una tabla de valores de una funci´n.1).11) linspace(a. 3) = 12 + 22 + 32 ).1. o la norma infinito o supremo.2.1.3] % Vectores fila w = [1. norm(v. por ejemplo.2.

almacenando en un vector los 10 primeros naturales >> N=1:10. a 5 Si se introducen vectores mediante : y se escribe s´lamente v=a:b. si a > b.. ya que MATLAB aplica el producto matricial y los tama˜os no son coherentes. se pone >> a*u.^N. 1/3. v=[4 5 6]. / significa “hacer dichas operaciones coordenada a coordenada”. En ocasiones hay que multiplicar dos vectores elemento a elemento y eso MATLAB lo hace con la versi´n “punto” del producto.1...^3 o las 10 primeras potencias de 2 con 2. Ejercicio 3: Obtener 10. Una caracter´ ıstica destacable de MATLAB es que eval´a una funci´n sobre todas las u o componentes de un vector simult´neamente. Ejercicio 2: Obtener 1. o 8 . el paso h debe ser negativo. lo cual es muy pr´ctico.. >> u. Sugerencia: Cuando se introducen vectores mediante v=a:h:b. podemos5 calcular los 10 primeros cubos con N. produce un mensaje de error. para a a construir tablas de funciones o representarlas gr´ficamente. Perdiendo el miedo. ^. por ejemplo. es decir v=a:1:b. Sin embargo. Por ejemplo: o >> u=[1 2 3]. Por ejemplo. . 2/9. 1/10. Para multiplicar un vector u por un escalar a. . 8/3... 1/2. El “punto” n antepuesto a las operaciones *. o u La suma (o resta) de dos vectores del mismo tama˜o se efect´a con MATLAB esn u cribiendo u + v (u-v para la resta). La funci´n length devuelve el n´mero de componentes de un vector. esto equivale a decir que la o separaci´n de las componentes de v es 1. la orden u*v. 9/2. 1/10.*v produce el vector [4 10 18].

3) y v = (4. 5. 9 .1) (6.y) La siguiente tabla muestra algunas de las funciones para vectores m´s usuales.-3) (3.Y) dot(u. Esto supone la ventaja substancial de no tener que declarar tipos de variable ni tama˜os de fila o columnas para trabajar n tanto con matrices de n´meros reales o complejos como con vectores o escalares. Matrices. Por defecto. que se u consideran casos particulares de matrices.4) sum(X) sum(u) prod(X) prod(v) dot(X.7.2.7.v) fliplr(X) flipud(X) fliplr(u) (flipud(v’))’ Observar que el producto vectorial s´lo est´ definido para vectores de IR3 . 3)t  2  3 1+2+3 4·5·6 u. 2.5. Los elementos de una fila se separan por “comas” y las distintas filas por “puntos y comas”. 15 n=1 1. calcular la media aritmetica de sus componentes. o a Ejercicio 4: Calcular la suma de los cuadrados de los mil primeros naturales.1. 2.1:2 >> y = exp(x) >> plot(x. 15 2πn Ejercicio 6: Calcular la siguiente expresi´n: o sen . Ejercicio 5: Dado un vector v. Funciones Vectoriales Funci´n o Sintaxis Si se escribe Transpuesta Suma de componentes Producto de componentes Producto escalar Producto vectorial Voltear de derecha a izquierda Voltear de arriba a abajo X’ u’ Ejemplo equivale  resultado al  1 (1. MATLAB trabaja con matrices.v) cross(X. 6).Y) cross(u. Las matrices se escriben por filas. Los a ejemplos son para u = (1.6. Matrices. >> x = -2:0. v u∧v 6 120 32 (-3.

Perdiendo el miedo. podemos tambi´n separar los elementos de una fila con e espacios y las filas pulsando la tecla [Intro].3 4]. A(:. >> M32 = M(fil.3.1.-1)+2*diag([v 1])+diag(v.col) La funci´n size devuelve un vector de dos componentes que son el n´mero de filas o u y el n´mero de columnas de la matriz: u >> [filas. Ejercicio 7: ¿Qu´ calcula en realidad el siguiente comando e >> prod(diag(A))-prod(diag(flipud(A))) para matrices de orden 2? 10 .4]. >> v=[1 2 3]. Tambi´n se puede usar como diag(matriz. basta escribir los bloques por filas. para cambiar el elemento (2. >> B = [-1 -2 -3 -4] El elemento en la fila i y la columna j de la matriz A es A(i. >> A = [1.j). w=diag(B) El comando diag en realidad tiene dos argumentos de entrada: diag(vector.3.4]. Por ejemplo: >> M = [A. A=diag(v) >> B=[1 2. An´logamente. k = 0 es la diagonal principal.A] Para extraer una submatriz. k) (k es un entero que denota la posici´n del vector. k). diag (matriz) produce un vector cuyas componentes forman la diagonal principal de la matriz.1) = 0 A(i.1) produce una matriz de bandas. diag (vector) produce una matriz diagonal cuya diagonal principal es el vector.:) denota la fila i de la matriz A. Por ejemplo. >> M41 = M(1:3. 1) de A por 0 hacemos: >> A(2. Con tal de que o sus tama˜os sean coherentes. seg´n si el argumento es u una matriz o un vector.2. k > 0 por o encima y k < 0 por debajo). a En ocasiones resulta c´modo construir una matriz a base de bloques.j) es la columna j de A.2. como si se tratase de n elementos individuales.2:4) Las filas o columnas no tienen por que ser consecutivas: >> fil = [1. Observar e como >> v=[1 1 1].columnas] = size(M) El comando diag tiene dos comportamientos distintos. col = [1.B. Se pueden modificar componentes de una matriz. se indican las filas y columnas de que se compone. A=diag(v.4] Lo mismo que con vectores.B.

A^2 La inversa de una matriz A se puede escribir o bien A^(-1) o usando la funci´n inv: o inv(A). La suma. la distribuci´n normal de media 0 y u u o desviaci´n t´ o ıpica 1. MATLAB usa m´todos num´ricos estables (eliminaci´n gaussiana). la soluci´n del sistema Ax = b. o Matrices Especiales Funci´n o Matriz identidad de orden n Matriz nula de orden n × m Matriz de unos de orden nula n × m Matrices aleatorias de orden n × m Sintaxis eye(n) zeros(n.. Observar la diferencia entre >> A*B. 1] al azar..m) rand(n. la probabilidad de que u x2 + y 2 ≤ 1 es π . Asimismo.’ Ejercicio 8: Dada una matriz A.*B. ) con el comando help elmat.m) ones(n. A’ es la transpuesta de A. 11 . 5*A. contar cu´ntos de ellos cumplen a 4 n 2 2 x + y ≤ 1. rank(A) estima el rango de A. 1]. e e a Para multiplicar dos matrices elemento a elemento. Bien entendido que la soluci´n no se obtiene calculando la inversa de A. sean n. A’ es la transpuesta conjugada. MATLAB interpreta A/B como AB −1 e interpreta A \ B como A−1 B. A^-1. A. y aproximar π por 4 1000 . Ejercicio 10: Si se eligen dos n´meros x. Se pueden consultar las funciones de redondeo mediante lookfor round. 1). det(A) proe e o porciona el determinante. En el caso complejo. Se pueden consultar m´s tipos de matrices especiales (por ejemplo de Van der Monde. se usamos las variantes “punto” de las operaciones correspondientes. o multiplicaci´n se efect´a de la manera obvia (siempre que los o u o ´rdenes de las matrices lo permitan): >> A + B. que formalmente es x = A−1 b. se obtiene en MATLAB con o A \ b. en concreto la parte entera es floor.1. calcular la traza (¡sin usar el comando trace!) MATLAB tiene varias funciones que facilitan la edici´n de matrices de uso frecuente. a Hilbert. . Elegir 1000 puntos (xi . resta. u randn produce n´meros aleatorios seg´n N (0. La transpuesta sin conjugar se obtiene con A.7.m) El comando rand produce n´meros aleatorios uniformemente distribuidos en [0. Ejercicio 9: Simular 10 lanzamientos de un dado. yi ) al azar. A. A*B. A-B.^-1 Si A es una matriz real. Matrices. y ∈ [0. sino o aplicando m´todos num´ricamente m´s eficientes (ver help slash).

3) eval´a el polinomio en x0 = 3. El producto de polinomios se hace con la orden conv y la divisi´n con resto se hace con o 12 . 1 3 + 1 32 + ··· + 1 310 por lo menos de dos maneras Esta funci´n. resta y producto por un escalar de polinomios corresponden exactamente con las mismas operaciones de vectores. MATLAB posee adem´s un n´mero considerable de funciones avanzadas para matria u ces: Por ejemplo. la norma. tabla=[x. As´ por ejemplo. como muchas de MATLAB . Cons´ltese help matfun para una u mayor informaci´n. la exponencial. Por o ejemplo. J1 O Ejercicio 12: Construir la siguiente matriz de Jordan: . de Cholesky.1. p(x) = 2x3 − 5x2 − 7. valores y vectores propios. donde J1 y J2 O J2 son dos bloques de Jordan. Perdiendo el miedo.y). MATLAB se vale de vectores para manejar los polinomios. dado un vector r. 1] se escribir´: a >> p=[1 0 0 -1]. El valor del polinomio p en un punto se halla con polyval. el primero de orden 10 asociado a 5 y el segundo es de orden 7 y asociado a -2. ordenados de mayor a menor grado.. x=linspace(-1. ıces >> poly(r) Las operaciones de suma. . las factorizaciones LU.y] La gr´fica e obtiene con plot(x. Para ello considera las componentes de un vector como coeficientes de un polinomio. o 1.. Para hallar las ra´ ıces de 4 3 2 x − 2x + 2x − 2x + 1 hacemos: >> r = roots([1 -2 2 -2 1]) Rec´ ıprocamente. calcular el espacio nulo. la orden polyval(p. si.x). y=polyval(p. se desea hacer una tabla de 20 valores del polinomio x3 − 1 en el intervalo [−1. Ejercicio 11: Construir el bloque de Jordan de orden 10 asociado al valor propio 5. el vector p = [2 -5 0 -7]. QR.20).8. representa al polinomio ı. u Ejercicio 13: Calcular la suma 1 + distintas. puede evaluarse sobre un vector.1. Polinomios. a Las ra´ ıces de un polinomio (reales y complejas e incluso con las multiplicidades correspondientes ) se obtienen inmediatamente con roots. poly(r) es el polinomio con coeficiente director unidad cuyas ra´ son las componentes del vector. Por ejemplo.

(xn . >> title(’Mi polinomio’) >> xlabel(’Abscisas’). siendo x = (x1 . Gr´ficos.1. 2] podemos hacer >> p=[1 0 -1 0].y) representa los pares (x1 . >> plot(x. a Hemos utilizado ya algunas ´rdenes gr´ficas de MATLAB . valores almacenados en una matriz y e funciones de dos variables. y el resto.9. A continuaci´n comprobar que p(x) = C(x)q(x)+R(x). y2 .y) Por defecto. (x2 .divisor) Ejercicio 14: Calcular (x + 1)4 . Hallar el cociente. como fplot o ezplot para o a representar expresiones algebraicas. polares y param´tricas. >> plot(x. o La orden title sirve para poner un t´ ıtulo al gr´fico. modificamos el color y el estilo del trazo. C(x). xn ) e y = (y1 . q(x) = x2 +x+1.1. x=linspace(-1. La orden plot(x.9. Igualmente podemos poner a t´ ıtulos en los ejes con xlabel e ylabel. Veremos alg´n comando m´s para representar funciones a partir de su expresi´n en u a o coordenadas cartesianas. Curvas planas. · · · . A˜adiendo un tercer n argumento. Hemos usado ya este comando para representar funciones: Por ejemplo. y1 ). ylabel(’Ordenadas’) 13 .y. · · · . yn ). plot une puntos consecutivos mediante un segmento.resto] = deconv( dividendo. Gr´ficos.2). si deseamos representar p(x) = x3 − x en el intervalo [−1. y=polyval(p.9.x). As´ con ı. · · · . 1.’*’) visualizamos los puntos que determinan el polinomio del ejemplo anterior. y2 ). a [cociente. Con help plot vemos las distintas combinaciones de car´cteres v´lidas como tercer a a argumento de esa funci´n. compass y plot para representar n´meros compleu jos. o 1. yn ). El argumento de estas funciones ha de ser una cadena o una variable de este tipo. x2 . R(x) de la divisi´n eucl´ o ıdea p/q. Ejercicio 15: Sean p(x) = x4 −x.

θ ∈ [0.5. 2π]. 4] y Para dibujar una curva en coordenadas polares se usa el comando polar. bien mediante coordenadas o con el rat´n. Podemos a˜adir cualquier texto sobre el gr´fico sin m´s que indicar la posici´n en que n a a o debe aparecer. Por ejemplo. de modo que cada fila es d´nde pinchamos con el rat´n en la o o gr´fica. >> z = 0:pi/300:pi. a log x x en el intervalo [1. Para escribir la palabra o M´ximo en el punto de coordenadas (1. r = sin(5*z). Su representaci´n o e o en MATLAB se obtiene con.’M´ximo’) a Tambi´n podemos situar el texto con el rat´n e o >> gtext(’M´nimo’) ı Otra posibilidad util es la de extraer valores del gr´fico.1.5.r) 14 . polar(z. la ecuaci´n de la rosa de 5 p´talos es ρ(θ) = sen(5θ). a Ejercicio 16: Dibujar la gr´fica de la funci´n f (x) = a o mediante el comando ginput estimar cu´l es el extremo. 2) utilizamos a >> text(1. Perdiendo el miedo. ginput(n) forma una matriz ´ a de 2 columnas y n filas.2.

t1 ] → IR3 . a Para representar una curva en param´tricas se procede del modo siguiente: Por e ejemplo.y.6*pi). β(t) = (− sen t. >> plot3(x. t ∈ [0.*sin(t).z=t. Para representar una curva en el espacio (en param´tricas).-x.9. >> x = t. α(t) = e (x(t).y) Para que vea mejor.4*pi). Para dibujar dos h´lices entrelazadas e α(t) = (sen t.1.’b’) Para dibujar una trayectoria helicoidal sobre una superficie c´nica: o >> t = linspace(0.’r’. e ´ o 15 . t).t) El comando view sirve para situar el “punto de vista”. la ecuaci´n de la cicloide es α(t) = (1 − cos t. >> x=sin(t). elevaci´n) (ambos en grados sexagesimales).y=cos(t). y = t. se escribe >> t=linspace(0. >> plot(x. y(t). − cos t. se puede escribir axis equal.2.*cos(t). Azimut es el ´ngulo de rotaci´n horizontal o a o y elevaci´n es el vertical.z. t − sen t). z(t)).-y. >> plot3(x. t). Unos comandos m´s interactivos (con el rat´n) son rotate3d o a o y zoom en ´ste ultimo se manejan los dos botones del rat´n. 6π] se representa o por medio de >> t = linspace(0. Gr´ficos. >> x = t-sin(t).9. α : [t0 . se usa el comando plot3.y. y = 1-cos(t). cos t. t ∈ [0. 4π]. 1.z. La sintaxis es view(azimut.10*pi). Curvas en el espacio.

a 16 . que a partir de un conjunto de valores de x y otro de y. Superficies en el espacio. Perdiendo el miedo. La matriz z se obtiene evaluando la funci´n que se desea representar sobre el par de matrices obtenidas. 1] × [−1. o Hay que tener cuidado en emplear las versiones “punto” de las operaciones producto. La idea b´sica para representar funciones de dos variables es evaluarlas en un conjunto a de puntos del plano XY formando una malla rectangular.y. 1]: a >> >> >> >> x = -1:0. almacenar estos valores en una matriz y utilizar ´rdenes de MATLAB que representan estos valores como alturas o sobre el plano y mediante colores o curvas de nivel.1:1. o No siempre es tan f´cil disponer los valores de la funci´n en una matriz z de modo a o que la posici´n en la matriz corresponda con las coordenadas del punto (x.3. y = -1:.y. pues la funci´n act´a elemento a elemento.^2.z) % Cortes verticales Ejercicio 17: Representar la funci´n z = sen x cos y en [0. X e Y .1:1.z) % Mallado de la superficie contour(x. surfc(x. 1] × [−1. aux = x2 + y 2 . MATLAB o nos ayuda con la orden meshgrid. 1.z) % Superficie de placas mesh(x. 1] se procede de la manera a siguiente: >> >> >> >> >> >> >> >> x = -1:0. crea dos matrices.^2 + Y.z) Ejercicio 18: Representar un sombrero: cos f (x. y = -1:0. con las coordenadas de los puntos de la malla. [X. % Columna x Fila = Matriz cuadrada surf(x.y. o u Si se desea representar la cu´drica z = x2 − y 2 en [−1. y). z = y’*x.y.Y] = meshgrid(x. 5] × [−5.1. cociente y potencia.y.z) % Superficie y curvas de nivel waterfall(x. 2π].z) % Curvas de nivel surfl(x.y) z = X.z) % Superficie suavizada surfc(x. f : [−5.y.1:1.y.9. 5] → IR.1:1. Para representar z = xy en el rect´ngulo [−1. 2π] × [0. y) = x2 +y 2 4 % Truco! % !Ojo al punto! 3 + x2 + y 2 . Sugerencia: Para evitar duplicar c´lculos utilizar una variable auxiliar.

1. o a u pcolor(x. Por ejemplo colormap summer La funci´n pcolor muestra un rect´ngulo coloreado seg´n el valor que se representa. hidden off Con hidden on volvemos al estado normal en el que se ocultan las l´ ıneas posteriores. hold Generar superficies de revoluci´n es muy f´cil con MATLAB . hold La letra k en la instrucci´n de contour indica el color con el cual queremos dibujar o las curvas de nivel: blacK. La sintaxis es o cylinder(vectorderadios.z).9.’k’).z). est´n los siguientes: Para a crear una malla transparente hacemos >> mesh(x.z.y.z. a El aspecto de la superficie puede modificarse de varias maneras. shading flat >> shading interp >> shading faceted % sin malla % color degradado % losetas con borde El color se cambia con colormap que tiene algunas opciones predefinidas (ver la ayuda de graph3).y. rotate3d y zoom. Si en cambio queremos mostrar las curvas de nivel sobre la superficie. shading interp.z).z) Jugando con las opciones de sombreado y a˜adiendo curvas de nivel en negro. Las opciones de sombreado muestran u ocultan la malla sobre la superficie.’k’). hacemos lo mismo con surf y contour3 >> surf(x.y. hold contour3(x. shading interp.y. numerodepuntosdelacircunferencia) 17 . Gr´ficos. contour(x.y. creamos n un mapa f´ ısico: >> hold. >> surf(x. Basta crear un vector o a con los radios de la superficie a intervalos regulares del eje de revoluci´n y utilizar la o funci´n cylinder. Aparte de los comandos vistos para curvas en el espacio.y.

100) Ejercicio 19: La ecuaci´n de un toro de radio mayor R y menor r (centrado en el o √ origen).10). cylinder(r) >> r=2*ones(1. r]. z ∈ [−r.50) >> r = 1:-. cylinder(r. r = 1. Veamos algunos ejemplos: >> r=2*ones(1.1.1:0. Observando que el toro es una superficie de revoluci´n. Perdiendo el miedo. es dibujar una esfera: sphere a a u 18 . desde luego. M´s f´cil a´n. es en ecuaciones cil´ ındricas: ρ(z) = R ± r2 − z 2 . cylinder(r. usar el comando cylinder para dibujar un toro o cuando R = 4.10).

resta = A-B.m. Como ejemplo creamos un fichero que calcula la suma y resta de dos matrices: En el e men´ File se elige New M-file para entrar en el editor de MATLAB y en ´l escribimos u el siguiente texto: function [suma. suma = A+B. • Se graba en a: con el nombre sumres. Son simplemente o u ficheros de texto que contienen ´rdenes de MATLAB .resta] = sumres(A.2.’a:’) • Se ejecuta: [M.m. res = A-B.m • Se indica la ruta para llegar al fichero: path(path. Aprendiendo a programar 2.m En estas dos ultimas horas aprenderemos (m´ ´ ınimamente) a usar el lenguaje de programaci´ de MATLAB para crear nosotros mismos funciones. • Guardarlo con extensi´n . % Salida: Dos matrices: sum = A+B.1.B) % Datos de entrada: Dos matrices A y B. o • Indicar a MATLAB d´nde est´ el archivo con path(path. o a o • Ejecutarlo escribiendo en la l´ ınea de ´rdenes el nombre de fichero y los par´metros o a de entrada necesarios.’direcci´n’).N] = sumres(eye(2). Su uso requiere: o • Editar el fichero con el editor de MATLAB o con un editor ASCII. Archivos.eye(2)) • Obs´rvese la importancia de las primeras l´ e ıneas: help sumres 19 . o La programaci´n en MATLAB se efect´a mediante ficheros.

% x=cos(t).-sin(pi/6) -sin(pi/6) 1]. Veamos un ejemplo m´s complicado: Aunque ya sepamos dibujar curvas param´tricas a e en el espacio (plot3). .. sen 210 ). ym son los argumentos de salida function [y1.m es un archivo de funci´n. borra los ejes y superpone varios gr’aficos. ym]=nombre de funci´n (x1. % dibuja(v) % Inicializa la matriz proyecci’on iso=[-cos(pi/6) cos(pi/6) 0. % z=t/4.. · · · . Luego la proyecci´n de (x..sent. % Ejemplo: H’elice a(t)=(cost.2. y. . xm son los argumentos de entrada e y1 . · · · .z]. Por ejemplo. p(e2 ) = (cos 330 . p.. Aprendiendo a programar El fichero sumres. xn) o Es aconsejable que el nombre de la funci´n coincida con el nombre del fichero . % v=[x. % y=sin(t). Hay muchas funciones implementadas en MATLAB que podemos ver su listado. veamos otra manera: La proyecci´n isom´trica. al incluir en la primera l´ o ınea la palabra clave function. % Misma escala.t/4) % t=0:0.05:8*pi.. sen 330 ). de IR a IR tal que p(e1 ) = (cos 210 .m o La orden type(fichero) muestra en pantalla el listado del programa. 1). type hilb muestra en pantalla c´mo formar la matriz de o Hilbert.y.. p(e3 ) = (0. Podemos escribir type sumres. La sintaxis es la siguiente: Si x1 . z) se puede calcular o   x − cos(π/6) cos(π/6) 0   y − sen(π/6) − sen(π/6) 1 z function dibuja(v) % dibuja curvas 3D en proyecci’on isom’etrica. axis(’equal’) axis off hold on % Dibuja el eje x 20 . es una aplicaci´n o e o 3 2 o o o o lineal.

:).:).’z’]) 21 . plot([0.m(2)]. Archivos.[’x’.’y’.:)).[0. x=m(1.’x’) % Dibuja el eje y ymax=max(v(2.0.’b’) text(m(1).:). y=m(2. (La o a forma de ejecutar la funci´n es exactamente la misma que la anterior) o function iso(v) % dibuja curvas 3D en proyecci’on isom’etrica.’b’) text(m(1).:).:)).m(2)].2*iso*ejes. compass(m(1. axis(’equal’) axis off hold on % dibuja ejes ejes=diag(max(v’)).:)).m(1)].2.m xmax=max(v(1. m=1. xm=[xmax. zm=[0.m(2). m=1. ym=[0.[0.-sin(pi/6) -sin(pi/6) 1].m(2. m=1.:).’z’) % Dibuja la curva en 3d m=iso*v.’y’) % Dibuja el eje z zmax=max(v(3.’b’) text(m(1.y) Una versi´n matricial (m´s compacta) del programa anterior es la siguiente. iso=[-cos(pi/6) cos(pi/6) 0. m=1.m(2)].m(2). plot([0.:).m(1)].ymax.[0.0].1.m(2).2*iso*zm.0.2*iso*ym.0].m(1)]. plot(x.zmax].’b’) text(m(1).2*iso*xm.m(2. plot([0.

· · · . 1 Ejercicio 21: Elaborar un archivo . si o o no lo fuese. plot(m(1.’r’) Ejercicio 20: Calcular la suma de los n primeros naturales.:).m(2.2. El siguiente ejercicio muestra un ejemplo sencillo de c´mo se obtienen n´mero de o u operaciones diferentes al calcular lo mismo. Ejercicio 22: Sea A una matriz real de orden 2. y) = 1} (Esta elipse es la c´nica de ecuaci´n X t (AAt )−1 X supuesta A invertible. a u (Lo que nos puede decidir entre varios algoritmos diferentes).:). donde S es {(x. Cuanto m´s achatada sea esta elipse.m para calcular S(n) = 1 + 212 + 312 + · · · + n2 . entonces ¡A(S) es un segmento!). y) ∈ IR2 : (x. operaciones=flops.operaciones hasta ahora Por ejemplo podemos estimar el n´mero de operaciones para elevar una matriz de orden u n al cuadrado de la manera siguiente: function operaciones=estima(n) % estima(n). a^2. operaciones=flops-operaciones. vn ) podemos construir el vector de 22 . Ejercicio 23: Dado un vector v = (v1 . v2 . Y 2 comprobar que para valores “grandes” de n. Por tanto la mejor manera para contar el n´mero de u operaciones de un cierto n´mero de instruciones es la siguiente u operaciones hasta ahora = flops Instrucciones numero de operaciones = flops . Estima el numero de operaciones para calcular el % cuadrado de una matriz de orden n a=rand(n). Se puede medir intuitivamente el condicionamiento de la matriz A observando la elipse A(S). peor a es el condicionamiento de A. o Hay una forma r´pida en MATLAB para contar el n´mero de operaciones efectuadas. v3 . Si escribimos >> flops MATLAB nos proporciona el n´mero de operaciones en coma flotante efectuadas desde u que hemos iniciado MATLAB . S(n) π6 . Elaborar un programa que calcule el n´mero de condici´n u o de una matriz A (cond) y que dibuje la c´nica A(S). Aprendiendo a programar % dibuja la curva m=iso*v.

Elaborar un archivo .m sumas acumuladas mediante  1  1   1   ··· 1 0 0 1 0 1 1 ··· ··· 1 1 ··· 0 ··· 0 ··· 0 ··· ··· ··· 1       v1 v2 v3 ··· vn    .1. a = x0 < a + h = o x1 < a + 2h = x2 < · · · < xn = b. Para ello escribimos dos programas.Calcula la integral por el m’etodo del punto medio --% integral(a. x=a+h/2:h:b-h/2. Si se divide [a.b. n:n’umero de divisiones. guardamos en el fichero f.m el integrando x function y=f(x) % Aqu’i almacenamos una funci’on y=f(x). la integral aproximada es h I (f (x0 ) + 2f (x1 ) + · · · + 2f (xn−1 ) + f (xn )) . uno donde se almacena el integrando y el otro en donde se describe el m´todo.m el m´todo: e function I=integral(a.b. El siguiente ejemplo es t´ ıpico: Se trata de evaluar de forma aproximada por el m´todo del punto medio una integral e definida. por ejemplo integral. y=sin(x). b:extremo superior.   La matriz se puede implementar usando tril(ones(n))1 ./x. 2 1 Los comandos tril y triu forman matrices triangulares inferior y superior respectivamente. h=(b-a)/n. Ejercicio 24: Elaborar un programa para calcular una integral definida por el m´todo e de los trapecios. y en otro fichero. b] en la partici´n equiespaciada por h. 23 . Una de las ventajas de las funciones de MATLAB es que podemos usar funciones implementadas por nosotros mismos para elaborar otro tipo de programas.n) % --.2.n): % a:extremo inferior.m para calcular el vector de sumas acumuladas y contar el n´mero de operaciones. ganando considerablemente en claridad: Si queremos calcular de e 1 forma aproximada 0 sen x dx. Archivos. Y as´ cuando queramos modificar el integrando e ı solo modificamos el fichero donde lo tengamos almacenado y no en donde est´ implea mentado el m´todo. I=h*sum(f(x)). Repetir lo u mismo mediante la orden cumsum.

/(x+eps). hay un problema de indeterminaci´n. Aprendiendo a programar sen x sen x dx. 2.n). Sugerencia: Al intentar evaluar la funci´n f (x) = o x x 0 en x = 0. for i=1:n s=s+i^2. En este caso se resuelve f´cilmente o a modificando ligeramente la funci´n: sin(x+eps). Bucles. si queremos formar el vector v = (1. Por ejemplo. ya que suponen un excesivo a gasto de tiempo. Un bucle es un conjunto de operaciones. ıa Otro ejemplo: Los dos siguientes calculan la suma de los n primeros cuadrados function s=suma(n) s=0. El programa sin usar bucles gana en legibilidad y en tiempo.2. del cual sabemos que se va a ejecutar una cantidad concreta de veces. n) (de una manera poco eficiente) podemos ejecutar Hacer desde i=1 hasta n → v(i)=i → siguiente i La sintaxis correcta es (inicializando el vector v) n=100. Por ejemplo.^2).2. end function s=suma(n) s=sum((1:n). end En lo posible se evitar´ el uso de bucles en MATLAB . for i=1:n v(i)=i. Un ejemplo un poco m´s complicado de utilizaci´n de bucles es el siguiente que a o muestra la bola unidad en IR2 para diferentes tipos de normas (¡e incluso la norma infinito!) 24 . como se muestra en el siguiente ejercicio: Ejercicio 25: Usar los comandos tic y toc para contar el tiempo de ejecuci´n y o comprobar que para los bucles el tiempo es mayor. lo anterior simplemente se implementar´ como v=1:100. v=zeros(1. La forma de usar estos comandos es tic operaciones toc. o 1 Intentar evaluar 2. · · · .

2. es preferible. (p puede ser Inf!) % intentos: el n’umero de vectores que se dibujan clf %sirve para borrar cualquier gr’afico anterior.y].axis([-1. y=y.[0 0].intentos) --% BOLA Una demostraci’on de la forma de la bola unidad en R2. %Calcula ’angulos equiespaciados theta=theta(1:length(theta)-1). %Inicializa el vector de normas for k=1:length(theta) %Calcula la norma p de cada vector norma(k)=norm(M(:. repetimos. end end Aunque. %Calcula los vectores y=sin(theta)./norma.’b-’) %dibuja los ejes hold on axis(’equal’) theta=linspace(0. end x=x. Por ejemplo. for i=1:n for j=1:n H(i. axis(’square’). o El paso de los bucles no tiene por qu´ ser 1.’ko’) %Dibuja en la punta del vector un c’irculo negro Tambi´n es posible anidar un bucle dentro de otro.[-1. Puede ser cualquier n´mero real (incluso e u negativo).k).intentos+1).0 1.0]) plot([-1. %Normaliza plot(x. En muchas ocasiones esto es e especialmente util para definir matrices.0 1. norma=zeros(1. Bucles.bola(p. como muestra el siguiente programa que calcula la soluci´n de Ax = b. evitar el uso de bucles: Escr´ ıbase type hilb para observar c´mo se puede implementar la matriz de Hilbert sin uso de bucles.intentos) % --. % La norma es ||(x. M=[x. function bola(p.length(theta))./norma.0].2. si se puede.0 -1.p).0 1.0 1.[0 0].0]. la matriz de Hilbert se define ´ 1 como hij = i+j−1 .y)|| = (x^p+y^p)^(1/p).y. Podemos elaborar el siguiente programa: function H=mihilb(n) H=zeros(n). siendo o A una matriz triangular superior de orden n con ning´n elemento nulo en la diagonal u 25 .2*pi.’b-’.j)=1/(i+j-1). x=cos(theta).

S=S+k.2. % b debe ser un vector columna n=length(A).k). x=zeros(n. a function x=sr(A.toc >> tic.v=zeros(1. (Antes de las dos sentencias se ha ejecutado clear all) >> S=0. Por ejemplo o >> (100+1e-15-100)*1e32 >> (100-100+1e-15)*1e32 producen ¡0 e 1017 ! respectivamente. Hay que tener en cuenta que MATLAB e trabaja con precisi´n finita. entonces ı xk = bk − n j=k+1 akj xj akk . el sumatorio se puede implementar f´cilmente como la fila k de A por el vector x columna.tic.1). for k=n:-1:1 x(k)=(b(k)-A(k.v(k)=2*k-1.for k=1:10000. Aprendiendo a programar principal y b un vector columna. un vector se obliga a que cambie la dimensi´n.S=sum(1:10000).end. Supuestos hallado hasta xk+1 .toc >> tic. Si ha medida que funciona un programa.for k=1:10000.b) % resuelve el sistema Ax=b por substituci’on regresiva % A ha de ser una matriz triangular superior cuadrada % con ning’un 0 en la diagonal principal. Estos sistemas se resuelven primero hallando xn . v=1:2:20000.toc • Dimensionar previamente los vectores.10000).v(k)=2*k-1. • Evitar en lo posible el uso de bucles.end.end. end A la hora de elaborar programas en MATLAB conviene tener en cuenta una serie de cuestiones para agilizar el rendimiento: • Elegir algoritmos num´ricamente robustos.:)*x)/A(k. MATLAB ralentiza considerablemente o el proceso: (Ejecut´ndose previamente clear all) a >> tic. toc 26 .toc >> tic.b) % x=sr(A. si se pueden usar funciones de tipo vectorial. luego xn−1 y as´ sucesivamente.for k=1:10000.

o o Disyunci´n (a>0)&(b<=0) devuelve [1 0 1]. no un n´mero predeterminado de veces (instrucci´n o u o for). Operadores l´gicos: Conjunci´n (a>=0)&(b>0) devuelve [0 1 0]. La sintaxis de la bifurcaci´n condicional if es la siguiente: o if condici´n o instrucciones end La instruci´n if se suele usar junto con else: Esta ultima instrucci´n permite o ´ o introducir instrucciones que se ejecutan si la condici´n es falsa. Si queremos usar una instrucci´n. Si ´sta no se verifica. 2. 1.3. La sintaxis es o if condici´n o instrucciones si la condici´n es cierta o else instrucciones si la condici´n es falsa o end Veamos algunos detalles sint´cticos a la hora de establecer condiciones. 0. • a~=0 devuelve [1 0 1]. Condicionales.3. • a>=0 devuelve [0 1 1]. entonces Igualdades: a==0 devuelve [0 1 0].1. La condici´n if o Una estructura de control util es la bifurcaci´n condicional if. El s´ ımbolo ~ se introuduce con [ALT]+126. o Negaci´n ~(a==1) devuelve [1 1 0]. 1) y si b = (0. si a = (−1. o Veamos un ejemplo sencillo: Dado un n´mero r. Las instrucciones que ´ o contienen if se ejecutan si se satisface la condici´n. Condicionales. mieno tras que la comparaci´n con ==. −1). 2. sino hasta que se satisfaga determinada condici´n. hemos de usar los condicionales o if y while. decidir si es entero o no: u 27 . MATLAB a reconoce expresiones l´gicas asoci´ndoles el valor 1 si son ciertas y 0 si son falsas (¡de o a manera vectorial!). se produce o e un salto hasta la orden siguiente a end. o Desigualdades: • a>0 devuelve [0 0 1]. Por ejemplo. Observar que la asignaci´n se realiza con =.2.3. o Disyunci´n exclusiva xor((a==1).(b>=-1) devuelve [1 1 0].

Si v = (cos α cos β. por supuesto. Las l´ ıneas 25 – 32 calculan las coordenadas esf´ricas e (α = latitud. z(t)). θ ∈ [0. Aprendiendo a programar function esentero(r) if r==floor(r) disp(’es entero’) else disp(’no es entero’) end Por supuesto los condicionales se pueden anidar uno dentro de otro. − cos β.2. 2π] 28 . Las l´ ıneas 11 – 13 muestran una utilidad t´ ıpica del condicional if mediante la variable nargin (=Number of ARGuments IN. y(t). − cos α). o El siguiente fichero dibuja una superficie tubular de radio R alrededor de la curva α(t) = (x(t). cos α sen β. 0) forman una base ortonormal del plano ortogonal a v. Por tanto w = w1 cos θ + w2 sen θ. sen α). tambi´n est´ la variable nargout). u s´lo en el supuesto de que sea entero. que aproximan a los vectores tangentes a la curva. e a La l´ ınea 23 calcula los vectores (almacenados en v) que forman la poligonal asociada a la curva. v es f´cil comprobar que a w1 = (sen α cos β. β = longitud) del vector v/ v . w2 = (sen β. Ejercicio 26: Modificar el programa anterior para decidir si un n´mero es par o no. sen α sen β. Ahora hay que construir circunferencias perpendiculares.

sbeta=0.Z=X. salfa=v(3)/V. X=zeros(n.yc(i+1)-yc(i). calfa=sqrt(v(1)*v(1)+v(2)*v(2))/V. a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 function gusano(xc. end h=2*pi/ntheta.ntheta+1). El resto del programa es f´cil de entender.Dibuja una superficie tubular --% sobre la curva [Xc Yc Zc] con radio transversal R.:)=z’.ntheta) % function gusano(Xc.R.ntheta) % % --. cbeta=v(1)/V/calfa. Condicionales. end x=+ct*salfa*cbeta+st*sbeta.Zc. ´ describe la circunferencia de radio 1 centrada en el origen perpendicular a v. end %Mueve y escala los c’irculos 29 . V=norm(v).zc(i+1)-zc(i)].Y=X. cbeta=1. z=-ct*calfa.3. if calfa~=0 sbeta=v(2)/V/calfa. % Por defecto ntheta=12. theta=(0:h:2*pi)’. Este es el objeto de las l´ ıneas 33 – 35.:)=y’.R.Y(i.Yc. st=sin(theta). y=+ct*salfa*sbeta-st*cbeta.2. %Construye n-1 c’irculos perpendiculares a cada segmento for i=1:n-1 v=[xc(i+1)-xc(i). % La curva debe tener al menos dos puntos.yc.:)=x’. n=length(xc). X(i. ct=cos(theta).Z(i. % ntheta es el numero de puntos de cada circunferencia transversal.zc. %preparaci’on if nargin==4 ntheta=12.

y(t).6 t. Por ejemplo el dibujo para la curva α(t) = (cos t.:).:)=Y(n-1. Y(i.:).:)=Z(i.2.:)=X(i. Las instrucciones que contiene el while se repiten hasta que se satisfaga la condici´n.:)*R+yc(i). lo m´s adecuado es usar la senteno a cia while. t ∈ [0.:)=Y(i. o de modo que en alg´n momento deje de verificarse.2. R(t) = 0. b] con radio variable R : [a. sen t.:)*R+xc(i). t ∈ [a. las instrucciones del while modifican la condici´n. 2π]. z(t)). Z(i.:). La sintaxis es la siguiente: u while condici´n o instrucciones end Veamos un ejemplo sencillo: Dado n π 1 − < 6 k2 k=1 2 > 0. b] → IR+ .:)*R+zc(i). encontrar el menor natural n tal que 30 . o e Para que el bucle no sea indefinido.Y.3. Y(n.:)=Z(n-1. Aprendiendo a programar 40 41 42 43 44 45 46 47 48 for i=1:n-1 X(i. Z(n. 0). La condici´n while o Si se quiere repetir un conjunto de instrucciones no un n´mero determinado de veces.7 − 0. u sino hasta que se cumpla una determinada condici´n.:)=X(n-1. se produce un salto hasta la orden que sigue al while.Z). end X(n. Si ´sta no se verifica. Ejercicio 27: Modificar el fichero previo para elaborar un programa que dibuje la superficie tubular alrededor de la curva α(t) = (x(t). debe ser 2π 2. surf(X.

while abs(a-f(a)) > precision & contador < itermax b=f(a).. Dado o o una funci´n f y una estimaci´n a de la ra´ de f (x) = x. end n=k-1. k=1. end n=length(x)-1. % itermax = N’umero m’aximo de iteraciones.m la funci´n o o f.2. x=[a]. function n=mierror(epsilon) % n=mierror(epsilon) % Dado epsilon>0 halla el menor natural n tal que % pi*pi/6-(1+1/4+1/9+.3. contador=1.precision. contador=contador+1. se estudia la convergencia de la o o ız sucesi´n formada por xn+1 = f (xn ). x=[x. a=b.precision. Hay que escribir antes en un fichero .. El siguiente ejemplo muestra c´mo se puede generar una sucesi´n de punto fijo. sumaexacta=pi^2/6. if (contador==itermax | abs(a)==inf) disp(’No converge’) else disp(’Soluci’on: ’) a disp(’Iteraciones: ’) n 31 .+1/n*n)< epsilon S=0. % precision = Precisi’on deseada. k=k+1. Condicionales.b].itermax) % calcula y dibuja los primeros iterados de punto fijo de la funcion f % La sintaxis es: % pfijo=(a.itermax) % a = Punto inicial. while sumaexacta-S>epsilon S=S+1/k^2. function pfijo(a.

4] (aproximadamente) la o sucesi´n a la larga oscila hacia dos valores. para λ ∈ [3. v=f(u). maxx=max(x).100).7385. n ∈ IN tiene un comportamiento ca´tico para algunos valores de λ ∈ [0. y=x en rojo. 4].’) for k=1:n-1 line([x(k). Aprendiendo a programar end if abs(a)~=Inf disp(’Pulse una tecla’) pause minx=min(x).v. 1] tienen un car´cter ca´tico.5. El comportamiento ca´tico se puede comprobar mediante o el ejercicio siguiente: Ejercicio 30: Consideremos la sucesi´n x0 = 0. y el comportamiento para λ cercano a 4 es o completamente imprevisible.1*rango. Para valores de λ o cercanos a 0.2. xn+1 = λxn (1 − xn ) para λ ∈ [0. Ejercicio 29: Comprobar que las sucesiones de punto fijo para las ecuaciones sen(πx) = x. con punto inicial x0 ∈ [0. · · · x60 ).x(k+1)]. hold off plot(u.’r’) title(’Funcion y=f(x) en negro. para la ecuaci´n cos x = x se puede ver que el m´todo converge hacia o e la ra´ ξ = 0.maxx+0. xn+1 = λxn (1 − xn ).u.5. ız Ejercicio 28: Modificar el fichero de punto fijo anterior para implementar el m´todo e de Newton.x(k+2)]) end hold off end Por ejemplo.1*rango.’k’) hold on plot(u.[x(k+1). rango=maxx-minx. 4]. a o La sucesi´n o x0 = 0.[x(k+1). y se o e 32 .x(k+1)]) line([x(k+1). u=linspace(minx-0. 3. o Para el estudio “a la larga” de la sucesi´n se va a tomar los t´rminos (x30 .x(k+1)]. 4x(1 − x) = x. la sucesi´n converge a un valor.

Condicionales. · · · . i = 30. n Para i = 1 hasta i = n hacer x = 0. Elaborar un programa en a donde se estudie dicho comportamiento. b ([a. xj ) para j = 30. b] subintervalo de [0. · · · . · · · . a + 2h. xi ) para λ ∈ [0. λ ∈ [0. e o Dibujar (λ.4]). La siguiente figura muestra el comportamiento para λ ∈ [2. El pseudoc´digo ser´ el siguiente: o ıa Datos de entrada: a. 1] y x0 = 0.5 Calcular los 60 primeros t´rminos de la sucesi´n xn .3. λ = (a. 4].2. 60. a + nh = b) (para un h peque˜o). dibujar´n los puntos (λ. fin para el bucle de i. 33 . a + h. 60.5. 4]: Tambi´n se puede estudiar el comportamiento ca´tico de la siguiente sucesi´n: xn+1 = e o o λ sen(πxn ).

2. Aprendiendo a programar 34 .

y as´ ı >> aproximapi=4*n/1000 11: v1=ones(1. Los pares tales que x2 + y 2 < 1 cumplen [x2 + y 2 ] = 0.1/3) o tambi´n e sum((ones(1. v2=(-2)*ones(1. J1=diag(v1)+diag(v2. q=conv(p.^2. Soluciones a algunos ejercicios.q) Observar que.1) 12: v1=ones(1.11). o 35 .1000)./(1:10) 3: (10:-1:1). aunque correcta. la siguiente expresi´n es inferior./(1:10) 4: sum(1:1000) 5: sum(v)/length(v) 6: sum(sin(linspace(2*pi/15. los otros cumplen [x2 + y 2 ] = 1.^2+A(2. Formemos una matriz correspondiente a x2 + y 2 : >> B=A(1.p). 2: 1. J=diag(v1)+diag(v2.10) J2] 13: p=ones(1.11)/3).7).6). r=conv(q.9).15))) 8: sum(diag(A)) 9: floor(6*rand(1.1) w1=ones(1.7).zeros(7. v2=5*ones(1. Luego >> n=1000-sum(floor(B)).:). v2=5*ones(1.10))+1 10: Se pueden generar 1000 pares de n´meros mediante u >> A=rand(2.9).^(0:1:10)) 14: p=[1 1].suma=polyval(p. ya que en ´sta o e 2 (1 + x) es calculado 2 veces en vez de 1 s´la vez.2*pi.1) J=[J1 zeros(10.3.10).:).10). J2=diag(w1)+diag(w2.

^2).sqrt(1-z. >> [X. >> numerador=cos(aux/4). hold 20: El siguiente programa calcula la suma de los n primeros naturales: function s=suma(n) % Calcula la suma de los n primeros naturales v=1:n.1:10. r = conv(conv(p. title(cond(A)) plot(Y(1. As´ ı: function condi(A) theta=linspace(0.q)+R-p 18: Se puede representar de esta manera: >> x=-10:0. >> surf(x. >> y=x.1:1. 1 21: El siguiente programa calcula s = 1 + 212 + · · · n2 y function [s. q=[1 1 1]. >> denominador=3+aux.z) 19: Usamos dos veces cylinder pues hay que representar dos funciones (para el m´s a y para el menos de la ra´ ız): >> z = -1:.Y]=meshgrid(x. 2π]. >> r1 = 4 + sqrt(1-z.sin(theta)]. donde θ ∈ [0.y.^2+Y. cylinder(r2).conv(p.. error=pi^2/6-s.^2)./((1:n). >> cylinder(r1). >> z=numerador.+1/(n*n) y pi*pi/6-s..3.p)) 15: p=[1 0 0 -1 0].q) tienequedar0 = conv(C./denominador. >> r2 = 4 .p). X=[cos(theta). s=sum(v).^2.error]=sinv(n) % Calcula s=1+1/2+.^2). >> aux=X. hold. v=1.2*pi). p=[1 1]. π2 6 − s. Soluciones a algunos ejercicios. sen θ).:). Y=A*X. [C R] = deconv(p.Y(2.y). 22: Un punto arbitrario de A(S) es A(cos θ.:)) 23: Se puede implementar por medio de: 36 . s=sum(v).

w2.:)*R(i)+xc(i). b] en 100 subintervalos: function caos(a. n1=flops-op.n2]=suma(v) % w:=sumas acumuladas de las dos maneras. y=f(x).n) h=(b-a)/n. w2=cumsum(v). por ejemplo la 41 ser´ ıa X(i. w1=a*v. x=a:h:b. for j=1:60 x=lambda(i)*x*(1-x).5.b. 30: Si dividimos el intervalo [a.n1. op=flops. % n1:=numero de operaciones sin usar cumsum % n2:=numero de operaciones usando cumsum op=flops.:)=X(i. 37 . 26: Hay que anidar condicionales: function par(r) if r==floor(r) if r==2*floor(r/2) disp(’es par’) else disp(’no es par’) end end 27: No hay m´s que modificar las l´ a ıneas 41–43.b) hold on lambda=linspace(a. for i=1:100 x=0. I=h*(sum(f(x))+f(a)+f(b)).m en donde se almacena el integrando. 24: Una vez creado el archivo f. a=tril(ones(n)).function [w1. la f´rmula o de los trapecios se elabora: function I=trapecio(a.b). n=length(v). n2=flops-op.

x) end end end 38 . if j>29 plot(lambda(i).3. Soluciones a algunos ejercicios.

.A. yn’..... ’ ’. o a o El ajuste de datos por el m´todo de los m´ e ınimos cuadrados es muy importante.. Polinomios.. xn]’. ´ Este y el siguiente ap´ndice constituyen algunos ejemplos m´s o menos complicados e a de una utilizaci´n (m´s bien pedag´gica) de MATLAB .. ’ ’. En el programa adjunto se proporciona una manera alternativa....... exponenciales. ’Analogo para y’...... ... MATLAB dispone de una funci´n polyfit que impleo menta dicho m´todo. M´ ınimos cuadrados..+am*x^m’. ayuda=strvcat(’Si la tabla de datos es’. ’Pulse una tecla’).. xn’.. La orden strvcat cone u catena cadenas verticalmente. ’Ajuste exponencial: y=a*e^(bx)’). ’Ayuda’. .. Hiperplanos.... ’[x1 x2 ... ’x : x1 x2 .. ’ ’. ’Cuando le pregunte vector x. introduzca’...... 39 ... . ’Ajuste por polinomios: y=a0+a1*x+. ’Ajuste por rectas: y=a+bx’.. ’y : y1 y2 . function ajuste % Realiza el ajuste por minimos cuadrados mediante % Rectas. e Obs´rvese el comando menu para crear men´s interactivos.. ..... a la par que bastante bien estudiado... ’ ’... K = MENU(’Elija una opcion’... . ’ ’.. if K==1 clc J = MENU(’Elija una opcion’.

. ’Calculos’)..flag) end end if K==2 clc J = MENU(’Elija una opcion’. end if J==2 clc x=input(’vector x? ’)...y. if J==1 clc disp(ayuda) pause 40 . M´ ınimos cuadrados.. .A.m) end end if K==3 J = MENU(’Elija una opcion’. aju1(x. if J==1 clc disp(ayuda) pause J=2. ’Calculos’).. ’Ayuda’.y. aju2(x. y=input(’vector y? ’). .. . pause end if J==2 clc x=input(’vector x? ’). ’Calculos’). ’Ayuda’. if J==1 clc disp(ayuda) J=2.. y=input(’vector y? ’). flag=0. m=input(’grado del polinomio? ’)..

y. pendiente=covarianzaxy/varianzax. varianzax=varianza(x). mediay=mean(y). aju1(x. covarianzaxy=covar(x. flag=1.flag) end ’).’) end mediax=mean(x).y).end clc x=input(’vector x? y=input(’vector y? y=log(y). if flag==0 disp(’Si sale [a b c]. error(’Las dimensiones de x e y deben coincidir.m que es utilizado para el ajuste por rectas (flag=0) y exponenciales (flag=1) y tambi´n a aju2. Este fichero “llama” a aju1.y. e function aju1(x.’o’) minimox=min(x).y. 41 . ’). la curva es y=a*e^(b(x-c))’) end [mean(y) pendiente mean(x)] disp(’Pulse una tecla para ver el error y el Indice de determinacion’) pause varianzay=varianza(y). la recta es y=a+b(x-c)’) end if flag==1 disp(’Si sale [a b c]. disp(’Error cuadratico:’) length(x)*(varianzax*varianzay-covarianzaxy^2)/varianzax disp(’Indice de determinacion’) (covarianzaxy^2)/(varianzax*varianzay) if flag==0 disp(’Pulse una tecla para ver la grafica’) pause hold on plot(x.flag) clc if length(x)~=length(y).m que es el ajuste para polinomios.

yt) end Para dibujar la recta se aprovecha que basta hallar dos puntos y unirlos. · · · . xn ). y=mean(y)*[1 1]+pendiente*(t-mean(x)*[1 1]).^2.*y. plot(t. E(yxm )  donde E(Z) indica la media aritm´tica de la variable Z. · · · . t=[minimox maximox].’o’) minimox=min(x).y) end if flag==1 disp(’Pulse una tecla para ver la grafica’) pause hold on plot(x. function y=varianza(x) auxiliar=x-mean(x)*ones(1. o 42 .y) xy=x. para resolver el sistema se hace la factorizaci´n de Cholesky: chol. maximox=max(x). entonces  1 E(x)  E(x) E(x2 )   ··· ··· m E(x ) E(xm+1 )  · · · E(xm ) a0 · · · E(xm+1 )   a1   ··· ··· ··· · · · E(x2m ) am   E(y)   E(yx)  =    ··· . yt=exp(mean(y))*exp(pendiente*(t-mediax*ones(1. plot(t.maximox). En este archivo se llaman a dos funciones para calcular la varianza y la covarianza: function z = covar(x.length(t)))). y=mean(auxiliar). y = (y1 . que en MATLAB se escribe como e mean(Z). t=linspace(minimox. yn ).exp(y). pero es definida positiva. maximox=max(x). auxiliar=auxiliar. M´ ınimos cuadrados.length(x)). Como la matriz suele estar mal condicionada. z=mean(xy)-mean(x)*mean(y). El ajuste por polinomios est´ implementado en la siguiente funci´n: Es f´cil probar a o a que si p(x) = a0 + a1 x + · · · + am xm es el polinomio que mejor ajusta a los datos x = (x1 .A.

end end b=zeros(m+1. end matriz=zeros(m+1. s=(R\u)’.^(i+j-2)).j)=mean(x. for i=1:m+1 for j=1:m+1 matriz(i. disp(’Pulse una tecla para saber el error cuadratico’) pause disp(’Error= ’) s=fliplr(s).function aju2(x..x). yt=polyval(s..m) clc if length(x)~=length(y).*(x.+am*x^m’) R=chol(matriz).y. (norm(p-y))^2 disp(’Pulse una tecla para ver la grafica’) pause hold on plot(x. xmax=max(x).1).xmax).. end clc disp(’Si la solucion es [a0 a1 . t=linspace(xmin.’) end if m==length(x) | m>length(x) m=length(x)-1. for i=2:m+1 b(i)=mean(y. p=polyval(s. error(’Las dimensiones de x e y deben coinidir.t).y.yt) 43 .. u=R’\b. am]’) disp(’ es a0+a1*x+. plot(t.m+1).^(i-1))).’o’) xmin=min(x).

A. M´ ınimos cuadrados. 44 .

dH ) es completo. K compacto}. es ıo o a decir n KF = i=1 fi (KF ). Utilicemos MATLAB para generar gr´ficamente fractales de esta manera: Los coma 2 pactos en IR los vamos a discretizar usando matrices cuadradas de ceros y unos. n. dadas fi : IRn → IRn . En este ap´ndice usaremos las capacidades gr´ficas de MATLAB para poder dibujar e a algunos fractales conocidos. B) = max{max d(a. n n F (K) = i=1 fi (K) es una aplicaci´n contractiva de raz´n r < 1. Todos los fundamentos matem´ticos de que se compone este ap´ndice est´n a e a extra´ ıdos de [4]. aplicaciones contractivas de raz´n r < 1. la curva de Koch o el de a Mandelbrot. A (fi )n le llamaremos en lo sucesivo sistema de funciones iteradas y al compacto KF i=1 atractor para el sistema de funciones o fractal autosemejante. Por el teorema del punto fijo. · · · . Si k es 45 . Se define dH (A. a∈A b∈B Se puede probar f´cilmente que esta aplicaci´n es una m´trica. entonces o n F : K(IR ) → K(IR ). i = 1. Definimos el siguiente conjunto: K(IRn ) = {K ⊂ IRn . B). Por otra parte. Adem´s se tiene F (KF ) = KF . A)}. K = ∅. max d(b. como el tri´ngulo de Sierpinsky. la llamada m´trica de a o e e n Hausdorff. la sucesi´n o o o (Kn )∞ en el espacio K(IRn ) dada por Kn+1 = F (Kn ) converge hacia un compacto KF n=1 no vac´ sin importar el valor inicial de la sucesi´n.B. En primer lugar construiremos algunos fractales cl´sicos mediante la teor´ de los a ıa sistemas de funciones iteradas. Fractales. y no es tan sencillo probar que (K(IR ).

for i=1:n titulo=strcat(’Iteracion:’. k] × [0. 46 . for f=1:k for c=1:k if T(f. y=zeros(k). Como ejemplo. T=M. 2 4 2 Es evidente que fi son aplicaciones contractivas de raz´n 1/2. % T una matriz cuadrada que representa (0s y 1s) el termino inicial % n el numero de iterados.num2str(i)). 2 1 k f2 (x. j) est´ en dicho compacto y T (i. y) = (x. function y=sfi(T) % Implementa un SFI k=length(T).n) % Construye fractales mediante un SFI. k]2 para o 2 culquier compacto K ⊂ [0. y) + ( . 2 2 1 k k f3 (x. quiere decir que el punto (i. o implementaremos el siguiente: 1 f1 (x. el tama˜o de una matriz T . y) + ( . ). 0). pcolor(T’) shading(’flat’) axis(’equal’) title(titulo) M=sfi(T). j) = 1. (se recomienda n<10) % Si se quiere modificar el fractal hay que modificar el SFI. y) = (x. querr´ decir que el compacto estar´ incluido en [0.B. k] .m que es d´nde est´ implementado o o a el sistema de funciones iteradas: function fractal(T. Fractales. i2=ceil(c/2). j) = 0 en a otro caso. k]. y). El programa siguiente usa la funci´n sfi.c)~=0 i1=ceil(f/2). M=zeros(k). n a a y si T (i. colormap(prism) k=length(T). Obs´rvese el uso de ceil para asegurar que los ´ e ındices de la matriz sean enteros entre 0 y k. pause end A continuaci´n implementaremos el sistema de funciones iteradas. y que fi (K) ⊂ [0. y) = (x.

a=zeros(100). a(:. 3 1 f2 (v) = Gπ/3 (v) + u2 . u=ones(1. la a sucesi´n converge siempre al tri´ngulo de Sierpinski. i2=ceil(c/2). i1=ceil(f/2+k/2).y(i1. Se puede implementar f´cilmente el siguiente sistema fundamental de funciones: a 1 f1 (v) = v.1)=u’. i2=ceil(c/2+k/2).i2)=1. end end end Se muestra varias gr´ficas para mostrar. a(:. a(99.6). y(i1. i1=ceil(f/2+k/4). o a T=eye(100)+flipud(eye(100)). Se ejecuta fractal(T.i2)=1.:)=u. 3 47 . 3 1 f3 (v) = G−π/3 (v) + u3 . 3 1 f4 (v) = v + u4 .100). y(i1.i2)=1. a(1.:)=u. como partiendo de algunos compactos.99)=u’.

vimag=linspace(c. Este resultado nos permite representar el conjunto o de Mandelbrot. j = 0. u4 = (2k/3. Sea c ∈ C.d) % Representa el conjunto de Mandelbrot en [a. y sea fc : C → C dada I I I 2 2 por fc (z) = z + c. dibujar c.d]. I Se puede demostrar que S(c) diverge a ∞ si y s´lamente si alg´n punto de la ´rbita o u o tien m´dulo mayor o igual que 2.c. Si |z| < 2. Fractales. a Se puede definir el conjunto de Mandelbrot como M = {c ∈ C : S(c) no diverge a ∞}. √ donde Gα indica el giro de ´ngulo α y u2 = (k/3. permite dibujar la curva de Koch: a Ahora representaremos el conjunto de Mandelbrot. Tomar c ∈ C puntos de este rect´ngulo. j = j + 1. a Que como se ver´. z = z1 . · · · ).b.B. es decir la o o ´rbita de 0 para el sistema din´mico generado por fc . Simplemente se calculan los 100 primeros t´rminos de la ´rbita. 0). hold on vreal=linspace(a.d). Consideremos la sucesi´n S(c) = (0. El programa (aprovechando que MATLAB posee aritm´tica compleja) es e function mandel(a. fc (0).b). 0). I a Mientras j < 100 y |z| < 2 hacer z1 = z 2 + c. fc (0). for h=1:100 for k=1:100 48 . k 3/6).b]x[c. El e o Pseudoc´digo es el siguiente: o Elegir rect´ngulo del plano complejo a z = 0. u3 = (k/2.

j=0.25).5.1. z=z1. 49 . while j<100 & abs(z)<2 z1=z^2+c.0.-1. c=vreal(h)+i*vimag(k). j=j+1.z=0. end if abs(z)<2 plot(vreal(h)+i*vimag(k)) end end end La siguiente figura se ha obtenido ejecutando mandel(-2.25.

B. Fractales. 50 .

Bruce Littlefield. The MathWorks Inc. 1999. Estruca ın. ıa [1] Duane Hanselman. [2] The MathWorks Inc. Editorial Labor. Pr´cticas con MATLAB . Miguel Angel Mart´ Manuel Mor´n. The student edition of MATLAB 5. 1999. e ´ [4] Miguel de Guzm´n. The student edition of MATLAB : Version 5: User’s guide. Matem´tica Aplicada. [3] Jos´ Luis Hueso.3: for Windows 95/N.Bibliograf´ usada. Prentice Hall. 1993. Universidad e a a Polit´cnica de Valencia. Miguel Reyes. 51 . a turas fractales y sus aplicaciones. Prentice Hall. 1997.

Sign up to vote on this title
UsefulNot useful