aprendiendo a programar en matlab

134

Click here to load reader

Upload: jorge-ipanaque

Post on 23-Jun-2015

595 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Aprendiendo a programar en matlab

Lenguajes de Programacion

Guıa docente ECTS

Ingenierıa Naval y Oceanica

Escuela Tecnica Superior de Ingenieros Navales

Universidad Politecnica de Madrid

A. Souto Iglesias, J.L. Bravo TrinidadL. Gonzalez Gutierrez, A. Canton Pire

30 de septiembre de 2008

Page 2: Aprendiendo a programar en matlab
Page 3: Aprendiendo a programar en matlab

....para mı una buena escuela serıa una escuela distinta,una escuela que tuviese un principio segun el cual todas susnormas estuviesen enfocadas a mantener a tantos estudiantescomo sea posible durante el mayor tiempo dentro del sistema.Ası, todo tendrıa que estar dirigido a hacer que los estudiantesparticipasen, que se sintiesen identificados con la escuela, quetuviesen la sensacion de estar haciendo las cosas bien. Paramı una buena escuela es una escuela que mantiene a todos losalumnos trabajando, comprometidos y con la sensacion de que novan a fracasar.

Stephen Ball.

In teaching you philosophy I’m like a guide showing you how

to find your way round London. I have to take you through

the city from north to south, from east to west, from Euston

to the embankment and from Piccadilly to the Marble Arch.

After I have taken you many journeys through the city, in

all sorts of directions, we shall have passed through any

given street a number of times - each time traversing the

street as part of a different journey. At the end of this

you will know London; you will be able to find your way about

like a Londoner. Of course, a good guide will take you through

the more important streets more often than he takes you down

side streets; a bad guide will do the opposite. In philosophy

I’m a rather bad guide.

L. Wittgenstein.

Page 4: Aprendiendo a programar en matlab
Page 5: Aprendiendo a programar en matlab

Indice general

Notacion y abreviaturas 6

I Aprender a programar, con MATLAB 7

Introduccion 9

0. Tutorial de MATLAB 130.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130.2. Conceptos basicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130.3. Manejo de vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170.4. Introduccion al tratamiento de matrices . . . . . . . . . . . . . . . . . . . . . 190.5. Resolucion de sistemas lineales . . . . . . . . . . . . . . . . . . . . . . . . . 230.6. Vectorizacion de operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 250.7. Creacion de graficas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270.8. Conjuntos de ordenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280.9. MATLAB y numeros complejos . . . . . . . . . . . . . . . . . . . . . . . . . 310.10. Matematicas simbolicas con MATLAB . . . . . . . . . . . . . . . . . . . . . 32

1. Funciones y Condicionales 351.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351.2. Funciones y variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351.3. Funciones con varios argumentos de entrada . . . . . . . . . . . . . . . . . . 381.4. Estructura de control condicional if . . . . . . . . . . . . . . . . . . . . . . . 401.5. Estructura de control condicional if-else . . . . . . . . . . . . . . . . . . . . . 421.6. Funcion que llama a otra funcion . . . . . . . . . . . . . . . . . . . . . . . . 431.7. Condicionales anidados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441.8. Variante elseif en el condicional . . . . . . . . . . . . . . . . . . . . . . . . . 461.9. Operadores logicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471.10. Operadores de comparacion: ¿son iguales? . . . . . . . . . . . . . . . . . . . 501.11. Igualdad entre numeros reales: precision y valor absoluto . . . . . . . . . . . . 501.12. Variables enteras y reales como argumentos . . . . . . . . . . . . . . . . . . . 521.13. Variables contador y sumador . . . . . . . . . . . . . . . . . . . . . . . . . . 531.14. Funcion parte entera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

2. Bucles 552.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552.2. Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552.3. Bucles con incremento variable . . . . . . . . . . . . . . . . . . . . . . . . . 57

Pag. 3

Page 6: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

2.4. Bucles con otras operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 572.5. Bucles y relaciones de recurrencia . . . . . . . . . . . . . . . . . . . . . . . . 582.6. Bucles y condicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602.7. Uso de bucles para verificar una condicion sobre un conjunto. . . . . . . . . . 622.8. Bucles anidados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

3. Vectores 653.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653.2. Vectores como argumentos de funciones . . . . . . . . . . . . . . . . . . . . . 653.3. Funciones que llaman a funciones con argumentos vectores . . . . . . . . . . . 663.4. Calculo de extremos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.5. Calculo de posicion de extremos . . . . . . . . . . . . . . . . . . . . . . . . . 693.6. Evaluacion de un polinomio . . . . . . . . . . . . . . . . . . . . . . . . . . . 703.7. Funcion que devuelve un vector . . . . . . . . . . . . . . . . . . . . . . . . . 733.8. Funciones que reciben y devuelven vectores . . . . . . . . . . . . . . . . . . . 753.9. Construccion de vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.10. Vectores y bucles anidados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783.11. Funciones con salidas multiples . . . . . . . . . . . . . . . . . . . . . . . . . 80

II Guıa ECTS para estudiantes 83

1. Introduccion 85

2. Datos generales 872.1. Temporalidad y caracter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872.2. Creditos LRU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872.3. Departamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872.4. Profesores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872.5. Creditos ECTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

3. Objetivos 893.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893.2. Objetivos generales: descripcion . . . . . . . . . . . . . . . . . . . . . . . . . 893.3. Prerrequisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 913.4. Otras asignaturas de las que LP es prerrequisito . . . . . . . . . . . . . . . . 91

4. Programa y Metodologıa 934.1. Metodos docentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934.2. Temario y estimacion del tiempo de estudio . . . . . . . . . . . . . . . . . . . 94

5. Recursos 975.1. Guıa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975.2. Tutorıas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975.3. Tutorıas virtuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975.4. Pagina web - Plataforma de B-learning . . . . . . . . . . . . . . . . . . . . . 975.5. Copias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 985.6. Centro de Calculo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 985.7. Bibliografıa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Pag. 4

Page 7: Aprendiendo a programar en matlab

INDICE GENERAL

6. Evaluacion 1016.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016.2. Evaluacion tradicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016.3. Evaluacion ECTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016.4. El examen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036.5. Evaluacion de los objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

III Apendices 107

A. Ejemplos de Examenes 109

B. Gestion del CC 117

C. Control de tiempos y ficha 123

D. Premio SENER 127

Indice alfabetico 132

Pag. 5

Page 8: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Notacion y abreviaturas

AO Aula de Ordenadoresaptdo. apartadocap. capıtuloDHOf para referirse a actividades a realizar dentro del horario oficial.DNI para referirse al numero del Documento Nacional de Identidad.ECTS sistema de creditos europeos.FHOf para referirse a actividades a realizar fuera del horario oficial.fig. figuraG para referirse a actividades a realizar en grupo.GATE Gabinete de Teleeducacion.I para referirse a actividades a realizar de modo individual.JEE Jefatura de Estudios.LOU Ley Organica d 6/2001 de Universidades.LP Lenguajes de Programacion.LRU Ley Organica 11/1983 de Reforma Universitaria.MEC Ministerio de Educacion y Ciencia.pag. pagina.PAS Personal de Administracion y Servicios.PF Portafolio.ref. referencia bibliografica.TIC Tecnologıas de la informacion y la comunicacion.

Pag. 6

Page 9: Aprendiendo a programar en matlab

Parte I

Aprender a programar, con MATLAB

Pag. 7

Page 10: Aprendiendo a programar en matlab
Page 11: Aprendiendo a programar en matlab

Introduccion

De modo resumido, podemos decir que programar es “ensenarle” a un ordenador como seresuelve un determinado problema. Para poder ensenar a alguien, es necesario dos cosas: tenerun lenguaje en comun y conocer bien lo que se quiere ensenar. En esta primera parte nosocupamos del primer problema (que es el mas sencillo y el que responde a la definicion de“programar”).

El lenguaje que “hablan” los ordenadores es muy simple, por lo que el proceso de aprenderlosera rapido. El principal problema es descomponer ideas complejas en otras mas simples paraque podamos programarlas.

Siguiendo el esquema anterior, hemos organizado cada unidad didactica en un esquema concepto-ejemplo-ejercicios/problemas. Normalmente se trabajan uno o dos conceptos de Programacionen cada unidad didactica (contadores y bucles “while”, por ejemplo), los cuales se introducenprimero formalmente y despues mediante un ejemplo, sobre el que se proponen una serie deejercicios que nos permitan asimilar y madurar las ideas explicadas.

Por cada concepto introducido se trabajan cuatro o cinco ejemplos. Se pretende que en cadauno de estos ejemplos aparezca un uso habitual del concepto introducido. Se trata de asimilarbloques con un sentido concreto, construidos con los elementos basicos de Programacion. Amenudo, en los cursos de Programacion, se introducen solo los elementos de Programacion y sesupone que el alumno aprendera a integrarlos por sı mismo. Sin embargo, muchas aplicacionesde esos elementos son estandares en la programacion (por ejemplo, el uso de contadores, unbucle “while” y un condicional para seleccionar determinados elementos de un vector, crear unvector mediante un contador, etc.) y una vez nos hemos familiarizado con ese uso conseguimosuna mayor agilidad a la hora de programar.

Las unidades didacticas que constituyen el curso son las siguientes:

0. Tutorial de MATLAB.

1. Funciones y Condicionales.

2. Bucles.

3. Vectores.

El curso comienza con un tutorial en el que se usa MATLAB como una potente calculadoraal principio para terminar dibujando curvas, y agrupando instrucciones en ficheros “script”,lo que permite introducir ideas importantes para mas adelante crear funciones. Ademas, seaprovecha esta unidad 0 para insistir en conceptos basicos de manejo de las herramientas delsistema operativo, sobre todo la creacion y gestion de carpetas, y la ubicacion precisa de lasmismas en el sistema de archivos del usuario, bien en un disco local o en la unidad de red delaula de ordenadores donde se trabaja.

Pag. 9

Eduardo
Resaltado
Eduardo
Resaltado
Eduardo
Resaltado
Eduardo
Resaltado
Eduardo
Resaltado
Eduardo
Resaltado
Eduardo
Resaltado
Eduardo
Resaltado
Eduardo
Resaltado
Eduardo
Resaltado
Eduardo
Resaltado
Page 12: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

El lenguaje elegido para la implementacion de ejemplos y ejercicios es el lenguaje de comandoso ”script”de MATLAB (o su version libre Octave). Esta eleccion se debio a varios motivos:

1. MATLAB es un entorno de calculo que los estudiantes usaran a lo largo de la carrera yprobablemente despues en su vida profesional ya que dispone de herramientas especıficas(“toolboxes”) para muchos ambitos. Aunque las competencias de manejo asociadasa esas herramientas especıficas no se trabajan en este curso, el que el estudiante sesienta al final comodo con el entorno MATLAB le permitira si es necesario asimilar sufuncionamiento con mucha mayor facilidad que si empezase de cero con el programa.

2. MATLAB es un lenguaje completo; tiene todos los elementos de un lenguaje de progra-macion, con una sintaxis similar al C pero con la simplicidad del BASIC. Comprobamosen cursos anteriores que al utilizar un lenguaje como C, los alumnos dedicaban la mayorparte del tiempo a la correccion de errores de sintaxis y a la declaracion de variables,reserva de memoria, etc., teniendo poco tiempo para comprender el funcionamiento delas estructuras de datos o de control del flujo del programa. En este sentido, el lenguajeMATLAB se acerca al pseudocodigo usado en algunos cursos de Programacion, pero conla ventaja de poder realmente ejecutar los codigos creados. La simplicidad de MATLABa estos efectos es a veces causa de falta de rigor en la forma de abordar la Progra-macion. Ası el hecho de que no haya tipado explıcito de variables pudiendo la mismavariable ser una matriz en una lınea del codigo y un escalar un poco mas abajo, o deMATLAB se ocupe del la reserva dinamica de memoria de modo automatico, nos alejande un lenguaje mas potente como C. Sin embargo y como comentabamos mas arriba,eso permite centrarse en el manejo de estructuras de control para resolver problemas ydesarrollar estrategias, creemos que esencial al principio.

3. MATLAB es un lenguaje interpretable: MATLAB traduce durante la ejecucion las di-ferentes sentencias al lenguaje primario y basico de la maquina. Se paga el precio denecesitar MATLAB para ejecutar nuestros codigos pero se recibe la recompensa de notener que compilar y enlazar nuestros codigos para despues ejecutarlos.

4. MATLAB proporciona una interfaz que permite probar las funciones directamente sinnecesidad de llamarlas desde un programa principal. Esto permite comprobar su fun-cionamiento de un modo sencillo e inmediato, y como comentamos mas abajo, ha permi-tido una estructura del curso creemos que muy interesante para un curso de introducciona la Programacion para no Informaticos.

5. Todo ello hace que sea muy sencillo empezar a generar codigos interesantes en MATLAB,algo a lo que se llega con mucho mas esfuerzo en un lenguaje de Programacion masriguroso como C.

Una vez realizado este tutorial, hasta hace unos anos empleabamos la organizacion curricularusual en un curso de Programacion (comenzando por la entrada y salida y el programa ”Holamundo”). Sin embargo, ahora usamos una estructura similar a la programacion funcional,comenzando por el concepto de funcion y estudiando la entrada y salida casi al final. Deeste modo, en la unidad 1 se trabaja al principio sobre el concepto de funcion, introduciendoinmediatamente la estructura de control condicional, la cual permite construir funciones mascomplejas e interesantes.

En la unidad 2 se trabaja con bucles, posibilitando la repeticion de operaciones. Es una unidad

Pag. 10

Page 13: Aprendiendo a programar en matlab

ardua, pues no se recurre todavıa a vectores o matrices, donde los bucles surgen de modonatural. Aquı estan los ejemplos mas interesantes del curso, como el de comprobar si unnumero natural es primo. Si el estudiante se siente comodo al final de esta unidad, el restodel curso sera para el una progresion sencilla. Si no se siente comodo todavıa, tendra ocasionde cubrir los vacıos en las unidades siguientes.

En la unidad 3 se introducen los vectores, pues ya se tienen las herramientas para manejarlos.

Como comentabamos en el prologo, no hemos pretendido escribir un compendio exhaustivoni de Programacion ni de MATLAB. Debido a ello la seleccion de unidades didacticas no esinocente sino que subyace la idea de mostrar unicamente los aspectos considerados esencialespara aprender a programar. Creemos que en ese sentido el libro es una aportacion interesanteya que no hay en la literatura cursos de introduccion a la Programacion que se apoyen enMATLAB como lenguaje de referencia, y lo mas parecido corresponde a cursos de MATLABen los que en algun capıtulo se tratan diferentes aspectos de la programacion1. En cuanto acompendios de MATLAB, recomendamos el sensacional trabajo de Guillem Borrell2.

1Gilat, A., MATLAB. Una introduccion con ejemplos practicos, Reverte, 2006, es un buen ejemplo de estetipo de libros

2Borrell i Nogueras, G., Introduccion Informal a MATLAB y OCTAVE. Disponible online enhttp://forja.rediris.es/

Pag. 11

Page 14: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 12

Page 15: Aprendiendo a programar en matlab

Unidad Didactica 0

Tutorial de MATLAB

0.1. Introduccion

Presentamos un tutorial de MATLAB, una herramienta potentısima, casi estandar para calculosen muchas ramas de la Ingenierıa, y de uso razonablemente simple. En la asignatura de LP,utilizaremos el interprete de comandos de MATLAB para que el estudiante se introduzca enel apasionante mundo de la programacion de ordenadores. Este tutorial, en el que haremosuna descripcion de los elementos basicos de MATLAB, y que se realizara durante las primerassesiones del curso de LP, tiene como objetivo que el estudiante se sienta comodo con elprograma y con el sistema de usuarios, carpetas y archivos del CC. Ası, al final del tutorialsera capaz de utilizar MATLAB como si fuese una calculadora potentısima, manejando suselementos de calculo en lınea de comandos, sin entrar en la programacion de aplicaciones, alo cual nos dedicaremos el resto del curso.

0.2. Conceptos basicos

Para arrancar MATLAB, se procede como con cualquier programa Windows, o sea, Inicio,Programas, MATLAB, R2006a, MATLAB R2006a 1 , o con el correspondiente icono en elescritorio, que tiene como etiqueta MATLAB R2006a. Una vez arrancado, nos encontramoscon algo similar a lo que se observa en la figura 1. En el espacio que denotamos como ventanade comandos en dicha figura aparece el cursor con el sımbolo (>>) o (EDU >>), indicandoque se pueden introducir ordenes. De hecho, en este tutorial, cuando aparezca este sımbolo, setiene que introducir por teclado la orden que aparece escrita a la derecha del mismo. Podeis,de momento, cerrar las otras ventanas que aparecen en la pantalla, para quedaros simplementecon la ventana de comandos.

La utilizacion mas basica de MATLAB es como calculadora 2. Ası, por ejemplo, para calcularcos(5) · 27.3, se debe introducir 3:

>>cos(5)*2ˆ7.3ans =

44.7013

1A veces, durante el curso hay algunos problemas con las licencias y se usa la version educacional, a la cualse accede con Inicio, Programas, Student MATLAB, o a traves del icono q esta en el escritorio

2Funcionando de este modo, es similar a una calculadora programable, aunque bastante mas versatil.3Los argumentos de las funciones trigonometricas siempre estan en radianes.

Pag. 13

Page 16: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Figura 1: Espacio de trabajo de MATLAB

Pag. 14

Page 17: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

MATLAB mantiene en memoria el ultimo resultado. Caso de que ese calculo no se asigne aninguna variable, lo hace a una variable por defecto de nombre ans. Si queremos referirnosa ese resultado, lo haremos a traves de la variable ans, y si no se asigna ese nuevo calculo aninguna variable, volvera a ser asignado a ans.

>>log(ans)ans =

3.8000

En este momento cabrıa preguntarnos si tratamos con un logaritmo decimal o con uno nepe-riano (natural). Para saberlo, pedimos ayuda acerca del comando log utilizando:

>>help logLOG Natural logarithm.

LOG(X) is the natural logarithm of the elements of X.Complex results are produced if X is not positive.

See also LOG2, LOG10, EXP, LOGM.

Aunque en la explicacion que se obtiene al pedir “help”de las ordenes los comandos aparecenen mayusculas, se deben usar en minusculas.

Por defecto, los resultados aparecen con 4 cifras decimales. Si se necesitara mas precision enlos resultados, se puede utilizar la orden format long repitiendo los calculos:

>>format long

Para recuperar una orden y ejecutarla otra vez o modificarla se usan la flechas arriba y abajodel cursor ⇑, ⇓. Presionemos ⇑ hasta recuperar la orden:

>>cos(5)*2ˆ7.3ans =

44.70132670851334

Ejercicio 0.1 Realizar la siguiente operacion: 2.72.1 + log10 108.2.

Ejercicio 0.2 Pedir ayuda de la orden exp.

Ejercicio 0.3 Realizar la siguiente operacion e2.72.1+log10 108.2.

El resultado del ejercicio anterior aparecera como 2.3992e+004. La notacion 2.3992+004,significa 2.3992 ∗ 104 o lo que es lo mismo 23992.

Si necesitamos referirnos a determinados calculos, se asignan a variables y ası se puedenrecuperar despues. El concepto de variable es crucial cuando se programa, como veremosdurante todo el curso. Por ejemplo, podemos recuperar con ⇑ la orden cos(5) ·27.3 y asignar suvalor a la variable x editando dicha orden. Luego podremos utilizarla para otros calculos. Losnombres de las variables en MATLAB han de comenzar por una letra; ademas, no contendransımbolos que nos sean letras, numeros o el guion bajo (que esta en la misma tecla que el signomenos).

Pag. 15

Page 18: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

>>x=cos(5)*2ˆ7.3x =

44.70132670851334>>y=log(x)y =

3.80000318145901

Ejercicio 0.4 Realizar la siguiente operacion: 2.72.1 + log10 108.2 y asignarla a la variable x.

Ejercicio 0.5 Realizar la siguiente operacion: e2.72.1+log10 108.2 y asignarla a la variable t.

Si queremos saber cuanto vale una variable, no tenemos mas que escribirla en la lınea decomandos y pulsar Enter.

>>yy =

3.80000318145901

Como es muy facil recuperar ordenes previas podemos utilizar esta idea para simular los termi-nos de una sucesion recurrente. Por ejemplo, xn+1 = cos(xn)

>>x=0.2x =

0.20000000000000>>x=cos(x)x =

0.98006657784124>>x=cos(x)x =

0.55696725280964>>x=cos(x)x =

0.84886216565827>>x=cos(x)x =

0.66083755111662>>x=cos(x)x =

0.78947843776687>>x=cos(x)x =

0.70421571334199

Ejercicio 0.6 Repetir la operacion anterior hasta que se estabilice el cuarto decimal de x deun paso al siguiente.

Ejercicio 0.7 Cambiar el formato para que otra vez se vean solo cuatro decimales.

Ejercicio 0.8 Empezando por x = 100 repetir la operacion

x = x− x2 − 81

2x

hasta que se converja en el cuarto decimal. ¿Que relacion hay entre el ultimo x y 81?

Pag. 16

Page 19: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

Ejercicio 0.9 Definir A como en vuestro documento de identidad o pasaporte. Empezandopor x = 100 repetir la operacion

x = x− x2 − A

2x

hasta que se converja en el cuarto decimal. ¿A que ha convergido la sucesion? 4

Es interesante comentar de este ejercicio que MATLAB distingue entre letras mayusculas yminusculas en los nombres de las variables.

A veces es bueno apagar y encender la calculadora para borrar todo y empezar de nuevo. Estose hace con la orden clear. Hay que tener cuidado al utilizarla, ya que borra todas las variablesque esten en la memoria sin pedir confirmacion.

>>clear>>x??? Undefined function or variable ’x’.

Ejercicio 0.10 Preguntar el valor de A igual que acabamos de preguntar x. ¿Tiene sentidoel resultado?

0.3. Manejo de vectores

Para crear y almacenar en memoria un vector v que tenga como componentes v1 = 0, v2 = 2,v3 = 4, v4 = 6 y v5 = 8 podemos hacerlo componente a componente:

>>v(1)=0v =

0>>v(2)=2v =

0 2>>v(3)=4v =

0 2 4>>v(4)=6v =

0 2 4 6>>v(5)=8v =

0 2 4 6 8

Se puede tambien definir este vector especificando su primer elemento, un incremento y elultimo elemento. MATLAB rellenara paso a paso sus componentes. Ası, podemos definir igual-mente el vector v como una secuencia que empieza en 0, avanza de 2 en 2 y que termina enel 8:

4Las calculadoras obtienen la raız cuadrada de un numero mediante esta sucesion.

Pag. 17

Page 20: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

>> v = [0:2:8]v =

0 2 4 6 8>> vv =

0 2 4 6 8

Si ponemos ; al final de una lınea de comandos, cuando pulsemos la tecla Enter para ejecutarla,se ejecutara pero no mostrara el resultado en pantalla (se anula el eco en pantalla). Esto esmuy util algunas veces:

>> v = [0:2:8];>> vv =

0 2 4 6 8

Podemos construir el vector v editando directamente entre los corchetes las componentes delvector v:

>>v = [0 2 4 6 8];>> vv =

0 2 4 6 8

Es facil acceder al contenido de una posicion del vector, por ejemplo la primera.

>> v(1)ans =

0

O modificarla:

>> v(1)=-3;>> vv =

-3 2 4 6 8

O hacer operaciones entre componentes, v2 · v35:

>> v(2)*v(5)ˆ3ans =

1024

Ejercicio 0.11 Calcular la suma de los elementos de v, elemento a elemento.

Para trasponer un vector o una matriz se usa el apostrofo, que es el acento que esta en lamisma tecla que el signo de interrogacion “?”.

>> v’ans =

-32468

Pag. 18

Page 21: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

Como hemos comentado, para recuperar una orden y ejecutarla otra vez o modificarla se usanla flechas arriba y abajo del cursor ⇑, ⇓. Presionemos ⇑ hasta recuperar la orden:

>> v(1)=-3;

Modifiquemosla para dejar el valor original

>> v(1)=0;

Al definir ese vector v de 5 componentes, en realidad lo que definimos es una matriz fila decinco columnas, o sea, un matriz de 1 × 5. Esto se comprueba preguntando el tamano de vcon la sentencia size:

>>size(v)ans =

1 5

que nos indica que v tiene una fila y 5 columnas.

Ejercicio 0.12 Definir un nuevo vector que sea el traspuesto de v y aplicar a ese vector elcomando size. ¿Es coherente el resultado?

Ejercicio 0.13 Pedir ayuda sobre la funcion norm y aplicarla al vector v.

0.4. Introduccion al tratamiento de matrices

Haremos una introduccion a la definicion y manipulacion de matrices. Se supone que se haseguido la seccion anterior y que se dispone de los conocimientos basicos sobre la definiciony manipulacion de vectores usando MATLAB. La definicion de una matriz es muy similar a lade un vector. Para definir una matriz, se puede hacer dando sus filas separadas por un puntoy coma (¡no olvidarse poner los espacios en blanco!):

>> A = [ 1 2 3; 3 4 5; 6 7 8]A =

1 2 33 4 56 7 8

o definirla directamente fila a fila, que es mas intuitivo:

>> A = [ 1 2 33 4 56 7 8]

A =1 2 33 4 56 7 8

Se puede modificar alguno de los elementos de la matriz A, accediendo a cualquiera de susposiciones, por ejemplo:

Pag. 19

Page 22: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

>> A(2,2)=-9A =

1 2 33 -9 56 7 8

Dejemos su valor original:

>> A(2,2)=4;

De igual modo, se la puede considerar como una fila de vectores columna:

>> B = [ [1 2 3]’ [2 4 7]’ [3 5 8]’]B =

1 2 32 4 53 7 8

(Otra vez, es importante colocar los espacios en blanco.)

Ejercicio 0.14 Sumar los elementos diagonales de la matriz A, refiriendonos a ellos, elementoa elemento.

