Clase01 Print
Clase01 Print
de Econom Cuantitativa a
Universidad Complutense de Madrid
Marcos Bujosa
c 20052007 Marcos Bujosa [email protected] Actualizado el: 21 de junio de 2007 Versin 1.2 o
Algunos derechos reservados. Esta obra est bajo una licencia Reconocimiento-CompartirIgual de Creative a Commons. Para ver una copia de esta licencia, visite http://creativecommons.org/licenses/by-sa/ e 2.5/es/ o env una carta a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. Puede encontrar la ultima versin de este material en http://www.ucm.es/info/ecocuan/mbb/index. o html#octave Indice Indice 1. Guiones (scripts) en GNU Octave (o Matlab) 2. Controles de ujo 2.1. Bucle for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Bucle while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3. Condiciones if-then-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Funciones 1. Guiones (scripts) en GNU Octave (o Matlab) Si teclea pwd, GNU Octave le indicar cual es el directorio de trabajo donde est operando GNU Octave. a a Con el comando cd puede variar dicho directorio de trabajo. Por ejemplo cd c:\ . GNU Octave puede ejecutar consecutivamente las rdenes escritas en un chero de texto (ASCII) con o extensin .m o El chero debe estar situado en directorio de trabajo donde est operando GNU Octave. O bien en el e path de GNU Octave (o Matlab). El path es el conjunto de directorios donde GNU Octave (o Matlab) buscan programas o guiones (scripts) para ser ejecutados. Teclee path para comprobar que directorios estn en el path. a El comando addpath aade los directorios que se especiquen al path; por ejemplo n addpath(E:\loquesea\loquesea\). Ntese las comillas. Si quisiramos eliminar dicho directorio del o e path deber amos teclear rmpath(E:\loquesea\loquesea\). Edite sus guiones (scripts) con un editor que respete el formato ASCII y la extensin *.m (por ejemplo, o si trabaja en el entorno windows, el editor wordpad; o mejor an WinEdit). u 1 1 2 2 3 4 4
pwd cd path
directorio de trabajo
addpath addpath(E:\loquesea\loquesea\)
(Octave en Windows)
rmpath(/cygdrive/E/loquesea/loquesea/) A continuacin veamos un ejemplo de guin con instrucciones para GNU Octave. o o Codigo guion1.m 1 n = 0:pi/100:2*pi; 2 y = cos(2*pi*n); 3 plot(n,y); % crea un vector % crea el vector y % representa el vector y frente a n
Guiones 2
octave
tecleando octave> guion1. . . 2. Controles de ujo Los controles de ujo permiten regular la ejecucin de rdenes. La regulacin se basa en imponer condio o o ciones para la ejecucin de un conjunto de rdenes. o o Estos controles son tremendamente utiles, aunque pueden ralentizar la ejecucin del programa. Por o ello veremos ms tarde que es recomendable evitar bucles siempre que esto sea posible. a 2.1. Bucle for Los bucles for permiten repetir un conjunto de rdenes un nmero jo de veces. o u Codigo EjemploFor1.m 1 for x = matriz 2 conjunto de ordenes 3 end
Bucle for 3
octave
1. 2. 3. 4. 5. 6. 7. 8. 9.
x toma como valor la primera columna de matriz Se ejecuta el conjunto_de_ordenes x toma como valor la siguiente columna de matriz Se ejecuta el conjunto_de_ordenes Vuelve al punto 3 . . . sigue iterando hasta que . . . x toma como valor la ultima columna de matriz Se ejecuta por ultima vez el conjunto_de_ordenes naliza el bucle
Por tanto, el conjunto_de_ordenes se ejecuta tantas veces como nmero de columnas tiene la variable u matriz.
octave
Qu hace este bucle?. . . e octave> EjemploFor2 Codigo EjemploFor3.m 1 for i = 1:3 2 i 3 end
Bucle for: Ejemplo contador 5
octave
Ejercicio 1. (a) Genere una matriz de dimensiones 2 3 y con distribucin Uniforme; y cree un bucle que muestre o consecutivamente cada una de sus columnas. (b) Genere una matriz de dimensiones 3 4 y con distribucin Uniforme; y cree un bucle que muestre o consecutivamente cada una de sus las. (c) Genere una matriz de dimensiones 3 4 y con distribucin Uniforme; y cree un bucle que muestre o consecutivamente las columnas en el siguiente orden: 2 4 1 (por tanto sin mostrar la tercera columna). (d) Genere un bucle que sume los elementos de un vector, por ejemplo del vector la v = 1 5 4 3 2
Los bucles se pueden anidar unos dentro de otros. El siguiente ejemplo calcula la suma de los elementos de una matriz. ([f,c]=size(x) asigna a f en nmero de las de x; y a c el nmero de columnas). u u (m=max(f,c) asigna a m el mayor de los nmeros f, c) u Codigo EjemploFor4.m 1 2 3 4 5 6 7 8 9 M=[1 2 3;-2 -4 -6;2 3 1] % creamos la matriz [f,c]=size(M) % f #las; c #columnas s=0; % suma inicial for i = 1:f % recorre las for j=1:c % recorre columnas (en cada la) s=s+M(i,j); % agrega cada elemento a s end end s % muestra suma total
Bucle for: Ejemplo suma 6
octave
2.2. Bucle while Los bucles while permiten repetir un conjunto de rdenes mientras una condicin jada se cumpla. o o Cunado dicha condicin sea falsa (cuando se deje de cumplir), el conjunto de rdenes deja de ser ejecutado o o (el bucle se para).
Seccin 3: Funciones o
Bucle while
octave
1. 2. 3. 4. 5.
Comprueba si condicion se cumple Se ejecuta el conjunto_de_ordenes Vuelve al punto 1 . . . sigue iterando hasta que . . . Cuando condicion se incumple naliza el bucle (Ojo!)
Bucle while: Ejemplo registro de suceso 8
Codigo EjemploWhile2.m 1 2 3 4 5 6 7 x=0; contador=0; while x<=0.95 contador=contador+1; x=rand(1) end contador
octave
octave> EjemploWhile2 2.3. Condiciones if-then-else Las condiciones if-then-else ejecutan un conjunto de rdenes una vez (por tanto no es un bucle) siempre o que la condicin jada se cumpla. Cuando dicha condicin sea falsa, el conjunto de rdenes no se ejecuta. o o o Codigo EjemploIfElse1.m 1 2 3 4 5 6 7 8 x=randn(1) if x<-1 disp(menor que -1) elseif x>1 disp(mayor que 1) else disp(entre -1 y 1) end
Ejemplo if else 9
octave
octave> EjemploIfElse1 3. Funciones Podemos convertir los guiones (scripts) en funciones de GNU Octave y Matlab. La estructura de una funcin es como sigue: o
Seccin 3: Funciones o
Codigo EjemploFun.m
Ejemplo de funcin o
10
octave
1 function [out1, out2, ...] = EjemploFun (in1, in2, ...) 2 3 conjunto de ordenes que calculan 4 out1, out2,... 5 empleando in1, in2,...
donde los argumentos de salida entre [] y separados por , el nombre de la funcin foo debe grabarse en chero foo.m o los argumentos de entrada entre () y separados por , Codigo SumaMatriz.m 1 2 3 4 5 6 7 8 9 function [s] = SumaMatriz (M) [f,c]=size(M) % f #las; c #columnas s=0; % suma inicial for i = 1:f % recorre las for j=1:c % recorre colunas (en cada la) s=s+M(i,j); % agrega cada elemento a s end end
Ejemplo de funcin: suma o 11
octave
Ejercicio 2. Suponga que tiene un vector v de nmeros. Programe, mediante un bucle for y una condicin u o if, un algoritmo que busque el valor mximo de los elementos de v (sin emplear la funcin max) a o Ejercicio 3. Suponga que tiene un vector la v de nmeros. Programe mediante un bucle for un algoritmo u que: busque el nmero n en el vector la v u muestre la ultima posicin en que aparece el nmero n en el vector v o u (si es que est en v). a Ejercicio 4. Suponga que tiene un vector la v de nmeros. Programe mediante un bucle while un u algoritmo que: busque un nmero n en el vector la v u muestre la primera posicin en que aparece el nmero n en el vector v o u (si es que est en v). a Ejercicio 5. Suponga que tiene un vector la v de nmeros. Programe un algoritmo que: u busque el nmero n en el vector la v u muestre todas las posiciones donde aparece el nmero n en el vector v u (si es que est en v). a Ejercicio 6. Suponga que v est ordenado (de menor a mayor). Programe un nuevo un buscador que a indique si nmero n est en el vector. Emplee un bucle while, y la siguiente estrategia: u a 1. La posicin ms baja posible Min es inicialmente 1 o a 2. La posicin ms alta posible Top es inicialmente length(v) o a 3. Busque n en una posicin intermedia pos (aprox. (Top-Min)/2) o 4. Si el nmero est ah solucin es pos u a : o 5. Si el nmero NO est ah u a :
Seccin 3: Funciones o
a) Si nmero en pos >n entonces Top=pos u b) Si nmero en pos <n entonces Min=pos u c) repetir punto 3 6. Si nalmente Top=Min entonces n no est en v a Algunas funciones de utilidad para elaborar el ejercicio anterior: round . redondeo La orden round(n) redondea al entero ms prximo a n. a o a o floor . redondeo La orden floor(n) redondea al entero ms prximo pero menor que n. ceil . redondeo La orden ceil(n) redondea al entero ms prximo pero mayor que n. a o isempty . La orden isempty(n) es verdadera si n est vac a a. disp . La orden disp(Hola mundo) muestra el mensaje entre comillas Hola mundo. Ejercicio 7. Suponga que tiene una sucesin de nmeros y considere el algoritmo de la burbuja como o u procedimiento de ordenacin: o El algoritmo de la burbuja ordena de menor a mayor una sucesin de nmeros realizando o u comparaciones entre pares de nmeros adyacentes, y permutando su posicin si es necesario. u o Considere una sucesin de nmeros a1 , a2 , a3 , . . . , aN en las posiciones iniciales 1a , 2a , 3a ,. . . , o u n-sima. Compare los nmeros que se encuentran en la primera y segunda posicin (a1 y a2 ). e u o No altere el orden si a1 < a2 , pero intercambie las posiciones en caso contrario. En el paso siguiente compare los nmeros colocados en las posiciones segunda y tercera, y proceda de u manera anloga (si el nmero que ocupa la posicin segunda es menor que el que ocupa la a u o tercera posicin no altere su orden, pero intercambie las posiciones en caso contrario). Repita o hasta comparar el ultimo par de nmeros (es decir, el ultimo con el penltimo). Este proced u u imiento desliza el nmero ms grande de la sucesin hasta la ultima posicin (tras cuantas u a o o comparaciones?). Repita el proceso anterior hasta ordenar de menor a mayor toda la secuencia (deslizando el segundo nmero mayor, luego el tercero, etc.. . . ). u Programe una funcin que implemente este algoritmo, y usela para ordenar diez nmeros enteros con o u valores entre 0 y 1000. Pista. use rand y round para generar los diez nmeros enteros. u Denicin de una funcin en matlab: o o mediante un chero *.m: function f=funF(x) f=x-cos(x);
denicin de funciones o 12
feval(funF,1)
Ejercicio 8. Programe el mtodo Newton-Raphson para busqueda de ceros de una funcin. e o Pista. Aproximando la funcin por el desarrollo de Taylor tenemos: o f (x0 + h) = f (x0 ) + hf (x0 ) + R, donde R contiene todos los trminos del desarrollo que no aparecen explicitamente en la expresin. e o Buscamos el punto x = x0 + h, donde la funcin es cero, y por tanto o 0 f (x0 ) + hf (x0 ) h = f (x0 ) f (x0 )
Seccin 3: Funciones o
(suponiendo R pequeo); as pues, un valor tentativo es n x = x0 Al nuevo x lo llamamos x0 y vuelta a empezar. . . Adems, recurdese que a e f (x) = l m
x0
f (x0 ) f (x0 )
f (x + x) f (x) x
deber aadir ejercicio de pivotaje con anterioridad, ayudar a programar Gauss a n a Ejercicio 9. Programe una funcin que de las soluciones de un sistema de ecuaciones triangular, es decir, o anlogo al siguiente a 1 1 1 1 : 1.5 0 1 4 12 : 0.8 0 0 2 9 : 1 0 0 0 0.5 : 1.6 Ejercicio 10. Programe una funcin que resuelva o ejemplo 0 1 2 0 1 4 1 1 1 1 2 4 un sistema de ecuaciones por el mtodo de Gauss, por e 3 : 0.2 12 : 0.8 1 : 1.5 8 : 1.2
Ejercicio 11. Programe el mtodo de Gauss-Jordan e Ejercicio 12. Programe media aritmtica recursivamente, es decir, con un programe que se llame a si e mismo Pista. Si llamamos xn a la media aritmtica de un vector con n > 1 datos, e
n n1
xn =
i=1
xi
/n =
i=1
xi + xn
/n = (n 1)xn1 + xn /n