Podemos sumar o restar matrices para tener otras matrices.

>>C=A+BC =

2 4 65 8 109 14 16

Ejercicio 0.15 Definir la matriz D = 2B − A.

Tambien podemos multiplicarlas.

>>C=A*BC =

14 31 3726 57 6944 96 117

Ejercicio 0.16 Definir la matriz D = B − A ·B.

Ejercicio 0.17 Definir la matriz C = AAt.

Podemos definir algunos tipos especiales de matrices, como por ejemplo una matriz de 3× 3que tenga todos sus elementos nulos.

>>I=zeros(3)I =

0 0 00 0 00 0 0

Pag. 20

Page 23: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

Podemos modificar sus elementos diagonales para tener la matriz identidad.

>>I(1,1)=1;>>I(2,2)=1;>>I(3,3)=1I =

1 0 00 1 00 0 1

Ejercicio 0.18 Repetir el ejercicio 0.16 sacando factor comun y utilizando la matriz identidad.

Otra forma de definir la matriz identidad es a traves de la funcion diag, que recibe un vectorque convierte en diagonal de una matriz cuyos otros elementos son nulos.

>>J=diag([1 1 1])J =

1 0 00 1 00 0 1

Ejercicio 0.19 Definir una matriz D diagonal cuyos elementos sean −2, 1, 0.2 y −0.7.

Ejercicio 0.20 Pedir ayuda de la funcion eye, y definir la matriz identidad de 10× 10.

Ejercicio 0.21 Repetir el ejercicio 0.16 sacando factor comun y utilizando la funcion eye.

0.4.1. Definicion de submatrices

La definicion de “subvectores” o submatrices es muy facil. Si v es

>> v = [0:2:8]v =

0 2 4 6 8

Podemos definir un vector e cuyas componentes sean las tres primeras componentes del vectorv poniendo

>> e=v(1:1:3)e =

0 2 4

donde el primer uno indica que vamos a tomar el primer elemento de v. El segundo numero esel incremento de ındices dentro de v y el ultimo numero marca el elemento final. Esta ordenes equivalente a la siguiente

>> e=v(1:3)e =

0 2 4

ya que cuando el incremento es la unidad, se puede suprimir.

Pag. 21

Page 24: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Ejercicio 0.22 Adivinar cual va a ser el resultado de las dos ordenes siguientes

>> e=v(2:2:5)>> e=v(1:3:5)

Como comentamos al principio, la notacion usada por MATLAB sigue en lo posible la notacionestandar de Algebra Lineal que se asume conocida. Es muy sencillo multiplicar matrices yvectores, teniendo cuidado de que las dimensiones sean las adecuadas.

>> A*v(1:3)??? Error using == *Inner matrix dimensions must agree.>> A*v(1:3)’ans =

162846

Es importante acostumbrase a ver ese mensaje de error. Una vez que se empieza a trabajarcon vectores y matrices, es sencillo olvidar los tamanos de los objetos que se han ido creando.

Ejercicio 0.23 Utilizando el comando size, razona sobre los problemas en lo que se refiere adimensiones en la multiplicacion anterior.

Se pueden extraer columnas o filas de una matriz. Si queremos, por ejemplo, que C sea latercera fila de la matriz A:

>> C=A(3,:)C =

6 7 8

O que C sea la segunda columna de la matriz B

>>C=B(:,2)C =

247

O bien que D sea la submatriz cuadrada de orden dos inferior derecha de la matriz A.

>> D=A(2:3,2:3)D =

4 57 8

Ejercicio 0.24 Definir una matriz de nombre D1 formada por la primera y tercera columnasde la matriz A.

Una vez que se es capaz de crear y manipular una matriz, se pueden realizar muchas op-eraciones estandar. Por ejemplo, calcular su inversa. Hay que tener cuidado y no olvidar quelas operaciones son calculos numericos realizados por ordenador. En el ejemplo, A no es unamatriz regular, y sin embargo MATLAB devolvera su inversa, pues los errores de redondeodurante su calculo convierten en invertible a dicha matriz.

Pag. 22

Page 25: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

>> inv(A)Warning: Matrix is close to singular or badly scaled.

Results may be inaccurate. RCOND = 4.565062e-18ans =

1.0e+15 *-2.7022 4.5036 -1.80145.4043 -9.0072 3.6029

-2.7022 4.5036 -1.8014

Con la matriz B sı que es posible calcular su inversa:

>>inv(B)ans =

-3.0000 5.0000 -2.0000-1.0000 -1.0000 1.00002.0000 -1.0000 0

Ejercicio 0.25 Definir una matriz de nombre B1 como la inversa de B. Multiplicar B por B1y razonar la coherencia del resultado.

Hay que comentar que MATLAB distingue entre mayusculas y minusculas. Este puede ser elorigen de algunas confusiones si se manejan algoritmos complejos.

>> inv(a)??? Undefined function or variable a.

0.5. Resolucion de sistemas lineales

Tambien hay funciones para resolver sistemas lineales. Si Ax = b y queremos encontrar x,el modo mas directo es simplemente invertir A, y luego premultiplicar por la inversa amboslados. Sin embargo, hay medios mucho mas eficientes y estables para resolver sistemas linealespero nosotros de momento nos quedaremos con este. Por ejemplo, el sistema lineal Bx = vcon:

>>v = [1 3 5]’v =

135

>>B = [ [1 2 3]’ [2 4 7]’ [3 5 8]’];

se resuelve con:

>> x = inv(B)*vx =

21-1

Para comprobar:

Pag. 23

Page 26: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

>> B*xans =

135

Ejercicio 0.26 Definir una matriz B2 = BBt.

Ejercicio 0.27 Encontrar la solucion del sistema lineal BBtx = v asignando esa solucion alvector x.

Ejercicio 0.28 Comprobar la solucion obtenida realizando el calculo BBT x− v.

Podemos crear una matriz aumentada a partir de B y del termino independiente y reducirlahasta convertir el sistema en uno equivalente triangular, efectuando las necesarias transforma-ciones elementales de fila

>>BA=[B v]BA =

1 2 3 12 4 5 33 7 8 5

>>BA(2,:)=BA(2,:)-2*BA(1,:)BA =

1 2 3 10 0 -1 13 7 8 5

>>BA(3,:)=BA(3,:)-3*BA(1,:)BA =

1 2 3 10 0 -1 10 1 -1 2

La segunda fila tiene el elemento diagonal nulo, ası que hay que realizar una permutacion defilas, premultiplicando por la identidad permutada:

>>IP=[1 0 0;0 0 1;0 1 0];>>BA=IP*BABA =

1 2 3 10 1 -1 20 0 -1 1

Ahora ya es inmediato resolver este sistema por sustitucion hacia atras:

Ejercicio 0.29 Definir una matriz H de 3 × 3 a partir de las tres primeras columnas de lamatriz BA.

Ejercicio 0.30 Definir un vector h utilizando la ultima columna de BA.

Pag. 24

Page 27: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

Ejercicio 0.31 Definir el vector z tal que Hz = h. ¿Es coherente el resultado?

Ejercicio 0.32 Pedir ayuda de la funcion det utilizandola con la matriz B y de la funcionrank utilizandola con la matriz BA.

Ejercicio 0.33 Calcular el determinante de la matriz H.

0.6. Vectorizacion de operaciones

Ejercicio 0.34 Borrar la memoria porque vamos a empezar operaciones nuevas reutilizandonombres de variables ya usadas.

Con MATLAB es sencillo crear vectores y matrices. La potencia de MATLAB nace de lafacilidad con la que se pueden manipular estos vectores y matrices. Primero mostraremoscomo realizar operaciones sencillas, sumar, restar y multiplicar. Luego las combinaremos paramostrar que se pueden realizar operaciones complejar a partir de estas operaciones simples sinmucho esfuerzo. Primero definiremos dos vectores, los cuales sumaremos y restaremos:

>> v = [1 2 3]’v =

123

>> b = [2 4 6]’b =

246

>> v+bans =

369

>> v-bans =

-1-2-3

La multiplicacion de vectores y matrices, igual que su suma, sigue las reglas estrictas delAlgebra Lineal. En el ejemplo anterior, los vectores son ambos vectores columna con treselementos. No se puede sumar un vector fila con un vector columna. Se debe recordar que elnumero de columnas del primer operando debe ser igual al numero de filas del segundo.

>> v*bError using == *Inner matrix dimensions must agree.>> v*b’ans =

Pag. 25

Page 28: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

2 4 64 8 126 12 18

>> v’*bans =

28

MATLAB permite realizar las operaciones entre elementos de un vector o matriz de modomuy sencillo. Supongamos que queremos multiplicar, por ejemplo, cada elemento del vector vcon su correspondiente elemento en el vector b. En otras palabras, supongamos que se quiereconocer v(1) ∗ b(1), v(2) ∗ b(2), y v(3) ∗ b(3). Serıa estupendo poder usar directamente elsımbolo “∗” pues en realidad estamos haciendo una especie de multiplicacion, pero como estamultiplicacion tiene otro sentido, necesitamos algo diferente. Los programadores que crearonMATLAB decidieron usar el sımbolo “·∗” para realizar estas operaciones. De hecho, un puntodelante de cualquier sımbolo significa que las operaciones se realizan elemento a elemento.

>> v.*bans =

2818

>> v./bans =

0.50000.50000.5000

Ejercicio 0.35 Definir un vector w tal que sus componentes sean las de v al cubo.

Una vez que hemos abierto la puerta a operaciones no lineales, ¿por que no ir hasta el final?Si aplicamos una funcion matematica predefinida a un vector, MATLAB nos devolvera unvector del mismo tamano en el que cada elemento se obtiene aplicando la funcion al elementocorrespondiente del vector original

>> sin(v)ans =

0.84150.90930.1411

>> log(v)ans =

00.69311.0986

Saber manejar habilmente estas funciones vectoriales es una de las ventajas de MATLAB. Deeste modo, se pueden definir operaciones sencillas que se pueden realizar facil y rapidamente.En el siguiente ejemplo, se define un vector muy grande y lo manipulamos de este modo tansencillo.

Pag. 26

Page 29: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

>> x = [0:0.1:100]x =Columns 1 through 7

0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000......................Columns 995 through 100199.4000 99.5000 99.6000 99.7000 99.8000 99.9000 100.0000>> y = sin(x).*x./(1+cos(x));

Usando este tratamiento vectorial, se pueden generar graficos de modo muy sencillo. Damosuna muestra de esto que luego completaremos.

>> plot(x,y)

Ejercicio 0.36 Definir un vector t cuya primera componente sea −4, que tenga un incrementoentre componentes de 0.05 y termine en el punto 1.

Ejercicio 0.37 Definir un vector y a partir de cada componente del vector t recien definido

y = 5e−t2 + sin(10t)

0.7. Creacion de graficas

En esta seccion presentamos los comandos basicos para crear representaciones graficas defunciones. Para mostrar el uso del comando plot, utilizaremos la funcion seno y su desarrolloen serie de Taylor5 en torno al cero con terminos cubicos, x − x3/6. Para dibujar la grafica,seleccionamos el paso del vector de muestreo x y sus valores primero y ultimo

>>h=0.1>>xmin=-2;>>xmax=2;>>x=xmin:h:xmax;>>yseno=sin(x);>>ytaylor=x-x.ˆ3/6;

Tras esto, tenemos en los vectores yseno e ytaylor los valores reales y los valores aproximadosobtenidos del desarrollo limitado. Para compararlos, dibujamos los valores exactos superpuestoscon los aproximados marcados por puntos verdes ‘o’.

El comando plot se utiliza para generar graficas en MATLAB. Admite una gran variedad deargumentos. Aquı solo utilizaremos el rango y el formato, y la posibilidad de representar doscurvas en la misma grafica.

5Brook Taylor nacio en 1685 en Inglaterra en el seno de una influyente y adinerada familia. Estudio enCambridge y cuando se graduo ya habıa escrito su primer artıculo matematico de relevancia. Taylor par-ticipo activamente en las agrias disputas entre matematicos britanicos (“newtonianos”) y matematicos eu-ropeos (“leibnitzianos”) sobre la adjudicacion del descubrimiento del Calculo Diferencial, llegando a formarparte del Comite que la Real Sociedad formo para dar fin a tal discusion.

Aunque las aportaciones de Taylor a las matematicas son profundas y variadas (entre otras, introdujoel calculo en diferencias finitas, la integracion por partes, desarrollo un metodo para encontrar solucionessingulares de ecuaciones diferenciales y sento las bases de la geometrıa descriptiva y proyectiva) su resultadomas conocido es el Teorema de Taylor, que permite el desarrollo de funciones en series polinomicas. Sinembargo, no fue Taylor el primero en obtenerlo, James Gregory, Newton, Leibniz, Johann Bernoulli, y deMoivre habıan ya descubierto independientemente variantes del mismo.

Pag. 27

Page 30: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

>>plot(x,yseno,’go’,x,ytaylor);

La g se refiere al color verde (green), y la o significa que los puntos se van a marcar con uncirculito. La tilde antes y despues de go en el comando anterior es la que esta en la tecla dela interrogacion de cierre.

Ejercicio 0.38 En la ventana en la que aparece la figura, seleccionar Edit, Copy Figure. Abrirun nuevo documento de Word y pegar la figura en ese documento.

Tambien es buena idea representar la funcion error:

>>plot(x,abs(yseno-ytaylor),’mx’);

Para que al final del fichero con todas las ordenes aparezca en pantalla el grafico, una vezque este ya ha sido ejecutado alguna vez, se utiliza la orden shg, que hace que la ventana delgrafico se convierta en la activa. Usemos este comando para utilizar el comando de peticionde ayuda help que es muy util tambien por sus referencias cruzadas a otros comandos.

>> help shg

SHG Show graph window.SHG brings the current figure window forward.

Ejercicio 0.39 Pedir ayuda de los comandos grid y plot.

Ejercicio 0.40 Dibujar la curva t, y del ejercicio 0.37.

Ejercicio 0.41 Dibujar la curva t, y del ejercicio 0.37 con cruces rojas y con una retıculaincorporada (grid).

Tambien se puede copiar este grafico al portapapeles desde la ventana del grafico, para despuespegarlo en un documento Word por ejemplo, como ya vimos en el ejercicio 0.38.

0.8. Conjuntos de ordenes

En esta seccion explicaremos como reunir ordenes en ficheros ejecutables desde la lınea decomandos de MATLAB. A estos ficheros se les suele llamar scripts. Ello permite realizaroperaciones mas complejas, y facilita sus repeticiones.

Para empezar a trabajar sobre esta parte del tutorial, lo primero que haremos es ejecutarclear para borrar las variables activas. Como ejemplo, consideramos el fichero correspondienteal dibujo de las graficas de la seccion 0.7. Para ejecutar los comandos del fichero se debeespecificar el intervalo entre los valores de las abscisas en el muestreo. De este modo, sepueden construir infinidad de aproximaciones variando este parametro.

Primero hay que crear el fichero. El editor mas conveniente es el que trae incorporado elpropio MATLAB, aunque cualquier editor de texto es valido dado que la codificacion de losarchivos de comandos de MATLAB es el estandar ASCII como sucede habitualmente en loslenguajes de programacion. El editor de MATLAB es muy simple y suficiente para este tipo deaplicaciones. A partir de la version 5, viene incorporado al propio MATLAB y mejora de versionen version. Los ficheros ejecutables de MATLAB, los M-files, deben tener la extension “.m”.En este ejemplo crearemos un fichero de nombre tutorm.m. Para abrir el editor pinchamos en(File, New, M-file) y debemos ir escribiendo y/o copiando-pegando los comandos necesarios.Se debe tener en cuenta que cuando una sentencia comienza por %, es un comentario, y nose va a ejecutar. Por tanto, en este ejemplo, no es necesario reproducir esas lıneas.

Pag. 28

Page 31: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

% file: tutorm.m% Seno y desarrollo del seno.%% Para ejecutarlo tienes que fijar el paso% h : intervalo entre las x%% El programa genera tres vectores,% x con las abscisas, yseno con% el seno evaluado en esas abscisas,% e ytaylor con el desarrollo% hasta el termino cubico del seno en torno al cero.%xmin=-2;xmax=2;x=xmin:h:xmax;yseno=sin(x);ytaylor=x-x.ˆ3/6;

Una vez que se hayan introducido las sentencias, se guarda el fichero en la carpeta que creamosconveniente, aunque hay que comunicar a MATLAB la ruta en la que se encuentra para queMATLAB lo encuentre. Esto se puede hacer de varias maneras, dependiendo de la version deMATLAB que estemos usando. En las versiones 6.5 y superiores se puede hacer modificandola carpeta-directorio activo en la caja correspondiente (ver figura 1); para volver a activar lavista inicial de MATLAB se procede como se indica en la figura 2. En versiones previas, sepuede indicar la ruta del archivo en el path browser con el icono correspondiente, o desde elmenu File con la opcion Set Path. Por defecto, si se guarda en el directorio ..\matlab\bin,MATLAB lo encontrara 6.

Ahora se ha de volver a la ventana con la lınea de comando y se teclea en esta lınea el nombredel fichero quitando .m. En este caso tutorm.

>>tutorm??? Undefined function or variable ’h’.Error in ==> C:\MATLAB\bin\tut.mOn line 13 ==> x=xmin:h:xmax;

Si se se invoca el fichero sin haber definido primero la variable h, aparecera un mensaje deerror. Se deben definir todas las variables que no se definen en el propio script y que esteutiliza.

>>h = 0.1;>>tutorm>>plot(x,yseno,’rx’,x,ytaylor)

Una vez ejecutada esta instruccion debera aparecer una ventana con una grafica como la dela Figura 3. Cuando tecleamos tutorm en la lınea de comandos, MATLAB buscara en losdirectorios indicados en el path un fichero llamado tutorm.m. Una vez que lo encuentre loleera y ejecutara los comandos como si se hubiesen tecleado uno detras de otro en la lınea decomandos. Si se desea ejecutar el programa otra vez pero con un paso diferente, hay que tener

6Si se utiliza MATLAB en el centro de calculo o laboratorio de una facultad o escuela, probablemente elusuario no tenga permiso de escritura en ese directorio y no pueda guardar ahı sus ficheros. En este caso, sepueden guardar en la carpeta que se desee que despues se incorpora a la ruta de busqueda (path), bien con elcomando path o con el icono correspondiente.

Pag. 29

Page 32: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Figura 2: Recuperar vista de la figura 1

cuidado. El programa sobreescribira los vectores x, yseno e yatylor. Si se quieren guardarestos vectores hay que especificarlo, almacenandolos en nuevas variables.

>>xp = x;>>ysenop = yseno;>>ytaylorp = ytaylor;

Ahora podemos seleccionar un nuevo paso h y volver a ejecutar tutor.

>>h = 0.01;>>tutorm

Tenemos dos aproximaciones; la primera con un paso h de 0.1 que se almacena en los vectoresxp, ysenop e ytaylorp y la segunda relativa a un paso de 0.01 que guardamos en los vectoresx, yseno e ytaylor.

Ejercicio 0.42 Calcular la dimension que tienen que tener los vectores x y xp y confirmar elresultado utilizando la orden size.

Ejercicio 0.43 Crear y ejecutar desde MATLAB un fichero que se llame BAIP.m con la se-cuencia de comandos siguiente:

v = [1 3 5]’;B = [ [1 2 3]’ [2 4 7]’ [3 5 8]’];BA=[B v]BA(2,:)=BA(2,:)-2*BA(1,:)BA(3,:)=BA(3,:)-3*BA(1,:)IP=[1 0 0;0 0 1;0 1 0];BA=IP*BA

Pag. 30

Page 33: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

Figura 3: Grafica correspondiente al ejemplo tutorm.m.

Ejercicio 0.44 Pedir ayuda del comando pause e incorporarlo entre algunas lıneas del ejercicioanterior para ver todos los pasos de la secuencia de comandos.

Ejercicio 0.45 Crear y ejecutar desde MATLAB un fichero que se llame CURVATY.m conuna secuencia de comandos que realicen las operaciones siguientes:

1. Borrar todas las variables activas de la memoria.

2. Definir un vector t cuya primera componente sea −4, que tenga un incremento entrecomponentes de 0.05 y termine en el punto 1.

3. Definir un vector y a partir de cada componente del vector t recien definido como:

y = 5e−t2 + sin(10t)

4. Dibujar la curva (t, y) con cruces rojas y con una retıcula ( grid) incorporada.

0.9. MATLAB y numeros complejos

MATLAB entiende la aritmetica compleja y es perfectamente posible trabajar con numeroscomplejos. Podemos multiplicar dos numeros complejos como:

>>(2+3*i)*(3-7*i)ans =

27.0000 - 5.0000i

O dividirlos como:

>>(2+3*i)*(3-7*i)ans =-0.2586 + 0.3966i

Pag. 31

Page 34: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

0.10. Matematicas simbolicas con MATLAB

MATLAB dispone de herramientas para calculo simbolico. Para ello es necesario instalar elSymbolic Math Toolbox, que es una especie de version reducida de Maple, un programa decalculo simbolico muy conocido. Aquı podemos usar esta caja de herramientas para resolverintegrales y calcular determinantes de modo simbolico entre otras cosas. Lo primero quetenemos que hacer es definir una variable como susceptible de ser utilizada en calculo simbolico:

>>syms x

Ahora podemos definir una funcion que dependa de x y cuya integral queramos calcular:

>>f=cos(x)ˆ2;>>int(f)ans=1/2*cos(x)*sin(x)+1/2*x

Podemos tambien definir una matriz que dependa de x y de una nueva variable y:

>>syms y>> A=[x y x-y2 xˆ2 y-x -y 0]A =[ x, y, x-y][ 2, xˆ2, y][ -x, -y, 0]

Y podemos calcular su determinante de modo simbolico:

>> det(A)ans =-2*y*x+2*yˆ2+xˆ4-xˆ3*y

Ejercicio 0.46 Calcular de modo simbolico la inversa de la matriz A.

Podemos evaluar este determinante para valores reales de x e y asignando valores a esasvariables y utilizando despues la orden eval :

>> x=2.41x =

2.4100>> y=-3.2y =

-3.2000>> eval(det(A))ans =

114.4301

En el momento en que hemos asignado valores a las variables, estas dejan de ser sımbolos. Siqueremos que vuelvan a serlo tenemos que hacerlo de modo explıcito

Pag. 32

Page 35: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 0. TUTORIAL DE MATLAB

>>syms x

Ejercicio 0.47 Definir una funcion f como e−x2.

Ejercicio 0.48 Pedir ayuda de la funcion diff y calcular la derivada de f . Evaluar esta derivadapara x = −3.327.

Ejercicio 0.49 Pedir ayuda de la funcion limit y calcular el lımite de f cuando x→∞.

Pag. 33

Page 36: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 34

Page 37: Aprendiendo a programar en matlab

Unidad Didactica 1

Funciones y Condicionales

1.1. General

Una vez que en el tutorial de la unidad 0 hemos usado MATLAB como una calculadora potente,pero al fin y al cabo una calculadora, ha llegado el momento de aprender a programar. En esesentido, la unidad 1, dedicada al concepto de funcion y la estructura de control condicional,y la unidad 2, dedicada al estudio de los bucles, son las mas importantes. Constituyen la basesobre la que se cimenta el resto del curso.

En la unidad 1 se tratan principalmente las ideas de funciones, variables, argumentos de lasfunciones, asignacion y la primera estructura de control del curso: el condicional. Tambien serealiza primeramente una contextualizacion del curso desde la perspectiva de la historia de laProgramacion y sus fundamentos.

1.2. Funciones y variables

La organizacion habitual de un curso de Programacion supone que se comience por los tıpicosprogramas de entrada y salida, el programa “Hola mundo”. Sin embargo, en este curso queahora comienza nos hemos decidido por una estructura similar a la programacion funcional,comenzando por el concepto de funcion y estudiando la entrada y salida ya con el cursomuy avanzado. La ventaja de este enfoque es que los alumnos comienzan por los conceptosfundamentales: funciones, estructuras de control y vectores. Como el aprendizaje es contin-uo, anadiendo sucesivamente nuevos conceptos y estructuras, conseguiremos que al final losalumnos esten mas familiarizados con las estructuras esenciales de la Programacion. Esto esposible porque MATLAB proporciona una interfaz estandar para las funciones y desde la lıneade comandos es posible ejecutarlas directamente.

El entender las cosas desde la perspectiva funcional proporciona la posibilidad de asimilar des-de el principio conceptos claves en Programacion, como el de encapsulamiento de tareas, ladivision de tareas y su codificacion en funciones, crucial cuando se abordan problemas grandesy se trabaja en equipo. Tambien se trabajan ideas esenciales relativas a el diseno de funcionesy a la reusabilidad de codigo ya escrito, visto ya como cajas negras que realizan determinadastareas, y que servira de base para construir nuevas funciones, etc...

La que ahora presentamos es la funcion mas sencilla que veremos durante el curso. Tiene unargumento de entrada, x y un argumento de salida y. Lo unico que se hace es calcular unaexpresion matematica sencilla y asignar ese valor a y.

% ud1_f1.m

Pag. 35

Page 38: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

% Una funcion sencilla% un argumentofunction y=ud1_f1(x)y=xˆ2-log(x);

El sımbolo = en Programacion es una asignacion, no siendo por tanto simetrico; se asignaa lo que esta a la izquierda del sımbolo igual lo que haya a la derecha del mismo, una vezrealizadas las operaciones que esten especificadas en esa parte derecha.

El nombre de la funcion, para evitar confusiones, debe coincidir con el nombre del archivo .mdonde esta funcion se encuentra. Por tanto, como este primer ejemplo es la funcion ud1_f1,debemos guardarla en el archivo ud1_f1.m. La primera lınea comienza con la palabra reser-vada function lo cual es comun a todas las funciones que veremos en el curso.

Lo mas interesante es entender a partir de este ejemplo como se pasan los argumentos desdela lınea de comandos hasta las funciones. Cuando invocamos esta funcion desde la lınea decomandos podrıamos hacerlo del siguiente modo, obteniendo la siguiente respuesta:

>> ud1_f1(5)ans =

23.3906

Cuando se pulsa Enter, tecla de retorno de carro, se carga en memoria RAM la funcionud1_f1.m, y se crea espacio en memoria para la variable x. En ese espacio se coloca elvalor 5. Se crea espacio tambien para y. Las variables x e y se llaman variables locales de lafuncion; el adjetivo locales procede de que viven en el espacio de memoria de la funcion. Unavez hecho esto, el ordenador ejecuta las sentencias de la funcion (en este caso una sola) dearriba abajo. Durante esta ejecucion se define la variable de salida y, en la cual al final de lamisma esta el resultado, 23.3906. Una vez terminada la ejecucion se devuelve el control a lalınea de comandos, se asigna en este caso el resultado a la variable por defecto ans y se borrade la memoria RAM la funcion ud1 f11.

Podemos invocar a la funcion ud1_f1.m ahora del siguiente modo:

>> t=5;>> z=ud1_f1(t)z =

23.3906

En ese caso, tendremos 4 variables x, y, z y t. Las variables x e y son locales de la funcion ylas variables z y t viven en el espacio de memoria asignado a la ventana de comandos. Cuandose llama a la funcion, x copia el valor de t y cuando se termina la ejecucion de la funcion esz la que copia el valor de la calculada y antes de que esta desaparezca (ver figura 1.1).

La situacion no cambia sustancialmente si invocamos a la funcion del siguiente modo:

>> x=5;>> y=ud1_f1(x)y =

23.3906

Volvemos a tener 4 variables en memoria, x e y en el espacio de memoria de la ventana decomandos y x e y en el espacio de memoria de la funcion ud1_f1.m mientras esta se ejecuta.

1Esto no es exactamente ası, pero esta es la imagen mas adecuada para un principiante en Programacion.

Pag. 36

Page 39: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 1. FUNCIONES Y CONDICIONALES

Figura 1.1: Ejemplo ud1 f1.m. Uso de la memoria RAM

De hecho, si cambiamos el valor de la x en el codigo de la funcion, la variable t del parrafoanterior y la variable x del espacio de memoria de la ventana de comandos no se ven afectadas.O sea que si cambiamos la funcion ud1_f1.m y la grabamos ahora como:

function y=ud1_f1(x)x=2;y=xˆ2-log(x);

Si la invocamos desde la lınea de comandos del siguiente modo,

>> x=5;>> y=ud1_f1(x)y =

3.3069>> xx =

5

el resultado no sera correcto, pero x tampoco habra cambiado su valor. Ello es ası porque lavariable local x vive en la funcion. Al principio de la misma, copia el valor de la variable xdel espacio de comandos, y aunque cambiemos la variable local en la funcion, la variable enel espacio de comandos no se ve afectada; estan en mundos diferentes que solo se comunicana traves de la lınea de argumentos. Hagamos ahora algunos ejercicios para consolidar estasideas:

Ejercicio 1.1Vamos a preparar el espacio donde vas a trabajar, dentro de la unidad de red Z. Si no lo has hecho

ya, crea una carpeta que se llame CXXY Y donde XX son las dos ultimas cifras del ano en que

empieza el curso y Y Y las dos ultimas cifras del ano en que termina. En el curso 2008-2009, la

carpeta se llamarıa C0809. Dentro de esa carpeta crea otra que se llame LP . Dentro de esta,crea

una carpeta llamada ud1. Esta sera tu carpeta de trabajo para todo slos ejemplos y ejercicios de la

unidad 1.

Pag. 37

Page 40: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Ejercicio 1.2

Edita manualmente la funcion ud1 f1 creando un archivo nuevo con el editor on desde la ventana decomandos (con File, New), guardala en tu carpeta de trabajo y ejecuta:

>> ud1_f1(2.3)>> ud1_f1(0.1)>> ud1_f1(0)>> ud1_f1(-2.2)

¿Son correctos los resultados? ¿Que errores o problemas da?

Ejercicio 1.3

Crea una funcion que reciba el radio de un cırculo y devuelva su area. MATLAB conoce el valor de

π, pide ayuda sobre pi para usarlo.

Ejercicio 1.4

Prueba la funcion que has creado con un cırculo de radio la unidad. Deberıa devolver π. Pruebala

con 2; deberıa devolver 4 ∗ π (puedes calcular ese valor con MATLAB).

1.3. Funciones con varios argumentos de entrada

El siguiente paso es construir funciones en las que haya mas de un argumento de entrada.Tenemos ası la siguiente, la cual calcula el area de un rectangulo. Si necesitamos mas argu-mentos de entrada, simplemente los colocamos uno tras otro separados por comas dentro delos parentesis a la derecha del nombre de la funcion.

% ud1_farea% primera funcion con mas de un argumento.% area del rectangulo de lados a y bfunction area=ud1_farea(a,b)area=a*b;

Para invocarla, se nos ocurren estas tres posibilidades, aprovechando lo explicado en la seccion1.2:

>> ud1_farea(2,3)ans =

6>> x=3;>> y=5;>> ud1_farea(x,y)ans =

15>> ud1_farea(x,4)ans =

12

En la primera, pasamos directamente dos numeros, los cuales son copiados por las variableslocales a y b. En la segunda posibilidad pasamos dos variables correspondientes al espaciode memoria de la ventana de comandos, x e y, las cuales son copiadas igualmente por lasvariables locales de la rutina, a y b, a traves de la lista de argumentos. Finalmente en la tercera,

Pag. 38

Page 41: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 1. FUNCIONES Y CONDICIONALES

tenemos una combinacion de las dos posibilidades anteriores.

En el siguiente ejemplo los argumentos no conmutan entre sı. Se trata de calcular el area deun polıgono regular sabiendo el numero de lados y el lado. En el calculo de la apotema los dosargumentos no conmutan entre sı.

% ud1_fareapol.m% area de un polıgono regular de n lados% primeras variables propias de la rutina, P,a,% las variables no conmutan pues juegan distinto papelfunction area=ud1_fareapol(l,n)P=n*l; % perımetroa=l/(2*tan(pi/n));area=P*a/2;

Es la primera funcion en la que usamos variables locales a la funcion. Si invocamos esta funciondesde la ventana de comandos, y preguntamos despues lo que valen esas variables locales, lascuales no pertenecen al espacio de memoria de la ventana de comandos tendremos el siguienteresultado:

>> ud1_fareapol(3,4)ans =

9.0000>> ud1_fareapol(4,3)ans =

6.9282>> P??? Undefined function or variable ’P’.>> a??? Undefined function or variable ’a’.>>

Los ejercicios correspondientes a estos ejemplos son los siguientes:

Ejercicio 1.5

Edita manualmente las funciones ud1_farea y ud1_fareapol, guardalas en tu carpeta de trabajo

y pruebalas desde la ventana de comandos de MATLAB.

Ejercicio 1.6

Crea una funcion que reciba la base y la altura de un triangulo y devuelva el area.

Ejercicio 1.7

Crea una funcion que reciba la masa y la velocidad de un movil y devuelva la energıa cinetica.

Ejercicio 1.8

Consideramos la funcion

function d=ud1_fprueba(a,b,c)b=c;a=b;d=a+b+c;

Pag. 39

Page 42: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Sin ejecutar la funcion, ¿que valor devolvera si invocamos desde MATLAB ud1 fprueba(1, 2, 3)?

Razonalo primero y compruebalo despues editando la funcion y ejecutando esa orden. Es la primera

funcion que tiene mas de dos argumentos. ¿Conmutan entre sı los argumentos de entrada?

Ejercicio 1.9

Crea una funcion que reciba los tres coeficientes a, b, c, de un polinomio de segundo grado y devuelvala raız

−b+√b2 − 4ac

2a.

Cuando se invoque la funcion, se elegiran los coeficientes para que la ecuacion tenga raıces reales. Se

recomienda usar una variable auxiliar D para definir el discriminante b2−4ac. ¿Conmutan entre sı los

argumentos de entrada?. Para comprobar si tu codigo es correcto, usa los coeficientes del polinomio

x2 − 7x+ 12, que tiene como raıces 3 y 4.

Ejercicio 1.10

Crea una funcion analoga para la otra raız,

−b−√b2 − 4ac

2a.

Ejercicio 1.11

Crea una funcion que reciba dos alturas, h1 y h2 y una masa y devuelva la energıa potencial perdi-

da/ganada por el cuerpo al caer/subir de h1 a h2.

1.4. Estructura de control condicional if

Hasta ahora, todas las sentencias se han ejecutado de modo consecutivo, una detras de la otra.No disponemos todavıa de herramientas que permitan controlar de algun modo la ejecuciono realizar operaciones mas complejas con la informacion de entrada a la funcion. La primerade esas herramientas y una de las mas importantes es el condicional y nos pone en la parrillade salida del desarrollo de estrategias y algoritmos para resolver los problemas de los que unordenador es capaz. Ademas, y no menos importante, se convierte en el primer mecanismo deprovocacion de vuestra capacidad de pensar y de articular un discurso complejo a partir deelementos mınimos, o sea, PROGRAMAR.

La estructura condicional aparece en los lenguajes de programacion normalmente mediante lapalabra reservada if. En MATLAB lo hace de ese modo, tal como se indica en las siguienteslıneas.

function y=nombrefuncion(arg1,arg2,....)........if cond

....

....end........

Pag. 40

Page 43: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 1. FUNCIONES Y CONDICIONALES

Por cond nos referimos a una condicion logica o combinacion de ellas. Ası, cond puede serque una variable sea mayor que un determinado valor, igual, mayor o igual (>=) etc. En casode que eso sea ası, se ejecutaran las sentencias que estan entre la sentencia del if y la primerasentencia end que se encuentre.

Es importante para que los codigos sean legibles tabular o indentar las instrucciones corres-pondientes a una estructura de control 3 o 4 espacios (seran 4 en nuestros ejemplos), comohemos hecho con el puntead en el bloque if anterior.

Uno de los ejemplos mas sencillos que se pueden poner de esta estructura es el de una funcionque devuelva el mayor de dos numeros a, b supuestos distintos entre sı. Se puede abordar esteproblema de varias maneras. La primera es mediante dos estructuras if, la primera controlan-do el caso de que a sea el mayor de los valores y la segunda controlando el caso de que elmayor sea b.

% ud1_fmayorab% primer uso del condicional if% Devuelve el mayor de dos numeros a,b% a,b se supondran diferentesfunction mayor=ud1_fmayorab(a,b)if a>b

mayor=a;end%if b>a

mayor=b;end

En la segunda posibilidad se define la variable mayor por defecto como a. Ahora se compruebasi b es mayor que a, y si eso es cierto se define la variable mayor como b.

% ud1_fmayorab0% Devuelve el mayor de dos numeros a,b% a,b se supondran diferentesfunction mayor=ud1_fmayorab0(a,b)mayor=a;if b>a

mayor=b;end

En la tercera variante se juega con la variable a calcular, dandole primero el valor a. Despuesse compara b con esa variable, y si en la comparacion gana b, se actualiza el valor de mayor.

% ud1_fmayorab0% Devuelve el mayor de dos numeros a,b% a,b se supondran diferentesfunction mayor=ud1_fmayorab1(a,b)mayor=a;if b>mayor

mayor=b;end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Pag. 41

Page 44: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Ejercicio 1.12

Abre la ventana principal de MATLAB, copia manualmente las funciones ud1_fmayorab, ud1_fmayorab0

y ud1_fmayorab1, guardalas en tu carpeta de trabajo y pruebalas .

Ejercicio 1.13

Crea una funcion que reciba un numero r y devuelva el area del cırculo de radio r si r ≥ 0 y −1 en

caso contrario.

Ejercicio 1.14

Crea una funcion que reciba un valor x y devuelva el valor y de la funcion definida a trozos:

y ={x+ 1 x < −11− x2 x ≥ −1

Ejercicio 1.15

(Para valientes) Crea una funcion que reciba tres numeros a, b, c, que se supondran diferentes entre

si, y devuelva el mayor de los tres.

1.5. Estructura de control condicional if-else

En el caso de que queramos que se ejecuten determinadas sentencias cuando cond sea falsa,deberemos complementar if con else. De este modo, si cond es cierta se ejecutara el primerbloque y si es falsa el segundo, como se muestra en el siguiente esquema:

function y=nombrefuncion(arg1,arg2,....)........if cond

bloque1else

bloque2end........

El ejemplo para ilustrar esta estructura es el correspondiente a la funcion que calcula el mayorde dos numeros supuestos distintos. Se comprueba si el primero es mayor que el segundo y sino es ası, se toma el mayor como el segundo.

% ud1_felseab% primer uso de la estructura if-else% Devuelve el mayor de dos numeros a,b% a,b se supondran diferentesfunction mayor=ud1_felseab(a,b)if a>b

mayor=a;else

mayor=b;end

Pag. 42

Page 45: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 1. FUNCIONES Y CONDICIONALES

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 1.16

Edita manualmente la funcion ud1_felseab, modificando alguna de las anteriores, guardala en tu

carpeta de trabajo y pruebala. Adivina cual sera el resultado si pasas como argumentos dos numeros

iguales.

Ejercicio 1.17

Crea una funcion que reciba un numero r y devuelva el area del cırculo de radio r si r ≥ 0 y −1 en

caso contrario, utilizando la estructura if-else.

Ejercicio 1.18

Crea una funcion que reciba un valor x y devuelva, utilizando la estructura if-else, el valor y de lafuncion definida a trozos:

y ={x+ 1 x < −11− x2 x ≥ −1

1.6. Funcion que llama a otra funcion

Una vez que con una funcion hemos resuelto un determinado problema y/o hemos agrupadouna serie de tareas, esa funcion es muy comodo verla como una caja negra que recibe unosargumentos de entrada y devuelve unos argumentos de salida (de momento uno solo de salida).Vista de ese modo, es natural que sea llamada por otra funcion que la necesita como partede la misma. La sintaxis de ello no ofrece ningun problema invocandose de modo analogo acomo se invoca desde la lınea de comandos. En el siguiente ejemplo codificamos una funciondefinida a trozos, similar a la del ejemplo 1.4, en la que el valor de uno de los trozos de lafuncion se obtiene llamando a una funcion creada previamente, la ud1_f1.m.

% ud1_ftrozos2% primera funcion q llama a otra funcion% ud1_ftrozos2(x). Devuelve el valor de la funcion:% f(x)=x si x<1% f(x)=xˆ2-ln(x) si x>=1function y=ud1_ftrozos2(x)if x<1

y=x+1;else

y=ud1_f1(x);end

El concepto de llamar a una funcion desde otra es muy poderoso y es la base para tantoresolver grandes problemas como ser capaz de repartir la escritura de grandes codigos entreun equipo de programadores. Haremos uso abundante de esta tecnica durante el curso y si elestudiante es habil conseguira simplificar la resolucion de muchos ejercicios si hace buen usode funciones ejemplo estudiadas en clase y de funciones codificadas al resolver otros ejercicios.Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 1.19

Edita manualmente la funcion ud1_ftrozos2, guardala en tu carpeta de trabajo y pruebala.

Pag. 43

Page 46: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

>> ud1_ftrozos2(2.3)>> ud1_ftrozos2(1.1)>> ud1_ftrozos2(0)>> ud1_ftrozos2(0.9)

¿Son correctos los resultados? ¿Que errores o problemas da?

Ejercicio 1.20Utilizando la funcion del area del rectangulo (ud1_farea), crea una funcion que reciba los dos

lados de la base y la altura de una piramide de base rectangular y devuelva su volumen (el volumen

de la piramide es 1/3 del area de la base por la altura).

Ejercicio 1.21Usando las funciones de los ejercicios 1.9 y 1.10, crea una funcion que reciba los tres coeficientes de

un polinomio de segundo grado de raıces reales y devuelva el producto de las mismas (se elegiran

los coeficientes para que ası sean). Prueba con varios polinomios (el producto de las dos raıces ha

de ser c/a).

Ejercicio 1.22(Para los valientes). Crea una funcion que que reciba los tres coeficientes de un polinomio de grado

2, llame a la funcion del apartado anterior para calcular el producto de sus raıces y que cuando las

raıces sean numeros complejos o cuando sea una raız doble, devuelva 0 en lugar del producto de las

raıces. Para ver si las raıces con complejas o reales, puedes ver el signo del discriminante, b2− 4ac.

1.7. Condicionales anidados.

Las estructuras de control pueden contener dentro de sus bloques de instrucciones internosotras estructuras de control. Es habitual que dentro de un bucle hay condicionales, o quedentro del bloque de un condicional haya un bucle y tambien es habitual que dentro del bloquede un condicional haya otro condicional. Esto lo reflejamos en el siguiente esquema.

function y=nombrefuncion(arg1,arg2,....)........if cond

bloque10if cond1

bloque11endbloque12

elsebloque2

end........

Para mostrar el funcionamiento, planteamos un ejemplo muy interesante, devolver el signo deuna variable entera n. Si n es estrictamente negativa el signo se toma como -1, si n es 0, elsigno sera 0, y si n es estrictamente positiva, el signo sera 1. Por tanto, hay que gestionartres posibilidades excluyentes, lo que abordaremos primero eliminando una de ellas frente a lasotras dos y despues las otras dos entre si.

Pag. 44

Page 47: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 1. FUNCIONES Y CONDICIONALES

% ud1_fsigno% funcion que devuelve el signo de un numero entero n% -1 si es negativo, 0 si es 0, 1 si es positivo.% primeros condicionales anidados.function signo=ud1_fsigno(n)if n<0

signo=-1;else

if n==0signo=0;

elsesigno=1;

endend

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 1.23

Edita manualmente la funcion ud1_fsigno, guardala en tu carpeta de trabajo y pruebala, desde

la ventana de comandos de MATLAB.

Ejercicio 1.24

Se trata de construir una funcion que reciba una calificacion (entre 0 y 10) y devuelva 0 si es

suspenso (calificacion estrictamente menor que 5), 1 si es aprobado (calificacion mayor o igual que 5

y menor que 7), 2 si es notable (calificacion mayor o igual que 7 y menor que 9), 3 si es sobresaliente

(calificacion mayor o igual que 9 y menor o igual que 10) y -1 si el argumento no esta entre 0 y 10.

No se podran utilizar operadores logicos.

Ejercicio 1.25

Crea una funcion que reciba un valor x y devuelva el valor y de la funcion definida a trozos:

y =

sin(x) x < 0x 0 ≤ x < 1x2 + log(x) x ≥ 1

No se podran utilizar operadores logicos.

Ejercicio 1.26

Funcion q devuelva el salario semanal de un trabajador en funcion del coste hora, de las horas que ha

trabajado y de un fijo de productividad que se cobra si se trabajan mas de 30 horas. Si se trabajan

mas de 40 horas, las horas por encima de esas 40 se pagan un 50 % mas caras (horas extras). No se

podran utilizar operadores logicos.

Ejercicio 1.27

Codifica la funcion

f(x) = max{ud1 f1(x), 7 cos(6x)}.

donde max significa maximo. En la definicion de ud1 f1 hay un logaritmo del argumento x implicado.

Por tanto, cuando x sea menor o igual que cero, ese logaritmo no podra ser evaluado y tomaremos

como maximo la unica funcion que esta definida. No se podran utilizar operadores logicos.

Pag. 45

Page 48: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

1.8. Variante elseif en el condicional

Una variante bastante util del condicional es la que permite abrir el abanico de posibilidadesde ejecucion a no solo el verdadero o falso referido a una determinada condicion. La idea esque si una condicion es cierta se ejecuten unas sentencias, pero si esta es falsa, se compruebeuna segunda condicion y si esta es cierta, se ejecuten el correspondiente segundo grupo desentencias, pero si la segunda condicion es falsa, se pase a una tercera y ası sucesivamente.Finalmente, la orden terminara con una sentencia else cuyo bloque de instrucciones posteriorse ejecutara si ninguna de las condiciones ha resultado cierta. Pretendemos reflejar esto conel siguiente esquema:

function y=nombrefuncion(arg1,arg2,....)........if cond1

bloque 1elseif cond2

bloque 2elseif cond3

bloque 3elseif......

.....else

bloque nend........

Si la condicion 1, cond1, es cierta, se ejecutara el bloque 1 de sentencias, y a posteriori sepasara directamente a las sentencias posteriores a la sentencia end. Si la condicion 1 fuesefalsa, se evaluarıa la condicion 2 y si esta fuese cierta, se ejecutarıa el bloque 2, pasandodirectamente a las sentencias posteriores a la sentencia end. Si ninguna de las condicionesfuese cierta, se pasarıa directamente a la ejecucion del bloque n.

Vemos esta estructura con el siguiente ejemplo. Se trata de construir una funcion que recibauna calificacion (entre 0 y 10) y devuelva 0 si es suspenso (calificacion estrictamente menorque 5), 1 si es aprobado (calificacion mayor o igual que 5 y menor que 7), 2 si es notable(calificacion mayor o igual que 7 y menor que 9) y 3 si es sobresaliente (calificacion mayor oigual que 9). Para codificar este ejemplo, lo primero que comprobamos es si la nota es menorque 5. Si no lo es, solo comprobamos si es menor que 7, por que ya sabemos que va a sermayor o igual que 5. Los demas casos son analogos.

% ud1_fnotas% primera vez q usamos el elseiffunction clave=ud1_fnotas(nota)if nota<5

clave=0;elseif nota<7

clave=1;elseif nota<9

clave=2;

Pag. 46

Page 49: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 1. FUNCIONES Y CONDICIONALES

elseclave=3;

end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 1.28Edita manualmente la funcion ud1_fnotas, guardala en tu carpeta de trabajo y pruebala, desde

la ventana de comandos de MATLAB. ¿Que ocurre si el valor del argumento no esta entre 0 y 10?

Ejercicio 1.29Se trata de construir una funcion que reciba una calificacion (entre 0 y 10) y devuelva 0 si es

suspenso (calificacion estrictamente menor que 5), 1 si es aprobado (calificacion mayor o igual que 5

y menor que 7), 2 si es notable (calificacion mayor o igual que 7 y menor que 9), 3 si es sobresaliente

(calificacion mayor o igual que 9 y menor o igual que 10) y -1 si el argumento no esta entre 0 y 10.

Se utilizara la variante elseif del condicional para realizar este ejercicio.

Ejercicio 1.30Crea una funcion que reciba un valor x y devuelva el valor y de la funcion definida a trozos:

y =

sin(x) x < 0x 0 ≤ x < 1x2 + log(x) x ≥ 1

Se utilizara la variante elseif del condicional para realizar este ejercicio.

Ejercicio 1.31Funcion q devuelva el salario semanal de un trabajador en funcion del coste hora, de las horas que ha

trabajado y de un fijo de productividad que se cobra si se trabajan mas de 30 horas. Si se trabajan

mas de 40 horas, las horas por encima de esas 40 se pagan un 50 % mas caras (horas extras). Se

utilizara la variante elseif del condicional para realizar este ejercicio.

Ejercicio 1.32Codifica la funcion

f(x) = max{ud1 f1(x), 7 cos(6x)}.donde max significa maximo. En la definicion de ud1 f1 hay un logaritmo del argumento x implicado.

Por tanto, cuando x sea menor o igual que cero, ese logaritmo no podra ser evaluado y tomaremos

como maximo la unica funcion que esta definida. Se utilizara la variante elseif del condicional

para realizar este ejercicio.

1.9. Operadores logicos

Si queremos construir condiciones algo mas interesantes, necesitaremos combinar condicioneselementales mediante los operadores logicos habituales, estudiados a menudo durante la etapade la educacion secundario. Necesitaremos saber escribir al menos los operadores Y logico y elO logico. Si se pretende construir una condicion que mezcle varias condiciones se pueden usarparentesis para establecer que operaciones logicas se hacen primero, de modo similar a comosucede con las operaciones aritmeticas.

Para el Y logico se usa el sımbolo reservado &. En el siguiente ejemplo vemos como se utilizaeste operador para construir una funcion que devuelva el mayor de tres numeros supuestosdistintos. Si uno de los numeros es mayor lo sera porque es al mismo tiempo mayor que unoy mayor que otro.

Pag. 47

Page 50: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

%% operadores logicos.function mayor=ud1_fmayor(a,b,c)if a>b & a>c

mayor=a;endif b>a & b>c

mayor=b;endif c>a & c>b

mayor=c;end

Otro operador interesante es el O logico (inclusivo). Para este se usa el sımbolo |, que se obtienepulsando la tecla Alt Gr y la del 1. En los siguientes ejercicios veremos algun ejemplo deutilizacion de este operador.

Ejercicio 1.33

Edita manualmente la funcion ud1_fmayor, guardala en tu carpeta de trabajo y pruebala, desde

la ventana de comandos de MATLAB.

Ejercicio 1.34

Construye una funcion que reciba tres valores a, b y c (que se supondran diferentes) y devuelva 1 si

a es el mayor, 2 si b es el mayor, y 3 si lo es c.

Ejercicio 1.35

Construye una funcion que reciba tres valores a, b y c devuelva el mayor si alguno de ellos es positivo

y el menor en caso contrario.

Ejercicio 1.36

Construye una funcion que reciba tres valores a, b y c (que se supondran diferentes) y devuelva el

mayor de ellos. No se podran utilizar operadores logicos, solo un bloque if-else y una llamada a la

funcion ud1 fmayorab

Ejercicio 1.37

¿Cual es el significado del argumento de salida de la siguiente funcion?

function mayor=ud1_fmayortres(a,b,c)mayor=a;if b>mayor

mayor=b;if c>mayor

mayor=c;end

end

Ejercicio 1.38

¿Que devuelve la siguiente funcion?

Pag. 48

Page 51: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 1. FUNCIONES Y CONDICIONALES

function y=ud1_prueba2(a,b,c)y=a+b+c;if a>b | c>b

y=y-b;if a>cy=y-c;

elsey=y-a;

endelse

y=b;end

Trata de obtenerlo sin usar el ordenador y despues compruebalo con algunos ejemplos.

Ejercicio 1.39Usando la funcion ud1 fmayor, construye una funcion que devuelva el maximo de cuatro valores.

Ejercicio 1.40(Para valientes) Idem con seis valores. Trata de hacerlo con un unico if −else y utilizando dos veces

la funcion del apartado 1.36.

Ejercicio 1.41(Para valientes) Idem con siete valores. Trata de hacerlo con el menor numero posible de if − else(ninguno).

Ejercicio 1.42(Para valientes) ¿Que errores hay en el siguiente programa? Se supone que la funcion deberıa devolverla potencia del segmento definido por tres abscisas a, b, c, es decir, el producto de las longitudes delos dos segmentos que determinan. No se sabe cual es la relacion de orden entre los valores pero sifuesen crecientes, la potencia serıa (b− a) ∗ (c− b).

function pot=ud1_fpotencia(a,b,c)if a>b & a>c

if b>cpot=(a-b)*(b-c)

elsepot=(a-c)*(c-b)

endend if b>a & b>c

if a>cpot=(b-a)*(a-c)

elsepot=(b-c)*(c-a)

endelse

if a>bpot=(c-a)*(a-b)

elsepot=(c-b)*(b-a)

endend

Trata de hacerlo primero en papel para encontrar algunos errores y luego prueba con el ordenador.

Prueba con (1, 2, 3), (3, 2, 1), (2, 1, 3), etc y con (1, 1, 2), (1, 2, 1), (2, 1, 1) y (1, 1, 1) (en estos cuatro

ultimos casos deberıa dar 0).

Pag. 49

Page 52: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

1.10. Operadores de comparacion: ¿son iguales?

La operacion de comparar si dos valores enteros son iguales tiene una sintaxis especıficaen MATLAB, colocando el sımbolo = de modo duplicado, ==. Cuando se trate de valorescorrespondientes a numeros reales, esta operacion es mas delicada y hablaremos de ella masadelante. En el siguiente ejemplo se muestra su uso para construir una funcion que indica sidos valores son iguales o no.

% ud1_figuales% operador de comparacion para numeros enterosfunction chivato=ud1_figuales(m,n)if m==n

chivato=1;else

chivato=0;end

La negacion logica se escribe en MATLAB anteponiendo al operador correspondiente el sımbolo∼, el cual se obtiene pulsando las teclas AltGr y 4. Por tanto, el operador para comprobarsi dos valores son distintos sera ∼=. En los siguientes ejercicios veremos algun ejemplo deutilizacion de este operador.

Ejercicio 1.43

Edita manualmente la funcion ud1_figuales, guardala en tu carpeta de trabajo y pruebala, desde

la ventana de comandos de MATLAB.

Ejercicio 1.44

Construye una funcion que reciba tres numeros enteros a, b y c y devuelva 1 si son iguales entre si,

y 0 en caso contrario.

Ejercicio 1.45

Construye una funcion que reciba tres numeros enteros a, b y c y devuelva 1 si a 6= b, 2 si a = b y

b 6= c y 3 si los tres valores son iguales.

Ejercicio 1.46

Construye una funcion que reciba tres numeros enteros a, b y c y devuelva 2 si los tres son iguales

entre si, 1 si dos de ellos son iguales entre si pero el tercero es diferente, y 0 si los tres son distintos.

Ejercicio 1.47

Repetir el ejercicio 1.46 sin utilizar ni else, ni elseif.

1.11. Igualdad entre numeros reales: precision y valor ab-soluto

Entender como el ordenador almacena y trabaja con numeros con cifras decimales escapaal contenido de este libro. Sin embargo, dado que la memoria RAM es finita, en numerosracionales periodicos o en numeros irracionales, es facil entender que sera imposible almacenarlas infinitas cifras que hay a la derecha del punto decimal. Ademas de estas dificultades de al-macenamiento, esta la dificultad conceptual relativa a la idea de igualdad entre numeros reales.

Pag. 50

Page 53: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 1. FUNCIONES Y CONDICIONALES

La mejor respuesta es pensar que dos numeros reales (y en general dos objetos cualesquiera enla vida profesional) son iguales cuando las diferencias entre ellos sean tan pequenas como lorequiera una determinada tarea. Ası, dos sillas del mismo modelo son objetivamente distintassi las vemos con mucho cuidado, pero si no tienen ningun defecto, seran a todos los efectosiguales. Lo mismo sucede con los numeros reales. Diremos que dos numeros reales son igualescuando el valor absoluto de su diferencia sea menor que un umbral de precision determinadoque dependera del significado y utilidad de dichas cantidades.

En el siguiente ejemplo observamos como se define ese umbral para comprobar si un trianguloes equilatero, isosceles, etc., y como se comprueba la igualdad de los lados recurriendo a lafuncion valor absoluto, abs en MATLAB.

% ud1_ftriangulos% recibe a, b y c, los lados de un triangulo% devuelve 3 si son los lados de un triangulo equilatero% devuelve 2 si son de un triangulo isosceles% devuelve 1 si son los lados de un triangulo escaleno% idea: cuando dos numeros reales son iguales, para% comprobarlo hay q definir una precison-umbral.function tipo=ud1_ftriangulos(a,b,c)

% Precision con la que trabajamos. Todo numero menor que% esa cantidad sera cero para nosotrosprec=(a+b+c)*1e-5;

if abs(a-b)<prec & abs(b-c)<prectipo=3;

elseif abs(a-b)<prec | abs(a-c)<prec | abs(b-c)<prectipo=2;

elsetipo=1;

end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 1.48Entra en al carpeta

Asignaturas\LP\Ejemplos.utilizando el enlace directo que tienes en el escritorio. Copia de ahı todos los ejemplos correspondientesa la unidad 1, aquellos ficheros cuyo nombre empieza por ud1 a tu propia carpeta ud1. Prueba lafuncion ud1 ftriangulos.

Ejercicio 1.49Crea una funcion que reciba tres valores, a, b y c y devuelva 1 si pueden ser los lados de un triangulo(la suma de dos lados cualesquiera ha de ser mayor que el otro, es decir, a + b > c, a + c > b yb+ c > a) y 0 en caso contrario.

Ejercicio 1.50Modifica el ejemplo ud1_ftriangulos para que reciba tres valores y devuelva 0 si no pueden serlos lados de un triangulo (usa la funcion creada en el apartado 1.49), 3 si es un triangulo equilatero,2 si es isosceles y 1 si es escaleno.

Ejercicio 1.51Codifica el ud1_ftriangulos en una sola lınea usando la funcion ud1 ftriangulos y el ejercicio1.49.

Ejercicio 1.52(Para valientes) Construye una funcion que reciba 4 numeros a, b, c, d, correspondientes a los ladosconsecutivos de un trapezoide, ası como la longitud de una las diagonales d1 y devuelva 1 si la figuraes un cuadrado, 2 si es un rectangulo, 3 si es un trapecio y 4 si no es ninguna de estas posibilidades.

Pag. 51

Page 54: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

1.12. Variables enteras y reales como argumentos

Hasta ahora habıamos utilizado variables que eran esencialmente o numeros enteros o numerosreales. En el siguiente ejemplo conviven ambos tipos como argumentos. La funcion recibe los valorescorrespondientes a las dimensiones principales de una determinada figura elemental (rectangulo,triangulo, cırculo, etc...) y recibe tambien un entero indicando el tipo de figura concreta a la que nosreferimos de entre esa lista. La funcion devuelve el area de dicha figura.

% ud1_fareafig% primera funcion que combina variables esencialmente diferentes,% una como tipo que funciona como un indicador de especie (numero% entero) y otras (a,b) q funcionan como numeros reales.% ademas b a veces es inutil.% ud1_fareafig(tipo,a,b) devuelve el area de distintas figuras% Si tipo=1, devuelve el area del rectangulo de lados a y b% Si tipo=2, devuelve el area del cırculo de radio a% Si tipo=3, devuelve el area del triangulo de base a y altura b% Si tipo=4, devuelve el area del cuadrado de lado a% Si tipo=5, devuelve el area del triangulo equilatero de lado a% Si no es ninguno de los tipos anteriores, devuelve -1function area=ud1_fareafig(tipo,a,b)if tipo==1

area=a*b;elseif tipo==2

area=pi*aˆ2;elseif tipo==3

area=a*b/2;elseif tipo==4

area=a*a;elseif tipo==5

area=a*a*sqrt(3)/4;else

area=-1;end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 1.53

Prueba la funcion ud1_fareafig, bien editandola manualmente o trayendola de una carpetadeterminada.

Ejercicio 1.54

Modifica la funcion ud1_fareafig para que tambien calcule el area del rombo.

Ejercicio 1.55

Codifica ud1_fareafig sin la orden else ni la elseif.

Ejercicio 1.56

Construye una funcion que reciba un parametro, raiz, y los coeficientes a, b y c de un polinomio desegundo grado. Devolvera la raız con el ’+’ en la formula si raiz es 1 y la raız con el ’-’ si raiz es6= 1. Para calcular estas raıces llamaremos a las funciones 1.9 y 1.10. Para comprobar si tu codigoes correcto, usa los coeficientes del polinomio x2 − 7x+ 12, que tiene como raıces 3 y 4.

Ejercicio 1.57

Codifica una funcion que reciba los coeficientes de un polinomio de grado 2 y devuelva la suma desus raıces, para lo cual usara del modo que corresponda la funcion del ejercicio 1.56. Para comprobarsi tu codigo es correcto, usa los coeficientes del polinomio x2 − 7x+ 12, que tiene como raıces 3 y4.

Ejercicio 1.58

Pag. 52

Page 55: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 1. FUNCIONES Y CONDICIONALES

(Para valientes) Sabiendo que una pulgada son 2.54 cm, que un pie son 12 pulgadas, y que unayarda son 3 pies se pide construir una funcion que reciba una cantidad, un numero que indicara enque sistema de medida esta (0 para el sistema internacional (SI) y 6= 0 para el sistema ingles) y otronumero que indicara en que unidades esta (1,2 o 6= 1, 2 segun sea mm, cm o metros en SI y 1, 2o 6= 1, 2 segun sea pulgadas, pies o yardas en el sistema ingles). La funcion devolvera la magnitudconvertida a metros si se ha recibido en el sistema ingles y convertida a pies si se ha recibido en elSI.

1.13. Variables contador y sumador

Ya vimos que el operador = en MATLAB no tiene mucho que ver con lo que ese operador significaen Algebra. Su significado es de asignacion. A la izquierda tendremos siempre una variable y a laderecha un expresion que puede combinar llamadas a funciones con operadores aritmeticos y logicos.El funcionamiento de la operacion es que primero se evalua la expresion a la derecha y el valorobtenido es asignado a la variable que esta a la izquierda.

Esto abre la puerta para operaciones que no tienen sentido matematico pero sı en Programacion,como decir que i = i+1. Lo que esto significa es que se evalua la expresion i+1 y se asigna su valora i, con lo cual esta variable habra incrementado su valor original en una unidad. En el siguienteejemplo aplicamos esta idea para encontrar la suma de los positivos entre cuatro numeros.

%% ud1_fsumapos%% primera variable sumadora (x=x+algo)%% suma de los positivos entre 4 numeros.function suma=ud1_fsumapos(a,b,c,d)suma = 0;if a>0

suma=suma+a;endif b>0

suma=suma+b;endif c>0

suma=suma+c;endif d>0

suma=suma+d;end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 1.59Prueba la funcion ud1_fsumapos

Ejercicio 1.60Construye una funcion que reciba 5 numeros a, b, c, d, y e y cuente cuantos son estrictamentepositivos.

Ejercicio 1.61Construye una funcion que reciba 5 numeros x, y, z, t, y s y dos numeros a y b y devuelva la sumade aquellos numeros de entre esos 5 que son mayores e iguales que a y menores o iguales que b.

Ejercicio 1.62Construye una funcion que reciba 5 numeros a, b, c, d, y e y un numero adicional positivo ref ydevuelva la suma de aquellos valores que sean negativos pero que su valor absoluto sea mayor queref . Por ejemplo, si los numeros son, -7, 12, 4, -3, -6 y ref vale 3.7, la suma serıa -7-5-=-13.

Pag. 53

Page 56: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

1.14. Funcion parte entera

Hay una funcion propia de MATLAB que se usa en muchos codigos y que conviene citar. Es la funcionque extrae la parte entera, redondeando hacia −∞, de un numero. Ası, la parte entera de 3.45 es 3,y la de -4.32 es -5. En el siguiente ejemplo se usa este operador, floor, para comprobar si un numeroes o no entero.

%% ud1_fesentero%% comprueba si un numero x es entero%% funcion parte enterafunction chivato=ud1_fesentero(x)parte_entera=floor(x);if x==parte_entera

chivato=1;else

chivato=0;end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 1.63

Prueba la funcion ud1_fesentero.

Ejercicio 1.64

Construye una funcion que reciba 4 numeros a, b, c, d y devuelva la suma de los que entre ellos sonenteros.

Ejercicio 1.65

Construye una funcion que reciba un numero natural n y devuelva 0 si n es par y 1 si n es impar.

Ejercicio 1.66

(Para valientes) Construye una funcion que reciba 4 numeros a, b, c, d y un numero entero n ydevuelva la suma de los que entre ellos son enteros y ademas multiplos de n.

Pag. 54

Page 57: Aprendiendo a programar en matlab

Unidad Didactica 2

Bucles

2.1. General

Como ya se indico al comienzo de la unidad 1, esta segunda unidad contiene junto con la primera lamayorıa de las herramientas que un alumno va a tener que utilizar a lo largo del curso.

La unidad se centra en la estructura de control mas importante, la que permite realizar repeticiones:los bucles. El bucle junto con los condicionales representan la base de la programacion estructurada.

2.2. Bucles

En muchos problemas de matematicas se requiere repetir o iterar un mismo procedimiento. Es porello que todos los lenguajes de programacion contienen la posibilidad de crear bucles. Un bucle enprogramacion es una sentencia que se realiza repetidas veces. Un bucle se utiliza para hacer un accionrepetida sin tener que repetir varias veces el mismo codigo, lo que ahorra tiempo, deja el codigo masclaro y facilita su modificacion en el futuro.

La variable entera que cuenta el numero de veces que regula la evolucion del bucle se conoce comoındice del bucle. Durante este curso un bucle lo relacionaremos con el uso del comando WHILE.

La gran ventaja de los bucles escritos mediante el uso de la sintaxis WHILE frente a otras formasde escribir un bucle radica en que el ındice del bucle es una variable mas del programa y su valor escontrolado en todo momento por el programador. Con este tipo de bucles, el fin de la iteratividadviene determinado por una condicion sobre una variable del programa que aparece a continuaciondel comando WHILE.

El primer ejemplo ilustra uno de los usos mas tıpicos de los bucles que sin lugar a dudas es la sumade un conjunto de elementos. El conjunto de elementos que se quieren sumar en este caso son losnaturales de 1 a n. El ındice i se inicializa por tanto a 1 y n es un argumento de la funcion. Lacondicion de corte del proceso iterativo que requiere la estructura WHILE se ejecutara cuando el ındicei sea mayor que n, en cualquier otro caso i se ira incrementando en una unidad y la variable sumase vera incrementada en el valor del propio ındice i. De esta forma cuando el bucle se interrumpa lavariable suma contendra el valor resultante de la suma de los n primeros numeros naturales.

%ud2_fsuma% Suma de todos los naturales entre 1 y n% primer buclefunction suma=ud2_fsuma(n)suma=0;i=1;

Pag. 55

Page 58: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

while i<=nsuma=suma+i;i=i+1;

end

Mediante los siguientes ejercicios se podra afianzar el concepto de bucle.

Ejercicio 2.1

Crea una carpeta llamada ud2 en Z : Copia en ella todos los ejemplos cuyo nombre empiece por ud2 ,los cuales encontraras en la carpeta:

Asignaturas\LP\Ejemplos

Anade la carpeta Z :\ud2 al path o Current Directory de MATLAB.

Ejercicio 2.2

Prueba la funcion ud2 fsuma

Ejercicio 2.3

Construye una funcion que reciba dos numeros naturales, m y n, con m < n, y devuelva la suma delos naturales entre m y n.

Ejercicio 2.4

Idem sin usar bucles y llamando a la funcion ud2 fsuma.

Ejercicio 2.5

Construye una funcion que reciba un numero natural, n y devuelva

sin(1) + sin(2) + . . .+ sin(n− 1) + sin(n)n+ 1

Ejercicio 2.6

(Para valientes) Construye una funcion que reciba dos numeros, reales a, b, con a < b, un numeronatural n, calcule h = (b− a)/n y devuelva

sin(a) + sin(a+ h) + sin(a+ 2h) + . . .+ sin(a+ (n− 1)h) + sin(b)n+ 1

,

es decir, el valor medio aproximado del seno entre a y b, tomando n + 1 puntos para aproximarlo.Tambien se puede ver como la posicion vertical del centro de gravedad de la curva y = sin(x) entrea y b si la consideramos representada por esos n+ 1 puntos.

Ejercicio 2.7

(Para valientes) Construye una funcion que reciba dos numeros, reales a, b, con a < b, un numeronatural n, y calcule la posicion vertical del centro de gravedad de la curva y = sin(x), consideradacomo una poligonal que se apoya en n+ 1 puntos de esa curva cuyas abscisas estan equiespaciadasentre a y b.

Ejercicio 2.8

(Para valientes) Construye una funcion que reciba dos numeros, reales a, b, con a < b, un numeronatural n, y calcule el centro de gravedad del superficie definida por los rectangulos que tiene comobase h = (b− a)/n y como altura sin(xi), con xi = a+ i ∗ h, 0 ≤ i < n.

Pag. 56

Page 59: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 2. BUCLES

2.3. Bucles con incremento variable

El segundo ejemplo es una variante del caso anterior donde se desea que tan solo se sumen losnumeros pares. La primera diferencia estriba en que el primer valor que debe tomar el ındice i debeser 2 y la segunda es que el incremento del ındice sea de dos unidades en vez de una.

% ud2_fsumapares% Suma todos los numeros pares entre 1 y nfunction suma=ud2_fsumapares(n)suma=0;i=2;while i<=n

suma=suma+i;i=i+2;

end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 2.9

Prueba la funcion ud2 fsumapares

Ejercicio 2.10

Construye una funcion que reciba un numero natural, n, y devuelva la suma de los impares entre 1y n.

Ejercicio 2.11

Construye una funcion que reciba un numero natural, n, y devuelva la suma de los multiplos de 3entre 1 y n.

Ejercicio 2.12

(Para valientes) Construye una funcion que reciba un numero natural n y devuelva 0 si n es par y 1si n es impar. No se podra usar la orden floor.

2.4. Bucles con otras operaciones

Como podemos ver en el siguiente ejemplo, el uso de un bucle se puede extender al producto igualque a la suma. De esta forma si hacemos productos de numeros que son siempre el mismo en estecaso x, estaremos hallando la potencia enesima de dicho numero.

% ud2_fpotencia% Calcula xˆn, repitiendo el producto.function pot=ud2_fpotencia(x,n)pot=1;i=1;while i<=n

pot=x*pot;i=i+1;

end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Pag. 57

Page 60: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Ejercicio 2.13

Prueba la funcion ud2 fpotencia

Ejercicio 2.14

Construye una funcion que reciba un numero natural, n, y devuelva

n! = 1 2 . . . (n− 1)n

Ejercicio 2.15

¿Que devuelve la siguiente funcion?

function y=ud2_fprueba(m,n,k)y=1;i=m;while i<=n

y=y*ii=i+k;

end

Sin ejecutarla, trata de calcular que devolverıa ud2 fprueba(2, 15, 3). Compruebalo con MATLAB.

Ejercicio 2.16

Construye una funcion que reciba un numero x y un numero natural, n, y devuelva x−n sin usar ∧ni llamar a ud2 fpotencia.

Ejercicio 2.17

Llamando a la funcion ud2 fpotencia y la funcion que has creado en el ejercicio 2.16, construye unafuncion que reciba un numero x y un entero a y devuelva xa.

Ejercicio 2.18

Construye una funcion que reciba x y n, calculando:∑i

xi

para lo cual llamara a ud2 fpotencia.

2.5. Bucles y relaciones de recurrencia

Otra aplicacion interesante de los bucles viene a partir del uso de las formulas de recurrencia, muyusadas en metodos numericos y calculo infinitesimal. El valor de una variable en un paso n dependede su valor en el paso anterior n− 1. El ındice del bucle sera capaz de ir avanzando con en numerode pasos y de este modo ir actualizando el valor de x en cada uno de los mismos. Ver el siguienteejemplo:

% ud2_fnewton% Recibe a y n y devuelve el termino n-esimo% de la sucesion x_(i+1)=x_i-((x_i)ˆ2-81)/(2*x_i), siendo% a el primer termino, x_1=a% Relacion entre sucesiones y bucles.function x=ud2_fnewton(a,n)

Pag. 58

Page 61: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 2. BUCLES

x=a;i=1;while i<=n-1

x=x-(xˆ2-81)/(2*x);i=i+1;

end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 2.19

Prueba la funcion ud2 fnewton con algunos valores y comprueba que los resultados son correctos.

Ejercicio 2.20

Construye una funcion que reciba un numero natural n y devuelva el termino n-esimo de la sucesion

xi+1 =√

2xi, x1 = 3.57, i ∈ N.

¿A que valor converge la sucesion cuando n→∞?

Ejercicio 2.21

Construye una funcion que reciba un numero natural n y devuelva ‖xn − xn−1‖, siendo xn y xn−1

los terminos n y n − 1 de la sucesion del ejercicio 2.20. Se llamara a la funcion creada en dichoejercicio.

Ejercicio 2.22

Construye una funcion que reciba un numero natural n y devuelva ‖xn − xn−1‖, siendo xn y xn−1

los terminos n y n − 1 de la sucesion del ejercicio 2.20. No se podra llamar a la funcion creada endicho ejercicio y solo se podra usar un bucle.

Ejercicio 2.23

Construye una funcion que reciba un numero natural n y devuelva el n-esimo termino de la sucesionde Fibonacci1.

xn+2 = xn + xn+1, x1 = 1, x2 = 2.

Ejercicio 2.24

Modifica el ejemplo 2.23 para que reciba un numero natural n y dos numeros x1 y x2 y devuelva eltermino n-esimo de la sucesion de Fibonacci.

1Leonardo Pisano nacio en 1170 probablemente en Pisa, en el seno de la familia Bonacci, de ahı susobrenombre Fibonacci, por el que es generalmente conocido. Su padre fue representante de los mercaderesde la Republica de Pisa en el norte de Africa, en lo que es hoy el noroeste de Argelia. Allı crecio y seeduco Fibonacci. En los numerosos viajes en los que acompano a su padre, Fibonacci aprendio las ventajas delos sistemas matematicos utilizados en otras culturas. Hacia 1200 regreso a Pisa y recopilo en diversos libroslo aprendido en sus viajes anadiendo ademas notables contribuciones propias.

Por ejemplo, en uno de sus libros introdujo el sistema decimal indo-arabigo, sistema de numeracion posicionalque usamos actualmente y extendio por Europa el uso del sistema arabe de numeracion. En el mismo libroaparece la conocida sucesion de Fibonacci, 1, 1, 2, 3, 5, 8, 13, 21, 34,... (en la que cada termino es sumade los dos anteriores) como solucion al siguiente problema: Un hombre aisla un par de conejos en un corral.¿Cuantos pares de conejos hay al cabo de un ano si se supone que cada par de conejos engendra un nuevopar que a partir del segundo mes se hace fertil?

Sin embargo, la mayor aportacion matematica de Fibonacci se encuentra en el area de la Teorıa de losNumeros, en la que, entre otros resultados destaca el estudio de metodos matematicos para encontrar triplesPitagoricos, es decir, tres numeros naturales, m, n y k que verifican m2 + n2 = k2.

Pag. 59

Page 62: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Ejercicio 2.25

(Para valientes) Construye una funcion que reciba tres numeros enteros p, q y r y devuelva 1 sir pertenece a la sucesion de Fibonacci iniciada por p y q y 0 en caso contrario (supondremos lasucesion monotona).

Ejercicio 2.26

(Para valientes) Idem siendo p, q y r numeros reales (supondremos la sucesion monotona).

Ejercicio 2.27

(Para valientes) El numero π, se puede obtener mediante la formula

π = 4 ∗ (1− 1/3 + 1/5− 1/7 + . . .+ (−1)i 12 ∗ i+ 1

+ . . .).

Construye una funcion que reciba un numero n y devuelva la aproximacion de π mediante los nprimeros sumandos de la expresion anterior (no hace falta utilizar ∧).

2.6. Bucles y condicionales

A continuacion se nos plantea la necesidad de contar los divisores de un numero natural n. Paraello hay que combinar un bucle con un condicional, es decir hay que recorrer todos los potencialescandidatos a divisor que van desde 1 a n y entre ellos ver los que realmente son divisores de n. Encaso de que verifiquen la condicion la variable de conteo de divisores se incrementa en una unidad yen el caso opuesto no se altera.

% ud2_fcuentadiv% ud2_fcuentadiv(n) cuenta los divisores de n% primer uso de modfunction num=ud2_fcuentadiv(n)num=0;i=1;while i<=n

if mod(n,i)==0num=num+1;

endi=i+1;

end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 2.28

Copia el ejemplo ud2 fcuentadiv a tu directorio. Pruebalo con algunos valores y comprueba que losresultados son correctos.

Ejercicio 2.29

Construye una funcion que reciba un numero natural n y devuelva 0 si n es par y 1 si n es impar. Seusara la orden mod.

Ejercicio 2.30

Construye una funcion que reciba un numero n, cuente los numeros que son pares y no son multiplosde 3 entre 1 y n y devuelva ese valor.

Pag. 60

Page 63: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 2. BUCLES

Ejercicio 2.31

Construye una funcion que reciba un numero n, recorra los valores

sin(1), sin(2), sin(3), . . . , sin(n),

y devuelva el numero de ellos que son positivos.

Ejercicio 2.32

Construye una funcion que reciba un numero n, recorra los valores

sin(1), sin(2), sin(3), . . . , sin(n),

y devuelva el producto de los que son positivos.

Ejercicio 2.33

Construye una funcion que reciba un ano y devuelva su siglo.

Ejercicio 2.34

La siguiente funcion que recibe un numero n y deberıa devolver el numero de valores entre 1 y npara los que sin es mayor que 1/2 menos para los que es menor que −1/2. Corrige los errores quetiene.

function c=ud2_fprueba2(n)i=1;while i<=n

if sin(i)>1/2c=c+1;

elsec=c-1;

endi=1+1;

end

Ejercicio 2.35

Construye una funcion que reciba dos numeros naturales m y n, y devuelva la cantidad de divisorescomunes.

Ejercicio 2.36

(Para valientes) Construye una funcion que reciba dos numeros naturales m y n, y devuelva sumaximo comun divisor.

Ejercicio 2.37

(Para valientes) Construye una funcion que reciba dos numeros naturales m y n, y devuelva sumınimo comun multiplo.

Ejercicio 2.38

(Para valientes) Construye una funcion que reciba 3 naturales m, n, p y devuelva una variable flag talque flag = 1 si el mınimo de los maximos comunes divisores entre dos de estos numeros correspondea la pareja m, n. flag = 2 si es m, p y flag = 3 si es n, p. Si por ejemplo m = 20, n = 30, p = 15,flag valdrıa 2. No se podra llamar a 2.36.

Ejercicio 2.39

(Para valientes) Construir una funcion que reciba un numero natural y devuelva el numero de cerosque hay en el (ası, por ejemplo, en 304 hay un cero, en 30 hay un cero y en 115 no hay ningun cero).Para contar cuantas cifras tiene el numero, podeis usar log10.

Pag. 61

Page 64: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

2.7. Uso de bucles para verificar una condicion sobre unconjunto.

El ejemplo que se ilustra a continuacion tan solo devuelve un valor 1 o 0 en el caso de que el numeroque introducimos como argumento sea o no primo. Al igual que en el caso anterior el bucle nosvale para recorrer todos los posibles candidatos que pueden cumplir una condicion, en este caso serdivisor del argumento numero. A diferencia del caso anterior basta con que la condicion se cumplauna vez para que no haga falta continuar el bucle, y podamos asegurar que el numero no es primodevolviendo por tanto un cero.

% ud2_fesprimo% ud2_fesprimo(numero) devuelve 1 si numero es primo% y 0 si no lo es% orden break.function primo=ud2_fesprimo(numero)primo=1;i=2;while i<=sqrt(numero)

if mod(numero,i)==0primo=0;break;

endi=i+1;

end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 2.40

Prueba la funcion ud2 fesprimo.

Ejercicio 2.41

Construye una funcion que reciba un numero natural n y devuelva su divisor mas grande distinto desı mismo.

Ejercicio 2.42

Idem mas pequeno y distinto de 1.

Ejercicio 2.43

Construye una funcion que reciba dos enteros, m, n, con m < n y devuelva el menor numero enteror entre m y n tal que sin(r) > 0 (se usara break). Se supondra que existe solucion. Por ejemplo, sim = 16 y n = 27 el resultado debe ser 19.

Ejercicio 2.44

Idem sin break.

Ejercicio 2.45

Construye una funcion que reciba un natural n y devuelva el mayor numero entero positivo m < ntal que sin(m) < 0. (se usara break). Se supondra que existe solucion. Por ejemplo, si n = 29 elresultado ha de ser 25.

Pag. 62

Page 65: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 2. BUCLES

Ejercicio 2.46

Idem sin break.

Ejercicio 2.47

Utilizando la funcion ud2 fcuentadiv, construye una funcion que haga lo mismo que ud2 fesprimo.

Ejercicio 2.48

Construir una funcion que reciba un numero natural n y un valor prec, itere la sucesion

xi+1 =√

2xi, x1 = 8, 32, i ∈ N

y si para algun 1 < i ≤ n, |xi − xi−1| < prec, devuelva xi. Si no, devolvera xn.

Ejercicio 2.49

Modificar la funcion creada en el ejercicio 2.23 para que reciba un numero num, y devuelva el primerelemento xi de la sucesion de Fibonacci x1 = 1, x2 = 2, xi = xi−1 + xi−2 tal que xi sea mayor quenum.Nota: Como en cada iteracion sumamos mas de 1, como mucho tendrıamos que hacer n iteraciones.

Ejercicio 2.50

Crea una funcion que reciba un numero num, calcule los terminos de la sucesion de Fibonacci x1 = 1,x2 = 2, xi = xi−1 + xi−2 menores que num y devuelva el numero de ellos que son primos.

Ejercicio 2.51

(Para valientes) Crea una funcion que reciba un numero num y devuelva 1 si descompone en productode dos primos y 0 si no es ası. Por ejemplo, para num = 6 = 3 · 2 devolvera 1 y para num = 7 onum = 12 devolvera 0. Usa la funcion ud2 fesprimo para determinar si un numero es primo o no.

2.8. Bucles anidados.

Al igual que hemos visto que se pueden encontrar unos condicionales anidados dentro de otros, estomismo ocurre con los bucles. En el ejemplo presentado a continuacion vamos a contar la cantidadde numeros primos que hay menores o iguales que el argumento de entrada n sin contar con el 1,esto lo llevaremos a cabo mediante el ındice i. Para ello planteamos un primer bucle donde i vayadesde 2 hasta n, y en cada uno de los casos realizamos un bucle interno sobre los posibles divisoresde i que vienen representados por el ındice j. Se deja al estudiante entender el porque se limita elcrecimiento del ındice j hasta que sea menor o igual que la raız cuadrada de i.

% ud2_fnprimos.m% ud2_fnprimos(n) devuelve el numero de primos% menores o iguales que n. No contamos el 1 como primo.% primer doble bucle (bucles anidados)function p=ud2_fnprimos(n)i=2;p=0;while i<=n

j=2;primo=1;while j<=sqrt(i)

Pag. 63

Page 66: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

if mod(i,j)==0primo=0; %i no es primobreak;

endj=j+1;

endif primo==1

p=p+1;endi=i+1;

end

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 2.52

Prueba la funcion ud2 fnprimos

Ejercicio 2.53

Construye una funcion que calcule el numero de primos menores o iguales que un numero n sinutilizar un doble bucle y llamando a ud2 fesprimo.

Ejercicio 2.54

Construye una funcion que reciba dos naturales, m y n, con m < n y devuelva la suma de losnumeros primos entre m y n.

Ejercicio 2.55

Construye una funcion que calcule la suma de de los primos menores o iguales que un numero n sinllamar a ud2 fesprimo.

Ejercicio 2.56

Construye una funcion que reciba dos naturales, m y n, con m < n y devuelva el producto de losnumeros primos entre m y n (sin llamar a ud2 fesprimo).

Ejercicio 2.57

Construye una funcion que reciba 3 naturales, m, n, p, con m < n y calcule:

m+m2 + · · ·+mp + (m+ 1) + (m+ 1)2 + · · ·+ (m+ 1)p + · · ·+ n+ n2 + · · ·+ np

Ejercicio 2.58

Construye una funcion que reciba dos naturales, m y n, con m < n y devuelva el mayor numeroprimo entre m y n. (Para valientes) Hacerlo sin usar break.

Ejercicio 2.59

Construye una funcion que reciba dos naturales, m y n, con m < n y devuelva el menor numeroprimo entre m y n. (Para valientes) Hacerlo sin usar break.

Ejercicio 2.60

(Para valientes) Construye una funcion que reciba dos naturales, m y n, con m < n y devuelva elmayor numero primo entre m y n. No se podra usar ud2 fesprimo.

Pag. 64

Page 67: Aprendiendo a programar en matlab

Unidad Didactica 3

Vectores

3.1. General

La unidad 3 introduce un elemento fundamental en Programacion: los vectores o “arrays”de datos.No hay apenas ordenes nuevas en esta unidad y nos concentramos en desarrollar algoritmos masinteresantes, los cuales permiten resolver problemas mas complejos y similares a los reales. Losvectores estan muy relacionados con los bucles que hemos estudiado en la unidad 2 pues son losbucles los que nos permiten movernos con generalidad por los vectores.

3.2. Vectores como argumentos de funciones

Este ejemplo es la primera funcion en la que se usa un vector. Ademas, ese vector es en si mismo elargumento de entrada de la funcion, lo cual no requiere ninguna sintaxis especıfica.

Como sabemos, desde que hicimos el tutorial (apendice 0), podemos preguntar a un vector o a unamatriz su tamano. Para ello disponemos de la orden length. Esto no es en general ası si usamos otrolenguaje de programacion, ya que en principio, ademas del vector, habrıa que pasar como argumentoun numero natural correspondiente a su dimension. En MATLAB no es necesario pero la primeralınea de la funcion es una asignacion de ese valor a una nueva variable n que nos va a permitir montarel bucle para movernos por el vector.

Para obtener la media tenemos que sumar todos los elementos del vector. Para ello, inicializamosa 0 la variable suma y mediante un bucle la vamos incrementando con los elementos del vector.Finalmente dividimos por su dimension para tener la media.

% ud3_fmedia.m% ud3_fmedia(v) recibe un vector v y% devuelve el valor medio de los elementos de v% Con esta funcion se introduce el uso de vectoresfunction m=ud3_fmedia(v)n=length(v);% n es la dimension o numero de

% elementos del vectorsuma=0; % Inicializamos la suma a 0i=1;while i<=n

suma=suma+v(i); % Sumamos el elemento i-esimo de vi=i+1;

endm=suma/n; % Una vez sumados, hallamos la media

Los ejercicios correspondientes a este ejemplo son los siguientes:

Ejercicio 3.1

Pag. 65

Page 68: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Crea una carpeta llamada ud3 en Z : Copia en ella todos los ejemplos cuyo nombre empiece por ud3 ,los cuales encontraras en la carpeta:

Asignaturas\LP\Ejemplos

Anade la carpeta Z :\ud3 al path o Current Directory de MATLAB.

Ejercicio 3.2Prueba la funcion ud3 fmedia.m para diferentes vectores.

Ejercicio 3.3Crea una funcion que reciba un vector y devuelva la media de los cuadrados de los elementos del

vector. ¿Coincidira el resultado con la media al cuadrado?

Ejercicio 3.4Crea una funcion que reciba un vector y devuelva la media geometrica de los elementos del vector.

La media geometrica de {a1, . . . , an} es n√a1a2 . . . an.

Ejercicio 3.5Crea una funcion que reciba dos vectores y devuelva el producto escalar de los mismos. Esta funcion

tambien se puede hacer sin utilizar bucles, como vimos en el tutorial. Se supondra que los dos vectores

tienen la misma dimension.

3.3. Funciones que llaman a funciones con argumentosvectores

Del mismo modo que en el ejemplo 1.6 estudiamos una funcion que llamaba a otra funcion,en este ejemplo vemos una funcion que recibe un vector y llama a otra funcion que recibe unvector, la que acabamos de estudiar, ud3 fmedia. La sintaxis no ofrece ninguna dificultad.

% ud3_fvarianza.m% ud3_fvarianza(v) recibe un vector v y% devuelve la varianza de los valores contenidos en el vector v% Se llama a una funcion que recibe un vector (ud3_fmedia)function var=ud3_fvarianza(v)suma2=0;m=ud3_fmedia(v);n=length(v);i=1;while i<=n

suma2=suma2+(v(i)-m)ˆ2;i=i+1;

endvar=suma2/(n-1);

De esta funcion no haremos ningun ejercicio especıfico, simplemente probar la funcion paradiferentes vectores, comprobando el significado del concepto varianza1. Tendremos ocasion dehacer abundantes ejemplos mas adelante.

Ejercicio 3.6Prueba la funcion ud3 fvarianza.m para diferentes vectores.

1Es una medida de como de semejantes son los elementos de un vector. Si son similares, la varianza espequena y si son muy diferentes, la varianza sera grande.

Pag. 66

Page 69: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 3. VECTORES

3.4. Calculo de extremos

Los algoritmos de busqueda de extremos son fundamentales en este curso y el mas basico detodos ellos es el de encontrar el maximo de una serie o vector. Para ello, se supone que elmaximo es el primero inicializando con ese valor una variable maxi que sera la que almaceneel maximo al final. A continuacion se van barriendo los demas elementos y en el momento enque encontramos un valor mayor que el que tenemos como referencia, maxi, asignamos a maxiese valor.

% ud3_fmaximo.m% ud3_fmaximo(v) recibe un vector v y devuelve% la mayor de sus componentes% El algoritmo de busqueda de maximo es fundamental en el curso.function maxi=ud3_fmaximo(v)n=length(v);maxi=v(1);i=2;while i<=n

if v(i)>maximaxi=v(i);

endi=i+1;

end

Es importante, muy importante, entender todos los detalles de este ejemplo. MATLAB disponede una funcion que realiza esta misma tarea, max, pero ello no es obice para estudiar el algorit-mo, el cual es fundamental. Los ejercicios correspondientes a este ejemplo son especialmenteinteresantes reflejando la importancia del algoritmo explicado.

Ejercicio 3.7

Prueba la funcion ud3 fmaximo.m para diferentes vectores.

Ejercicio 3.8

Crea una funcion que reciba un vector y devuelva el mınimo de los elementos del vector.

Ejercicio 3.9

Crea una funcion que reciba un vector de numeros naturales y devuelva el numero de elementos del

vector que sean multiplos de tres.

Ejercicio 3.10

Crea una funcion que reciba un vector v, cambie de signo todos los elementos del vector, calcule el

maximo del nuevo vector y lo devuelva cambiado de signo. ¿Que valor has obtenido?

Ejercicio 3.11

Crea una funcion que reciba un vector y calcule la media de los elementos positivos del vector. En

lugar de sumar todos los elementos, tendras que comprobar si un elemento es positivo o no antes de

sumarlo.

Ejercicio 3.12

Crea una funcion que reciba un vector de numeros naturales y utilizando la funcion ud2 fesprimo,

devuelva el numero de elementos del vector que son primos.

Pag. 67

Page 70: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Ejercicio 3.13

Idem sin if.

Ejercicio 3.14

Crea una funcion que reciba un vector y que devuelva 1 si todos los elementos del vector son positivos

y 0 en caso contrario.

Ejercicio 3.15

Crea una funcion que reciba un vector de numeros naturales y utilizando la funcion ud2 fesprimoy sin utilizar if devuelva 1 si todos los elementos del vector son primos y 0 en caso contrario.

Ejercicio 3.16

Codifica una funcion que reciba un vector de naturales v y devuelva el primer numero primo que

aparezca en el vector. Caso de que no haya ninguno, devolvera 0. Por ejemplo, si v = (9, 14, 11, 7, 12),

la funcion devolvera 11.

Ejercicio 3.17

Crea una funcion que reciba un vector v y devuelva el mınimo de las diferencias en valor absoluto

entre un elemento de v y la media de v. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y la

diferencia mınima es ‖3− 3.25‖ = 0.25.

Ejercicio 3.18

Crea una funcion que reciba un vector v y devuelva el valor del elemento de v que este mas cerca

de la media. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y el elemento mas proximo a la media

es 3.

Ejercicio 3.19

Crea una funcion que reciba un vector v y devuelva el ındice del elemento de v que este mas cerca de

la media. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y el elemento mas proximo a la media es el

1. Cambiad de orden los elementos en este ejemplo para probar el codigo y comprobar que funciona

en todas las circunstancias.

Ejercicio 3.20

Crea una funcion que reciba un vector v y devuelva el mınimo de las diferencias entre un elemento

de v y la media de v. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y la diferencia mınima es

1-3.25=-2.25.

Ejercicio 3.21

Crea una funcion que reciba un vector v y devuelva el ındice del elemento en el que se de el mınimo

de las diferencias entre un elemento de v y la media de v. Por ejemplo, si v = [3 2 1 7], la media

vale 3.25 y la diferencia mınima es 1-3.25=-2.25. El ındice del elemento cuyo valor es 1 es 3, pues

ocupa la tercera posicion en el vector.

Ejercicio 3.22

¿Que valor devuelve la siguiente funcion (v es un vector de numeros naturales)?

Pag. 68

Page 71: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 3. VECTORES

function y=ud3_fprueba(v)n=length(v);i=1;y=v(1);while i<=n

if ud2_fesprimo(i)==1 & v(i)>yy=v(i);

endi=i+1;

end

Ejercicio 3.23

(Para valientes) Crea una funcion que reciba un vector de naturales y devuelva 1 si todos los elementos

son primos y 0 en caso contrario, sin usar if.

3.5. Calculo de posicion de extremos

A veces no interesa tanto el valor del maximo como su posicion en el vector. En esta funcionse juega con esa idea, de tal modo que se guarda posicion cuando se supera la posicion dereferencia inicial (la primera). Es un algoritmo muy interesante y esencialmente mas complicadoy difıcil de entender que el anterior.

% ud3_fimax.m% ud3_fimax(v) recibe un vector v y devuelve% la posicion de la mayor de sus componentesfunction imax=ud3_fimax(v)n=length(v);imax=1; % Tomamos como maximo el primer elementoi=2;while i<=n

if v(imax)<v(i) % Si encontramos un elemento mayorimax=i; % actualizamos el valor de la posicion

endi=i+1;

end% Al final imax contiene la posicion de la mayor de las componentes

Los ejercicios correspondientes a este ejemplo son tambien bastante interesantes.

Ejercicio 3.24

Prueba la funcion ud3 fimax.m para diferentes vectores.

Ejercicio 3.25

Crea una funcion que reciba un vector de naturales y devuelva el ındice del primer numero primo que

aparezca en el vector. En caso de que no haya ninguno, devolvera 0.

Ejercicio 3.26

Crea una funcion que reciba un vector de naturales y devuelva el ındice del mayor primo que aparezca

en el vector. En caso de que no haya ninguno, devolvera 0.

Ejercicio 3.27

Pag. 69

Page 72: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

La siguiente funcion recibe un vector y deberıa devolver la mayor diferencia entre dos terminosconsecutivos (la diferencia de un elemento menos el anterior). Encuentra los errores.

function y=ud3_fprueba3(v)n=length(v);y=0;while i<=n

if abs(v(i)-v(i-1))>yy=v(i)-(v(i)-1);

endend

Pruebala con los vectores (1, 1, 1), (1, 2, 1), (1, 2, 4) y (4, 2, 1) (deberıa devolver 0, 1, 2 y -1.

3.6. Evaluacion de un polinomio

El ejemplo correspondiente a esta seccion ejemplifica el caso de una funcion que recibe escalaresy vectores como argumentos de entrada. Se trata de evaluar un polinomio en un punto,devolviendo el valor obtenido. Tiene detalles interesantes que pasamos a comentar. El primeroes el de la identificacion de un polinomio de grado n con un vector de n + 1 componentes ypor tanto, dimension n+1. Ası, si tenemos el siguiente polinomio de grado n la representacionhabitual que de el se hace serıa:

a0 + a1x + a2x2 + · · ·+ an−1x

n−1 + anxn

De este modo, este polinomio se identificarıa de modo inmediato con el vector a.

a = (a0, a1, · · · , an−1, an)

Sin embargo, no podemos trasladar esto directamente a MATLAB pues la indexacion de losvectores siempre empieza por la componente 1. Ello invita a repensar polinomio y vector delsiguiente modo:

a1 + a2x + a3x2 + · · ·+ anx

n−1 + an+1xn

a = (a1, a2, · · · , an, an+1)

Por tanto, el polinomio 2.5−3.7x2+0.5x3 se corresponderıa con el vector a = (2.5, 0.0,−3.7, 0.5).Como se puede observar, grado 3 pero dimension 4. La forma mas directa de construir unafuncion que evaluase este polinomio a en un punto x serıa

function y=ud3_fevalua0(a,x)n=length(a)-1;y=a(1);i=2;while i<=n+1

y=y+a(i)*xˆ(i-1);i=i+1;

end

en la cual simplemente vamos incrementando la variable y en el sumando aixi−1, hasta que i

sea n+1. Para invocar esta funcion desde la lınea de comandos, evaluando el ejemplo anterioren x = 2 tendremos:

Pag. 70

Page 73: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 3. VECTORES

>> ud3_fevalua0([2.5 0.0 -3.7 0.5],2)ans =

-8.3000

Para comprobar, haremos las siguientes operaciones:

>> 2.5+0.0*2-3.7*2ˆ2+0.5*2ˆ3ans =

-8.3000

Existe un algoritmo que evita el tener que calcular todas esas potencias ahorrando ciertotiempo. Se llama algoritmo de Horner2 En el algoritmo de Horner, el polinomio escribe del

Figura 3.1: Zoetropo de Horner

siguiente modo:a1 + x(a2 + x(a3 + x(a4 + · · ·+ x(an + xan+1))))

Es como si el polinomio 2.5−3.7x2+0.5x3 lo escribiesemos como 2.5+x(0.0+x(−3.7+x0.5)).Ello conduce a un algoritmo diferente en el que se empieza por el termino de grado mas alto yse va hacia abajo despues. Con ello, en este ejemplo aprendemos a recorrer el vector utilizandoun orden distinto al habitual y aprendemos tambien a desconectar la variable n de la dimensiondel vector, algo que en general os cuesta mucho.

% ud3_fevalua.m% ud3_fevalua(a,x), recibe un vector a de dimension n+1 y un escalar x y% devuelve el polinomio a(n+1)xˆn+...+a(2)x+a(1) evaluado en x,% escribiendolo como x(...(x(x a(n+1)+ a(n))+a(n-1))...+a(2))+a(1)% En este ejemplo, mostramos como recorrer los elementos de un vector en% otro orden y trabajamos con n distinto de la dimension del vector

function y=ud3_fevalua(a,x)n=length(a)-1;

2William George Horner (Bristol, 1786, Bath, 1837), matematico ingles conocido por haber desarrolladometodos para resolver ecuaciones polinomicas y sobre todo por ser el inventor del zoetropo(fig. 3.1), artilugioque creaba la ilusion optica de movimiento, y a partir del cual se evoluciono hasta la invencion del cine.

Pag. 71

Page 74: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

y=a(n+1);i=n;while i>=1

y=x*y+a(i);i=i-1;

end

Los ejercicios correspondientes a este ejemplo son bastante interesantes.

Ejercicio 3.28

Prueba la funcion ud3 fevalua.m.

Ejercicio 3.29

Aproximacion del seno. Para obtener un valor aproximado del seno de un angulo α evaluamos elpolinomio de Taylor:

α− α3

3!+α5

5!− α7

7!Usando la funcion ud3 fevalua.m, crea una funcion que reciba un valor de α y devuelva el valor del

seno de α, calculado a partir de la formula anterior.

Ejercicio 3.30

La siguiente funcion recibe un vector v y una posicion i y devuelve la diferencia entre el primer y elelemento i-esimo. ¿Es correcta? ¿Podrıas hacerla mas eficiente?

function dif=ud3_fdiferencia(v,pos)n=length(v);i=1;while i<=n

if i==posdif=v(1)-v(i);

endi=i+1;

end

Pista: No se deberıa usar un bucle ni un condicional.

Ejercicio 3.31

Crea una funcion que reciba dos vectores, el primero de los cuales seran los coeficientes de un

polinomio p(x). La funcion devolvera 1 si en el segundo vector aparece una raız de p(x) y 0 en caso

contrario. Utiliza ud3 fevalua.m para comprobar si un numero es raız del polinomio o no.

Ejercicio 3.32

Crea una funcion que reciba un vector t y un numero x y evalue en x el polinomio

(x− t1)(x− t2) . . . (x− tn),

donde n es la dimension del vector t. Es decir, evalua en x el vector de coeficiente principal 1 cuyas

raıces son los elementos de t.

Ejercicio 3.33

Pag. 72

Page 75: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 3. VECTORES

Crea una funcion que reciba un vector de naturales v y un natural d y devuelva 1 si todos los

elementos de v son divisibles por d y 0 en caso contrario.

Ejercicio 3.34

Crea una funcion que reciba un numero y un vector y devuelva el numero de veces que aparece ese

numero en el vector.

Ejercicio 3.35

(Para valientes) Usando la funcion creada en el apartado 3.34, construir una funcion que reciba un

vector y devuelva el elemento que se repite mas veces. Por ejemplo, en [0 1 2 1] devolverıa 1.

Ejercicio 3.36

(Para valientes) Crea una funcion que reciba α y un numero n y devuelva el valor del seno en α

aproximandolo por el polinomio de Taylor en 0 de grado n.

3.7. Funcion que devuelve un vector

A menudo, la salida de nuestras funciones pueden ser tambien vectores. En MATLAB, lasintaxis no cambia con respecto a la de una variable escalar convencional. En este ejemplo,ademas ese vector se construye a partir de varios escalares, pues de lo que se trata es deconstruir un vector con los terminos de la sucesion de Fibonacci, la cual ya estudiamos en elejercicio 2.23.

% ud3_fibo% ud3_fibo(x1,x2,n) devuelve los n primeros% terminos de la sucesion de Fibonacci% x_1=x1, x_2=x2, x_n=x_(n-1)+x_(n-2)% Por primera vez definimos una funcion que% devuelve un vector, y lo construimos con% argumentos de entrada escalares.function v=ud3_fibo(x1,x2,n)v(1)=x1;v(2)=x2;i=3;while i<=n

v(i)=v(i-1)+v(i-2);i=i+1;

end

Los ejercicios correspondientes a este ejemplo son:

Ejercicio 3.37

Prueba la funcion ud3 fibo.m.

Ejercicio 3.38

Construye una funcion que reciba un numero natural n y devuelva un vector v tal que sus componentessean

vi =(

1 +1i

)i

, 1 ≤ i ≤ n

Llama desde MATLAB a la funcion. ¿A que tienden las componentes del vector resultado?.

Ejercicio 3.39

Pag. 73

Page 76: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Construye una funcion que reciba un numero natural n y devuelva un vector formado por los nprimeros terminos de la sucesion

x1 = 2, 456, xi+1 =√

2xi, i ∈ N

Comprobar que converge a 2.

Ejercicio 3.40Crea una funcion que reciba dos valores, xmin, xmax, y el numero de tramos n. La funcion calcu-lara el valor

h =xmax− xmin

n,

y devolvera un vector x de n+1 componentes que contenga los puntos entre xmin y xmax separadoscada dos una distancia h. Ası pues,

x1 = xmin, x2 = xmin+ h, . . . , xn+1 = xmin+ nh = xmax.

Ejercicio 3.41(Para valientes) Construye una funcion que reciba un numero natural y devuelva el vector formado

por sus cifras. Ası, si introducimos 1423, devolvera [1 4 2 3].

Ejercicio 3.42(Para los mas valientes) Criba de Eratostenes. La manera mas rapida de obtener todos los numeros

primos menores que un numero dado n es mediante la Criba de Eratostenes. El procedimiento es el

siguiente: se toman todos los numeros menores que n y se van eliminando de la lista los multiplos

de dos, los multiplos de tres y ası sucesivamente hasta llegar a los multiplos de la raız cuadrada de

n.

Ejercicio 3.43Crea una funcion que reciba un numero n y devuelva todos los numeros primos menores que nmediante la Criba de Eratostenes. Como lista de numeros, usaremos un vector v de dimension 100que tenga en la posicion i el numero i y para marcar el numero como eliminado, pondremos un 0 endicha posicion.

Para mejorarlo, elimina los multiplos de los numeros primos entre 2 y√n en lugar de eliminar

los multiplos de todos los numeros entre 2 y√n. Notese que segun vamos aplicando la criba de

Eratostenes vamos obteniendo los numeros primos, ası que podemos utilizar la informacion guardada

en el vector para este caso.

Ejercicio 3.44Determina que valor devolvera la siguiente funcion si v = (1, 3, 2, 5, 4).

function y=ud3_fprueba2(v)n=length(v);i=1;y=1;while i<=n

if v(i)>yy=i;

endi=i+1;

end

Pag. 74

Page 77: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 3. VECTORES

3.8. Funciones que reciben y devuelven vectores

Cuando queramos por ejemplo una funcion que nos devuelva una curva evaluada en una seriede valores estructurados a su vez como un vector, deberemos tener la posibilidad de recibirun vector en la funcion y devolver otro vector. La sintaxis no ofrece ningun problema, peroconceptualmente hay que saber moverse a traves del vector de partida y generar otro. Vamosa plantear primero un ejemplo sencillo en el que se trata simplemente de codificar una funcionque reciba un vector de abscisas x y devuelva un vector de ordenadas y tal que para cadaabscisa xi, la ordenada correspondiente yi sea el maximo de las funciones seno y cosenoevaluadas en xi.

% ud3_fmaxsincos% ud3_fmax_vect(x) recibe un vector x y devuelve el vector% y tal que cada componente de y es el maximo de las% funciones seno y coseno evaluadas en cada componente de x% Primera funcion que recibe un vector y devuelve otro vector%function y=ud3_fmaxsincos(x)n=length(x);i=1;while i<=n

if sin(x(i))>cos(x(i))y(i)=sin(x(i));

elsey(i)=cos(x(i));

endi=i+1;

end

Para probar esta funcion podemos ejecutar los siguientes comandos desde la ventana de co-mandos de MATLAB.

>>x=0:0.01:8*pi;>>y=ud3_fmaxsincos(x);>>plot(x,y);

Otra posibilidad sencilla pero tambien interesante es el de tener una funcion que reciba unvector y uno o varios escalares y devuelva otro vector. Presentamos este ejemplo en el que setrata simplemente de codificar una funcion que reciba un vector x y un escalar a. La funciondevolvera un vector y, tal que la componente yi de ese vector sera 0 si la correspondiente xi

es menor que a y 1 en caso contrario.

% ud3_fmayormenor% ud3_fmayormenor(x,a) recibe un vector x y devuelve el% vector y tal que cada componente de y vale 0 o 1% dependiendo de que la correspondiente de x sea menor% o mayor o igual que a%function y=ud3_fmenormayor(x,a)n=length(x);i=1;while i<=n

if x(i)<ay(i)=0;

elsey(i)=1;

endi=i+1;

end

Pag. 75

Page 78: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Presentamos un ejemplo mas que tiene el interes de que llamamos a una funcion para ircalculando el valor de cada componente del vector resultado. Se trata de codificar una funcionque reciba un vector de naturales u y devolver un vector vprimos tal que cada componentede vprimos vale uno o cero en funcion de que la correspondiente componente de u sea o noprima.

% ud3_fvprimos% ud3_fvprimos(u) recibe un vector de naturales u y devuelve% un vector vprimos tal que cada componente de vprimos vale% uno o cero dependiendo de que la componente correspodiente% de u sea o no prima.

function vprimos=ud3_fvprimos(u)n=length(u);i=1;while i<=n

vprimos(i)=ud2_fesprimo(u(i));i=i+1;

end

En algunos casos, se puede utilizar la vectorizacion de operaciones explicada en el tutorialpara evitar uno de los bucles en la funcion, pero en general eso no sera posible. Los ejercicioscorrespondientes a este ejemplo son:

Ejercicio 3.45

Prueba las funciones ud3 fmaxsincos.m, ud3 fmenormayor.m y ud3 fvprimos.m.

Ejercicio 3.46

Crea una funcion que reciba un vector x y devuelva un vector y tal que yi = x2i − log(x2

i + 1) (se

podrıa hacer sin while, vectorizando las operaciones).

Ejercicio 3.47

Crea una funcion similar a la funcion ud3 fmaxsincos.m que calcule el maximo entre la funcion del

ejercicio 3.46 y el seno. Dibuja la curva resultado de modo analogo a como se dibujo la de dicha

funcion.

Ejercicio 3.48

Crea una funcion que reciba un vector x y devuelva un vector y tal que para cada ındice i, yi sea laaproximacion de sin(xi) dada por:

yi = xi −x3

i

3!+x5

i

5!− x7

i

7!.

Se llamara a la funcion del ejercicio 3.29 del modo que convenga. Dibuja con MATLAB el seno y su

aproximacion por la funcion anterior en [−π/2, π/2], con al menos 1000 puntos.

Ejercicio 3.49

Construye una funcion que reciba un vector de naturales, (m1, m2, . . . , mn) y devuelva el vectorde los factoriales, (m1!, m2!, . . . , mn!). Representa en una grafica la funcion factorial entre 1 y 10y la funcion exponencial entre 1 y 10.

Para mejorar la grafica, cambiamos la escala a logarıtmica, es decir, aplicamos el logaritmo a cada

una de las funciones. ¿Cual de las dos funciones crece mas rapido?

Ejercicio 3.50

Pag. 76

Page 79: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 3. VECTORES

Crea una funcion que reciba un vector v y devuelva un vector con los elementos del vector v pero

en orden inverso al original.

Ejercicio 3.51Crea una funcion que reciba un vector x y dos valores a y b, con a < b, y devuelva un vector y que

es el original truncado entre a y b.

Ejercicio 3.52Crea una funcion que reciba un vector y devuelva los datos escalados entre cero y uno. Para ello

determinaremos el valor mınimo del vector. Restamos ese valor al vector para que los datos comiencen

en cero. Calculamos el maximo del nuevo vector y dividimos cada elemento del vector por dicho

maximo. Al final tenemos que obtener un vector de numeros entre cero y uno, de modo que el menor

sea cero y el mayor uno y las diferencias entre dos elementos del vector original y los correspondientes

escalado sean proporcionales.

Ejercicio 3.53(Para valientes) Modifica la funcion anterior para que reciba un vector y dos valores a y b y devuelva

el vector escalado entre a y b.

3.9. Construccion de vectores

A menudo surgen problemas en los que a partir de un vector es necesario construir un nuevovector que no tiene la misma dimension que el original, situacion esencialmente mas sencillaque ya hemos contemplado en la seccion 3.8. Ademas, al construir este nuevo vector a partirdel original, a menudo no sabemos el tamano o dimension del vector resultante. La gestionde la memoria RAM en estos casos requerirıa un cierto cuidado en muchos lenguajes deprogramacion pero MATLAB lo maneja con mucha simplicidad. Ası, a medida que vamosdefiniendo nuevas posiciones del vector, ese vector crece en tamano y la memoria RAM quese necesita para el es gestionada de modo automatico por MATLAB.

Para ilustrar esta idea planteamos un ejemplo muy sencillo pero tambien muy bonito, y queademas sugiere infinidad de ejercicios muy interesantes, los cuales apareceran a lo largo delresto del curso. Se trata de una funcion que recibe un vector y devuelve otro vector que contieneunicamente las componentes positivas del vector original, colocadas en el mismo orden en elque estan en este.

Para ir construyendo este segundo vector, de tal modo que cada componente vaya en la posicioncorrecta, necesitamos un nuevo contador solo de componentes positivas. A medida que esecontador se va incrementando, vamos colocando en cada posicion el elemento correspondiente.El codigo completo de este ejemplo es el siguiente:

% ud3_fpositivas% Recibe un vector v y devuelve otro vp con las componentes% positivas de v. Es la primera funcion que recibe un% vector y va construyendo otro de dimension distinta% que el originalfunction vp=ud3_fpositivas(v)n=length(v);ip=0;i=1;while i<=n

if v(i)>=0ip=ip+1;vp(ip)=v(i);

endi=i+1;

end

Pag. 77

Page 80: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Los ejercicios correspondientes a este ejemplo especıficamente son los siguientes:

Ejercicio 3.54

Prueba ud3 fpositivas.m.

Ejercicio 3.55

Crea una funcion que reciba un vector u de numeros naturales, un natural m y devuelva un vector

v que contenga aquellos elementos de u que sean divisores de m. Por ejemplo, si u = (10, 7, 4, 5, 3)y m = 40, el resultado serıa v = (10, 4, 5)

Ejercicio 3.56

Crea una funcion que reciba un vector y devuelva un vector con los numeros primos que contiene.

Ejercicio 3.57

Crea una funcion que reciba un numero n y devuelva un vector con los numeros primos que sean

divisores de n.

3.10. Vectores y bucles anidados

A menudo, es necesario anidar bucles para resolver determinados problemas con vectores.Por ejemplo si tenemos dos vectores de numeros enteros y queremos saber cuantos elementoscomunes tienen (supuestos todos distintos en cada uno de los vectores), tendremos que fijar unelemento del primer vector y barrer todos los del segundo mediante un bucle y ası sucesivamentecon el segundo, tercero, etc., lo que requiere otro bucle exterior a ese.

% ud3_figuales% numero de elementos iguales entre dos vectores. Se% supone que todos los elementos en cada vector son distintos.% primeros bucles anidados con vectores.%function iguales=ud3_figuales(u,v)i=1;iguales=0;m=length(u);n=length(v);while i<=m

j=1;while j<=n

if u(i)==v(j)iguales=iguales+1;

endj=j+1;

endi=i+1;

end

Los ejercicios correspondientes a este ejemplo, muy interesantes, son:

Ejercicio 3.58

Prueba la funcion ud3 figuales.

Ejercicio 3.59

Modifica la funcion ud3 figuales para que funcione con vectores de numeros reales.

Pag. 78

Page 81: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 3. VECTORES

Ejercicio 3.60Construye una funcion que reciba un vector v de naturales y devuelva 1 si tiene dos elementos iguales

y 0 en caso contrario.

Ejercicio 3.61Construye una funcion que reciba un vector v de naturales y devuelva

∑vi!. No se podra llamar a

ninguna funcion y por tanto habra que usar bucles anidados.

Ejercicio 3.62(Para valientes) Crea una funcion que reciba un vector de numeros naturales y sin utilizar la funcion

ud2 fesprimo, devuelva el numero de elementos del vector que son primos.

Ejercicio 3.63(Para valientes) Crea una funcion que reciba un vector de numeros naturales y sin utilizar la funcion

ud2 fesprimo, devuelva el primer elemento de del vector que sea primo.

Ejercicio 3.64(Para valientes) Crea una funcion que reciba un vector de numeros naturales y sin utilizar la funcion

ud2 fesprimo, calcule y devuelva la media de los elementos primos para lo cual llamara a su vez a la

funcion ud3 fmedia.

Ejercicio 3.65(Para valientes) Crea una funcion que reciba un vector de numeros enteros y devuelva 1 si la suma

de dos cualesquiera de sus elementos es igual a un tercero y cero en caso contrario. Por ejemplo,

para v = [2, 7, 5] devolverıa 1 y para [−1, 2, 5] devolverıa 0.

Ejercicio 3.66(Para valientes) Construye una funcion que reciba un vector v de naturales y devuelva el numero de

veces que se repita el que mas veces se repita.

Ejercicio 3.67(Para valientes) Construye una funcion que reciba un vector v de naturales y devuelva el mayor de

los repetidos, sin llamar a ninguna funcion.

Ejercicio 3.68(Para valientes) Construye una funcion que reciba un vector v de naturales y devuelva el mayor de

los repetidos, llamando a ud3 fmaximo

Ejercicio 3.69(Para valientes) Crea una funcion que reciba un vector x, un entero n y devuelva un vector y talque para cada ındice i, yi sea la aproximacion de sin(xi) dada por un polinomio de Taylor en el 0 degrado n.Se usara la funcion 3.36. Por ejemplo, si introducimos el vector x = (1.9, 2.5, 2.8) y n = 7,el vector devuelto sera la el resultado de evaluar el polinomio

x− x3

3!+x5

5!− x7

7!.

en los puntos (1.9, 2.5, 2.8), o sea devolvera el vector y = (0.9454, 0.5885, 0.3078). El seno toma

en esas mismas abscisa los valores (0.9463, 0.5985, 0.3350). Recuerda que en la unidad 2 hay un

ejercicio, el 2.14, para calcular el factorial.

Ejercicio 3.70(Para valientes) Idem pero la evaluacion del polinomio en cada valor del vector x se realizara llamando

a la funcion ud3 fevalua.

Ejercicio 3.71(Para valientes) Idem sin llamar a ninguna funcion.

Pag. 79

Page 82: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

3.11. Funciones con salidas multiples

En esta seccion se presentan funciones que tienen mas de un argumento de salida. Es un temaque no plantea dificultad a los estudiantes y que permite hacer funciones mas interesantes. Enmultiples ocasiones es necesario obtener varios resultados en una misma funcion, para lo cual esnecesario pasarlos todos como argumentos de salida. La sintaxis es muy sencilla, simplementese agrupan todos los argumentos entre corchetes y separados por comas. El ejemplo maselemental que se nos ha ocurrido es el de resolver una ecuacion de segundo grado, la cualsiempre tendra 2 soluciones, sean reales, complejas o una raız doble. MATLAB es capaz detrabajar directamente con complejos pero es un tema al que apenas hemos prestado atenciony que escapa a los contenidos del curso. Por tanto, propondremos ejemplos de ecuaciones quetengan raıces reales.

% ud3_fe2grado.m% devuelve las dos soluciones de axˆ2+bx+c=0

function [x1,x2]=ud4_fe2grado(a,b,c)x1=(-b-sqrt(b*b-4*a*c))/(2*a);x2=(-b+sqrt(b*b-4*a*c))/(2*a);

Para invocar esta funcion desde la lınea de comandos, lo haremos del siguiente modo, porejemplo:

>> [r,s]=ud3_fe2grado(1,-3,2)r =

1s =

2

Con lo que se asignan a las variables r y s las dos raıces 1 y 2 de la ecuacion x2− 3x+2 = 0.

Ejercicio 3.72

Copia ud3 fe2grado.m a tu directorio y pruebala.

Ejercicio 3.73

Crea una funcion que reciba los coeficientes de una ecuacion de segundo grado y devuelva la suma

y el producto de las soluciones.

Ejercicio 3.74

Crea una funcion que reciba los coeficientes de la ecuacion ax4 +bx2 +c = 0, que resuelva utilizando

y = x2 llamando para ello a ud3 fe2grado.m, que deshaga el cambio de variable mediante x = ±√yy que devuelva las cuatro soluciones de la ecuacion original.

Ejercicio 3.75

Modifica la funcion ud3 fe2grado.m para que si las raıces son numeros imaginarios (el discriminante

b2 − 4ac es negativo) devuelva r1 = 0, r2 = 0 y otra variable error = 1. Si no son numeros

imaginarios devolvera las dos raıces en r1 y r2 y error = 0.

Ejercicio 3.76

Pag. 80

Page 83: Aprendiendo a programar en matlab

UNIDAD DIDACTICA 3. VECTORES

Crea una funcion que reciba un vector y devuelva el maximo y el mınimo de sus elementos, sin usar

las funciones min y max.

Ejercicio 3.77

Crea una funcion que reciba un vector y devuelva la posicion del maximo y del mınimo de sus

elementos.

Ejercicio 3.78

Crea una funcion que reciba un vector y devuelva el maximo, el mınimo y sus posiciones.

Ejercicio 3.79

Crea una funcion que reciba un vector u y devuelva dos vectores up y un con las componentes

positivas y negativas del vector u respectivamente, colocadas en el mismo orden.

Ejercicio 3.80

Crea una funcion que reciba un vector u de numeros naturales y devuelva un vector con los numeros

primos que contiene y otro con los no primos.

Ejercicio 3.81

Crea una funcion que reciba un numero n y devuelva un vector con los numeros primos que sean

divisores de n.

Ejercicio 3.82

Crea una funcion que reciba un vector v y devuelva un vector w y un numero error de modo que:

1. Si todos los elementos de v son estrictamente positivos, devolvera w(i) = Ln(v(i)), 1 ≤ i ≤ ny error = 0.

2. Si algun elemento es menor o igual que cero, devolvera w = v y error = 1.

Ejercicio 3.83

Crea una funcion que reciba los tres lados de un triangulo y devuelva en una variable lado, 1 si

es equilatero, 2 si es isosceles y 3 si es escaleno y en una variable angulo, 3 si es obtuso, 2 si es

rectangulo y 1 si es agudo. (Para valientes) La funcion devolvera 0 en las dos variables si los valores

introducidos no forman un triangulo.

Pag. 81

Page 84: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 82

Page 85: Aprendiendo a programar en matlab

Parte II

Guıa ECTS para estudiantes

Pag. 83

Page 86: Aprendiendo a programar en matlab
Page 87: Aprendiendo a programar en matlab

Capıtulo 1

Introduccion

Uno de los objetivos de este libro es ser un soporte de la introduccion de la metodologıabasada en los creditos europeos ECTS1 en la asignatura, aprovechando esta oportunidad paratransformar el modo en el que ensenamos Programacion. Ası, se pasa de un paradigma con unaevaluacion que obtiene informacion unicamente de un examen final, a una evaluacion basadacompletamente en los procesos, incorporada a los mismos y mucho mas rica. En esta partedel libro se pretende documentar con todo detalle esta metodologıa de evaluacion, para queel estudiante la conozca y se ubique en la misma. Con estos cambios pretendemos manteneral estudiante activo a lo largo de todo el curso, proponiendole mecanismos de enganche ala asignatura de modo continuo, tratando, como dice Stephen Ball en la cita que nos hainspirado, de mantener a todos los alumnos trabajando, comprometidos y con la sensacion deque no van a fracasar.

En esta parte del libro detallamos los objetivos y los relacionamos con las actividades realizadasa lo largo del mismo, indicando en que medida creemos que dichas actividades contribuyena la consecucion de los objetivos, e indicando tambien el tiempo que estimamos es necesariopara realizar dichas actividades.

Tambien destacamos los recursos que creemos son necesarios para realizar dichas actividades,para finalmente reflexionar sobre el tipo de evaluacion que creemos adecuado para un cursode este tipo, discutiendo sus ventajas e inconvenientes, y razonando sobre el esfuerzo que esnecesario para realizarla.

Esperamos que esta guıa resulte util y que cumpla los objetivos que antes citamos y que noshan llevado a escribirla. Ahora es el momento de que los estudiantes comprueben si ha sidoası y de que sugieran las mejoras que consideren convenientes.

1Los creditos LRU, los que se asocian a cada asignatura al hacer la matrıcula, se establecen unicamenteen funcion del numero de sesiones presenciales; por cada 10 horas de clase, un credito. Los creditos ECTScontabilizan no solo las horas de clase sino que intentan definir el peso de la asignatura teniendo en cuentael esfuerzo en tiempo que le cuesta aprobarla a un alumno medio. Este esfuerzo significa no solo asistir a lasclases sino tambien un trabajo bien individual bien con los companeros realizado fuera de las horas de clase.

Pag. 85

Page 88: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 86

Page 89: Aprendiendo a programar en matlab

Capıtulo 2

Datos generales

2.1. Temporalidad y caracter

2.1.1. Ciclo

Primero

2.1.2. Curso

Primero

2.1.3. Cuatrimestre

Primero

2.1.4. Caracter

Obligatoria

2.2. Creditos LRU

4.5 siendo 1.5 teoricos y 3.0 practicos

2.3. Departamento

Departamento de Ensenanzas Basicas de la Ingenierıa Naval

2.4. Profesores

Antonio Souto Iglesias, [email protected]

Leo Gonzalez Gutierrez, [email protected]

Alicia Canton Pire, [email protected]

Pag. 87

Page 90: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

2.5. Creditos ECTS

Horas presenciales Horas/semana Total horasTeorıa 1 15

Practicas 2 30Total 45

Horas no presenciales Total horasPracticas 41Examen – 4

Total 45

Total 90

Pag. 88

Page 91: Aprendiendo a programar en matlab

Capıtulo 3

Objetivos

3.1. General

Para contextualizar la definicion de objetivos, algunas de las titulaciones disponen de su libroblanco correspondiente, en el cual se especifican los perfiles profesionales a los que se orientala titulacion. En el caso de la titulacion INO esto no ha sido ası hasta bien entrado 2005,momento en que aparecion un libro blanco orientado a las nuevas titulaciones post-Bolonia1.Aunque en el estudio de las competencias transversales, no se presta una atencion particular enese libro a la Informatica, esta es, junto con los idiomas modernos, senalada como la materiabasica mas importante, para lo cual se recurrio a un significativo numero de encuestas entreprofesionales en activo. De hecho en el plan de estudios generico que se elabora en ese libroblanco, se da una importancia equivalente a la formacion obligatoria en Informatica a la quecorresponde a este curso de Lenguajes de Programacion.

Hablaremos ası primero de unos objetivos generales de la asignatura, a traves de una catego-rizacion de los mismos en conocimientos, capacidades y actitudes. A partir de estos objetivosgenerales disenaremos una serie de actividades las cuales agruparemos en una secuencia deunidades didacticas, que cubriran unos objetivos especıficos, y precisaran de unos determinadosrecursos.

3.2. Objetivos generales: descripcion

Como hemos comentado, agrupamos los objetivos generales en 3 categorıas:

1. Conocimientos. Cubren los aspectos mas teoricos de la formacion.

2. Capacidades. Referidos a aplicaciones, cuestiones practicas, habilidades.... muy en lıneacon el concepto de competencias.

3. Actitudes. Se refieren a determinados valores o motivaciones que se trate de generar opotenciar en el estudiante.

Conocimientos:

1http://www.aneca.es/activin/docs/libroblanco naval def.pdf

Pag. 89

Page 92: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

CoA. Adquirir una formacion elemental en Informatica conociendo el ordenador como unaherramienta de trabajo y conocer de modo basico su estructura y funcionamiento.

CoB. Conocer los principales tipos de datos y estructuras de control de la programaciondeclarativa y aprender su sintaxis en un lenguaje de programacion concreto. Hemoselegido el lenguaje script de MATLAB porque es una herramienta estandar en Inge-nierıa y porque, al tener una sintaxis sencilla, permite profundizar en los elementosde programacion.

Capacidades:

Realizar un programa de ordenador es un proceso que consta de 4 fases: especificacion,diseno, codificacion, validacion/verificacion. La primera, la especificacion, consiste endefinir las caracterısticas del sofware que se va a programar. Aunque es una etapaimportante queda fuera del contenido de esta asignatura, al ser muy dependiente deltipo de problemas industriales o de gestion a resolver, y no proceder su estudio en uncurso de introduccion a la Prgramacion. Las capacidades que queremos desarrollar sonlas necesarias para las otras tres etapas:

CpA. Codificacion. El alumno debe ser capaz de “traducir” algoritmos sencillos a codigoMATLAB. Este es un “requisito normal” en el sentido de que es un objetivo quenecesariamente debera alcanzarse para superar la asignatura. Seran en generalcodigos no muy complejos, de una, dos o tres acciones a lo sumo.

CpB. Diseno. El alumno debe ser capaz de analizar un problema sencillo y elaborar unalgoritmo que lo resuelva. Este es un “requisito innovador” en el sentido de que loconsideramos importante, pero no esencial para superar la asignatura.

CpC. Validacion. El alumno debe ser capaz de encontrar sus errores, entenderlos y cor-regirlos. Este es un “requisito esperado”: no se evalua directamente, pero esta im-plıcito en la evaluacion de los objetivos CpA y CpB.

Actitudes:

AcA. Conseguir una motivacion en el alumno que le impulse a profundizar en la In-formatica como herramienta necesaria para su futuro academico y profesional.

AcB. Trabajo en equipo. Hoy en dıa casi ningun proyecto involucra a un unico ingeniero.Por tanto, consideramos que saber trabajar en equipo es imprescindible y que sedeben ir formando las actitudes necesarias a lo largo de todos los estudios.

AcC. Actitud positiva ante los problemas. El afan de superacion y la perseverancia sonactitudes necesarias para un buen ingeniero.

AcD. Mejora continua. El aprendizaje, sobre todo el que perdura, no es labor de un dıani de una semana, sino que requiere constancia y esfuerzo.

AcE. Autocrıtica. El alumno debe ser capaz de reflexionar sobre sus capacidades, esfuerzoy proceso de aprendizaje para determinar en que punto esta y que acciones debetomar en el futuro.

Pag. 90

Page 93: Aprendiendo a programar en matlab

CAPITULO 3. OBJETIVOS

3.3. Prerrequisitos

LP es una asignatura del primer cuatrimestre del primer ano, y por tanto los prerrequisitosse refieren unicamente a que el estudiante debe haber cursado y aprobado los estudios deeducacion secundaria. Por tanto, se le supone una formacion basica en Matematicas. Ademasse puede suponer que estan cursando simultaneamente las asignaturas de Calculo y Algebra I,y por tanto manejan con cierta soltura sucesiones, vectores y matrices.

3.4. Otras asignaturas de las que LP es prerrequisito

En el plan de estudios vigente2 no se contempla la existencia de prerrequisitos en el sentidoestricto. Sin embargo, es conveniente haber cursado y superado LP antes de matricularse dela asignatura Metodos Numericos3, y de las asignaturas optativas o de libre configuracion“Leguajes de Programacion II” y “Complementos de Informatica”. Ademas, los lenguajes deprogramacion son utiles para muchas otras asignaturas, que pueden incluir trabajos para losque se necesite MATLAB y algunos elementos de Programacion.

2Plan 2002 de Ingeniero Naval y Oceanico de la Universidad Politecnica de Madrid3En realidad esto esta implıcito en la estructura del plan de estudios vigente, dado que no es posible

matricularse de ninguna asignatura de cuarto ano si no se han aprobado todas las del primer ano

Pag. 91

Page 94: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 92

Page 95: Aprendiendo a programar en matlab

Capıtulo 4

Programa y Metodologıa

En esta seccion describiremos todas las actividades que creemos necesarias para conseguir losobjetivos descritos en 3.2. Agruparemos estas actividades en una serie de unidades didacticaspara facilitar su descripcion, organizacion y temporalizacion.

4.1. Metodos docentes

4.1.1. Parte teorica de las sesiones DHOf

Todas las sesiones DHOf1 se impartiran en el Centro de Calculo (CC). Durante la parte deexposicion de teorıa se introducira cada uno de los temas ayudandose de ejemplos (ver parteI), utilizando la pizarra electronica que proporciona la interfaz tablet del portatil. Ademas,se comentaran los problemas observados durante la parte mas practica de la clase y comoevitarlos. Asimismo, al principio de cada sesion habra un recordatorio de las sesiones previasutilizando el archivo que para cada grupo se guarda en el tablet PC.

El objetivo de las clase teoricas es exponer los conceptos basicos y errores frecuentes a todoslos alumnos a la vez, tratando de evitar repetirlos a cada uno por separado.

4.1.2. Parte practica de las sesiones DHOf

La parte practica consistira en la realizacion de ejercicios en el CC (ver parte I), con la super-vision de uno o varios profesores, dependiendo del numero de alumnos y de la disponibilidad dedocentes. Esta parte practica, de acuerdo con la distribucion de creditos, cubrira dos terceraspartes de la asignatura.

Los alumnos se organizaran en parejas para que empleen la tecnica de “pair programming” dela metodologıa “extreme programming”. En cada pareja de programadores/alumnos, uno deellos disena el programa y el otro lo codifica (escribe el codigo) siguiendo las instrucciones delanterior, mientras trata de encontrar los fallos que pueda tener el diseno. Al terminar cada ejer-cicio se intercambian los papeles. El objetivo del “pair programming” es que el conocimientoeste igualmente repartido entre los miembros de la pareja, lo que es muy conveniente duranteel examen individual y en general, al final del proceso de aprendizaje planteado en LP.

Se potenciara el que los alumnos defiendan sus propios codigos proyectando los mismos en

1DHOf por dentro del horario oficial

Pag. 93

Page 96: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

la pizarra electronica. Ello es posible porque la carpeta Mis Documentos de cada maquinaesta compartida, y puede ser accedida desde el PC del profesor, proyectando desde este, elejercicio correspondiente.

4.2. Temario y estimacion del tiempo de estudio

4.2.1. Temario

Unidad 0. Introduccion a MATLAB.

Introduccion al curso. Conceptos basicos del entorno MATLAB. Operaciones elemen-tales. Variables.

Actividades:

Sesiones en el CC (4h).

Repaso y estudio I2 FHOf3 (2h).

Unidad 1. Funciones.

Definicion y uso de las funciones. Variables de entrada y salida. Condicionales. Funcionesque llaman a otras funciones.

Actividades:

Sesiones en el CC (8h).

Repaso y estudio I (0.5h).

Completar los ejercicios que no ha dado tiempo en clase (I o G4) (2h aprox.).

Unidad 2. Estructuras de Control.

Bucles. Contadores. Bucles anidados.

Actividades:

Sesiones en el CC (11h).

Repaso y estudio I (0.5h).

Completar los ejercicios que no ha dado tiempo en clase (I o G) (3h aprox.).

Unidad 3. Vectores.

Definicion de vector. Recorrido de un vector. Seleccion de ındices. Funciones con vec-tores.

Actividades:

Sesiones en el CC (9h).

Repaso y estudio I (0.5h).

Completar los ejercicios que no ha dado tiempo en clase (I o G) (4h aprox.).

2I por individual3FHOf por fuera del horario oficial4G por en grupo

Pag. 94

Page 97: Aprendiendo a programar en matlab

CAPITULO 4. PROGRAMA Y METODOLOGIA

Actividades:

Sesiones en el CC (7h).

Repaso y estudio I (0.5h).

Completar los ejercicios que no ha dado tiempo en clase (I o G) (5h aprox.).

4.2.2. Otras actividades

Presentacion del curso. (1h)

Prueba de control por parejas. (2 o 3 horas)

Repaso en la ultima semana. (3h en el CC + 2h (I o G) para completar ejercicios)

Examen final. (2h de examen + 10h de repaso)

Pag. 95

Page 98: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 96

Page 99: Aprendiendo a programar en matlab

Capıtulo 5

Recursos

5.1. Guıa

El mas importante de todos los recursos es esta Guıa Docente. En ella, ademas de definir elcontexto del curso de modo preciso se muestran los ejemplos y ejercicios correspondientes almismo en la parte I. Tambien se disponen de examenes propuestos en otras convocatorias, eltutorial de MATLAB y diversa documentacion importante para el alumno.

5.2. Tutorıas

Para los horarios y ubicacion de las tutorıas podeis consultar la pagina web de la escuela:

http://www.etsin.upm.es/

Independientemente de esas horas, y dado que los tres profesores tienen dedicacion completa,no tendran inconveniente en resolver dudas a cualquier hora, salvo que tuviesen alguna urgenciapuntual o no estuviesen en sus despachos.Algunas de estas tutorıas podrıan ser en algunos casos en el CC, lo cual se anunciara a lo largodel curso en clase, en la pagina web de la asignatura (5.4) o vıa e-mail.

5.3. Tutorıas virtuales

Con la ficha que han rellenado los estudiantes al principio de curso se formara una lista de correopara informarles de asuntos relativos a la asignatura (publicacion de notas, sesiones especialesde practicas, ...). Los estudiantes pueden consultar sus dudas mandandolas a las direcciones decorreo de los profesores, [email protected], [email protected], [email protected].

5.4. Pagina web - Plataforma de B-learning

La asignatura tiene vida paralela en la plataforma de B-learning del Gabinete de tele-educacionde la UPM (GATE). El enlace web para la misma es:

http://moodle.upm.es/titulaciones/oficiales/course/view.php?id=629

aunque se puede entrar a traves de Politecnica Virtual en la web de la UPM. El curso 2007-2008 fue la primera edicion de esta plataforma, la cual sustituye y supera a la pagina web de la

Pag. 97

Page 100: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

asignatura. En ella se ira colgando toda la informacion relativa a la asignatura, ası como califi-caciones(la publicacion de las mismas sera anunciada por correo electronico), documentacion,ejercicios y se utilizara como tablon de anuncios. Se dispone ademas de un foro, la participacionen el cual forma parte del item Participacion de la evaluacion de la asignatura. Para acceder aesta plataforma necesitais disponer de una direccion de correo electronico de la UPM, la cualos es facilitada al matricularos.

5.5. Copias

En copias estara disponible una version completa encuadernada de esta guıa docente.

5.6. Centro de Calculo

Los estudiantes pueden y deben usar el CC para estudiar LP, aunque han de respetar las nor-mas(ver apendice B). De vez en cuando, organizaremos sesiones de tutorıas allı (sobre todohacia el final del curso), para que el estudiante pregunte dudas mientras estudia. Para poderusar el CC hay que estar dado de alta como usuario (hablar con el personal del CC para estetramite y ver las normas en el apendice B).

5.7. Bibliografıa

Los siguientes libros, de los cuales damos un pequeno comentario, los podeis encontrar en labiblioteca de la ETSIN:

1. Tıtulo: MATLAB. Una introduccion con ejemplos practicos.

Autores: Amos Gilat

Editorial: Reverte

Ano: 2006

Excelente texto introductorio a MATLAB y a la Programacion con MATLAB. Creemosque es el que mejor trata la parte de Programacion, aunque el orden de los temas noes el mismo que el que seguimos en el curso. No obstante hay que tener en cuenta queen el libro se tratan comandos de MATLAB que no permitimos en clase, por ser muyespecıficos y no estar disponibles en general en los lenguajes de programacion.

2. Tıtulo: Aprenda MATLAB 5.3 como si estuviera en primero.

Autores: Javier Garcıa de Jalon, Jose Ignacio Rodrıguez, Alfonso Brazalez

Editorial: Escuela Superior de Ingenieros Industriales

Ano: 2001

Guıa para aprender MATLAB paso a paso. Esta pensada para estudiantes de primero yse puede seguir con facilidad. Aunque la parte de Programacion es demasiado escueta,es interesante tenerla para utilizarla como ayuda cuando utilicemos el MATLAB paraotras asignaturas. Se puede comprar en reprografıa de la ETSII o descargar de

Pag. 98

Page 101: Aprendiendo a programar en matlab

CAPITULO 5. RECURSOS

http://mat21.etsii.upm.es/ayudainf/aprendainf/MATLAB53/matlab53.pdf

3. Tıtulo: MATLAB, edicion de estudiante. Version 4 guıa de usuario.

Autores: The Math Works inc.

Editorial: Prentice Hall

Ano: 1998

Manual de referencia para la version de estudiante. Recoge todos los aspectos del pro-grama e incluye ejemplos para cada uno. Es muy escueta en la parte de Programacion.

4. Tıtulo: MATLAB guide

Autores: Desmond J. Higham, Nicolas J. Higham

Editorial: Siam

Ano: 2000

Otra guıa de referencia de MATLAB. Mas tecnica que las anteriores y un poco masextensa en el apartado de Programacion.

5. Tıtulo: Programing in MATLAB

Autor: Marc E. Herniter

Editorial: Thomson learning

Ano: 2001

Guıa de programacion con MATLAB. Contiene numerosos ejemplos y ejercicios. Es muytecnica, por lo que es mas recomendable para profundizar en lo aprendido que comolibro de texto.

6. Tıtulo: Getting Started with MATLAB

Autor: Rudra Pratap

Editorial: Oxford University Press

Ano: 2002

Comentario: Otra guıa de MATLAB. La parte de Programacion esta mas detallada queen algunas de las otras guıas y contiene algunos ejercicios.

7. Tıtulo: Algoritmos en C++

Autor: Robert Sedgewick

Editorial: Addison-Wesley Iberoamericana

Ano: 1995 Comentario: Otra guıa de MATLAB. La parte de Programacion esta masdetallada que en algunas de las otras guıas y contiene algunos ejercicios.

Pag. 99

Page 102: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 100

Page 103: Aprendiendo a programar en matlab

Capıtulo 6

Evaluacion

6.1. General

La parte de evaluacion del curso tiene como objetivo detectar si el estudiante ha conseguidolos objetivos que se persiguen con la asignatura, los cuales hemos enumerado en el capıtulo 3de esta guıa. En LP tratamos tambien que las propias actividades de evaluacion contribuyanen sı mismas al proceso formativo. Para ello, el alumno podra elegir entre dos modelos deevaluacion, el tradicional, que se ha venido utilizando hasta ahora, y el modelo ECTS, que sedebera implantar en Europa en cumplimiento de la declaracion de Bolonia y de lo que esta haimplicado en la configuracion del Espacio Europeo de la Educacion Superior. Por otro lado, seha establecido el Premio SENER a la mejor progresion durante el desarrollo de la asignaturaLP con el objeto de motivar a los estudiantes que llegan a la titulacion con unas notas mediasde la educacion secundaria bajas, ofreciendoles la oportunidad de que una buena progresionrespecto a la posicion de partida suponga una recompensa economica, con repercusion publicay curricular. Las bases de este premio estan descritas en el apendice D.

6.2. Evaluacion tradicional

Consistira en un examen final en el que se tratara de evaluar en que grado se han alcanzadolos objetivos descritos en 3.2. Los objetivos y estructura del examen estan descritos en 6.4.

Dado el caracter eminentemente practico de la asignatura (3 de los 4.5 creditos de LP sonpracticos) y el cambio importante que para un estudiante de primer ano supone su entradaen la universidad, creemos que es necesario que sigan el curso de modo regular. En la planifi-cacion que se ha hecho del curso no se ha considerado adecuado establecer sesiones teoricas ypracticas especıficas, conviviendo ambos aspectos en casi todas ellas. Debido a ello, el criteriode superacion de las practicas sera simplemente asistir a dos tercios (3/4.5) de las clases, paralo cual llevaremos un registro de asistencia.

En las convocatorias extraordinarias de Junio y Septiembre solo se podra optar a la evaluaciontradicional.

6.3. Evaluacion ECTS

La calificacion ECTS esta desglosada a partir de la evaluacion de las siguientes actividades:

Pag. 101

Page 104: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

1. Trabajo en equipo: 35 %. En algunas de las sesiones se propondra una prueba-control arealizar en pareja. Estos controles pretenden evaluar la dinamica del grupo (AcB) y queel alumno compruebe la evolucion de los conocimientos (AcD). Los controles consistiranen la realizacion de unos ejercicios similares a los de las hojas del tema en curso (CoA,CoB, CpA y CpC). Los controles se deberan hacer en pareja, no pudiendo hacerlo encaso de que falte uno de sus integrantes. Estos examenes no seran anunciados. Ademas,no se permitira el acceso al aula a los estudiantes que lleguen mas de 5 minutos tarde.

2. Examen final consistente en la resolucion de una serie de problemas practicos: 35 %. Losobjetivos y estructura del examen estan descritos en 6.4.

3. Participacion activa en las clases: 15 %. El profesor valorara la participacion (AcA) y laactitud positiva ante los problemas (AcC) a partir de la participacion de los alumnos enclase: preguntas, salir a la pizarra, comentarios, etc.

Se valorara que el alumno sea activo con hasta cinco puntos, es decir, que salga aexplicar sus programas, comente los de los demas, pregunte lo que no quede claro, etc, ycon otros cinco puntos la calidad de esa participacion, es decir, que los programas seaninteresantes y las explicaciones claras, que las preguntas sean interesantes y demuestrensaber de lo que se esta hablando, etc.

Para que a los profesores les sea mas facil la evaluacion de la participacion, los alumnosdebera entregar una fotografıa con su nombre y DNI en el reverso al comenzar el curso,junto con la ficha con el resto de sus datos personales y decision de optar al premioSENER.

Se realizaran y publicaran dos calificaciones, una cuando haya transcurrido la mitad delcurso con efectos informativos, y la otra cuando haya transcurrido el curso completo. Lanota sera la correspondiente a la valoracion final.

4. Otras actividades: 10 %. Las actividades que forman parte de este apartado correspondena la valoracion de las intervenciones en el foro de la plataforma de B-learning (ver secc.5.4), las cuales permitiran valor objetivos relativos a conocimientos (CoB) y los objetivosactitudinales de actitud positiva y de mejora continua (AcC, AcD). Los comentarios ysugerencias sobre esta propia Guıa ası como la correccion de erratas de la misma seconsidera parte de este item de evaluacion.

Ademas, y mas importante, se propondran actividades para realizar fuera de clase duranteel curso, como por ejemplo que el estudiante proponga ejercicios similares a los del curso,los cuales seran resueltos o al menos intentados por parte del companero de grupo.Con ello se pretenden evaluar los objetivos de capacidades relativos a diseno(CpB),codificacion(CpA) y validacion(CpC).

Finalmente, dentro de este item se considerara tambien el llevar al dıa la hoja de controly contabilizacion de tiempo y esfuerzo (objetivo AcD), la cual ademas ayuda al alumnoa establecer si esta realizando el esfuerzo recomendado por los profesores para seguir elcurso (objetivo AcE).

5. Realizacion de la encuesta sobre la asignatura (3 %) y participacion en el debate posterior(2 %). Esta encuesta sera realizada una vez publicadas las notas de la asignatura. En eldebate se mostraran los resultados de la encuesta y se pedira la opinion de los alumnos.

Pag. 102

Page 105: Aprendiendo a programar en matlab

CAPITULO 6. EVALUACION

Estas dos notas se conservaran para las convocatorias de junio y septiembre a los quehayan suspendido. Se valorara de este modo tambien la la actitud positiva ante losproblemas (AcC), la capacidad de autocrıtica (AcE), ası como la de mejora continua(AcD).

En caso de que un alumno complete los requisitos que le habilitan para seguir los dos metodosde evaluacion (tradicional y ECTS), su nota final sera la mayor de las dos calificaciones.

6.4. El examen

6.4.1. Tipo de examen

El examen consistira en la codificacion en el Centro de Calculo de una serie de ejerciciossimilares a los propuestos de modo continuo durante el curso y similares tambien a los queforman los examenes por grupos. Se facilitan ejemplos de enunciados en el apendice A. Estosexamenes se realizaran en clase en la ultima parte del curso.

El codigo a entregar no debe tener errores y debe realizar las tareas correspondientes al corres-pondiente ejercicio. Se nombraran los codigos correspondientes a cada ejercicio como f1.m,f2.m etc.... Las normas para escribir los codigos son las habituales con la que se trabaja en elcurso y estan explicadas en la seccion 6.4.3.

6.4.2. Criterios de evaluacion

El examen individual tendra ejercicios diversos, con los cuales evaluar la consecucion de lostipos de objetivos CpA y CpB.

Ası, habra ejercicios en los cuales se detallara un algoritmo que el alumno tendra que codificaren MATLAB. En estos ejercicios no se esperan capacidades innovadoras y su puntuacionacumulada sera suficiente para aprobar el examen. Algunos de estos algoritmos tendran ciertacomplejidad.

Tambien habra ejercicios un poco mas abiertos en los que el propio estudiante tenga quepensar y disenar los algoritmos. Finalmente, reconocemos que de manera implıcita estamosvalorando CpC. Por ello, cuando proceda, proporcionaremos al alumno una serie de ejemplosque funcionaran como baterıa de pruebas del codigo.

6.4.3. Normas del examen

Normas para la realizacion de los ejercicios en los examenes.

1. Las funciones se ubicaran en ficheros independientes, cuyo nombre coincidira con el dela funcion a falta por supuesto de la extension .m.

2. La funcion del ejercicio 1 se llamara f1, la del ejercicio 2 se llamara f2, y ası sucesiva-mente. ESTO ES IMPORTANTE!. No se llamaran ni examen1, ni examen f1, etc...Los nombres han de ser f1, f2, etc...

3. El unico material permitido es un bolıgrafo. No se permite el uso de ningun dispositivode almacenamiento, incluidas memorias USB.

Pag. 103

Page 106: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

4. Debera estar escrito en MATLAB. No se permitira usar funciones propias de MATLABno estudiadas durante el curso, ni conceptos o estructuras correspondientes a ejemplosy unidades didacticas que todavıa no se hayan explicado. No se permitira el uso de lavectorizacion de operaciones explicada en el tutorial, ni la multiplicacion directa de matri-ces. O sea, todas las operaciones hay que realizarlas siempre componente a componentecuando se trate con vectores.

5. Cuando en el enunciado se exija la utilizacion de una rutina estudiada en elcurso o incluida en el enunciado, esta no podra ser modificada. Debera serusada tal y como esta escrita en los apuntes o en el enunciado. Si crees quenecesitas modificarla para poderla utilizar es que lo estas haciendo mal.

6. Las funciones se ubicaran en ficheros independientes, cuyo nombre coincidira con el de lafuncion a falta por supuesto de la extension .m. La funcion del ejercicio 1 se llamara f1,la del ejercicio 2 se llamara f2, y ası sucesivamente.

7. En las funciones solo se utilizaran aquellos argumentos de entrada y salida que se es-pecifiquen en el enunciado.

8. La primera lınea de cada programa o funcion sera un comentario con vuestros apellidos,nombres y el numero de maquina en la que estais.

9. Todos los ficheros estaran ubicados en la carpeta C : \examenes.

10. Se podran usar todos los ejemplos (no ejercicios) que se han estudiado en el curso hastael dıa del examen, los cuales puedes encontrar en la carpeta correspondiente.

11. Se podran crear funciones auxiliares (como una que calcule el factorial por ejemplo), sicrees que te pueden simplificar el trabajo

12. Al terminar el examen, se cerrara la sesion pero NO se apagara el ordenador.

6.4.4. Publicacion de calificaciones

La publicacion de calificaciones sera unicamente online mientras estas calificaciones sean pro-visionales. Una vez definitivas, se redactara el acta correspondiente para pasarla a los serviciosde Secretarıa de la ETSIN.

Se dispone en la web de la asignatura (ver 5.4) de una utilidad en la que introduciendo el DNIse puede ver la nota de la ultima convocatoria. Con ello conseguimos una privacidad relativapero creemos que suficiente.

6.4.5. Revision del examen

En el enunciado de cada examen se anunciara una fecha aproximada de publicacion de lasnotas y un dıa y hora para la revision de examen. Los estudiantes que deseen revisar su examendeberan comunicarlo, por email o por cualquier otro medio a los profesores. En la revision sefacilitara a cada estudiante su examen ası como una copia de las soluciones. Durante 60’tendra a los profesores de LP a su disposicion para responder todas las dudas que considerepertinentes.

Pag. 104

Page 107: Aprendiendo a programar en matlab

CAPITULO 6. EVALUACION

6.5. Evaluacion de los objetivos

La siguiente tabla relaciona los objetivos generales de la asignatura, descritos en la seccion 3.2,con los diferentes apartados de la evaluacion ECTS descritos en 6.3. Es decir, resume que secalifica en cada ıtem de la evaluacion.

Participacion Examen Otras act. Grupos Encuesta/debateCoA x x xCoB x x xCpA x x x xCpB x x x xCpC x x x xAcA x xAcB xAcC x x xAcD x x xAcE x x

Pag. 105

Page 108: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 106

Page 109: Aprendiendo a programar en matlab

Parte III

Apendices

Pag. 107

Page 110: Aprendiendo a programar en matlab
Page 111: Aprendiendo a programar en matlab

Apendice A

Ejemplos de Examenes

Pag. 109

Page 112: Aprendiendo a programar en matlab

Examen final de Lenguajes de Programacion. Febrero 2008Escuela Tecnica Superior de Ingenieros Navales

Fecha aproximada de publicacion de las notas: 29/02/2008Dıa y hora de la revision: 03/03/2008, 12h30mTiempo para esta parte : 85 minutosPuntuacion: 10 puntos.

Normas para la realizacion de los ejercicios en los examenes.

1. Las funciones se ubicaran en ficheros independientes, cuyo nombre coincidira conel de la funcion a falta por supuesto de la extension .m.

2. La funcion del ejercicio 1 se llamara f1, la del ejercicio 2 se llamara f2, y ası sucesi-vamente. ESTO ES IMPORTANTE!. No se llamaran ni examen1, ni examen f1,etc... Los nombres han de ser f1, f2, etc...

3. El unico material permitido es un bolıgrafo. No se permite el uso de ningun dis-positivo de almacenamiento, incluidas memorias USB.

4. Debera estar escrito en MATLAB. No se permitira usar funciones propias de MAT-LAB no estudiadas durante el curso, ni conceptos o estructuras correspondientes aejemplos y unidades didacticas que todavıa no se hayan explicado. No se permitirael uso de la vectorizacion de operaciones explicada en el tutorial, ni la multiplicaciondirecta de matrices. O sea, todas las operaciones hay que realizarlas siempre com-ponente a componente cuando se trate con vectores.

5. Cuando en el enunciado se exija la utilizacion de una rutina estudiada enel curso o incluida en el enunciado, esta no podra ser modificada. Deberaser usada tal y como esta escrita en los apuntes o en el enunciado. Sicrees que necesitas modificarla para poderla utilizar es que lo estas haciendo mal.

6. Las funciones se ubicaran en ficheros independientes, cuyo nombre coincidira conel de la funcion a falta por supuesto de la extension .m. La funcion del ejercicio 1se llamara f1, la del ejercicio 2 se llamara f2, y ası sucesivamente.

7. En las funciones solo se utilizaran aquellos argumentos de entrada y salida que seespecifiquen en el enunciado.

8. La primera lınea de cada programa o funcion sera un comentario con vuestrosapellidos, nombres y el numero de maquina en la que estais.

9. Todos los ficheros estaran ubicados en la carpeta C : \examenes.

10. Se podran usar todos los ejemplos (no ejercicios) que se han estudiado en el cursohasta el dıa del examen, los cuales puedes encontrar en la carpeta correspondiente.

Page 113: Aprendiendo a programar en matlab

11. Se podran crear funciones auxiliares (como una que calcule el factorial por ejemplo),si crees que te pueden simplificar el trabajo

12. Al terminar el examen, se cerrara la sesion pero NO se apagara el orde-nador.

Page 114: Aprendiendo a programar en matlab

Ejercicios.

1. Crea una funcion que reciba un vector v de numeros naturales y un natural my nos devuelva el numero de elementos de v que son multiplos de m. Devolveraademas el numero de elementos de v que son multiplos de m + 1. Por ejemplo, siv = (7, 6, 15, 8, 5) y m = 2, devolverıa 2 y 2, porque el 6 y el 8 son multiplos de 2,y el 6 y el 15 son multiplos de 3 (2.5 puntos).

2. Construir una funcion que reciba un numero n y devuelva un vector que contengaa todos los numeros magicos menores o iguales que n. Se define un numero magicocomo aquel que es la suma de todos sus divisores salvo el mismo, por ejemplo el 6,cuyos divisores son 3, 2, 1 y 6 = 3 + 2 + 1, o el 28 = 14 + 7 + 4 + 2 + 1, o el 1, cuyounico divisor es el mismo. Por ejemplo, si n = 30, la funcion devolvera el vector[1 6 28] (2.5 puntos).

3. Crea una funcion que reciba un numero natural n, un numero real x y devuelva elpolinomio de Mc-Laurin de de grado n de la funcion ex, evaluado en x.

ex ∼ 1 + x +x2

2!+

x3

3!+ · · ·+ xn

n!

Para evaluar el polinomio de Mc-Laurin, se construira este componente a compo-nente y se utilizara del modo adecuado la funcion ud3 fevalua. No se podra usarla funcion propia de MATLAB factorial para hacer el calculo del factorial. Laalternativa es o bien escribir una funcion aparte que calcule el factorial, o biencualquier otra idea que se os ocurra.

Por ejemplo, si n = 3 y x = 0.5, devolverıa 1 + 0.5 + 0.52/2 + 0.53/6 = 1.6458, quees bastante similar a e0.5 = 1.6487.

La funcion devolvera tambien la diferencia en valor absoluto entre ex y el polinomiocitado evaluado en x. Por tanto, en este caso, devolverıa tambien 0.0029 (2.5puntos).

4. Codifica una funcion que reciba dos vectores u y v ordenados de modo crecientepor hipotesis, que carecen de elementos comunes y de dimensiones m y n que sonen general distintas. La funcion devolvera otro vector w construido a partir detodas las componentes de u y v, tales que el vector w tambien este ordenado. No sepodra llamar a ninguna funcion. Por ejemplo, si u = (2, 4, 5, 9, 10) y v = (1, 3, 6, 8),el resultado sera w = (1, 2, 3, 4, 5, 6, 8, 9, 10). Como comprobacion adicional, siintercambiamos u y v en la llamada, el resultado tiene que ser el mismo (2.5 puntos).

Page 115: Aprendiendo a programar en matlab

Ejercicios.

Examen final de Lenguajes de Programacion. Junio 2008Escuela Tecnica Superior de Ingenieros Navales

Fecha aproximada de publicacion de las notas: 30/06/2008Dıa y hora de la revision: 03/07/2008, 19h30mTiempo para esta parte : 85 minutosPuntuacion: 10 puntos.

1. Crea una funcion que reciba un vector u de numeros positivos y devuelva un vectorue con los numeros enteros que contiene y otro ur con los no enteros, ası como susrespectivos mınimos me, mr. Por ejemplo, si u = (3, 20.3, 7, 5, 12.7, 13) el resultadoha de ser ue = (3, 7, 5, 13), un = (20.3, 12.7), me = 3 y mr = 12.7. Se podrasuponer que en el vector u siempre va a haber enteros y no enteros (2.5 puntos).

2. Crea una funcion que reciba un vector v de naturales y te devuelva 1 si la restade dos cualesquiera de los numeros es igual a un tercero. Por ejemplo, si v =(3, 10, 7, 14, 6), la funcion devolvera un 1, pues 10−7 = 3. Sin embargo, si el vectores v = (3, 11, 7, 15, 6) la funcion devolvera 0. Se recomienda probar la funcioncambiando de orden los elementos del primer ejemplo (2.5 puntos).

3. Crea una funcion que reciba un vector p cuyas componentes asimilamos a los co-eficientes de un polinomio del modo como se ha hecho en el curso. La funcionha de recibir tambien un vector x de n numeros reales y devolvera el elementodel vector x que se encuentra mas cerca de la media que resulta de que se evalueel polinomio p en todos los elementos del vector x. Ası, si p = [1 − 1 2] yx = [1.1 3.5 2.1 −0.7], el resultado de evaluar el polinomio p en todos los puntos dex es un vector y = [2.3200 22.0000 7.7200 2.6800] cuya media vale 8.6800, siendo2.1 el punto que mas cerca tiene su valor de la media (2.5 puntos).

4. Construye una funcion que reciba dos numeros naturales p, q y devuelva el menorprimo mayor que p y q que pertenezca a la sucesion de Fibonacci iniciada por py q (2.5 puntos). No se tendran en cuenta ni p ni q. La sucesion de Fibonacci seconstruye de tal modo que.

xi = xi−1 + xi−2, x1 = p, x2 = q, i > 2

Por ejemplo, si p = 1 y q = 3, la sucesion de Fibonacci estarıa formada por 1, 3, 4,7, ..., y el primer primo serıa el 7. Si p = 4 y q = 5, tendrıamos 4, 5, 9, 14, 23, ...y el primer primo serıa el 23(2.5 puntos).

Page 116: Aprendiendo a programar en matlab

Ejercicios.

Examen final de Lenguajes de Programacion. Sept 2008Escuela Tecnica Superior de Ingenieros Navales

Fecha aproximada de publicacion de las notas: 22/09/2008Dıa y hora de la revision: 24/09/2008, 19h30mTiempo : 90 minutosPuntuacion: 10 puntos.Nombre:Numero de PC:Firma:

1. Crea una funcion que reciba un vector v de naturales y te devuelva un vector vpformado por aquellas componentes de v que sean primas y otro vnp formado poraquellas componentes que no sean primas. Por ejemplo, si v = (3, 10, 7, 14, 6), lafuncion devolvera un los vectores vp = (3, 7) y vnp = (10, 14, 6) (2.5 puntos).

2. Crea una funcion que reciba un vector p cuyas componentes asimilamos a los co-eficientes de un polinomio del modo como se ha hecho en el curso. La funcionha de recibir tambien un vector x de n numeros reales y devolvera el ındice delelemento del vector x que se encuentra mas cerca de la media que resulta de quese evalue el polinomio p en todos los elementos del vector x. Ası, si p = [1 − 1 2] yx = [1.1 3.5 2.1 −0.7], el resultado de evaluar el polinomio p en todos los puntos dex es un vector y = [2.3200 22.0000 7.7200 2.6800] cuya media vale 8.6800, siendo2.1 el punto que mas cerca tiene su valor de la media, cuyo ındice es 3, que ha deser el unico valor que finalmente devuelva la funcion (2.5 puntos).

3. Construye una funcion que reciba tres numeros naturales p, q y r. La funcion iracalculando terminos de la sucesion de Fibonacci iniciada por p y q e ira compro-bando si son multiplos de p. En el momento en que hayamos encontrado r multiplosde p la funcion terminara, devolviendo el termino en que estemos de la sucesion deFibonacci (2.5 puntos). No se tendran en cuenta los valores p y q. La sucesion deFibonacci se construye de tal modo que.

xi = xi−1 + xi−2, x1 = p, x2 = q, i > 2

Por ejemplo, si p = 3, q = 4 y r = 2, la sucesion de Fibonacci estarıa formada por3, 4, 7, 11, 18, 29, 47, 76, 123..... Como 18 y 123 son los dos primeros multiplosde 3, el valor a devolver sera 123 (2.5 puntos). Si p = 2, q = 1 y r = 3, la funciondevolverıa en este caso 76, pues los tres primeros multiplos de 2 serıan 4, 18 y 76.

4. Crea una funcion que reciba un vector u de numeros naturales y otro vector v denumeros racionales positivos. La funcion devolvera 1 si existe alguna combinacionde fracciones formadas por elementos del vector u tomados de dos en dos, que sea

Page 117: Aprendiendo a programar en matlab

igual a algun elemento del vector v y 0 en caso contrario. Se definira en la funcionuna variable prec igual a la milesima parte de la suma de los elementos de u. Seconsiderara que dos numeros son iguales si su diferencia en valor absoluto es menorque prec.

Por ejemplo, si u = (3, 20, 7, 5, 12, 13) y v = (2.98, 1.8571) el resultado ha de ser 1pues prec = 0.06, y |13/7− 1.8571| = 0.00004 < prec. Si ponemos como ejemplo elmismo u pero ahora v = (2.98, 1.2571) la respuesta ha de ser 0 (2.5 puntos).

Page 118: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 116

Page 119: Aprendiendo a programar en matlab

Apendice B

Gestion del CC

Pag. 117

Page 120: Aprendiendo a programar en matlab

ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO

ACCESO A LOS ORDENADORES DEL CENTRO DE CÁLCULO E.T.S.I NAVALES Cuando enciendas el ordenador aparecerá una máscara donde introducirás el usuario y la contraseña que se te ha facilitado, comprobando que la sesión se conecte a CCALCULO:

Iniciaras una sesión con este aspecto:

A tu izquierda encontrarás todos los accesos directos a los programas que están instalados. A la derecha aparecerán 3 accesos directos a 3 carpetas. A continuación explicamos en que consiste cada carpeta:

Page 121: Aprendiendo a programar en matlab

ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO

CARPETA PERSONAL Esta carpeta es individual para cada usuario. Físicamente se encuentra en un servidor de la ETSI Navales. Esta carpeta tiene capacidad hasta 128MB.Siempre que te conectes a tu usuario aparecerán tus ficheros y los tendrás disponibles desde cualquier ordenador de la sala. Estos ficheros no los pueden ver los demás usuarios. Solo tú podrás acceder a esta carpeta. ASIGNATURAS Esta carpeta esta disponible para todos los usuarios. Aquí pondrán los profesores los trabajos y documentos que quieran compartir con vosotros. MIS DOCUMENTOS Esta carpeta físicamente se encuentra en el disco duro del ordenador en el que inicias sesión. Esta compartida para todos los ordenadores de la sala. Estos datos se pueden perder en cualquier momento, bien por ser borrados por otro usuario o por el personal de CdC en sus tareas de mantenimiento. Se recomienda que cada usuario borre sus ficheros de zonas compartidas (como los discos duros de los PC´s) una vez finalizada su sesion de trabajo. El CdC no se responsabiliza de mantener datos en zonas compartidas ni temporales y recomienda que cada usuario haga copia de seguridad de dichos datos, bien en su carpeta personal o en algún medio extraíble (memoria USB, disquette). Para una mayor seguridad, el usuario deberá cerrar la sesión una vez que termine de usar el ordenador (Menú de Inicio- Cerrar sesión).

SOFTWARE DISPONIBLE EN CADA ORDENADOR

• S.O: Windows XP Profesional SP2. • Microsoft OFFICE 2003 • Adobe Reader 7.0 • Winrar 3.11 • Internet Explorer 6. SP1. • Firefox. • Winamp 5.1: Lector de MP3 • MathType 5.2 • Microsoft Visio 2003 • Microsoft Project 2003 • Autocad 2005 • Rhinoceros 3.0 • Matlab 5.0 • Matlab 2006 • Visual C++ 6.0 • Visual J ++ 6.0 • Visual MSDN 6.0 • Electronics Workbench • PCTRAN-U2LP • Ansys ED 5.5 • MD_Solids 1.7 • Maple 9 • Chechenic • Femap v8.3 • DNV Nauticus

Page 122: Aprendiendo a programar en matlab

ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO

En los ordenadores con conexión a Internet solo están instalados los 10 primeros programas de la lista. Además en la sala de Informática se permite la Navegación de las páginas: ETSI Navales, UPM; Aulaweb, Correo Alumnos, Centro de Cálculo. ACTUALIZACIONES DE SOFTWARE Se prevee al comienzo del curso 2007-08 actualizar a las siguientes versiones de software:

• Microsoft OFFICE 2007 Professional Plus • Microsoft Visio 2007 • Microsoft Project 2007 • Internet Explorer 7. • Statgraphics Centurion XV

Page 123: Aprendiendo a programar en matlab

ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO

DESCRIPCIÓN DEL CENTRO DE CÁLCULO

www.centrocalculo.etsin.upm.es

La función del Centro de Cálculo (CdC) es dar soporte a los alumnos y al personal de la ETSIN para la realización de trabajos orientados a fines docentes, formativos y de investigación propios de la Universidad. En él se imparten clases y se realizan exámenes. Se compone de 3 despachos para el personal informático y de 2 salas de Informática con equipos. Las salas son:

• Sala de Navegación por Internet. (consta de 10 puestos con capacidad para 20 alumnos)

• Sala de Informática. (consta de 50 puestos con capacidad para 100 alumnos)

Los alumnos podrán utilizar estas dos salas, salvo cuando estén reservadas. Normalmente para dar clase, se reserva la mitad de la sala de Informática delimitándose por una mampara. Si el número de alumnos es grande, se reservará toda la sala de Informática. En épocas de exámenes, el CdC se reserva el derecho de cerrar el CdC el día anterior al exámen, para la reinstalación de los equipos. Existe en la entrada un tablón donde se expondrán las reservas para la docencia, exámenes, actividades programadas y las comunicaciones a los usuarios.También puedes encontrar esta información en la web www.centrocalculo.etsin.upm.es. Para dirigirse al personal responsable, se puede enviar un e-mail a [email protected] o utilizar el buzón de sugerencias (también está a la entrada del CdC)

HORARIO El horario de las salas será de 8:30h a 21:30 horas de Lunes a Viernes los días lectivos.

SERVICIO DE IMPRESIÓN La sala dispone de 1 Impresora Modelo OCE Varioprint 2040 que funciona con una tarjeta prepago que se puede adquirir en Gestión económica. No es Fotocopiadora. Se recomienda que una vez impresos los trabajos, se borren de la memoria de la impresora, ya que pueden ser impresos por otro usuario.

NORMAS DE FUNCIONAMIENTO DE LAS AULAS DE INFORMÁTICA

• Para utilizar las instalaciones del CdC el alumno tendrá que estar matriculado en la ETSI Navales o tener autorización expresa por parte del Centro. Todo usuario está obligado a identificarse ante el personal de CdC cuando éste lo solicite.

• El alumno solicitará a través de un cuestionario el usuario/contraseña con el que

accederá a los ordenadores de las aulas. El usuario velará en la medida de lo posible por la seguridad de su cuenta. El CdC no se hace responsable de los perjuicios ocasionados al usuario por la acción de terceros.

• Queda extrictamente prohibida la utilización autorizada o no de una cuenta de

usuario distinta a la propia.

Page 124: Aprendiendo a programar en matlab

ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO

• La utilización de los equipos informáticos se reservará exclusivamente para el soporte de las prácticas de asignaturas, navegación por Internet y el correspondiente aprendizaje de los distintos programas propios de la carrera.

• Deberá informarse al personal de Informática de cualquier deficiencia o funcionamiento anómalo que se observe.

• Se ruega por y para el beneficio de todos, que tanto los equipos y mobiliario, se manipulen y usen de forma correcta.

• NO SE PERMITE: • Fumar, introducir y consumir bebida o comida, • Utilizar los equipos como videojuegos para cualquier fin lúdico. • Utilizar el CdC como lugar de tertulia o de juego. • Sentarse en las mesas. • Ocupar los puestos con prendas de abrigo o mochilas. • Reservar los ordenadores. • Cambiar la configuración de software y hardware sin previa autorización del

responsable de aula. • Modificar la situación de cualquiera de los equipos o recursos del Aula sin previa

autorización. • Interferir en el trabajo de los demás usuarios. • El acceso a los despachos del Centro a personal no asignado o no autorizado. • Imprimir trabajos no relacionados con los fines docentes y formativos propios de la

ETSI Navales/UPM. NORMAS DE NAVEGACIÓN POR INTERNET El uso del Servicio de Internet se realizará dentro de los fines docentes, formativos y de Investigación de la UPM. Se prohibe expresamente el uso de Internet para recibir o enviar material que resulte ofensivo, obsceno, difamatorio o susceptible de constituir delito. Por tanto, se prohibe visitar páginas web con contenidos pornográficos, páginas de contenido hacker en cualquiera de sus variantes, intercambio de material protegido con derechos de autor, etc.. También se prohibe su uso para cualquier fin lúdico o lucrativo por ejemplo paginas de juegos online, chatear, etc..

El personal del CdC ante cualquier incumplimiento de las Normas anteriormente expuestas se reserva el derecho de poder tomar la medidas oportunas como llamar al orden, cerrar sesión de usuario, deshabilitar cuenta o mandar desalojar el CdC. El personal se encuentra a vuestra disposición para cualquier aclaración o duda.

Page 125: Aprendiendo a programar en matlab

Apendice C

Control de tiempos y ficha

Pag. 123

Page 126: Aprendiendo a programar en matlab

ETSI NAVALES - UPM

FOTO

(pegadla por donde querais,

en zonas blancas de esta

ficha)

LENGUAJES DE PROGRAMACIÓN (LP)

CURSO 2008-2009.

FICHA PERSONAL - URGENTE!!!!!!!!!!!!! APELLIDOS: NOMBRE: DNI O PASAPORTE: EMAIL (escríbelo con claridad!!!! y si estás matriculado, activa tu cuenta

de correo UPM): GRUPO (A,B,C): ¿ES TU PRIMER AÑO EN LA ETSI NAVALES? TFO MOVIL: TFO FIJO: ¿TE GUSTARÍA OPTAR AL PREMIO SENER DE LP?: CASO DE QUE SÍ,¿CUÁL HA SIDO TU CALIFICACIÓN DE ACCESO A LA UNIVERSIDAD?: Y ADEMÁS FIRMA Y FECHA: ---------------------------------------------------- Para efectos estadísticos, ¿te importaría decirme los siguientes datos? 1 Elección de primera opción: 2 Elección de segunda opción: 3 Elección de tercera opción:

Page 127: Aprendiendo a programar en matlab

APELLIDOS:NOMBRE:

Fecha DHOf Acum InFHOf Acum EqFHOf Acum Total Acum1 29/09/2008 0 0 0 0 02 06/10/2008 0 0 0 0 03 13/10/2008 0 0 0 0 04 20/10/2008 0 0 0 0 05 27/10/2008 0 0 0 0 06 03/11/2008 0 0 0 0 07 10/11/2008 0 0 0 0 08 17/11/2008 0 0 0 0 09 24/11/2008 0 0 0 0 0

10 01/12/2008 0 0 0 0 011 08/12/2008 0 0 0 0 012 15/12/2008 0 0 0 0 013 22/12/2008 0 0 0 0 014 29/12/2008 0 0 0 0 015 05/01/2009 0 0 0 0 016 12/01/2009 0 0 0 0 017 19/01/2009 0 0 0 0 016 26/01/2009 0 0 0 0 017 02/02/2009 0 0 0 0 016 09/02/2009 0 0 0 0 0

Fecha: fecha en la que se ha rellenado la fila correspondiente.DHOf: por horas dentro del horario oficial como clases y exámenes.Acum: por horas acumuladas de cada categoríaInFHOf: por horas de trabajo individual fuera del horario oficialEqFHOf: por horas de trabajo en equipo fuera del horario oficial

Semana

FICHA DE CONTROL DE TIEMPOS

La idea es que pongais las horas correspondientes a los tres bloques, llevando también el acumulado. La unidad mínima serán 0.5 horas, procediendo al redondeo cuando no sean valores exactos. Así, 50min se consignará como 1, y 1h17m se consignará como 1.5

Page 128: Aprendiendo a programar en matlab

Lenguajes de Programacion: Guıa ECTS

Pag. 126

Page 129: Aprendiendo a programar en matlab

Apendice D

Premio SENER

Pag. 127

Page 130: Aprendiendo a programar en matlab

1/4

PREMIO SENER A LA MEJOR PROGRESIÓN

EN LA ASIGNATURA LENGUAJES DE PROGRAMACIÓN

- Bases del premio -

1. Objeto del premio:

El objeto de este premio es recompensar la mejor progresión durante el desarrollo de la asignatura de Lenguajes de Programación de Primer Curso de la titulación de Ingenieros Navales y Oceánicos, Plan 2002, de la Universidad Politécnica de Madrid.

De este modo se pretende motivar a los estudiantes que llegan a la titulación con unas notas medias de Bachillerato bajas, ofreciéndoles la oportunidad de que una buena progresión respecto a la posición de partida suponga una recompensa económica, con repercusión pública y curricular. Lo habitual es que estos premios que pretenden servir para motivar, no motiven a los que más lo necesitan, y terminen simplemente por confirmar la buena preparación y actitud de ciertos estudiantes. En este sentido, este premio tiene más matices, pues son precisamente los "peores" estudiantes, los que parten de una posición más baja, los que más pueden progresar, y los que por tanto se convierten en mejores candidatos para obtenerlo.

SENER es la empresa líder en el sector de las aplicaciones informáticas para el mundo naval, y su fundación, la Fundación SENER, a partes iguales con el Departamento Naval de SENER se han ofrecido a dotar y dar nombre a este premio. ETSIN cree que el premio, dada su naturaleza, lleva el mejor nombre posible, y es de agradecer la implicación de SENER en el mismo.

2. Requisitos de los solicitantes:

Alumnos matriculados en la asignatura de Lenguajes de Programación de Primer Curso de la titulación de Ingenieros Navales y Oceánicos, Plan 2002, de la Universidad Politécnica de Madrid, que deseen optar al Premio.

3. Procedimiento de valoración:

Los alumnos están organizados por grupos de 2 componentes durante el desarrollo del curso, tratando de que los estudiantes adquieran hábitos de trabajo en equipo y se familiaricen con los problemas y ventajas de esta forma de trabajo. De hecho, el modus operandi de cada equipo tiene su repercusión en la evaluación ECTS que se viene desarrollando desde el curso 2005-2006.

Al final de esta evaluación, los componentes del grupo habrán obtenido una nota final. El baremo para fijar la puntuación para el premio pasa por restar, de cada una de las notas de cada uno de los 2 componentes, la nota media del

Page 131: Aprendiendo a programar en matlab

2/4

bachillerato1. Así, si los estudiantes de un grupo obtuviesen un 7.5 y un 9.0 en la evaluación ECTS de Lenguajes de Programación y sus notas del bachillerato fuesen 5.4 y 6.2 respectivamente, su puntuación para el premio será de (7.5-5.4)+(9.0-6.2)=4.9 puntos. La puntuación máxima será de 10 puntos, (10-5)+(10-5)=10, y la mínima de –20 puntos, (0-10)+(0-10)=-20. El grupo ganador será aquel que mayor puntuación tenga siguiendo este baremo.

Para el premio se tendrá en cuenta únicamente la nota correspondiente a la evaluación ECTS y no la correspondiente a la evaluación convencional. La evaluación ECTS contempla diferentes ítems a lo largo del curso (ver Guía Docente de la asignatura). Teniendo esto en cuenta se arbitrará una forma de seguimiento consistente en la publicación de las notas de los diferentes grupos en 2 instantes del curso, identificando a los alumnos a través de su DNI. Ello les permitirá conocer su posición e implicarse más en la parte final del curso, en la que se consigue la parte más importante de la nota. Para ello, la Secretaría de la ETSIN facilitará a los profesores una lista de alumnos matriculados con una columna correspondiente a las notas de acceso a la universidad de aquellos alumnos que deseen optar al Premio, que previamente habrán firmado su autorización para que se facilite dicho dato de su expediente.

4. Dotación:

La dotación será de 1200€ a repartir a partes iguales entre los 2 componentes del grupo. Esta dotación se incrementará cada año aplicando el IPC correspondiente. ETSIN emitirá un diploma acreditativo, el cual contendrá un suplemento al mismo consistente en un histograma de las notas con la puntuación de los diferentes grupos, para que quede constancia de modo cuantitativo del progreso del grupo ganador en términos absolutos y relativos al resto de grupos de ese año académico. La información para dicho histograma será facilitada por el profesor responsable de la asignatura.

5. Entrega de premios:

La entrega de premios se realizará durante la ceremonia de entrega de diplomas a los nuevos egresados, y el abono de los premios se efectuará mediante cheque nominativo de 600€ emitido por la Fundación SENER para uno de los

1 Con nota media del Bachillerato nos referimos a la Calificación definitiva de las Pruebas de Aptitud de Acceso a la Universidad, la cual es a su vez la media de la nota media del Expediente del alumno correspondiente al Bachillerato propiamente dicho y la nota de la Selectividad. En aquellos casos en que este valor no esté correctamente definido por haber ingresado el estudiante con bachillerato extranjero o por pruebas en las que ese parámetro no sea relevante, se considerará que su nota es la media de entre todos los estudiantes para las que sí lo sea.

Page 132: Aprendiendo a programar en matlab

3/4

componentes del grupo ganador y otro de la misma cantidad emitido por el Departamento Naval de SENER Ingeniería y Sistemas para el otro componente del grupo ganador.

Los familiares de primer grado de los estudiantes premiados, así como 4 compañeros a elegir por cada uno de ellos y el delegado de su clase durante el curso correspondiente, estarán invitados a esta ceremonia. Se invitará a SENER y a Fundación SENER a que asistan y entreguen directamente el premio a través de alguna o algunas personas indicadas por ellos mismos.

Page 133: Aprendiendo a programar en matlab

PREMIO SENER A LA MEJOR PROGRESIÓN EN LA ASIGNATURA LENGUAJES DE PROGRAMACIÓN

- Curso 2007-2008-

Ganadores: LUIS ARJONILLA GARCIA SERGIO IGLESIAS CHAPERO Histograma de puntuaciones de todos los grupos1.

02468

101214

-8 -6 -4 -2 0 2 4 6Puntuación <=

Número de grupos

1 La puntuación corresponde a la diferencia (suma de ambos componentes) entre la nota ECTS de la asignatura y la nota media del bachillerato.

Page 134: Aprendiendo a programar en matlab

Indice alfabetico

abs, 50, 51ASCII, 28

Ball, S., 1

contadores, 53

else, 42elseif, 46end, 41

ficherosASCII, 28

floor, 54function, 36

if, 40if-else, 42if-elseif, 46if-end, 40

MATLABcalculo simbolico, 32carpeta activa, 29ventana de comandos, 13

operadores logicos, 47O, 47negacion, 47Y, 47

pi, 38

sumadores, 53

Taylor, Brook, 27

Wittgenstein, L., 1

Pag. 132