Lenguajes de Programación
Guı́a docente ECTS
Ingenierı́a Naval y Oceánica
Escuela Técnica Superior de Ingenieros Navales
Universidad Politécnica de Madrid
A. Souto Iglesias, J.L. Bravo Trinidad
L. González Gutiérrez, A. Cantón Pire
30 de septiembre de 2008
....para mı́ una buena escuela serı́a una escuela distinta,
una escuela que tuviese un principio según el cual todas sus
normas estuviesen enfocadas a mantener a tantos estudiantes
como sea posible durante el mayor tiempo dentro del sistema.
Ası́, todo tendrı́a que estar dirigido a hacer que los estudiantes
participasen, que se sintiesen identificados con la escuela, que
tuviesen la sensación de estar haciendo las cosas bien. Para
mı́ una buena escuela es una escuela que mantiene a todos los
alumnos trabajando, comprometidos y con la sensación de que no
van 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.
Índice general
Notación y abreviaturas
6
I
7
Aprender a programar, con MATLAB
Introducción
0. Tutorial de MATLAB
0.1. Introducción . . . . . . . . . . . . . .
0.2. Conceptos básicos . . . . . . . . . . .
0.3. Manejo de vectores . . . . . . . . . .
0.4. Introducción al tratamiento de matrices
0.5. Resolución de sistemas lineales . . . .
0.6. Vectorización de operaciones . . . . .
0.7. Creación de gráficas . . . . . . . . . .
0.8. Conjuntos de órdenes . . . . . . . . .
0.9. MATLAB y números complejos . . . .
0.10. Matemáticas simbólicas con MATLAB
9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1. Funciones y Condicionales
1.1. General . . . . . . . . . . . . . . . . . . . . .
1.2. Funciones y variables . . . . . . . . . . . . . .
1.3. Funciones con varios argumentos de entrada .
1.4. Estructura de control condicional if . . . . . .
1.5. Estructura de control condicional if-else . . . .
1.6. Función que llama a otra función . . . . . . .
1.7. Condicionales anidados. . . . . . . . . . . . .
1.8. Variante elseif en el condicional . . . . . . . .
1.9. Operadores lógicos . . . . . . . . . . . . . . .
1.10. Operadores de comparación: ¿son iguales? . .
1.11. Igualdad entre números reales: precisión y valor
1.12. Variables enteras y reales como argumentos . .
1.13. Variables contador y sumador . . . . . . . . .
1.14. Función parte entera . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
13
13
17
19
23
25
27
28
31
32
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
absoluto
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
35
35
35
38
40
42
43
44
46
47
50
50
52
53
54
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2. Bucles
55
2.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.2. Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.3. Bucles con incremento variable . . . . . . . . . . . . . . . . . . . . . . . . . 57
Pág. 3
Lenguajes de Programación: Guı́a ECTS
2.4.
2.5.
2.6.
2.7.
2.8.
Bucles con otras operaciones . . . . . . . . . . .
Bucles y relaciones de recurrencia . . . . . . . . .
Bucles y condicionales . . . . . . . . . . . . . . .
Uso de bucles para verificar una condición sobre un
Bucles anidados. . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
conjunto.
. . . . . .
3. Vectores
3.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Vectores como argumentos de funciones . . . . . . . . . . .
3.3. Funciones que llaman a funciones con argumentos vectores .
3.4. Cálculo de extremos . . . . . . . . . . . . . . . . . . . . .
3.5. Cálculo de posición de extremos . . . . . . . . . . . . . . .
3.6. Evaluación de un polinomio . . . . . . . . . . . . . . . . .
3.7. Función que devuelve un vector . . . . . . . . . . . . . . .
3.8. Funciones que reciben y devuelven vectores . . . . . . . . .
3.9. Construcción de vectores . . . . . . . . . . . . . . . . . . .
3.10. Vectores y bucles anidados . . . . . . . . . . . . . . . . . .
3.11. Funciones con salidas múltiples . . . . . . . . . . . . . . .
II
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
57
58
60
62
63
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
65
65
65
66
67
69
70
73
75
77
78
80
Guı́a ECTS para estudiantes
83
1. Introducción
85
2. Datos generales
2.1. Temporalidad y carácter
2.2. Créditos LRU . . . . . .
2.3. Departamento . . . . .
2.4. Profesores . . . . . . .
2.5. Créditos ECTS . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3. Objetivos
3.1. General . . . . . . . . . . . . .
3.2. Objetivos generales: descripción
3.3. Prerrequisitos . . . . . . . . .
3.4. Otras asignaturas de las que LP
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
87
87
87
87
87
88
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
es prerrequisito
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
89
89
89
91
91
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4. Programa y Metodologı́a
93
4.1. Métodos docentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.2. Temario y estimación del tiempo de estudio . . . . . . . . . . . . . . . . . . . 94
5. Recursos
5.1. Guı́a . . . . . . . . . . . . . . . . . .
5.2. Tutorı́as . . . . . . . . . . . . . . . .
5.3. Tutorı́as virtuales . . . . . . . . . . . .
5.4. Página web - Plataforma de B-learning
5.5. Copias . . . . . . . . . . . . . . . . .
5.6. Centro de Cálculo . . . . . . . . . . .
5.7. Bibliografı́a . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
97
97
97
97
97
98
98
98
Pág. 4
ÍNDICE GENERAL
6. Evaluación
6.1. General . . . . . . . . . . .
6.2. Evaluación tradicional . . .
6.3. Evaluación ECTS . . . . .
6.4. El examen . . . . . . . . .
6.5. Evaluación de los objetivos
III
Apéndices
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
101
101
101
101
103
105
107
A. Ejemplos de Exámenes
109
B. Gestión del CC
117
C. Control de tiempos y ficha
123
D. Premio SENER
127
Indice alfabético
132
Pág. 5
Lenguajes de Programación: Guı́a ECTS
Notación y abreviaturas
AO
aptdo.
cap.
DHOf
DNI
ECTS
FHOf
fig.
G
GATE
I
JEE
LOU
LP
LRU
MEC
pág.
PAS
PF
ref.
TIC
Aula de Ordenadores
apartado
capı́tulo
para referirse a actividades a realizar dentro del horario oficial.
para referirse al número del Documento Nacional de Identidad.
sistema de créditos europeos.
para referirse a actividades a realizar fuera del horario oficial.
figura
para referirse a actividades a realizar en grupo.
Gabinete de Teleeducación.
para referirse a actividades a realizar de modo individual.
Jefatura de Estudios.
Ley Orgánica d 6/2001 de Universidades.
Lenguajes de Programación.
Ley Orgánica 11/1983 de Reforma Universitaria.
Ministerio de Educación y Ciencia.
página.
Personal de Administración y Servicios.
Portafolio.
referencia bibliográfica.
Tecnologı́as de la información y la comunicación.
Pág. 6
Parte I
Aprender a programar, con MATLAB
Pág. 7
Introducción
De modo resumido, podemos decir que programar es “enseñarle” a un ordenador cómo se
resuelve un determinado problema. Para poder enseñar a alguien, es necesario dos cosas: tener
un lenguaje en común y conocer bien lo que se quiere enseñar. En esta primera parte nos
ocupamos del primer problema (que es el más sencillo y el que responde a la definición de
“programar”).
El lenguaje que “hablan” los ordenadores es muy simple, por lo que el proceso de aprenderlo
será rápido. El principal problema es descomponer ideas complejas en otras más simples para
que podamos programarlas.
Siguiendo el esquema anterior, hemos organizado cada unidad didáctica en un esquema conceptoejemplo-ejercicios/problemas. Normalmente se trabajan uno o dos conceptos de Programación
en cada unidad didáctica (contadores y bucles “while”, por ejemplo), los cuales se introducen
primero formalmente y después mediante un ejemplo, sobre el que se proponen una serie de
ejercicios que nos permitan asimilar y madurar las ideas explicadas.
Por cada concepto introducido se trabajan cuatro o cinco ejemplos. Se pretende que en cada
uno de estos ejemplos aparezca un uso habitual del concepto introducido. Se trata de asimilar
bloques con un sentido concreto, construidos con los elementos básicos de Programación. A
menudo, en los cursos de Programación, se introducen sólo los elementos de Programación y se
supone que el alumno aprenderá a integrarlos por sı́ mismo. Sin embargo, muchas aplicaciones
de esos elementos son estándares en la programación (por ejemplo, el uso de contadores, un
bucle “while” y un condicional para seleccionar determinados elementos de un vector, crear un
vector mediante un contador, etc.) y una vez nos hemos familiarizado con ese uso conseguimos
una mayor agilidad a la hora de programar.
Las unidades didácticas 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 calculadora
al principio para terminar dibujando curvas, y agrupando instrucciones en ficheros “script”,
lo que permite introducir ideas importantes para más adelante crear funciones. Además, se
aprovecha esta unidad 0 para insistir en conceptos básicos de manejo de las herramientas del
sistema operativo, sobre todo la creación y gestión de carpetas, y la ubicación precisa de las
mismas en el sistema de archivos del usuario, bien en un disco local o en la unidad de red del
aula de ordenadores donde se trabaja.
Pág. 9
Lenguajes de Programación: Guı́a ECTS
El lenguaje elegido para la implementación de ejemplos y ejercicios es el lenguaje de comandos
o ”script”de MATLAB (o su versión libre Octave). Esta elección se debió a varios motivos:
1. MATLAB es un entorno de cálculo que los estudiantes usarán a lo largo de la carrera y
probablemente después en su vida profesional ya que dispone de herramientas especı́ficas
(“toolboxes”) para muchos ámbitos. Aunque las competencias de manejo asociadas
a esas herramientas especı́ficas no se trabajan en este curso, el que el estudiante se
sienta al final cómodo con el entorno MATLAB le permitirá si es necesario asimilar su
funcionamiento 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 programación, con una sintaxis similar al C pero con la simplicidad del BASIC. Comprobamos
en cursos anteriores que al utilizar un lenguaje como C, los alumnos dedicaban la mayor
parte del tiempo a la corrección de errores de sintaxis y a la declaración de variables,
reserva de memoria, etc., teniendo poco tiempo para comprender el funcionamiento de
las estructuras de datos o de control del flujo del programa. En este sentido, el lenguaje
MATLAB se acerca al pseudocódigo usado en algunos cursos de Programación, pero con
la ventaja de poder realmente ejecutar los códigos creados. La simplicidad de MATLAB
a estos efectos es a veces causa de falta de rigor en la forma de abordar la Programación. Ası́ el hecho de que no haya tipado explı́cito de variables pudiendo la misma
variable ser una matriz en una lı́nea del código y un escalar un poco más abajo, o de
MATLAB se ocupe del la reserva dinámica de memoria de modo automático, nos alejan
de un lenguaje más potente como C. Sin embargo y como comentábamos más arriba,
eso permite centrarse en el manejo de estructuras de control para resolver problemas y
desarrollar estrategias, creemos que esencial al principio.
3. MATLAB es un lenguaje interpretable: MATLAB traduce durante la ejecución las diferentes sentencias al lenguaje primario y básico de la máquina. Se paga el precio de
necesitar MATLAB para ejecutar nuestros códigos pero se recibe la recompensa de no
tener que compilar y enlazar nuestros códigos para después ejecutarlos.
4. MATLAB proporciona una interfaz que permite probar las funciones directamente sin
necesidad de llamarlas desde un programa principal. Esto permite comprobar su funcionamiento de un modo sencillo e inmediato, y como comentamos más abajo, ha permitido una estructura del curso creemos que muy interesante para un curso de introducción
a la Programación para no Informáticos.
5. Todo ello hace que sea muy sencillo empezar a generar códigos interesantes en MATLAB,
algo a lo que se llega con mucho más esfuerzo en un lenguaje de Programación más
riguroso como C.
Una vez realizado este tutorial, hasta hace unos años empleábamos la organización curricular
usual en un curso de Programación (comenzando por la entrada y salida y el programa ”Hola
mundo”). Sin embargo, ahora usamos una estructura similar a la programación funcional,
comenzando por el concepto de función y estudiando la entrada y salida casi al final. De
este modo, en la unidad 1 se trabaja al principio sobre el concepto de función, introduciendo
inmediatamente la estructura de control condicional, la cual permite construir funciones más
complejas e interesantes.
En la unidad 2 se trabaja con bucles, posibilitando la repetición de operaciones. Es una unidad
Pág. 10
ardua, pues no se recurre todavı́a a vectores o matrices, donde los bucles surgen de modo
natural. Aquı́ están los ejemplos más interesantes del curso, como el de comprobar si un
número natural es primo. Si el estudiante se siente cómodo al final de esta unidad, el resto
del curso será para él una progresión sencilla. Si no se siente cómodo todavı́a, tendrá ocasión
de 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 comentábamos en el prólogo, no hemos pretendido escribir un compendio exhaustivo
ni de Programación ni de MATLAB. Debido a ello la selección de unidades didácticas no es
inocente sino que subyace la idea de mostrar únicamente los aspectos considerados esenciales
para aprender a programar. Creemos que en ese sentido el libro es una aportación interesante
ya que no hay en la literatura cursos de introducción a la Programación que se apoyen en
MATLAB como lenguaje de referencia, y lo más parecido corresponde a cursos de MATLAB
en los que en algún capı́tulo se tratan diferentes aspectos de la programación1 . En cuanto a
compendios de MATLAB, recomendamos el sensacional trabajo de Guillem Borrell2 .
1
Gilat, A., MATLAB. Una introducción con ejemplos prácticos, Reverté, 2006, es un buen ejemplo de este
tipo de libros
2
Borrell i Nogueras, G., Introducción Informal a MATLAB y OCTAVE. Disponible online en
http://forja.rediris.es/
Pág. 11
Lenguajes de Programación: Guı́a ECTS
Pág. 12
Unidad Didáctica 0
Tutorial de MATLAB
0.1.
Introducción
Presentamos un tutorial de MATLAB, una herramienta potentı́sima, casi estándar para cálculos
en muchas ramas de la Ingenierı́a, y de uso razonablemente simple. En la asignatura de LP,
utilizaremos el intérprete de comandos de MATLAB para que el estudiante se introduzca en
el apasionante mundo de la programación de ordenadores. Este tutorial, en el que haremos
una descripción de los elementos básicos de MATLAB, y que se realizará durante las primeras
sesiones del curso de LP, tiene como objetivo que el estudiante se sienta cómodo con el
programa y con el sistema de usuarios, carpetas y archivos del CC. Ası́, al final del tutorial
será capaz de utilizar MATLAB como si fuese una calculadora potentı́sima, manejando sus
elementos de cálculo en lı́nea de comandos, sin entrar en la programación de aplicaciones, a
lo cual nos dedicaremos el resto del curso.
0.2.
Conceptos básicos
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 el
escritorio, que tiene como etiqueta MATLAB R2006a. Una vez arrancado, nos encontramos
con algo similar a lo que se observa en la figura 1. En el espacio que denotamos como ventana
de comandos en dicha figura aparece el cursor con el sı́mbolo (>>) o (EDU >>), indicando
que se pueden introducir órdenes. De hecho, en este tutorial, cuando aparezca este sı́mbolo, se
tiene 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 simplemente
con la ventana de comandos.
La utilización más básica de MATLAB es como calculadora 2 . Ası́, por ejemplo, para calcular
cos(5) · 27.3 , se debe introducir 3 :
>>cos(5)*2ˆ7.3
ans =
44.7013
1
A veces, durante el curso hay algunos problemas con las licencias y se usa la versión educacional, a la cual
se accede con Inicio, Programas, Student MATLAB, o a través del icono q está en el escritorio
2
Funcionando de este modo, es similar a una calculadora programable, aunque bastante más versátil.
3
Los argumentos de las funciones trigonométricas siempre están en radianes.
Pág. 13
Lenguajes de Programación: Guı́a ECTS
Figura 1: Espacio de trabajo de MATLAB
Pág. 14
UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB
MATLAB mantiene en memoria el último resultado. Caso de que ese cálculo no se asigne a
ninguna variable, lo hace a una variable por defecto de nombre ans. Si queremos referirnos
a ese resultado, lo haremos a través de la variable ans, y si no se asigna ese nuevo cálculo a
ninguna variable, volverá 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 neperiano (natural). Para saberlo, pedimos ayuda acerca del comando log utilizando:
>>help log
LOG
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 explicación que se obtiene al pedir “help”de las órdenes los comandos aparecen
en mayúsculas, se deben usar en minúsculas.
Por defecto, los resultados aparecen con 4 cifras decimales. Si se necesitara más precisión en
los resultados, se puede utilizar la orden format long repitiendo los cálculos:
>>format long
Para recuperar una orden y ejecutarla otra vez o modificarla se usan la flechas arriba y abajo
del cursor ⇑, ⇓. Presionemos ⇑ hasta recuperar la orden:
>>cos(5)*2ˆ7.3
ans =
44.70132670851334
Ejercicio 0.1 Realizar la siguiente operación: 2.72.1 + log10 108.2.
Ejercicio 0.2 Pedir ayuda de la orden exp.
Ejercicio 0.3 Realizar la siguiente operación e2.7
2.1 +log
10
108.2
.
El resultado del ejercicio anterior aparecerá como 2.3992e+004. La notación 2.3992+004,
significa 2.3992 ∗ 104 o lo que es lo mismo 23992.
Si necesitamos referirnos a determinados cálculos, se asignan a variables y ası́ se pueden
recuperar después. El concepto de variable es crucial cuando se programa, como veremos
durante todo el curso. Por ejemplo, podemos recuperar con ⇑ la orden cos(5) · 27.3 y asignar su
valor a la variable x editando dicha orden. Luego podremos utilizarla para otros cálculos. Los
nombres de las variables en MATLAB han de comenzar por una letra; además, no contendrán
sı́mbolos que nos sean letras, números o el guión bajo (que está en la misma tecla que el signo
menos).
Pág. 15
Lenguajes de Programación: Guı́a ECTS
>>x=cos(5)*2ˆ7.3
x =
44.70132670851334
>>y=log(x)
y =
3.80000318145901
Ejercicio 0.4 Realizar la siguiente operación: 2.72.1 + log10 108.2 y asignarla a la variable x.
Ejercicio 0.5 Realizar la siguiente operación: e2.7
2.1 +log
10
108.2
y asignarla a la variable t.
Si queremos saber cuánto vale una variable, no tenemos más que escribirla en la lı́nea de
comandos y pulsar Enter.
>>y
y =
3.80000318145901
Como es muy fácil recuperar órdenes previas podemos utilizar esta idea para simular los términos de una sucesión recurrente. Por ejemplo, xn+1 = cos(xn )
>>x=0.2
x =
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 operación anterior hasta que se estabilice el cuarto decimal de x de
un paso al siguiente.
Ejercicio 0.7 Cambiar el formato para que otra vez se vean sólo cuatro decimales.
Ejercicio 0.8 Empezando por x = 100 repetir la operación
x2 − 81
2x
hasta que se converja en el cuarto decimal. ¿Qué relación hay entre el último x y 81?
x=x−
Pág. 16
UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB
Ejercicio 0.9 Definir A como en vuestro documento de identidad o pasaporte. Empezando
por x = 100 repetir la operación
x2 − A
x=x−
2x
hasta que se converja en el cuarto decimal. ¿A qué ha convergido la sucesión? 4
Es interesante comentar de este ejercicio que MATLAB distingue entre letras mayúsculas y
minúsculas en los nombres de las variables.
A veces es bueno apagar y encender la calculadora para borrar todo y empezar de nuevo. Esto
se hace con la orden clear. Hay que tener cuidado al utilizarla, ya que borra todas las variables
que estén en la memoria sin pedir confirmación.
>>clear
>>x
??? Undefined function or variable ’x’.
Ejercicio 0.10 Preguntar el valor de A igual que acabamos de preguntar x. ¿Tiene sentido
el 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)=0
v =
0
>>v(2)=2
v =
0
>>v(3)=4
v =
0
>>v(4)=6
v =
0
>>v(5)=8
v =
0
2
2
4
2
4
6
2
4
6
8
Se puede también definir este vector especificando su primer elemento, un incremento y el
último elemento. MATLAB rellenará paso a paso sus componentes. Ası́, podemos definir igualmente el vector v como una secuencia que empieza en 0, avanza de 2 en 2 y que termina en
el 8:
4
Las calculadoras obtienen la raı́z cuadrada de un número mediante esta sucesión.
Pág. 17
Lenguajes de Programación: Guı́a ECTS
>> v = [0:2:8]
v =
0
2
>> v
v =
0
2
4
6
8
4
6
8
Si ponemos ; al final de una lı́nea de comandos, cuando pulsemos la tecla Enter para ejecutarla,
se ejecutará pero no mostrará el resultado en pantalla (se anula el eco en pantalla). Esto es
muy útil algunas veces:
>> v = [0:2:8];
>> v
v =
0
2
4
6
8
Podemos construir el vector v editando directamente entre los corchetes las componentes del
vector v:
>>v = [0 2 4 6 8];
>> v
v =
0
2
4
6
8
Es fácil acceder al contenido de una posición del vector, por ejemplo la primera.
>> v(1)
ans =
0
O modificarla:
>> v(1)=-3;
>> v
v =
-3
2
4
6
8
O hacer operaciones entre componentes, v2 · v53 :
>> v(2)*v(5)ˆ3
ans =
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 apóstrofo, que es el acento que está en la
misma tecla que el signo de interrogación “?”.
>> v’
ans =
-3
2
4
6
8
Pág. 18
UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB
Como hemos comentado, para recuperar una orden y ejecutarla otra vez o modificarla se usan
la flechas arriba y abajo del cursor ⇑, ⇓. Presionemos ⇑ hasta recuperar la orden:
>> v(1)=-3;
Modifiquémosla 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 de
cinco columnas, o sea, un matriz de 1 × 5. Esto se comprueba preguntando el tamaño de v
con 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 el
comando size. ¿Es coherente el resultado?
Ejercicio 0.13 Pedir ayuda sobre la función norm y aplicarla al vector v.
0.4.
Introducción al tratamiento de matrices
Haremos una introducción a la definición y manipulación de matrices. Se supone que se ha
seguido la sección anterior y que se dispone de los conocimientos básicos sobre la definición
y manipulación de vectores usando MATLAB. La definición de una matriz es muy similar a la
de un vector. Para definir una matriz, se puede hacer dando sus filas separadas por un punto
y coma (¡no olvidarse poner los espacios en blanco!):
>> A = [ 1 2 3; 3 4 5; 6 7 8]
A =
1
2
3
3
4
5
6
7
8
o definirla directamente fila a fila, que es más intuitivo:
>> A = [ 1
3
6
A =
1
3
6
2 3
4 5
7 8]
2
4
7
3
5
8
Se puede modificar alguno de los elementos de la matriz A, accediendo a cualquiera de sus
posiciones, por ejemplo:
Pág. 19
Lenguajes de Programación: Guı́a ECTS
>> A(2,2)=-9
A =
1
2
3
-9
6
7
3
5
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
3
2
4
5
3
7
8
(Otra vez, es importante colocar los espacios en blanco.)
Ejercicio 0.14 Sumar los elementos diagonales de la matriz A, refiriéndonos a ellos, elemento
a elemento.
Podemos sumar o restar matrices para tener otras matrices.
>>C=A+B
C =
2
5
9
4
8
14
6
10
16
Ejercicio 0.15 Definir la matriz D = 2B − A.
También podemos multiplicarlas.
>>C=A*B
C =
14
26
44
31
57
96
37
69
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 × 3
que tenga todos sus elementos nulos.
>>I=zeros(3)
I =
0
0
0
0
0
0
0
0
0
Pág. 20
UNIDAD DIDÁCTICA 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)=1
I =
1
0
0
1
0
0
0
0
1
Ejercicio 0.18 Repetir el ejercicio 0.16 sacando factor común y utilizando la matriz identidad.
Otra forma de definir la matriz identidad es a través de la función diag, que recibe un vector
que convierte en diagonal de una matriz cuyos otros elementos son nulos.
>>J=diag([1 1 1])
J =
1
0
0
0
1
0
0
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 función eye, y definir la matriz identidad de 10 × 10.
Ejercicio 0.21 Repetir el ejercicio 0.16 sacando factor común y utilizando la función eye.
0.4.1.
Definición de submatrices
La definición de “subvectores” o submatrices es muy fácil. 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 vector
v 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 número es
el incremento de ı́ndices dentro de v y el último número marca el elemento final. Esta orden
es equivalente a la siguiente
>> e=v(1:3)
e =
0
2
4
ya que cuando el incremento es la unidad, se puede suprimir.
Pág. 21
Lenguajes de Programación: Guı́a ECTS
Ejercicio 0.22 Adivinar cuál va a ser el resultado de las dos órdenes siguientes
>> e=v(2:2:5)
>> e=v(1:3:5)
Como comentamos al principio, la notación usada por MATLAB sigue en lo posible la notación
estándar de Álgebra Lineal que se asume conocida. Es muy sencillo multiplicar matrices y
vectores, 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 =
16
28
46
Es importante acostumbrase a ver ese mensaje de error. Una vez que se empieza a trabajar
con vectores y matrices, es sencillo olvidar los tamaños de los objetos que se han ido creando.
Ejercicio 0.23 Utilizando el comando size, razona sobre los problemas en lo que se refiere a
dimensiones en la multiplicación anterior.
Se pueden extraer columnas o filas de una matriz. Si queremos, por ejemplo, que C sea la
tercera 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 =
2
4
7
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
5
7
8
Ejercicio 0.24 Definir una matriz de nombre D1 formada por la primera y tercera columnas
de la matriz A.
Una vez que se es capaz de crear y manipular una matriz, se pueden realizar muchas operaciones estándar. Por ejemplo, calcular su inversa. Hay que tener cuidado y no olvidar que
las operaciones son cálculos numéricos realizados por ordenador. En el ejemplo, A no es una
matriz regular, y sin embargo MATLAB devolverá su inversa, pues los errores de redondeo
durante su cálculo convierten en invertible a dicha matriz.
Pág. 22
UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB
>> inv(A)
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 4.565062e-18
ans =
1.0e+15 *
-2.7022
4.5036
-1.8014
5.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
-1.0000
2.0000
5.0000
-1.0000
-1.0000
-2.0000
1.0000
0
Ejercicio 0.25 Definir una matriz de nombre B1 como la inversa de B. Multiplicar B por B1
y razonar la coherencia del resultado.
Hay que comentar que MATLAB distingue entre mayúsculas y minúsculas. Este puede ser el
origen de algunas confusiones si se manejan algoritmos complejos.
>> inv(a)
??? Undefined function or variable a.
0.5.
Resolución de sistemas lineales
También hay funciones para resolver sistemas lineales. Si Ax = b y queremos encontrar x,
el modo más directo es simplemente invertir A, y luego premultiplicar por la inversa ambos
lados. Sin embargo, hay medios mucho más eficientes y estables para resolver sistemas lineales
pero nosotros de momento nos quedaremos con éste. Por ejemplo, el sistema lineal Bx = v
con:
>>v = [1 3 5]’
v =
1
3
5
>>B = [ [1 2 3]’ [2 4 7]’ [3 5 8]’];
se resuelve con:
>> x = inv(B)*v
x =
2
1
-1
Para comprobar:
Pág. 23
Lenguajes de Programación: Guı́a ECTS
>> B*x
ans =
1
3
5
Ejercicio 0.26 Definir una matriz B2 = BB t .
Ejercicio 0.27 Encontrar la solución del sistema lineal BB t x = v asignando esa solución al
vector x.
Ejercicio 0.28 Comprobar la solución obtenida realizando el cálculo BB T x − v.
Podemos crear una matriz aumentada a partir de B y del término independiente y reducirla
hasta convertir el sistema en uno equivalente triangular, efectuando las necesarias transformaciones elementales de fila
>>BA=[B v]
BA =
1
2
3
1
2
4
5
3
3
7
8
5
>>BA(2,:)=BA(2,:)-2*BA(1,:)
BA =
1
2
3
1
0
0
-1
1
3
7
8
5
>>BA(3,:)=BA(3,:)-3*BA(1,:)
BA =
1
2
3
1
0
0
-1
1
0
1
-1
2
La segunda fila tiene el elemento diagonal nulo, ası́ que hay que realizar una permutación de
filas, premultiplicando por la identidad permutada:
>>IP=[1 0 0;0 0 1;0 1 0];
>>BA=IP*BA
BA =
1
0
0
2
1
0
3
-1
-1
1
2
1
Ahora ya es inmediato resolver este sistema por sustitución hacia atrás:
Ejercicio 0.29 Definir una matriz H de 3 × 3 a partir de las tres primeras columnas de la
matriz BA.
Ejercicio 0.30 Definir un vector h utilizando la última columna de BA.
Pág. 24
UNIDAD DIDÁCTICA 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 función det utilizándola con la matriz B y de la función
rank utilizándola con la matriz BA.
Ejercicio 0.33 Calcular el determinante de la matriz H.
0.6.
Vectorización de operaciones
Ejercicio 0.34 Borrar la memoria porque vamos a empezar operaciones nuevas reutilizando
nombres de variables ya usadas.
Con MATLAB es sencillo crear vectores y matrices. La potencia de MATLAB nace de la
facilidad con la que se pueden manipular estos vectores y matrices. Primero mostraremos
cómo realizar operaciones sencillas, sumar, restar y multiplicar. Luego las combinaremos para
mostrar que se pueden realizar operaciones complejar a partir de estas operaciones simples sin
mucho esfuerzo. Primero definiremos dos vectores, los cuales sumaremos y restaremos:
>> v = [1 2 3]’
v =
1
2
3
>> b = [2 4 6]’
b =
2
4
6
>> v+b
ans =
3
6
9
>> v-b
ans =
-1
-2
-3
La multiplicación de vectores y matrices, igual que su suma, sigue las reglas estrictas del
Álgebra Lineal. En el ejemplo anterior, los vectores son ambos vectores columna con tres
elementos. No se puede sumar un vector fila con un vector columna. Se debe recordar que el
número de columnas del primer operando debe ser igual al número de filas del segundo.
>> v*b
Error using == *
Inner matrix dimensions must agree.
>> v*b’
ans =
Pág. 25
Lenguajes de Programación: Guı́a ECTS
2
4
6
>> v’*b
ans =
28
4
8
12
6
12
18
MATLAB permite realizar las operaciones entre elementos de un vector o matriz de modo
muy sencillo. Supongamos que queremos multiplicar, por ejemplo, cada elemento del vector v
con su correspondiente elemento en el vector b. En otras palabras, supongamos que se quiere
conocer v(1) ∗ b(1), v(2) ∗ b(2), y v(3) ∗ b(3). Serı́a estupendo poder usar directamente el
sı́mbolo “∗” pues en realidad estamos haciendo una especie de multiplicación, pero como esta
multiplicación tiene otro sentido, necesitamos algo diferente. Los programadores que crearon
MATLAB decidieron usar el sı́mbolo “·∗” para realizar estas operaciones. De hecho, un punto
delante de cualquier sı́mbolo significa que las operaciones se realizan elemento a elemento.
>> v.*b
ans =
2
8
18
>> v./b
ans =
0.5000
0.5000
0.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 qué no ir hasta el final?
Si aplicamos una función matemática predefinida a un vector, MATLAB nos devolverá un
vector del mismo tamaño en el que cada elemento se obtiene aplicando la función al elemento
correspondiente del vector original
>> sin(v)
ans =
0.8415
0.9093
0.1411
>> log(v)
ans =
0
0.6931
1.0986
Saber manejar hábilmente estas funciones vectoriales es una de las ventajas de MATLAB. De
este modo, se pueden definir operaciones sencillas que se pueden realizar fácil y rápidamente.
En el siguiente ejemplo, se define un vector muy grande y lo manipulamos de este modo tan
sencillo.
Pág. 26
UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB
>> x = [0:0.1:100]
x =
Columns 1 through 7
0
0.1000
0.2000
0.3000
......................
Columns 995 through 1001
99.4000 99.5000 99.6000 99.7000
>> y = sin(x).*x./(1+cos(x));
0.4000
0.5000
0.6000
99.8000
99.9000 100.0000
Usando este tratamiento vectorial, se pueden generar gráficos de modo muy sencillo. Damos
una muestra de esto que luego completaremos.
>> plot(x,y)
Ejercicio 0.36 Definir un vector t cuya primera componente sea −4, que tenga un incremento
entre 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 recién definido
2
y = 5e−t + sin(10t)
0.7.
Creación de gráficas
En esta sección presentamos los comandos básicos para crear representaciones gráficas de
funciones. Para mostrar el uso del comando plot, utilizaremos la función seno y su desarrollo
en serie de Taylor5 en torno al cero con términos cúbicos, x − x3 /6. Para dibujar la gráfica,
seleccionamos el paso del vector de muestreo x y sus valores primero y último
>>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 aproximados
obtenidos del desarrollo limitado. Para compararlos, dibujamos los valores exactos superpuestos
con los aproximados marcados por puntos verdes ‘o’.
El comando plot se utiliza para generar gráficas en MATLAB. Admite una gran variedad de
argumentos. Aquı́ sólo utilizaremos el rango y el formato, y la posibilidad de representar dos
curvas en la misma gráfica.
5
Brook Taylor nació en 1685 en Inglaterra en el seno de una influyente y adinerada familia. Estudió en
Cambridge y cuando se graduó ya habı́a escrito su primer artı́culo matemático de relevancia. Taylor participó activamente en las agrias disputas entre matemáticos británicos (“newtonianos”) y matemáticos europeos (“leibnitzianos”) sobre la adjudicación del descubrimiento del Cálculo Diferencial, llegando a formar
parte del Comité que la Real Sociedad formó para dar fin a tal discusión.
Aunque las aportaciones de Taylor a las matemáticas son profundas y variadas (entre otras, introdujo
el cálculo en diferencias finitas, la integración por partes, desarrolló un método para encontrar soluciones
singulares de ecuaciones diferenciales y sentó las bases de la geometrı́a descriptiva y proyectiva) su resultado
más conocido es el Teorema de Taylor, que permite el desarrollo de funciones en series polinómicas. Sin
embargo, no fue Taylor el primero en obtenerlo, James Gregory, Newton, Leibniz, Johann Bernoulli, y de
Moivre habı́an ya descubierto independientemente variantes del mismo.
Pág. 27
Lenguajes de Programación: 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 un
circulito. La tilde antes y después de go en el comando anterior es la que está en la tecla de
la interrogación de cierre.
Ejercicio 0.38 En la ventana en la que aparece la figura, seleccionar Edit, Copy Figure. Abrir
un nuevo documento de Word y pegar la figura en ese documento.
También es buena idea representar la función error:
>>plot(x,abs(yseno-ytaylor),’mx’);
Para que al final del fichero con todas las órdenes aparezca en pantalla el gráfico, una vez
que éste ya ha sido ejecutado alguna vez, se utiliza la orden shg, que hace que la ventana del
gráfico se convierta en la activa. Usemos este comando para utilizar el comando de petición
de ayuda help que es muy útil también 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ı́cula
incorporada (grid).
También se puede copiar este gráfico al portapapeles desde la ventana del gráfico, para después
pegarlo en un documento Word por ejemplo, como ya vimos en el ejercicio 0.38.
0.8.
Conjuntos de órdenes
En esta sección explicaremos cómo reunir órdenes en ficheros ejecutables desde la lı́nea de
comandos de MATLAB. A estos ficheros se les suele llamar scripts. Ello permite realizar
operaciones más complejas, y facilita sus repeticiones.
Para empezar a trabajar sobre esta parte del tutorial, lo primero que haremos es ejecutar
clear para borrar las variables activas. Como ejemplo, consideramos el fichero correspondiente
al dibujo de las gráficas de la sección 0.7. Para ejecutar los comandos del fichero se debe
especificar el intervalo entre los valores de las abscisas en el muestreo. De este modo, se
pueden construir infinidad de aproximaciones variando este parámetro.
Primero hay que crear el fichero. El editor más conveniente es el que trae incorporado el
propio MATLAB, aunque cualquier editor de texto es válido dado que la codificación de los
archivos de comandos de MATLAB es el estándar ASCII como sucede habitualmente en los
lenguajes de programación. El editor de MATLAB es muy simple y suficiente para este tipo de
aplicaciones. A partir de la versión 5, viene incorporado al propio MATLAB y mejora de versión
en versión. Los ficheros ejecutables de MATLAB, los M-files, deben tener la extensión “.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 no
se va a ejecutar. Por tanto, en este ejemplo, no es necesario reproducir esas lı́neas.
Pág. 28
UNIDAD DIDÁCTICA 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 creamos
conveniente, aunque hay que comunicar a MATLAB la ruta en la que se encuentra para que
MATLAB lo encuentre. Esto se puede hacer de varias maneras, dependiendo de la versión de
MATLAB que estemos usando. En las versiones 6.5 y superiores se puede hacer modificando
la carpeta-directorio activo en la caja correspondiente (ver figura 1); para volver a activar la
vista inicial de MATLAB se procede como se indica en la figura 2. En versiones previas, se
puede indicar la ruta del archivo en el path browser con el icono correspondiente, o desde el
menú File con la opción Set Path. Por defecto, si se guarda en el directorio ..\matlab\bin,
MATLAB lo encontrará 6 .
Ahora se ha de volver a la ventana con la lı́nea de comando y se teclea en esta lı́nea el nombre
del fichero quitando .m. En este caso tutorm.
>>tutorm
??? Undefined function or variable ’h’.
Error in ==> C:\MATLAB\bin\tut.m
On line 13 ==> x=xmin:h:xmax;
Si se se invoca el fichero sin haber definido primero la variable h, aparecerá un mensaje de
error. Se deben definir todas las variables que no se definen en el propio script y que éste
utiliza.
>>h = 0.1;
>>tutorm
>>plot(x,yseno,’rx’,x,ytaylor)
Una vez ejecutada esta instrucción deberá aparecer una ventana con una gráfica como la de
la Figura 3. Cuando tecleamos tutorm en la lı́nea de comandos, MATLAB buscará en los
directorios indicados en el path un fichero llamado tutorm.m. Una vez que lo encuentre lo
leerá y ejecutará los comandos como si se hubiesen tecleado uno detrás de otro en la lı́nea de
comandos. Si se desea ejecutar el programa otra vez pero con un paso diferente, hay que tener
6
Si se utiliza MATLAB en el centro de cálculo o laboratorio de una facultad o escuela, probablemente el
usuario no tenga permiso de escritura en ese directorio y no pueda guardar ahı́ sus ficheros. En este caso, se
pueden guardar en la carpeta que se desee que después se incorpora a la ruta de búsqueda (path), bien con el
comando path o con el icono correspondiente.
Pág. 29
Lenguajes de Programación: Guı́a ECTS
Figura 2: Recuperar vista de la figura 1
cuidado. El programa sobreescribirá los vectores x, yseno e yatylor. Si se quieren guardar
estos vectores hay que especificarlo, almacenándolos 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 vectores
xp, ysenop e ytaylorp y la segunda relativa a un paso de 0.01 que guardamos en los vectores
x, yseno e ytaylor.
Ejercicio 0.42 Calcular la dimensión que tienen que tener los vectores x y xp y confirmar el
resultado utilizando la orden size.
Ejercicio 0.43 Crear y ejecutar desde MATLAB un fichero que se llame BAIP.m con la secuencia 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
Pág. 30
UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB
Figura 3: Gráfica correspondiente al ejemplo tutorm.m.
Ejercicio 0.44 Pedir ayuda del comando pause e incorporarlo entre algunas lı́neas del ejercicio
anterior 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 con
una 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 entre
componentes de 0.05 y termine en el punto 1.
3. Definir un vector y a partir de cada componente del vector t recién definido como:
2
y = 5e−t + sin(10t)
4. Dibujar la curva (t, y) con cruces rojas y con una retı́cula ( grid) incorporada.
0.9.
MATLAB y números complejos
MATLAB entiende la aritmética compleja y es perfectamente posible trabajar con números
complejos. Podemos multiplicar dos números 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
Pág. 31
Lenguajes de Programación: Guı́a ECTS
0.10.
Matemáticas simbólicas con MATLAB
MATLAB dispone de herramientas para cálculo simbólico. Para ello es necesario instalar el
Symbolic Math Toolbox, que es una especie de versión reducida de Maple, un programa de
cálculo simbólico muy conocido. Aquı́ podemos usar esta caja de herramientas para resolver
integrales y calcular determinantes de modo simbólico entre otras cosas. Lo primero que
tenemos que hacer es definir una variable como susceptible de ser utilizada en cálculo simbólico:
>>syms x
Ahora podemos definir una función 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 también definir una matriz que dependa de x y de una nueva variable y:
>>syms y
>> A=[x y x-y
2 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 simbólico:
>> det(A)
ans =
-2*y*x+2*yˆ2+xˆ4-xˆ3*y
Ejercicio 0.46 Calcular de modo simbólico la inversa de la matriz A.
Podemos evaluar este determinante para valores reales de x e y asignando valores a esas
variables y utilizando después la orden eval:
>> x=2.41
x =
2.4100
>> y=-3.2
y =
-3.2000
>> eval(det(A))
ans =
114.4301
En el momento en que hemos asignado valores a las variables, éstas dejan de ser sı́mbolos. Si
queremos que vuelvan a serlo tenemos que hacerlo de modo explı́cito
Pág. 32
UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB
>>syms x
2
Ejercicio 0.47 Definir una función f como e−x .
Ejercicio 0.48 Pedir ayuda de la función diff y calcular la derivada de f . Evaluar esta derivada
para x = −3.327.
Ejercicio 0.49 Pedir ayuda de la función limit y calcular el lı́mite de f cuando x → ∞.
Pág. 33
Lenguajes de Programación: Guı́a ECTS
Pág. 34
Unidad Didáctica 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 ese
sentido, la unidad 1, dedicada al concepto de función y la estructura de control condicional,
y la unidad 2, dedicada al estudio de los bucles, son las más importantes. Constituyen la base
sobre la que se cimenta el resto del curso.
En la unidad 1 se tratan principalmente las ideas de funciones, variables, argumentos de las
funciones, asignación y la primera estructura de control del curso: el condicional. También se
realiza primeramente una contextualización del curso desde la perspectiva de la historia de la
Programación y sus fundamentos.
1.2.
Funciones y variables
La organización habitual de un curso de Programación supone que se comience por los tı́picos
programas de entrada y salida, el programa “Hola mundo”. Sin embargo, en este curso que
ahora comienza nos hemos decidido por una estructura similar a la programación funcional,
comenzando por el concepto de función y estudiando la entrada y salida ya con el curso
muy avanzado. La ventaja de este enfoque es que los alumnos comienzan por los conceptos
fundamentales: funciones, estructuras de control y vectores. Como el aprendizaje es continuo, añadiendo sucesivamente nuevos conceptos y estructuras, conseguiremos que al final los
alumnos estén más familiarizados con las estructuras esenciales de la Programación. Esto es
posible porque MATLAB proporciona una interfaz estándar para las funciones y desde la lı́nea
de comandos es posible ejecutarlas directamente.
El entender las cosas desde la perspectiva funcional proporciona la posibilidad de asimilar desde el principio conceptos claves en Programación, como el de encapsulamiento de tareas, la
división de tareas y su codificación en funciones, crucial cuando se abordan problemas grandes
y se trabaja en equipo. También se trabajan ideas esenciales relativas a el diseño de funciones
y a la reusabilidad de código ya escrito, visto ya como cajas negras que realizan determinadas
tareas, y que servirá de base para construir nuevas funciones, etc...
La que ahora presentamos es la función más sencilla que veremos durante el curso. Tiene un
argumento de entrada, x y un argumento de salida y. Lo único que se hace es calcular una
expresión matemática sencilla y asignar ese valor a y.
% ud1_f1.m
Pág. 35
Lenguajes de Programación: Guı́a ECTS
% Una función sencilla
% un argumento
function y=ud1_f1(x)
y=xˆ2-log(x);
El sı́mbolo = en Programación es una asignación, no siendo por tanto simétrico; se asigna
a lo que está a la izquierda del sı́mbolo igual lo que haya a la derecha del mismo, una vez
realizadas las operaciones que estén especificadas en esa parte derecha.
El nombre de la función, para evitar confusiones, debe coincidir con el nombre del archivo .m
donde esta función se encuentra. Por tanto, como este primer ejemplo es la función ud1_f1,
debemos guardarla en el archivo ud1_f1.m. La primera lı́nea comienza con la palabra reservada function lo cual es común a todas las funciones que veremos en el curso.
Lo más interesante es entender a partir de este ejemplo cómo se pasan los argumentos desde
la lı́nea de comandos hasta las funciones. Cuando invocamos esta función desde la lı́nea de
comandos 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 función
ud1_f1.m, y se crea espacio en memoria para la variable x. En ese espacio se coloca el
valor 5. Se crea espacio también para y. Las variables x e y se llaman variables locales de la
función; el adjetivo locales procede de que viven en el espacio de memoria de la función. Una
vez hecho esto, el ordenador ejecuta las sentencias de la función (en este caso una sola) de
arriba abajo. Durante esta ejecución se define la variable de salida y, en la cual al final de la
misma está el resultado, 23.3906. Una vez terminada la ejecución se devuelve el control a la
lı́nea de comandos, se asigna en este caso el resultado a la variable por defecto ans y se borra
de la memoria RAM la función ud1 f11 .
Podemos invocar a la función 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 función y
las variables z y t viven en el espacio de memoria asignado a la ventana de comandos. Cuando
se llama a la función, x copia el valor de t y cuando se termina la ejecución de la función es
z la que copia el valor de la calculada y antes de que esta desaparezca (ver figura 1.1).
La situación no cambia sustancialmente si invocamos a la función 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 de
comandos y x e y en el espacio de memoria de la función ud1_f1.m mientras ésta se ejecuta.
1
Esto no es exactamente ası́, pero esta es la imagen más adecuada para un principiante en Programación.
Pág. 36
UNIDAD DIDÁCTICA 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 código de la función, la variable t del párrafo
anterior y la variable x del espacio de memoria de la ventana de comandos no se ven afectadas.
O sea que si cambiamos la función 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
>> x
x =
5
el resultado no será correcto, pero x tampoco habrá cambiado su valor. Ello es ası́ porque la
variable local x vive en la función. Al principio de la misma, copia el valor de la variable x
del espacio de comandos, y aunque cambiemos la variable local en la función, la variable en
el espacio de comandos no se ve afectada; están en mundos diferentes que sólo se comunican
a través de la lı́nea de argumentos. Hagamos ahora algunos ejercicios para consolidar estas
ideas:
Ejercicio 1.1
Vamos 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 últimas cifras del año en que
empieza el curso y Y Y las dos últimas cifras del año 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 será tu carpeta de trabajo para todo slos ejemplos y ejercicios de la
unidad 1.
Pág. 37
Lenguajes de Programación: Guı́a ECTS
Ejercicio 1.2
Edita manualmente la función ud1 f1 creando un archivo nuevo con el editor on desde la ventana de
comandos (con File, New ), guárdala 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? ¿Qué errores o problemas da?
Ejercicio 1.3
Crea una función que reciba el radio de un cı́rculo y devuelva su área. MATLAB conoce el valor de
π, pide ayuda sobre pi para usarlo.
Ejercicio 1.4
Prueba la función que has creado con un cı́rculo de radio la unidad. Deberı́a devolver π. Pruébala
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 más de un argumento de entrada.
Tenemos ası́ la siguiente, la cual calcula el área de un rectángulo. Si necesitamos más argumentos de entrada, simplemente los colocamos uno tras otro separados por comas dentro de
los paréntesis a la derecha del nombre de la función.
% ud1_farea
% primera función con más de un argumento.
% área del rectángulo de lados a y b
function area=ud1_farea(a,b)
area=a*b;
Para invocarla, se nos ocurren estas tres posibilidades, aprovechando lo explicado en la sección
1.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 números, los cuales son copiados por las variables
locales a y b. En la segunda posibilidad pasamos dos variables correspondientes al espacio
de memoria de la ventana de comandos, x e y, las cuales son copiadas igualmente por las
variables locales de la rutina, a y b, a través de la lista de argumentos. Finalmente en la tercera,
Pág. 38
UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES
tenemos una combinación de las dos posibilidades anteriores.
En el siguiente ejemplo los argumentos no conmutan entre sı́. Se trata de calcular el área de
un polı́gono regular sabiendo el número de lados y el lado. En el cálculo de la apotema los dos
argumentos 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 papel
function area=ud1_fareapol(l,n)
P=n*l; % perı́metro
a=l/(2*tan(pi/n));
area=P*a/2;
Es la primera función en la que usamos variables locales a la función. Si invocamos esta función
desde la ventana de comandos, y preguntamos después lo que valen esas variables locales, las
cuales no pertenecen al espacio de memoria de la ventana de comandos tendremos el siguiente
resultado:
>> 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, guárdalas en tu carpeta de trabajo
y pruébalas desde la ventana de comandos de MATLAB.
Ejercicio 1.6
Crea una función que reciba la base y la altura de un triángulo y devuelva el área.
Ejercicio 1.7
Crea una función que reciba la masa y la velocidad de un móvil y devuelva la energı́a cinética.
Ejercicio 1.8
Consideramos la función
function d=ud1_fprueba(a,b,c)
b=c;
a=b;
d=a+b+c;
Pág. 39
Lenguajes de Programación: Guı́a ECTS
Sin ejecutar la función, ¿qué valor devolverá si invocamos desde MATLAB ud1 f prueba(1, 2, 3)?
Razónalo primero y compruébalo después editando la función y ejecutando esa orden. Es la primera
función que tiene más de dos argumentos. ¿Conmutan entre sı́ los argumentos de entrada?
Ejercicio 1.9
Crea una función que reciba los tres coeficientes a, b, c, de un polinomio de segundo grado y devuelva
la raı́z
√
−b + b2 − 4ac
.
2a
Cuando se invoque la función, se elegirán los coeficientes para que la ecuación 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 código es correcto, usa los coeficientes del polinomio
x2 − 7x + 12, que tiene como raı́ces 3 y 4.
Ejercicio 1.10
Crea una función análoga para la otra raı́z,
−b −
√
b2 − 4ac
.
2a
Ejercicio 1.11
Crea una función que reciba dos alturas, h1 y h2 y una masa y devuelva la energı́a potencial perdida/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 detrás de la otra.
No disponemos todavı́a de herramientas que permitan controlar de algún modo la ejecución
o realizar operaciones más complejas con la información de entrada a la función. La primera
de esas herramientas y una de las más importantes es el condicional y nos pone en la parrilla
de salida del desarrollo de estrategias y algoritmos para resolver los problemas de los que un
ordenador es capaz. Además, y no menos importante, se convierte en el primer mecanismo de
provocación de vuestra capacidad de pensar y de articular un discurso complejo a partir de
elementos mı́nimos, o sea, PROGRAMAR.
La estructura condicional aparece en los lenguajes de programación normalmente mediante la
palabra reservada if. En MATLAB lo hace de ese modo, tal como se indica en las siguientes
lı́neas.
function y=nombrefuncion(arg1,arg2,....)
....
....
if cond
....
....
end
....
....
Pág. 40
UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES
Por cond nos referimos a una condición lógica o combinación de ellas. Ası́, cond puede ser
que una variable sea mayor que un determinado valor, igual, mayor o igual (>=) etc. En caso
de que eso sea ası́, se ejecutarán las sentencias que están entre la sentencia del if y la primera
sentencia end que se encuentre.
Es importante para que los códigos sean legibles tabular o indentar las instrucciones correspondientes a una estructura de control 3 o 4 espacios (serán 4 en nuestros ejemplos), como
hemos hecho con el puntead en el bloque if anterior.
Uno de los ejemplos más sencillos que se pueden poner de esta estructura es el de una función
que devuelva el mayor de dos números a, b supuestos distintos entre sı́. Se puede abordar este
problema de varias maneras. La primera es mediante dos estructuras if, la primera controlando el caso de que a sea el mayor de los valores y la segunda controlando el caso de que el
mayor sea b.
% ud1_fmayorab
% primer uso del condicional if
% Devuelve el mayor de dos números a,b
% a,b se supondrán diferentes
function 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 comprueba
si b es mayor que a, y si eso es cierto se define la variable mayor como b.
% ud1_fmayorab0
% Devuelve el mayor de dos números a,b
% a,b se supondrán diferentes
function mayor=ud1_fmayorab0(a,b)
mayor=a;
if b>a
mayor=b;
end
En la tercera variante se juega con la variable a calcular, dándole primero el valor a. Después
se compara b con esa variable, y si en la comparación gana b, se actualiza el valor de mayor.
% ud1_fmayorab0
% Devuelve el mayor de dos números a,b
% a,b se supondrán diferentes
function mayor=ud1_fmayorab1(a,b)
mayor=a;
if b>mayor
mayor=b;
end
Los ejercicios correspondientes a este ejemplo son los siguientes:
Pág. 41
Lenguajes de Programación: Guı́a ECTS
Ejercicio 1.12
Abre la ventana principal de MATLAB, copia manualmente las funciones ud1_fmayorab, ud1_fmayorab0
y ud1_fmayorab1, guárdalas en tu carpeta de trabajo y pruébalas .
Ejercicio 1.13
Crea una función que reciba un número r y devuelva el área del cı́rculo de radio r si r ≥ 0 y −1 en
caso contrario.
Ejercicio 1.14
Crea una función que reciba un valor x y devuelva el valor y de la función definida a trozos:
x + 1 x < −1
y=
1 − x2 x ≥ −1
Ejercicio 1.15
(Para valientes) Crea una función que reciba tres números a, b, c, que se supondrán 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 ejecutará el primer
bloque y si es falsa el segundo, como se muestra en el siguiente esquema:
function y=nombrefuncion(arg1,arg2,....)
....
....
if cond
bloque1
else
bloque2
end
....
....
El ejemplo para ilustrar esta estructura es el correspondiente a la función que calcula el mayor
de dos números supuestos distintos. Se comprueba si el primero es mayor que el segundo y si
no es ası́, se toma el mayor como el segundo.
% ud1_felseab
% primer uso de la estructura if-else
% Devuelve el mayor de dos números a,b
% a,b se supondrán diferentes
function mayor=ud1_felseab(a,b)
if a>b
mayor=a;
else
mayor=b;
end
Pág. 42
UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES
Los ejercicios correspondientes a este ejemplo son los siguientes:
Ejercicio 1.16
Edita manualmente la función ud1_felseab, modificando alguna de las anteriores, guárdala en tu
carpeta de trabajo y pruébala. Adivina cuál será el resultado si pasas como argumentos dos números
iguales.
Ejercicio 1.17
Crea una función que reciba un número r y devuelva el área del cı́rculo de radio r si r ≥ 0 y −1 en
caso contrario, utilizando la estructura if-else.
Ejercicio 1.18
Crea una función que reciba un valor x y devuelva, utilizando la estructura if-else, el valor y de la
función definida a trozos:
x + 1 x < −1
y=
1 − x2 x ≥ −1
1.6.
Función que llama a otra función
Una vez que con una función hemos resuelto un determinado problema y/o hemos agrupado
una serie de tareas, esa función es muy cómodo verla como una caja negra que recibe unos
argumentos de entrada y devuelve unos argumentos de salida (de momento uno sólo de salida).
Vista de ese modo, es natural que sea llamada por otra función que la necesita como parte
de la misma. La sintaxis de ello no ofrece ningún problema invocándose de modo análogo a
como se invoca desde la lı́nea de comandos. En el siguiente ejemplo codificamos una función
definida a trozos, similar a la del ejemplo 1.4, en la que el valor de uno de los trozos de la
función se obtiene llamando a una función creada previamente, la ud1_f1.m.
% ud1_ftrozos2
% primera funcion q llama a otra funcion
% ud1_ftrozos2(x). Devuelve el valor de la función:
% f(x)=x si x<1
% f(x)=xˆ2-ln(x) si x>=1
function y=ud1_ftrozos2(x)
if x<1
y=x+1;
else
y=ud1_f1(x);
end
El concepto de llamar a una función desde otra es muy poderoso y es la base para tanto
resolver grandes problemas como ser capaz de repartir la escritura de grandes códigos entre
un equipo de programadores. Haremos uso abundante de esta técnica durante el curso y si el
estudiante es hábil conseguirá simplificar la resolución de muchos ejercicios si hace buen uso
de 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 función ud1_ftrozos2, guárdala en tu carpeta de trabajo y pruébala.
Pág. 43
Lenguajes de Programación: Guı́a ECTS
>>
>>
>>
>>
ud1_ftrozos2(2.3)
ud1_ftrozos2(1.1)
ud1_ftrozos2(0)
ud1_ftrozos2(0.9)
¿Son correctos los resultados? ¿Qué errores o problemas da?
Ejercicio 1.20
Utilizando la función del área del rectángulo (ud1_farea), crea una función que reciba los dos
lados de la base y la altura de una pirámide de base rectangular y devuelva su volumen (el volumen
de la pirámide es 1/3 del área de la base por la altura).
Ejercicio 1.21
Usando las funciones de los ejercicios 1.9 y 1.10, crea una función que reciba los tres coeficientes de
un polinomio de segundo grado de raı́ces reales y devuelva el producto de las mismas (se elegirán
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 función que que reciba los tres coeficientes de un polinomio de grado
2, llame a la función del apartado anterior para calcular el producto de sus raı́ces y que cuando las
raı́ces sean números 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 internos
otras estructuras de control. Es habitual que dentro de un bucle hay condicionales, o que
dentro del bloque de un condicional haya un bucle y también es habitual que dentro del bloque
de un condicional haya otro condicional. Esto lo reflejamos en el siguiente esquema.
function y=nombrefuncion(arg1,arg2,....)
....
....
if cond
bloque10
if cond1
bloque11
end
bloque12
else
bloque2
end
....
....
Para mostrar el funcionamiento, planteamos un ejemplo muy interesante, devolver el signo de
una variable entera n. Si n es estrictamente negativa el signo se toma como -1, si n es 0, el
signo será 0, y si n es estrictamente positiva, el signo será 1. Por tanto, hay que gestionar
tres posibilidades excluyentes, lo que abordaremos primero eliminando una de ellas frente a las
otras dos y después las otras dos entre si.
Pág. 44
UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES
% ud1_fsigno
% función que devuelve el signo de un número 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==0
signo=0;
else
signo=1;
end
end
Los ejercicios correspondientes a este ejemplo son los siguientes:
Ejercicio 1.23
Edita manualmente la función ud1_fsigno, guárdala en tu carpeta de trabajo y pruébala, desde
la ventana de comandos de MATLAB.
Ejercicio 1.24
Se trata de construir una función que reciba una calificación (entre 0 y 10) y devuelva 0 si es
suspenso (calificación estrictamente menor que 5), 1 si es aprobado (calificación mayor o igual que 5
y menor que 7), 2 si es notable (calificación mayor o igual que 7 y menor que 9), 3 si es sobresaliente
(calificación mayor o igual que 9 y menor o igual que 10) y -1 si el argumento no está entre 0 y 10.
No se podrán utilizar operadores lógicos.
Ejercicio 1.25
Crea una función que reciba un valor x y devuelva el
sin(x)
x
y=
2
x + log(x)
valor y de la función definida a trozos:
x<0
0≤x<1
x≥1
No se podrán utilizar operadores lógicos.
Ejercicio 1.26
Función q devuelva el salario semanal de un trabajador en función del coste hora, de las horas que ha
trabajado y de un fijo de productividad que se cobra si se trabajan más de 30 horas. Si se trabajan
más de 40 horas, las horas por encima de esas 40 se pagan un 50 % más caras (horas extras). No se
podrán utilizar operadores lógicos.
Ejercicio 1.27
Codifica la función
f (x) = máx{ud1 f 1(x), 7 cos(6x)}.
donde máx significa máximo. En la definición de ud1 f1 hay un logaritmo del argumento x implicado.
Por tanto, cuando x sea menor o igual que cero, ese logaritmo no podrá ser evaluado y tomaremos
como máximo la única función que está definida. No se podrán utilizar operadores lógicos.
Pág. 45
Lenguajes de Programación: Guı́a ECTS
1.8.
Variante elseif en el condicional
Una variante bastante útil del condicional es la que permite abrir el abanico de posibilidades
de ejecución a no sólo el verdadero o falso referido a una determinada condición. La idea es
que si una condición es cierta se ejecuten unas sentencias, pero si esta es falsa, se compruebe
una segunda condición y si esta es cierta, se ejecuten el correspondiente segundo grupo de
sentencias, pero si la segunda condición es falsa, se pase a una tercera y ası́ sucesivamente.
Finalmente, la orden terminará con una sentencia else cuyo bloque de instrucciones posterior
se ejecutará si ninguna de las condiciones ha resultado cierta. Pretendemos reflejar esto con
el siguiente esquema:
function y=nombrefuncion(arg1,arg2,....)
....
....
if cond1
bloque 1
elseif cond2
bloque 2
elseif cond3
bloque 3
elseif......
.....
else
bloque n
end
....
....
Si la condición 1, cond1, es cierta, se ejecutará el bloque 1 de sentencias, y a posteriori se
pasará directamente a las sentencias posteriores a la sentencia end. Si la condición 1 fuese
falsa, se evaluarı́a la condición 2 y si está fuese cierta, se ejecutarı́a el bloque 2, pasando
directamente a las sentencias posteriores a la sentencia end. Si ninguna de las condiciones
fuese cierta, se pasarı́a directamente a la ejecución del bloque n.
Vemos esta estructura con el siguiente ejemplo. Se trata de construir una función que reciba
una calificación (entre 0 y 10) y devuelva 0 si es suspenso (calificación estrictamente menor
que 5), 1 si es aprobado (calificación mayor o igual que 5 y menor que 7), 2 si es notable
(calificación mayor o igual que 7 y menor que 9) y 3 si es sobresaliente (calificación mayor o
igual que 9). Para codificar este ejemplo, lo primero que comprobamos es si la nota es menor
que 5. Si no lo es, sólo comprobamos si es menor que 7, por que ya sabemos que va a ser
mayor o igual que 5. Los demás casos son análogos.
% ud1_fnotas
% primera vez q usamos el elseif
function clave=ud1_fnotas(nota)
if nota<5
clave=0;
elseif nota<7
clave=1;
elseif nota<9
clave=2;
Pág. 46
UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES
else
clave=3;
end
Los ejercicios correspondientes a este ejemplo son los siguientes:
Ejercicio 1.28
Edita manualmente la función ud1_fnotas, guárdala en tu carpeta de trabajo y pruébala, desde
la ventana de comandos de MATLAB. ¿Que ocurre si el valor del argumento no está entre 0 y 10?
Ejercicio 1.29
Se trata de construir una función que reciba una calificación (entre 0 y 10) y devuelva 0 si es
suspenso (calificación estrictamente menor que 5), 1 si es aprobado (calificación mayor o igual que 5
y menor que 7), 2 si es notable (calificación mayor o igual que 7 y menor que 9), 3 si es sobresaliente
(calificación mayor o igual que 9 y menor o igual que 10) y -1 si el argumento no está entre 0 y 10.
Se utilizará la variante elseif del condicional para realizar este ejercicio.
Ejercicio 1.30
Crea una función que reciba un valor x y devuelva el
sin(x)
x
y=
2
x + log(x)
valor y de la función definida a trozos:
x<0
0≤x<1
x≥1
Se utilizará la variante elseif del condicional para realizar este ejercicio.
Ejercicio 1.31
Función q devuelva el salario semanal de un trabajador en función del coste hora, de las horas que ha
trabajado y de un fijo de productividad que se cobra si se trabajan más de 30 horas. Si se trabajan
más de 40 horas, las horas por encima de esas 40 se pagan un 50 % más caras (horas extras). Se
utilizará la variante elseif del condicional para realizar este ejercicio.
Ejercicio 1.32
Codifica la función
f (x) = máx{ud1 f 1(x), 7 cos(6x)}.
donde máx significa máximo. En la definición de ud1 f1 hay un logaritmo del argumento x implicado.
Por tanto, cuando x sea menor o igual que cero, ese logaritmo no podrá ser evaluado y tomaremos
como máximo la única función que está definida. Se utilizará la variante elseif del condicional
para realizar este ejercicio.
1.9.
Operadores lógicos
Si queremos construir condiciones algo más interesantes, necesitaremos combinar condiciones
elementales mediante los operadores lógicos habituales, estudiados a menudo durante la etapa
de la educación secundario. Necesitaremos saber escribir al menos los operadores Y lógico y el
Ó lógico. Si se pretende construir una condición que mezcle varias condiciones se pueden usar
paréntesis para establecer qué operaciones lógicas se hacen primero, de modo similar a como
sucede con las operaciones aritméticas.
Para el Y lógico se usa el sı́mbolo reservado &. En el siguiente ejemplo vemos como se utiliza
este operador para construir una función que devuelva el mayor de tres números supuestos
distintos. Si uno de los números es mayor lo será porque es al mismo tiempo mayor que uno
y mayor que otro.
Pág. 47
Lenguajes de Programación: Guı́a ECTS
%% operadores logicos.
function mayor=ud1_fmayor(a,b,c)
if a>b & a>c
mayor=a;
end
if b>a & b>c
mayor=b;
end
if c>a & c>b
mayor=c;
end
Otro operador interesante es el Ó lógico (inclusivo). Para éste se usa el sı́mbolo |, que se obtiene
pulsando la tecla Alt Gr y la del 1. En los siguientes ejercicios veremos algún ejemplo de
utilización de este operador.
Ejercicio 1.33
Edita manualmente la función ud1_fmayor, guárdala en tu carpeta de trabajo y pruébala, desde
la ventana de comandos de MATLAB.
Ejercicio 1.34
Construye una función que reciba tres valores a, b y c (que se supondrán 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 función 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 función que reciba tres valores a, b y c (que se supondrán diferentes) y devuelva el
mayor de ellos. No se podrán utilizar operadores lógicos, solo un bloque if-else y una llamada a la
función ud1 fmayorab
Ejercicio 1.37
¿Cuál es el significado del argumento de salida de la siguiente función?
function mayor=ud1_fmayortres(a,b,c)
mayor=a;
if b>mayor
mayor=b;
if c>mayor
mayor=c;
end
end
Ejercicio 1.38
¿Qué devuelve la siguiente función?
Pág. 48
UNIDAD DIDÁCTICA 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>c
y=y-c;
else
y=y-a;
end
else
y=b;
end
Trata de obtenerlo sin usar el ordenador y después compruébalo con algunos ejemplos.
Ejercicio 1.39
Usando la función ud1 fmayor, construye una función que devuelva el máximo de cuatro valores.
Ejercicio 1.40
(Para valientes) Idem con seis valores. Trata de hacerlo con un único if − else y utilizando dos veces
la función del apartado 1.36.
Ejercicio 1.41
(Para valientes) Idem con siete valores. Trata de hacerlo con el menor número posible de if − else
(ninguno).
Ejercicio 1.42
(Para valientes) ¿Qué errores hay en el siguiente programa? Se supone que la función deberı́a devolver
la potencia del segmento definido por tres abscisas a, b, c, es decir, el producto de las longitudes de
los dos segmentos que determinan. No se sabe cuál es la relación de orden entre los valores pero si
fuesen crecientes, la potencia serı́a (b − a) ∗ (c − b).
function pot=ud1_fpotencia(a,b,c)
if a>b & a>c
if b>c
pot=(a-b)*(b-c)
else
pot=(a-c)*(c-b)
end
end if b>a & b>c
if a>c
pot=(b-a)*(a-c)
else
pot=(b-c)*(c-a)
end
else
if a>b
pot=(c-a)*(a-b)
else
pot=(c-b)*(b-a)
end
end
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
últimos casos deberı́a dar 0).
Pág. 49
Lenguajes de Programación: Guı́a ECTS
1.10.
Operadores de comparación: ¿son iguales?
La operación de comparar si dos valores enteros son iguales tiene una sintaxis especı́fica
en MATLAB, colocando el sı́mbolo = de modo duplicado, ==. Cuando se trate de valores
correspondientes a números reales, esta operación es más delicada y hablaremos de ella más
adelante. En el siguiente ejemplo se muestra su uso para construir una función que indica si
dos valores son iguales o no.
% ud1_figuales
% operador de comparacion para numeros enteros
function chivato=ud1_figuales(m,n)
if m==n
chivato=1;
else
chivato=0;
end
La negación lógica 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 comprobar
si dos valores son distintos será ∼=. En los siguientes ejercicios veremos algún ejemplo de
utilización de este operador.
Ejercicio 1.43
Edita manualmente la función ud1_figuales, guárdala en tu carpeta de trabajo y pruébala, desde
la ventana de comandos de MATLAB.
Ejercicio 1.44
Construye una función que reciba tres números enteros a, b y c y devuelva 1 si son iguales entre si,
y 0 en caso contrario.
Ejercicio 1.45
Construye una función que reciba tres números 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 función que reciba tres números 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 números reales: precisión y valor absoluto
Entender cómo el ordenador almacena y trabaja con números con cifras decimales escapa
al contenido de este libro. Sin embargo, dado que la memoria RAM es finita, en números
racionales periódicos o en números irracionales, es fácil entender que será imposible almacenar
las infinitas cifras que hay a la derecha del punto decimal. Además de estas dificultades de almacenamiento, está la dificultad conceptual relativa a la idea de igualdad entre números reales.
Pág. 50
UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES
La mejor respuesta es pensar que dos números reales (y en general dos objetos cualesquiera en
la vida profesional) son iguales cuando las diferencias entre ellos sean tan pequeñas como lo
requiera una determinada tarea. Ası́, dos sillas del mismo modelo son objetivamente distintas
si las vemos con mucho cuidado, pero si no tienen ningún defecto, serán a todos los efectos
iguales. Lo mismo sucede con los números reales. Diremos que dos números reales son iguales
cuando el valor absoluto de su diferencia sea menor que un umbral de precisión determinado
que dependerá del significado y utilidad de dichas cantidades.
En el siguiente ejemplo observamos cómo se define ese umbral para comprobar si un triángulo
es equilátero, isósceles, etc., y como se comprueba la igualdad de los lados recurriendo a la
función valor absoluto, abs en MATLAB.
% ud1_ftriangulos
% recibe a, b y c, los lados de un triángulo
% devuelve 3 si son los lados de un triángulo equilátero
% devuelve 2 si son de un triángulo isósceles
% devuelve 1 si son los lados de un triángulo escaleno
% idea: cuando dos numeros reales son iguales, para
% comprobarlo hay q definir una precisón-umbral.
function tipo=ud1_ftriangulos(a,b,c)
% Precisión con la que trabajamos. Todo número menor que
% esa cantidad será cero para nosotros
prec=(a+b+c)*1e-5;
if abs(a-b)<prec & abs(b-c)<prec
tipo=3;
elseif abs(a-b)<prec | abs(a-c)<prec | abs(b-c)<prec
tipo=2;
else
tipo=1;
end
Los ejercicios correspondientes a este ejemplo son los siguientes:
Ejercicio 1.48
Entra en al carpeta
Asignaturas\LP \Ejemplos.
utilizando el enlace directo que tienes en el escritorio. Copia de ahı́ todos los ejemplos correspondientes
a la unidad 1, aquellos ficheros cuyo nombre empieza por ud1 a tu propia carpeta ud1. Prueba la
función ud1 ftriangulos.
Ejercicio 1.49
Crea una función que reciba tres valores, a, b y c y devuelva 1 si pueden ser los lados de un triángulo
(la suma de dos lados cualesquiera ha de ser mayor que el otro, es decir, a + b > c, a + c > b y
b + c > a) y 0 en caso contrario.
Ejercicio 1.50
Modifica el ejemplo ud1_ftriangulos para que reciba tres valores y devuelva 0 si no pueden ser
los lados de un triángulo (usa la función creada en el apartado 1.49), 3 si es un triángulo equilátero,
2 si es isósceles y 1 si es escaleno.
Ejercicio 1.51
Codifica el ud1_ftriangulos en una sola lı́nea usando la función ud1 ftriangulos y el ejercicio
1.49.
Ejercicio 1.52
(Para valientes) Construye una función que reciba 4 números a, b, c, d, correspondientes a los lados
consecutivos de un trapezoide, ası́ como la longitud de una las diagonales d1 y devuelva 1 si la figura
es un cuadrado, 2 si es un rectángulo, 3 si es un trapecio y 4 si no es ninguna de estas posibilidades.
Pág. 51
Lenguajes de Programación: Guı́a ECTS
1.12.
Variables enteras y reales como argumentos
Hasta ahora habı́amos utilizado variables que eran esencialmente o números enteros o números
reales. En el siguiente ejemplo conviven ambos tipos como argumentos. La función recibe los valores
correspondientes a las dimensiones principales de una determinada figura elemental (rectángulo,
triángulo, cı́rculo, etc...) y recibe también un entero indicando el tipo de figura concreta a la que nos
referimos de entre esa lista. La función devuelve el área de dicha figura.
% ud1_fareafig
% primera función que combina variables esencialmente diferentes,
% una como tipo que funciona como un indicador de especie (número
% entero) y otras (a,b) q funcionan como números reales.
% ademas b a veces es inutil.
% ud1_fareafig(tipo,a,b) devuelve el área de distintas figuras
% Si tipo=1, devuelve el área del rectángulo de lados a y b
% Si tipo=2, devuelve el área del cı́rculo de radio a
% Si tipo=3, devuelve el área del triángulo de base a y altura b
% Si tipo=4, devuelve el área del cuadrado de lado a
% Si tipo=5, devuelve el área del triángulo equilátero de lado a
% Si no es ninguno de los tipos anteriores, devuelve -1
function 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 función ud1_fareafig, bien editándola manualmente o trayéndola de una carpeta
determinada.
Ejercicio 1.54
Modifica la función ud1_fareafig para que también calcule el área del rombo.
Ejercicio 1.55
Codifica ud1_fareafig sin la orden else ni la elseif.
Ejercicio 1.56
Construye una función que reciba un parámetro, raiz, y los coeficientes a, b y c de un polinomio de
segundo grado. Devolverá la raı́z con el ’+’ en la fórmula si raiz es 1 y la raı́z con el ’-’ si raiz es
6= 1. Para calcular estas raı́ces llamaremos a las funciones 1.9 y 1.10. Para comprobar si tu código
es correcto, usa los coeficientes del polinomio x2 − 7x + 12, que tiene como raı́ces 3 y 4.
Ejercicio 1.57
Codifica una función que reciba los coeficientes de un polinomio de grado 2 y devuelva la suma de
sus raı́ces, para lo cual usará del modo que corresponda la función del ejercicio 1.56. Para comprobar
si tu código es correcto, usa los coeficientes del polinomio x2 − 7x + 12, que tiene como raı́ces 3 y
4.
Ejercicio 1.58
Pág. 52
UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES
(Para valientes) Sabiendo que una pulgada son 2.54 cm, que un pie son 12 pulgadas, y que una
yarda son 3 pies se pide construir una función que reciba una cantidad, un número que indicará en
qué sistema de medida está (0 para el sistema internacional (SI) y 6= 0 para el sistema inglés) y otro
número que indicará en qué unidades está (1,2 o 6= 1, 2 según sea mm, cm o metros en SI y 1, 2
o 6= 1, 2 según sea pulgadas, pies o yardas en el sistema inglés). La función devolverá la magnitud
convertida a metros si se ha recibido en el sistema inglés y convertida a pies si se ha recibido en el
SI.
1.13.
Variables contador y sumador
Ya vimos que el operador = en MATLAB no tiene mucho que ver con lo que ese operador significa
en Algebra. Su significado es de asignación. A la izquierda tendremos siempre una variable y a la
derecha un expresión que puede combinar llamadas a funciones con operadores aritméticos y lógicos.
El funcionamiento de la operación es que primero se evalúa la expresión a la derecha y el valor
obtenido es asignado a la variable que está a la izquierda.
Esto abre la puerta para operaciones que no tienen sentido matemático pero sı́ en Programación,
como decir que i = i + 1. Lo que esto significa es que se evalúa la expresión i + 1 y se asigna su valor
a i, con lo cual esta variable habrá incrementado su valor original en una unidad. En el siguiente
ejemplo aplicamos esta idea para encontrar la suma de los positivos entre cuatro números.
%% ud1_fsumapos
%% primera variable sumadora (x=x+algo)
%% suma de los positivos entre 4 números.
function suma=ud1_fsumapos(a,b,c,d)
suma = 0;
if a>0
suma=suma+a;
end
if b>0
suma=suma+b;
end
if c>0
suma=suma+c;
end
if d>0
suma=suma+d;
end
Los ejercicios correspondientes a este ejemplo son los siguientes:
Ejercicio 1.59
Prueba la función ud1_fsumapos
Ejercicio 1.60
Construye una función que reciba 5 números a, b, c, d, y e y cuente cuántos son estrictamente
positivos.
Ejercicio 1.61
Construye una función que reciba 5 números x, y, z, t, y s y dos números a y b y devuelva la suma
de aquellos números de entre esos 5 que son mayores e iguales que a y menores o iguales que b.
Ejercicio 1.62
Construye una función que reciba 5 números a, b, c, d, y e y un número adicional positivo ref y
devuelva la suma de aquellos valores que sean negativos pero que su valor absoluto sea mayor que
ref . Por ejemplo, si los números son, -7, 12, 4, -3, -6 y ref vale 3.7, la suma serı́a -7-5-=-13.
Pág. 53
Lenguajes de Programación: Guı́a ECTS
1.14.
Función parte entera
Hay una función propia de MATLAB que se usa en muchos códigos y que conviene citar. Es la función
que extrae la parte entera, redondeando hacia −∞, de un número. 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 número
es o no entero.
%% ud1_fesentero
%% comprueba si un numero x es entero
%% funcion parte entera
function 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 función ud1_fesentero.
Ejercicio 1.64
Construye una función que reciba 4 números a, b, c, d y devuelva la suma de los que entre ellos son
enteros.
Ejercicio 1.65
Construye una función que reciba un número natural n y devuelva 0 si n es par y 1 si n es impar.
Ejercicio 1.66
(Para valientes) Construye una función que reciba 4 números a, b, c, d y un número entero n y
devuelva la suma de los que entre ellos son enteros y además múltiplos de n.
Pág. 54
Unidad Didáctica 2
Bucles
2.1.
General
Como ya se indicó al comienzo de la unidad 1, esta segunda unidad contiene junto con la primera la
mayorı́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 más importante, la que permite realizar repeticiones:
los bucles. El bucle junto con los condicionales representan la base de la programación estructurada.
2.2.
Bucles
En muchos problemas de matemáticas se requiere repetir o iterar un mismo procedimiento. Es por
ello que todos los lenguajes de programación contienen la posibilidad de crear bucles. Un bucle en
programación es una sentencia que se realiza repetidas veces. Un bucle se utiliza para hacer un acción
repetida sin tener que repetir varias veces el mismo código, lo que ahorra tiempo, deja el código más
claro y facilita su modificación en el futuro.
La variable entera que cuenta el número de veces que regula la evolución 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 formas
de escribir un bucle radica en que el ı́ndice del bucle es una variable más del programa y su valor es
controlado en todo momento por el programador. Con este tipo de bucles, el fin de la iteratividad
viene determinado por una condición sobre una variable del programa que aparece a continuación
del comando WHILE.
El primer ejemplo ilustra uno de los usos más tı́picos de los bucles que sin lugar a dudas es la suma
de un conjunto de elementos. El conjunto de elementos que se quieren sumar en este caso son los
naturales de 1 a n. El ı́ndice i se inicializa por tanto a 1 y n es un argumento de la función. La
condición de corte del proceso iterativo que requiere la estructura WHILE se ejecutará cuando el ı́ndice
i sea mayor que n, en cualquier otro caso i se irá incrementando en una unidad y la variable suma
se verá incrementada en el valor del propio ı́ndice i. De esta forma cuando el bucle se interrumpa la
variable suma contendrá el valor resultante de la suma de los n primeros números naturales.
%ud2_fsuma
% Suma de todos los naturales entre 1 y n
% primer bucle
function suma=ud2_fsuma(n)
suma=0;
i=1;
Pág. 55
Lenguajes de Programación: Guı́a ECTS
while i<=n
suma=suma+i;
i=i+1;
end
Mediante los siguientes ejercicios se podrá 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 encontrarás en la carpeta:
Asignaturas\LP \Ejemplos
Añade la carpeta Z :\ud2 al path o Current Directory de MATLAB.
Ejercicio 2.2
Prueba la función ud2 fsuma
Ejercicio 2.3
Construye una función que reciba dos números naturales, m y n, con m < n, y devuelva la suma de
los naturales entre m y n.
Ejercicio 2.4
Idem sin usar bucles y llamando a la función ud2 fsuma.
Ejercicio 2.5
Construye una función que reciba un número natural, n y devuelva
sin(1) + sin(2) + . . . + sin(n − 1) + sin(n)
n+1
Ejercicio 2.6
(Para valientes) Construye una función que reciba dos números, reales a, b, con a < b, un número
natural 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.
También se puede ver como la posición vertical del centro de gravedad de la curva y = sin(x) entre
a y b si la consideramos representada por esos n + 1 puntos.
Ejercicio 2.7
(Para valientes) Construye una función que reciba dos números, reales a, b, con a < b, un número
natural n, y calcule la posición vertical del centro de gravedad de la curva y = sin(x), considerada
como una poligonal que se apoya en n + 1 puntos de esa curva cuyas abscisas están equiespaciadas
entre a y b.
Ejercicio 2.8
(Para valientes) Construye una función que reciba dos números, reales a, b, con a < b, un número
natural n, y calcule el centro de gravedad del superficie definida por los rectángulos que tiene como
base h = (b − a)/n y como altura sin(xi ), con xi = a + i ∗ h, 0 ≤ i < n.
Pág. 56
UNIDAD DIDÁCTICA 2. BUCLES
2.3.
Bucles con incremento variable
El segundo ejemplo es una variante del caso anterior donde se desea que tan sólo se sumen los
números pares. La primera diferencia estriba en que el primer valor que debe tomar el ı́ndice i debe
ser 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 n
function 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 función ud2 fsumapares
Ejercicio 2.10
Construye una función que reciba un número natural, n, y devuelva la suma de los impares entre 1
y n.
Ejercicio 2.11
Construye una función que reciba un número natural, n, y devuelva la suma de los múltiplos de 3
entre 1 y n.
Ejercicio 2.12
(Para valientes) Construye una función que reciba un número natural n y devuelva 0 si n es par y 1
si n es impar. No se podrá usar la orden f loor.
2.4.
Bucles con otras operaciones
Como podemos ver en el siguiente ejemplo, el uso de un bucle se puede extender al producto igual
que a la suma. De esta forma si hacemos productos de números que son siempre el mismo en este
caso x, estaremos hallando la potencia enésima de dicho número.
% 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:
Pág. 57
Lenguajes de Programación: Guı́a ECTS
Ejercicio 2.13
Prueba la función ud2 fpotencia
Ejercicio 2.14
Construye una función que reciba un número natural, n, y devuelva
n! = 1 2 . . . (n − 1)n
Ejercicio 2.15
¿Qué devuelve la siguiente función?
function y=ud2_fprueba(m,n,k)
y=1;
i=m;
while i<=n
y=y*i
i=i+k;
end
Sin ejecutarla, trata de calcular qué devolverı́a ud2 f prueba(2, 15, 3). Compruébalo con MATLAB.
Ejercicio 2.16
Construye una función que reciba un número x y un número natural, n, y devuelva x−n sin usar ∧
ni llamar a ud2 fpotencia.
Ejercicio 2.17
Llamando a la función ud2 f potencia y la función que has creado en el ejercicio 2.16, construye una
función que reciba un número x y un entero a y devuelva xa .
Ejercicio 2.18
Construye una función que reciba x y n, calculando:
X
xi
i
para lo cual llamará a ud2 f potencia.
2.5.
Bucles y relaciones de recurrencia
Otra aplicación interesante de los bucles viene a partir del uso de las fórmulas de recurrencia, muy
usadas en métodos numéricos y cálculo infinitesimal. El valor de una variable en un paso n depende
de su valor en el paso anterior n − 1. El ı́ndice del bucle será capaz de ir avanzando con en número
de pasos y de este modo ir actualizando el valor de x en cada uno de los mismos. Ver el siguiente
ejemplo:
% 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)
Pág. 58
UNIDAD DIDÁCTICA 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 función ud2 fnewton con algunos valores y comprueba que los resultados son correctos.
Ejercicio 2.20
Construye una función que reciba un número natural n y devuelva el término n-ésimo de la sucesión
√
xi+1 = 2xi , x1 = 3.57, i ∈ N.
¿A qué valor converge la sucesión cuando n → ∞?
Ejercicio 2.21
Construye una función que reciba un número natural n y devuelva kxn − xn−1 k, siendo xn y xn−1
los términos n y n − 1 de la sucesión del ejercicio 2.20. Se llamará a la función creada en dicho
ejercicio.
Ejercicio 2.22
Construye una función que reciba un número natural n y devuelva kxn − xn−1 k, siendo xn y xn−1
los términos n y n − 1 de la sucesión del ejercicio 2.20. No se podrá llamar a la función creada en
dicho ejercicio y solo se podrá usar un bucle.
Ejercicio 2.23
Construye una función que reciba un número natural n y devuelva el n-ésimo término de la sucesión
de Fibonacci1 .
xn+2 = xn + xn+1 , x1 = 1, x2 = 2.
Ejercicio 2.24
Modifica el ejemplo 2.23 para que reciba un número natural n y dos números x1 y x2 y devuelva el
término n-ésimo de la sucesión de Fibonacci.
1
Leonardo Pisano nació en 1170 probablemente en Pisa, en el seno de la familia Bonacci, de ahı́ su
sobrenombre Fibonacci, por el que es generalmente conocido. Su padre fue representante de los mercaderes
de la República de Pisa en el norte de África, en lo que es hoy el noroeste de Argelia. Allı́ creció y se
educó Fibonacci. En los numerosos viajes en los que acompañó a su padre, Fibonacci aprendió las ventajas de
los sistemas matemáticos utilizados en otras culturas. Hacia 1200 regresó a Pisa y recopiló en diversos libros
lo aprendido en sus viajes añadiendo además notables contribuciones propias.
Por ejemplo, en uno de sus libros introdujo el sistema decimal indo-arábigo, sistema de numeración posicional
que usamos actualmente y extendió por Europa el uso del sistema árabe de numeración. En el mismo libro
aparece la conocida sucesión de Fibonacci, 1, 1, 2, 3, 5, 8, 13, 21, 34,... (en la que cada término es suma
de los dos anteriores) como solución al siguiente problema: Un hombre aisla un par de conejos en un corral.
¿Cuántos pares de conejos hay al cabo de un año si se supone que cada par de conejos engendra un nuevo
par que a partir del segundo mes se hace fértil?
Sin embargo, la mayor aportación matemática de Fibonacci se encuentra en el área de la Teorı́a de los
Números, en la que, entre otros resultados destaca el estudio de métodos matemáticos para encontrar triples
Pitagóricos, es decir, tres números naturales, m, n y k que verifican m2 + n2 = k 2 .
Pág. 59
Lenguajes de Programación: Guı́a ECTS
Ejercicio 2.25
(Para valientes) Construye una función que reciba tres números enteros p, q y r y devuelva 1 si
r pertenece a la sucesión de Fibonacci iniciada por p y q y 0 en caso contrario (supondremos la
sucesión monótona).
Ejercicio 2.26
(Para valientes) Idem siendo p, q y r números reales (supondremos la sucesión monótona).
Ejercicio 2.27
(Para valientes) El número π, se puede obtener mediante la fórmula
π = 4 ∗ (1 − 1/3 + 1/5 − 1/7 + . . . + (−1)i
1
+ . . .).
2∗i+1
Construye una función que reciba un número n y devuelva la aproximación de π mediante los n
primeros sumandos de la expresión anterior (no hace falta utilizar ∧).
2.6.
Bucles y condicionales
A continuación se nos plantea la necesidad de contar los divisores de un número natural n. Para
ello hay que combinar un bucle con un condicional, es decir hay que recorrer todos los potenciales
candidatos a divisor que van desde 1 a n y entre ellos ver los que realmente son divisores de n. En
caso de que verifiquen la condición la variable de conteo de divisores se incrementa en una unidad y
en el caso opuesto no se altera.
% ud2_fcuentadiv
% ud2_fcuentadiv(n) cuenta los divisores de n
% primer uso de mod
function num=ud2_fcuentadiv(n)
num=0;
i=1;
while i<=n
if mod(n,i)==0
num=num+1;
end
i=i+1;
end
Los ejercicios correspondientes a este ejemplo son los siguientes:
Ejercicio 2.28
Copia el ejemplo ud2 fcuentadiv a tu directorio. Pruébalo con algunos valores y comprueba que los
resultados son correctos.
Ejercicio 2.29
Construye una función que reciba un número natural n y devuelva 0 si n es par y 1 si n es impar. Se
usará la orden mod.
Ejercicio 2.30
Construye una función que reciba un número n, cuente los números que son pares y no son múltiplos
de 3 entre 1 y n y devuelva ese valor.
Pág. 60
UNIDAD DIDÁCTICA 2. BUCLES
Ejercicio 2.31
Construye una función que reciba un número n, recorra los valores
sin(1), sin(2), sin(3), . . . , sin(n),
y devuelva el número de ellos que son positivos.
Ejercicio 2.32
Construye una función que reciba un número 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 función que reciba un año y devuelva su siglo.
Ejercicio 2.34
La siguiente función que recibe un número n y deberı́a devolver el número de valores entre 1 y n
para los que sin es mayor que 1/2 menos para los que es menor que −1/2. Corrige los errores que
tiene.
function c=ud2_fprueba2(n)
i=1;
while i<=n
if sin(i)>1/2
c=c+1;
else
c=c-1;
end
i=1+1;
end
Ejercicio 2.35
Construye una función que reciba dos números naturales m y n, y devuelva la cantidad de divisores
comunes.
Ejercicio 2.36
(Para valientes) Construye una función que reciba dos números naturales m y n, y devuelva su
máximo común divisor.
Ejercicio 2.37
(Para valientes) Construye una función que reciba dos números naturales m y n, y devuelva su
mı́nimo común múltiplo.
Ejercicio 2.38
(Para valientes) Construye una función que reciba 3 naturales m, n, p y devuelva una variable f lag tal
que f lag = 1 si el mı́nimo de los máximos comunes divisores entre dos de estos números corresponde
a la pareja m, n. f lag = 2 si es m, p y f lag = 3 si es n, p. Si por ejemplo m = 20, n = 30, p = 15,
f lag valdrı́a 2. No se podrá llamar a 2.36.
Ejercicio 2.39
(Para valientes) Construir una función que reciba un número natural y devuelva el número de ceros
que hay en él (ası́, por ejemplo, en 304 hay un cero, en 30 hay un cero y en 115 no hay ningún cero).
Para contar cuántas cifras tiene el número, podéis usar log10.
Pág. 61
Lenguajes de Programación: Guı́a ECTS
2.7.
Uso de bucles para verificar una condición sobre un
conjunto.
El ejemplo que se ilustra a continuación tan sólo devuelve un valor 1 o 0 en el caso de que el número
que introducimos como argumento sea o no primo. Al igual que en el caso anterior el bucle nos
vale para recorrer todos los posibles candidatos que pueden cumplir una condición, en este caso ser
divisor del argumento numero. A diferencia del caso anterior basta con que la condición se cumpla
una vez para que no haga falta continuar el bucle, y podamos asegurar que el número no es primo
devolviendo 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)==0
primo=0;
break;
end
i=i+1;
end
Los ejercicios correspondientes a este ejemplo son los siguientes:
Ejercicio 2.40
Prueba la función ud2 fesprimo.
Ejercicio 2.41
Construye una función que reciba un número natural n y devuelva su divisor más grande distinto de
sı́ mismo.
Ejercicio 2.42
Idem más pequeño y distinto de 1.
Ejercicio 2.43
Construye una función que reciba dos enteros, m, n, con m < n y devuelva el menor número entero
r entre m y n tal que sin(r) > 0 (se usará break). Se supondrá que existe solución. Por ejemplo, si
m = 16 y n = 27 el resultado debe ser 19.
Ejercicio 2.44
Idem sin break.
Ejercicio 2.45
Construye una función que reciba un natural n y devuelva el mayor número entero positivo m < n
tal que sin(m) < 0. (se usará break). Se supondrá que existe solución. Por ejemplo, si n = 29 el
resultado ha de ser 25.
Pág. 62
UNIDAD DIDÁCTICA 2. BUCLES
Ejercicio 2.46
Idem sin break.
Ejercicio 2.47
Utilizando la función ud2 f cuentadiv, construye una función que haga lo mismo que ud2 f esprimo.
Ejercicio 2.48
Construir una función que reciba un número natural n y un valor prec, itere la sucesión
√
xi+1 = 2xi , x1 = 8, 32, i ∈ N
y si para algún 1 < i ≤ n, |xi − xi−1 | < prec, devuelva xi . Si no, devolverá xn .
Ejercicio 2.49
Modificar la función creada en el ejercicio 2.23 para que reciba un número num, y devuelva el primer
elemento xi de la sucesión de Fibonacci x1 = 1, x2 = 2, xi = xi−1 + xi−2 tal que xi sea mayor que
num.
Nota: Como en cada iteración sumamos más de 1, como mucho tendrı́amos que hacer n iteraciones.
Ejercicio 2.50
Crea una función que reciba un número num, calcule los términos de la sucesión de Fibonacci x1 = 1,
x2 = 2, xi = xi−1 + xi−2 menores que num y devuelva el número de ellos que son primos.
Ejercicio 2.51
(Para valientes) Crea una función que reciba un número num y devuelva 1 si descompone en producto
de dos primos y 0 si no es ası́. Por ejemplo, para num = 6 = 3 · 2 devolverá 1 y para num = 7 o
num = 12 devolverá 0. Usa la función ud2 f esprimo para determinar si un número es primo o no.
2.8.
Bucles anidados.
Al igual que hemos visto que se pueden encontrar unos condicionales anidados dentro de otros, esto
mismo ocurre con los bucles. En el ejemplo presentado a continuación vamos a contar la cantidad
de números 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 vaya
desde 2 hasta n, y en cada uno de los casos realizamos un bucle interno sobre los posibles divisores
de i que vienen representados por el ı́ndice j. Se deja al estudiante entender el porqué se limita el
crecimiento del ı́ndice j hasta que sea menor o igual que la raı́z cuadrada de i.
% ud2_fnprimos.m
% ud2_fnprimos(n) devuelve el número 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)
Pág. 63
Lenguajes de Programación: Guı́a ECTS
if mod(i,j)==0
primo=0; %i no es primo
break;
end
j=j+1;
end
if primo==1
p=p+1;
end
i=i+1;
end
Los ejercicios correspondientes a este ejemplo son los siguientes:
Ejercicio 2.52
Prueba la función ud2 fnprimos
Ejercicio 2.53
Construye una función que calcule el número de primos menores o iguales que un número n sin
utilizar un doble bucle y llamando a ud2 fesprimo.
Ejercicio 2.54
Construye una función que reciba dos naturales, m y n, con m < n y devuelva la suma de los
números primos entre m y n.
Ejercicio 2.55
Construye una función que calcule la suma de de los primos menores o iguales que un número n sin
llamar a ud2 fesprimo.
Ejercicio 2.56
Construye una función que reciba dos naturales, m y n, con m < n y devuelva el producto de los
números primos entre m y n (sin llamar a ud2 fesprimo).
Ejercicio 2.57
Construye una función 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 función que reciba dos naturales, m y n, con m < n y devuelva el mayor número
primo entre m y n. (Para valientes) Hacerlo sin usar break.
Ejercicio 2.59
Construye una función que reciba dos naturales, m y n, con m < n y devuelva el menor número
primo entre m y n. (Para valientes) Hacerlo sin usar break.
Ejercicio 2.60
(Para valientes) Construye una función que reciba dos naturales, m y n, con m < n y devuelva el
mayor número primo entre m y n. No se podrá usar ud2 fesprimo.
Pág. 64
Unidad Didáctica 3
Vectores
3.1.
General
La unidad 3 introduce un elemento fundamental en Programación: los vectores o “arrays”de datos.
No hay apenas órdenes nuevas en esta unidad y nos concentramos en desarrollar algoritmos más
interesantes, los cuales permiten resolver problemas más complejos y similares a los reales. Los
vectores están muy relacionados con los bucles que hemos estudiado en la unidad 2 pues son los
bucles los que nos permiten movernos con generalidad por los vectores.
3.2.
Vectores como argumentos de funciones
Este ejemplo es la primera función en la que se usa un vector. Además, ese vector es en si mismo el
argumento de entrada de la función, lo cual no requiere ninguna sintaxis especı́fica.
Como sabemos, desde que hicimos el tutorial (apéndice 0), podemos preguntar a un vector o a una
matriz su tamaño. Para ello disponemos de la orden length. Esto no es en general ası́ si usamos otro
lenguaje de programación, ya que en principio, además del vector, habrı́a que pasar como argumento
un número natural correspondiente a su dimensión. En MATLAB no es necesario pero la primera
lı́nea de la función es una asignación de ese valor a una nueva variable n que nos va a permitir montar
el bucle para movernos por el vector.
Para obtener la media tenemos que sumar todos los elementos del vector. Para ello, inicializamos
a 0 la variable suma y mediante un bucle la vamos incrementando con los elementos del vector.
Finalmente dividimos por su dimensión 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 vectores
function m=ud3_fmedia(v)
n=length(v);% n es la dimensión o número de
% elementos del vector
suma=0;
% Inicializamos la suma a 0
i=1;
while i<=n
suma=suma+v(i); % Sumamos el elemento i-esimo de v
i=i+1;
end
m=suma/n; % Una vez sumados, hallamos la media
Los ejercicios correspondientes a este ejemplo son los siguientes:
Ejercicio 3.1
Pág. 65
Lenguajes de Programación: Guı́a ECTS
Crea una carpeta llamada ud3 en Z : Copia en ella todos los ejemplos cuyo nombre empiece por ud3 ,
los cuales encontrarás en la carpeta:
Asignaturas\LP \Ejemplos
Añade la carpeta Z :\ud3 al path o Current Directory de MATLAB.
Ejercicio 3.2
Prueba la función ud3 fmedia.m para diferentes vectores.
Ejercicio 3.3
Crea una función que reciba un vector y devuelva la media de los cuadrados de los elementos del
vector. ¿Coincidirá el resultado con la media al cuadrado?
Ejercicio 3.4
Crea una función que reciba un vector y devuelva la media geométrica de los elementos del vector.
√
La media geométrica de {a1 , . . . , an } es n a1 a2 . . . an .
Ejercicio 3.5
Crea una función que reciba dos vectores y devuelva el producto escalar de los mismos. Esta función
también se puede hacer sin utilizar bucles, como vimos en el tutorial. Se supondrá que los dos vectores
tienen la misma dimensión.
3.3.
Funciones que llaman a funciones con argumentos
vectores
Del mismo modo que en el ejemplo 1.6 estudiamos una función que llamaba a otra función,
en este ejemplo vemos una función que recibe un vector y llama a otra función que recibe un
vector, 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 función 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;
end
var=suma2/(n-1);
De esta función no haremos ningún ejercicio especı́fico, simplemente probar la función para
diferentes vectores, comprobando el significado del concepto varianza1 . Tendremos ocasión de
hacer abundantes ejemplos más adelante.
Ejercicio 3.6
Prueba la función ud3 fvarianza.m para diferentes vectores.
1
Es una medida de como de semejantes son los elementos de un vector. Si son similares, la varianza es
pequeña y si son muy diferentes, la varianza será grande.
Pág. 66
UNIDAD DIDÁCTICA 3. VECTORES
3.4.
Cálculo de extremos
Los algoritmos de búsqueda de extremos son fundamentales en este curso y el más básico de
todos ellos es el de encontrar el máximo de una serie o vector. Para ello, se supone que el
máximo es el primero inicializando con ese valor una variable maxi que será la que almacene
el máximo al final. A continuación se van barriendo los demás elementos y en el momento en
que encontramos un valor mayor que el que tenemos como referencia, maxi, asignamos a maxi
ese 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)>maxi
maxi=v(i);
end
i=i+1;
end
Es importante, muy importante, entender todos los detalles de este ejemplo. MATLAB dispone
de una función que realiza esta misma tarea, max, pero ello no es óbice para estudiar el algoritmo, el cual es fundamental. Los ejercicios correspondientes a este ejemplo son especialmente
interesantes reflejando la importancia del algoritmo explicado.
Ejercicio 3.7
Prueba la función ud3 fmaximo.m para diferentes vectores.
Ejercicio 3.8
Crea una función que reciba un vector y devuelva el mı́nimo de los elementos del vector.
Ejercicio 3.9
Crea una función que reciba un vector de números naturales y devuelva el número de elementos del
vector que sean múltiplos de tres.
Ejercicio 3.10
Crea una función que reciba un vector v, cambie de signo todos los elementos del vector, calcule el
máximo del nuevo vector y lo devuelva cambiado de signo. ¿Qué valor has obtenido?
Ejercicio 3.11
Crea una función que reciba un vector y calcule la media de los elementos positivos del vector. En
lugar de sumar todos los elementos, tendrás que comprobar si un elemento es positivo o no antes de
sumarlo.
Ejercicio 3.12
Crea una función que reciba un vector de números naturales y utilizando la función ud2 f esprimo,
devuelva el número de elementos del vector que son primos.
Pág. 67
Lenguajes de Programación: Guı́a ECTS
Ejercicio 3.13
Idem sin if.
Ejercicio 3.14
Crea una función 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 función que reciba un vector de números naturales y utilizando la función ud2 f esprimo
y sin utilizar if devuelva 1 si todos los elementos del vector son primos y 0 en caso contrario.
Ejercicio 3.16
Codifica una función que reciba un vector de naturales v y devuelva el primer número primo que
aparezca en el vector. Caso de que no haya ninguno, devolverá 0. Por ejemplo, si v = (9, 14, 11, 7, 12),
la función devolverá 11.
Ejercicio 3.17
Crea una función 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 k3 − 3.25k = 0.25.
Ejercicio 3.18
Crea una función que reciba un vector v y devuelva el valor del elemento de v que esté más cerca
de la media. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y el elemento más proximo a la media
es 3.
Ejercicio 3.19
Crea una función que reciba un vector v y devuelva el ı́ndice del elemento de v que esté más cerca de
la media. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y el elemento más proximo a la media es el
1. Cambiad de orden los elementos en este ejemplo para probar el código y comprobar que funciona
en todas las circunstancias.
Ejercicio 3.20
Crea una función 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 función que reciba un vector v y devuelva el ı́ndice del elemento en el que se dé 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 posición en el vector.
Ejercicio 3.22
¿Qué valor devuelve la siguiente función (v es un vector de números naturales)?
Pág. 68
UNIDAD DIDÁCTICA 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)>y
y=v(i);
end
i=i+1;
end
Ejercicio 3.23
(Para valientes) Crea una función 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.
Cálculo de posición de extremos
A veces no interesa tanto el valor del máximo como su posición en el vector. En esta función
se juega con esa idea, de tal modo que se guarda posición cuando se supera la posición de
referencia inicial (la primera). Es un algoritmo muy interesante y esencialmente más complicado
y 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 componentes
function imax=ud3_fimax(v)
n=length(v);
imax=1; % Tomamos como maximo el primer elemento
i=2;
while i<=n
if v(imax)<v(i) % Si encontramos un elemento mayor
imax=i; % actualizamos el valor de la posicion
end
i=i+1;
end
% Al final imax contiene la posición de la mayor de las componentes
Los ejercicios correspondientes a este ejemplo son también bastante interesantes.
Ejercicio 3.24
Prueba la función ud3 fimax.m para diferentes vectores.
Ejercicio 3.25
Crea una función que reciba un vector de naturales y devuelva el ı́ndice del primer número primo que
aparezca en el vector. En caso de que no haya ninguno, devolverá 0.
Ejercicio 3.26
Crea una función 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, devolverá 0.
Ejercicio 3.27
Pág. 69
Lenguajes de Programación: Guı́a ECTS
La siguiente función recibe un vector y deberı́a devolver la mayor diferencia entre dos términos
consecutivos (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))>y
y=v(i)-(v(i)-1);
end
end
Pruébala 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.
Evaluación de un polinomio
El ejemplo correspondiente a esta sección ejemplifica el caso de una función que recibe escalares
y 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 primero
es el de la identificación de un polinomio de grado n con un vector de n + 1 componentes y
por tanto, dimensión n + 1. Ası́, si tenemos el siguiente polinomio de grado n la representación
habitual que de él se hace serı́a:
a0 + a1 x + a2 x2 + · · · + an−1 xn−1 + an xn
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 indexación de los
vectores siempre empieza por la componente 1. Ello invita a repensar polinomio y vector del
siguiente modo:
a1 + a2 x + a3 x2 + · · · + an xn−1 + an+1 xn
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 dimensión 4. La forma más directa de construir una
función 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 ai xi−1 , hasta que i
sea n + 1. Para invocar esta función desde la lı́nea de comandos, evaluando el ejemplo anterior
en x = 2 tendremos:
Pág. 70
UNIDAD DIDÁCTICA 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ˆ3
ans =
-8.3000
Existe un algoritmo que evita el tener que calcular todas esas potencias ahorrando cierto
tiempo. 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 escribiésemos como 2.5+x(0.0+x(−3.7+x0.5)).
Ello conduce a un algoritmo diferente en el que se empieza por el término de grado más alto y
se va hacia abajo después. Con ello, en este ejemplo aprendemos a recorrer el vector utilizando
un orden distinto al habitual y aprendemos también a desconectar la variable n de la dimensión
del vector, algo que en general os cuesta mucho.
%
%
%
%
%
%
ud3_fevalua.m
ud3_fevalua(a,x), recibe un vector a de dimensión 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;
2
William George Horner (Bristol, 1786, Bath, 1837), matemático inglés conocido por haber desarrollado
métodos para resolver ecuaciones polinómicas y sobre todo por ser el inventor del zoetropo(fig. 3.1), artilugio
que creaba la ilusión óptica de movimiento, y a partir del cual se evolucionó hasta la invención del cine.
Pág. 71
Lenguajes de Programación: 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 función ud3 fevalua.m.
Ejercicio 3.29
Aproximación del seno. Para obtener un valor aproximado del seno de un ángulo α evaluamos el
polinomio de Taylor:
α3 α5 α7
α−
+
−
3!
5!
7!
Usando la función ud3 f evalua.m, crea una función que reciba un valor de α y devuelva el valor del
seno de α, calculado a partir de la fórmula anterior.
Ejercicio 3.30
La siguiente función recibe un vector v y una posición i y devuelve la diferencia entre el primer y el
elemento i-ésimo. ¿Es correcta? ¿Podrı́as hacerla más eficiente?
function dif=ud3_fdiferencia(v,pos)
n=length(v);
i=1;
while i<=n
if i==pos
dif=v(1)-v(i);
end
i=i+1;
end
Pista: No se deberı́a usar un bucle ni un condicional.
Ejercicio 3.31
Crea una función que reciba dos vectores, el primero de los cuales serán los coeficientes de un
polinomio p(x). La función devolverá 1 si en el segundo vector aparece una raı́z de p(x) y 0 en caso
contrario. Utiliza ud3 f evalua.m para comprobar si un número es raı́z del polinomio o no.
Ejercicio 3.32
Crea una función que reciba un vector t y un número x y evalué en x el polinomio
(x − t1 )(x − t2 ) . . . (x − tn ),
donde n es la dimensión del vector t. Es decir, evalúa en x el vector de coeficiente principal 1 cuyas
raı́ces son los elementos de t.
Ejercicio 3.33
Pág. 72
UNIDAD DIDÁCTICA 3. VECTORES
Crea una función 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 función que reciba un número y un vector y devuelva el número de veces que aparece ese
número en el vector.
Ejercicio 3.35
(Para valientes) Usando la función creada en el apartado 3.34, construir una función que reciba un
vector y devuelva el elemento que se repite más veces. Por ejemplo, en [0 1 2 1] devolverı́a 1.
Ejercicio 3.36
(Para valientes) Crea una función que reciba α y un número n y devuelva el valor del seno en α
aproximándolo por el polinomio de Taylor en 0 de grado n.
3.7.
Función que devuelve un vector
A menudo, la salida de nuestras funciones pueden ser también vectores. En MATLAB, la
sintaxis no cambia con respecto a la de una variable escalar convencional. En este ejemplo,
además ese vector se construye a partir de varios escalares, pues de lo que se trata es de
construir un vector con los términos de la sucesión de Fibonacci, la cual ya estudiamos en el
ejercicio 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 función ud3 fibo.m.
Ejercicio 3.38
Construye una función que reciba un número natural n y devuelva un vector v tal que sus componentes
sean
1 i
vi = 1 +
, 1≤i≤n
i
Llama desde MATLAB a la función. ¿A qué tienden las componentes del vector resultado?.
Ejercicio 3.39
Pág. 73
Lenguajes de Programación: Guı́a ECTS
Construye una función que reciba un número natural n y devuelva un vector formado por los n
primeros términos de la sucesión
√
x1 = 2, 456, xi+1 = 2xi , i ∈ N
Comprobar que converge a 2.
Ejercicio 3.40
Crea una función que reciba dos valores, xmin, xmax, y el número de tramos n. La función calculará el valor
xmax − xmin
h=
,
n
y devolverá un vector x de n+1 componentes que contenga los puntos entre xmin y xmax separados
cada dos una distancia h. Ası́ pues,
x1 = xmin,
x2 = xmin + h,
...,
xn+1 = xmin + nh = xmax.
Ejercicio 3.41
(Para valientes) Construye una función que reciba un número natural y devuelva el vector formado
por sus cifras. Ası́, si introducimos 1423, devolverá [1 4 2 3].
Ejercicio 3.42
(Para los más valientes) Criba de Eratóstenes. La manera más rápida de obtener todos los números
primos menores que un número dado n es mediante la Criba de Eratóstenes. El procedimiento es el
siguiente: se toman todos los números menores que n y se van eliminando de la lista los múltiplos
de dos, los múltiplos de tres y ası́ sucesivamente hasta llegar a los múltiplos de la raı́z cuadrada de
n.
Ejercicio 3.43
Crea una función que reciba un número n y devuelva todos los números primos menores que n
mediante la Criba de Eratóstenes. Como lista de números, usaremos un vector v de dimensión 100
que tenga en la posición i el número i y para marcar el número como eliminado, pondremos un 0 en
dicha posición.
√
Para mejorarlo, elimina los múltiplos de los números primos entre 2 y n en lugar de eliminar
√
los múltiplos de todos los números entre 2 y n. Nótese que según vamos aplicando la criba de
Eratóstenes vamos obteniendo los números primos, ası́ que podemos utilizar la información guardada
en el vector para este caso.
Ejercicio 3.44
Determina qué valor devolverá la siguiente función 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)>y
y=i;
end
i=i+1;
end
Pág. 74
UNIDAD DIDÁCTICA 3. VECTORES
3.8.
Funciones que reciben y devuelven vectores
Cuando queramos por ejemplo una función que nos devuelva una curva evaluada en una serie
de valores estructurados a su vez como un vector, deberemos tener la posibilidad de recibir
un vector en la función y devolver otro vector. La sintaxis no ofrece ningún problema, pero
conceptualmente hay que saber moverse a través del vector de partida y generar otro. Vamos
a plantear primero un ejemplo sencillo en el que se trata simplemente de codificar una función
que reciba un vector de abscisas x y devuelva un vector de ordenadas y tal que para cada
abscisa xi , la ordenada correspondiente yi sea el máximo de las funciones seno y coseno
evaluadas 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 función 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));
else
y(i)=cos(x(i));
end
i=i+1;
end
Para probar esta función podemos ejecutar los siguientes comandos desde la ventana de comandos de MATLAB.
>>x=0:0.01:8*pi;
>>y=ud3_fmaxsincos(x);
>>plot(x,y);
Otra posibilidad sencilla pero también interesante es el de tener una función que reciba un
vector y uno o varios escalares y devuelva otro vector. Presentamos este ejemplo en el que se
trata simplemente de codificar una función que reciba un vector x y un escalar a. La función
devolverá un vector y, tal que la componente yi de ese vector será 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)<a
y(i)=0;
else
y(i)=1;
end
i=i+1;
end
Pág. 75
Lenguajes de Programación: Guı́a ECTS
Presentamos un ejemplo más que tiene el interés de que llamamos a una función para ir
calculando el valor de cada componente del vector resultado. Se trata de codificar una función
que reciba un vector de naturales u y devolver un vector vprimos tal que cada componente
de vprimos vale uno o cero en función de que la correspondiente componente de u sea o no
prima.
%
%
%
%
%
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 vectorización de operaciones explicada en el tutorial
para evitar uno de los bucles en la función, pero en general eso no será posible. Los ejercicios
correspondientes 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 función que reciba un vector x y devuelva un vector y tal que yi = x2i − log(x2i + 1) (se
podrı́a hacer sin while, vectorizando las operaciones).
Ejercicio 3.47
Crea una función similar a la función ud3 fmaxsincos.m que calcule el máximo entre la función del
ejercicio 3.46 y el seno. Dibuja la curva resultado de modo análogo a como se dibujó la de dicha
función.
Ejercicio 3.48
Crea una función que reciba un vector x y devuelva un vector y tal que para cada ı́ndice i, yi sea la
aproximación de sin(xi ) dada por:
yi = xi −
x3i
x5 x7
+ i − i.
3!
5!
7!
Se llamará a la función del ejercicio 3.29 del modo que convenga. Dibuja con MATLAB el seno y su
aproximación por la función anterior en [−π/2, π/2], con al menos 1000 puntos.
Ejercicio 3.49
Construye una función que reciba un vector de naturales, (m1 , m2 , . . . , mn ) y devuelva el vector
de los factoriales, (m1 !, m2 !, . . . , mn !). Representa en una gráfica la función factorial entre 1 y 10
y la función exponencial entre 1 y 10.
Para mejorar la gráfica, cambiamos la escala a logarı́tmica, es decir, aplicamos el logaritmo a cada
una de las funciones. ¿Cuál de las dos funciones crece más rápido?
Ejercicio 3.50
Pág. 76
UNIDAD DIDÁCTICA 3. VECTORES
Crea una función que reciba un vector v y devuelva un vector con los elementos del vector v pero
en orden inverso al original.
Ejercicio 3.51
Crea una función 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.52
Crea una función 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 máximo del nuevo vector y dividimos cada elemento del vector por dicho
máximo. Al final tenemos que obtener un vector de números 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 función anterior para que reciba un vector y dos valores a y b y devuelva
el vector escalado entre a y b.
3.9.
Construcción de vectores
A menudo surgen problemas en los que a partir de un vector es necesario construir un nuevo
vector que no tiene la misma dimensión que el original, situación esencialmente más sencilla
que ya hemos contemplado en la sección 3.8. Además, al construir este nuevo vector a partir
del original, a menudo no sabemos el tamaño o dimensión del vector resultante. La gestión
de la memoria RAM en estos casos requerirı́a un cierto cuidado en muchos lenguajes de
programación pero MATLAB lo maneja con mucha simplicidad. Ası́, a medida que vamos
definiendo nuevas posiciones del vector, ese vector crece en tamaño y la memoria RAM que
se necesita para él es gestionada de modo automático por MATLAB.
Para ilustrar esta idea planteamos un ejemplo muy sencillo pero también muy bonito, y que
además sugiere infinidad de ejercicios muy interesantes, los cuales aparecerán a lo largo del
resto del curso. Se trata de una función que recibe un vector y devuelve otro vector que contiene
únicamente las componentes positivas del vector original, colocadas en el mismo orden en el
que están en éste.
Para ir construyendo este segundo vector, de tal modo que cada componente vaya en la posición
correcta, necesitamos un nuevo contador sólo de componentes positivas. A medida que ese
contador se va incrementando, vamos colocando en cada posición el elemento correspondiente.
El código 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 dimensión distinta
% que el original
function vp=ud3_fpositivas(v)
n=length(v);
ip=0;
i=1;
while i<=n
if v(i)>=0
ip=ip+1;
vp(ip)=v(i);
end
i=i+1;
end
Pág. 77
Lenguajes de Programación: Guı́a ECTS
Los ejercicios correspondientes a este ejemplo especı́ficamente son los siguientes:
Ejercicio 3.54
Prueba ud3 f positivas.m.
Ejercicio 3.55
Crea una función que reciba un vector u de números 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 función que reciba un vector y devuelva un vector con los números primos que contiene.
Ejercicio 3.57
Crea una función que reciba un número n y devuelva un vector con los números 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 números enteros y queremos saber cuantos elementos
comunes tienen (supuestos todos distintos en cada uno de los vectores), tendremos que fijar un
elemento del primer vector y barrer todos los del segundo mediante un bucle y ası́ sucesivamente
con 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;
end
j=j+1;
end
i=i+1;
end
Los ejercicios correspondientes a este ejemplo, muy interesantes, son:
Ejercicio 3.58
Prueba la función ud3 figuales.
Ejercicio 3.59
Modifica la función ud3 figuales para que funcione con vectores de números reales.
Pág. 78
UNIDAD DIDÁCTICA 3. VECTORES
Ejercicio 3.60
Construye una función que reciba un vector v de naturales y devuelva 1 si tiene dos elementos iguales
y 0 en caso contrario.
Ejercicio 3.61
Construye una función que reciba un vector v de naturales y devuelva
ninguna función y por tanto habrá que usar bucles anidados.
P
vi !. No se podrá llamar a
Ejercicio 3.62
(Para valientes) Crea una función que reciba un vector de números naturales y sin utilizar la función
ud2 fesprimo, devuelva el número de elementos del vector que son primos.
Ejercicio 3.63
(Para valientes) Crea una función que reciba un vector de números naturales y sin utilizar la función
ud2 fesprimo, devuelva el primer elemento de del vector que sea primo.
Ejercicio 3.64
(Para valientes) Crea una función que reciba un vector de números naturales y sin utilizar la función
ud2 fesprimo, calcule y devuelva la media de los elementos primos para lo cual llamará a su vez a la
función ud3 fmedia.
Ejercicio 3.65
(Para valientes) Crea una función que reciba un vector de números 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 función que reciba un vector v de naturales y devuelva el número de
veces que se repita el que más veces se repita.
Ejercicio 3.67
(Para valientes) Construye una función que reciba un vector v de naturales y devuelva el mayor de
los repetidos, sin llamar a ninguna función.
Ejercicio 3.68
(Para valientes) Construye una función 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 función que reciba un vector x, un entero n y devuelva un vector y tal
que para cada ı́ndice i, yi sea la aproximación de sin(xi ) dada por un polinomio de Taylor en el 0 de
grado n.Se usará la función 3.36. Por ejemplo, si introducimos el vector x = (1.9, 2.5, 2.8) y n = 7,
el vector devuelto será la el resultado de evaluar el polinomio
x3 x5 x7
+
− .
3!
5!
7!
en los puntos (1.9, 2.5, 2.8), o sea devolverá 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.
x−
Ejercicio 3.70
(Para valientes) Idem pero la evaluación del polinomio en cada valor del vector x se realizará llamando
a la función ud3 fevalua.
Ejercicio 3.71
(Para valientes) Idem sin llamar a ninguna función.
Pág. 79
Lenguajes de Programación: Guı́a ECTS
3.11.
Funciones con salidas múltiples
En esta sección se presentan funciones que tienen más de un argumento de salida. Es un tema
que no plantea dificultad a los estudiantes y que permite hacer funciones más interesantes. En
múltiples ocasiones es necesario obtener varios resultados en una misma función, para lo cual es
necesario pasarlos todos como argumentos de salida. La sintaxis es muy sencilla, simplemente
se agrupan todos los argumentos entre corchetes y separados por comas. El ejemplo más
elemental que se nos ha ocurrido es el de resolver una ecuación de segundo grado, la cual
siempre tendrá 2 soluciones, sean reales, complejas o una raı́z doble. MATLAB es capaz de
trabajar directamente con complejos pero es un tema al que apenas hemos prestado atención
y que escapa a los contenidos del curso. Por tanto, propondremos ejemplos de ecuaciones que
tengan 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 función desde la lı́nea de comandos, lo haremos del siguiente modo, por
ejemplo:
>> [r,s]=ud3_fe2grado(1,-3,2)
r =
1
s =
2
Con lo que se asignan a las variables r y s las dos raı́ces 1 y 2 de la ecuación x2 − 3x + 2 = 0.
Ejercicio 3.72
Copia ud3 f e2grado.m a tu directorio y pruébala.
Ejercicio 3.73
Crea una función que reciba los coeficientes de una ecuación de segundo grado y devuelva la suma
y el producto de las soluciones.
Ejercicio 3.74
Crea una función que reciba los coeficientes de la ecuación ax4 + bx2 + c = 0, que resuelva utilizando
√
y = x2 llamando para ello a ud3 f e2grado.m, que deshaga el cambio de variable mediante x = ± y
y que devuelva las cuatro soluciones de la ecuación original.
Ejercicio 3.75
Modifica la función ud3 f e2grado.m para que si las raı́ces son números imaginarios (el discriminante
b2 − 4ac es negativo) devuelva r1 = 0, r2 = 0 y otra variable error = 1. Si no son números
imaginarios devolverá las dos raı́ces en r1 y r2 y error = 0.
Ejercicio 3.76
Pág. 80
UNIDAD DIDÁCTICA 3. VECTORES
Crea una función que reciba un vector y devuelva el máximo y el mı́nimo de sus elementos, sin usar
las funciones min y max.
Ejercicio 3.77
Crea una función que reciba un vector y devuelva la posición del máximo y del mı́nimo de sus
elementos.
Ejercicio 3.78
Crea una función que reciba un vector y devuelva el máximo, el mı́nimo y sus posiciones.
Ejercicio 3.79
Crea una función 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 función que reciba un vector u de números naturales y devuelva un vector con los números
primos que contiene y otro con los no primos.
Ejercicio 3.81
Crea una función que reciba un número n y devuelva un vector con los números primos que sean
divisores de n.
Ejercicio 3.82
Crea una función que reciba un vector v y devuelva un vector w y un número error de modo que:
1. Si todos los elementos de v son estrictamente positivos, devolverá w(i) = Ln(v(i)), 1 ≤ i ≤ n
y error = 0.
2. Si algún elemento es menor o igual que cero, devolverá w = v y error = 1.
Ejercicio 3.83
Crea una función que reciba los tres lados de un triángulo y devuelva en una variable lado, 1 si
es equilátero, 2 si es isósceles y 3 si es escaleno y en una variable angulo, 3 si es obtuso, 2 si es
rectángulo y 1 si es agudo. (Para valientes) La función devolverá 0 en las dos variables si los valores
introducidos no forman un triángulo.
Pág. 81
Lenguajes de Programación: Guı́a ECTS
Pág. 82
Parte II
Guı́a ECTS para estudiantes
Pág. 83
Capı́tulo 1
Introducción
Uno de los objetivos de este libro es ser un soporte de la introducción de la metodologı́a
basada en los créditos europeos ECTS1 en la asignatura, aprovechando esta oportunidad para
transformar el modo en el que enseñamos Programación. Ası́, se pasa de un paradigma con una
evaluación que obtiene información únicamente de un examen final, a una evaluación basada
completamente en los procesos, incorporada a los mismos y mucho más rica. En esta parte
del libro se pretende documentar con todo detalle esta metodologı́a de evaluación, para que
el estudiante la conozca y se ubique en la misma. Con estos cambios pretendemos mantener
al estudiante activo a lo largo de todo el curso, proponiéndole mecanismos de enganche a
la asignatura de modo continuo, tratando, como dice Stephen Ball en la cita que nos ha
inspirado, de mantener a todos los alumnos trabajando, comprometidos y con la sensación de
que no van a fracasar.
En esta parte del libro detallamos los objetivos y los relacionamos con las actividades realizadas
a lo largo del mismo, indicando en qué medida creemos que dichas actividades contribuyen
a la consecución de los objetivos, e indicando también el tiempo que estimamos es necesario
para realizar dichas actividades.
También destacamos los recursos que creemos son necesarios para realizar dichas actividades,
para finalmente reflexionar sobre el tipo de evaluación que creemos adecuado para un curso
de este tipo, discutiendo sus ventajas e inconvenientes, y razonando sobre el esfuerzo que es
necesario para realizarla.
Esperamos que esta guı́a resulte útil y que cumpla los objetivos que antes citamos y que nos
han llevado a escribirla. Ahora es el momento de que los estudiantes comprueben si ha sido
ası́ y de que sugieran las mejoras que consideren convenientes.
1
Los créditos LRU, los que se asocian a cada asignatura al hacer la matrı́cula, se establecen únicamente
en función del número de sesiones presenciales; por cada 10 horas de clase, un crédito. Los créditos ECTS
contabilizan no sólo las horas de clase sino que intentan definir el peso de la asignatura teniendo en cuenta
el esfuerzo en tiempo que le cuesta aprobarla a un alumno medio. Este esfuerzo significa no solo asistir a las
clases sino también un trabajo bien individual bien con los compañeros realizado fuera de las horas de clase.
Pág. 85
Lenguajes de Programación: Guı́a ECTS
Pág. 86
Capı́tulo 2
Datos generales
2.1.
Temporalidad y carácter
2.1.1.
Ciclo
Primero
2.1.2.
Curso
Primero
2.1.3.
Cuatrimestre
Primero
2.1.4.
Carácter
Obligatoria
2.2.
Créditos LRU
4.5 siendo 1.5 teóricos y 3.0 prácticos
2.3.
Departamento
Departamento de Enseñanzas Básicas de la Ingenierı́a Naval
2.4.
Profesores
Antonio Souto Iglesias, antonio.souto@upm.es
Leo González Gutiérrez, leo.gonzalez@upm.es
Alicia Cantón Pire, alicia.canton@upm.es
Pág. 87
Lenguajes de Programación: Guı́a ECTS
2.5.
Créditos ECTS
Horas/semana Total horas
1
15
2
30
Total
45
Horas no presenciales
Total horas
Prácticas
41
Examen
–
4
Total
45
Total
90
Horas presenciales
Teorı́a
Prácticas
Pág. 88
Capı́tulo 3
Objetivos
3.1.
General
Para contextualizar la definición de objetivos, algunas de las titulaciones disponen de su libro
blanco correspondiente, en el cual se especifican los perfiles profesionales a los que se orienta
la titulación. En el caso de la titulación INO esto no ha sido ası́ hasta bien entrado 2005,
momento en que apareción un libro blanco orientado a las nuevas titulaciones post-Bolonia1 .
Aunque en el estudio de las competencias transversales, no se presta una atención particular en
ese libro a la Informática, ésta es, junto con los idiomas modernos, señalada como la materia
básica más importante, para lo cual se recurrió a un significativo número de encuestas entre
profesionales en activo. De hecho en el plan de estudios genérico que se elabora en ese libro
blanco, se da una importancia equivalente a la formación obligatoria en Informática a la que
corresponde a este curso de Lenguajes de Programación.
Hablaremos ası́ primero de unos objetivos generales de la asignatura, a través de una categorización de los mismos en conocimientos, capacidades y actitudes. A partir de estos objetivos
generales diseñaremos una serie de actividades las cuales agruparemos en una secuencia de
unidades didácticas, que cubrirán unos objetivos especı́ficos, y precisarán de unos determinados
recursos.
3.2.
Objetivos generales: descripción
Como hemos comentado, agrupamos los objetivos generales en 3 categorı́as:
1. Conocimientos. Cubren los aspectos más teóricos de la formación.
2. Capacidades. Referidos a aplicaciones, cuestiones prácticas, habilidades.... muy en lı́nea
con el concepto de competencias.
3. Actitudes. Se refieren a determinados valores o motivaciones que se trate de generar o
potenciar en el estudiante.
Conocimientos:
1
http://www.aneca.es/activin/docs/libroblanco naval def.pdf
Pág. 89
Lenguajes de Programación: Guı́a ECTS
CoA. Adquirir una formación elemental en Informática conociendo el ordenador como una
herramienta de trabajo y conocer de modo básico su estructura y funcionamiento.
CoB. Conocer los principales tipos de datos y estructuras de control de la programación
declarativa y aprender su sintaxis en un lenguaje de programación concreto. Hemos
elegido el lenguaje script de MATLAB porque es una herramienta estándar en Ingenierı́a y porque, al tener una sintaxis sencilla, permite profundizar en los elementos
de programación.
Capacidades:
Realizar un programa de ordenador es un proceso que consta de 4 fases: especificación,
diseño, codificación, validación/verificación. La primera, la especificación, consiste en
definir las caracterı́sticas del sofware que se va a programar. Aunque es una etapa
importante queda fuera del contenido de esta asignatura, al ser muy dependiente del
tipo de problemas industriales o de gestión a resolver, y no proceder su estudio en un
curso de introducción a la Prgramación. Las capacidades que queremos desarrollar son
las necesarias para las otras tres etapas:
CpA. Codificación. El alumno debe ser capaz de “traducir” algoritmos sencillos a código
MATLAB. Este es un “requisito normal” en el sentido de que es un objetivo que
necesariamente deberá alcanzarse para superar la asignatura. Serán en general
códigos no muy complejos, de una, dos o tres acciones a lo sumo.
CpB. Diseño. El alumno debe ser capaz de analizar un problema sencillo y elaborar un
algoritmo que lo resuelva. Este es un “requisito innovador” en el sentido de que lo
consideramos importante, pero no esencial para superar la asignatura.
CpC. Validación. El alumno debe ser capaz de encontrar sus errores, entenderlos y corregirlos. Este es un “requisito esperado”: no se evalúa directamente, pero está implı́cito en la evaluación de los objetivos CpA y CpB.
Actitudes:
AcA. Conseguir una motivación en el alumno que le impulse a profundizar en la Informática como herramienta necesaria para su futuro académico y profesional.
AcB. Trabajo en equipo. Hoy en dı́a casi ningún proyecto involucra a un único ingeniero.
Por tanto, consideramos que saber trabajar en equipo es imprescindible y que se
deben ir formando las actitudes necesarias a lo largo de todos los estudios.
AcC. Actitud positiva ante los problemas. El afan de superación y la perseverancia son
actitudes necesarias para un buen ingeniero.
AcD. Mejora continua. El aprendizaje, sobre todo el que perdura, no es labor de un dı́a
ni de una semana, sino que requiere constancia y esfuerzo.
AcE. Autocrı́tica. El alumno debe ser capaz de reflexionar sobre sus capacidades, esfuerzo
y proceso de aprendizaje para determinar en qué punto está y qué acciones debe
tomar en el futuro.
Pág. 90
CAPÍTULO 3. OBJETIVOS
3.3.
Prerrequisitos
LP es una asignatura del primer cuatrimestre del primer año, y por tanto los prerrequisitos
se refieren únicamente a que el estudiante debe haber cursado y aprobado los estudios de
educación secundaria. Por tanto, se le supone una formación básica en Matemáticas. Además
se puede suponer que están cursando simultáneamente las asignaturas de Cálculo 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 sentido
estricto. Sin embargo, es conveniente haber cursado y superado LP antes de matricularse de
la asignatura Métodos Numéricos3 , y de las asignaturas optativas o de libre configuración
“Leguajes de Programación II” y “Complementos de Informática”. Además, los lenguajes de
programación son útiles para muchas otras asignaturas, que pueden incluir trabajos para los
que se necesite MATLAB y algunos elementos de Programación.
2
Plan 2002 de Ingeniero Naval y Oceánico de la Universidad Politécnica de Madrid
En realidad esto esta implı́cito en la estructura del plan de estudios vigente, dado que no es posible
matricularse de ninguna asignatura de cuarto año si no se han aprobado todas las del primer año
3
Pág. 91
Lenguajes de Programación: Guı́a ECTS
Pág. 92
Capı́tulo 4
Programa y Metodologı́a
En esta sección describiremos todas las actividades que creemos necesarias para conseguir los
objetivos descritos en 3.2. Agruparemos estas actividades en una serie de unidades didácticas
para facilitar su descripción, organización y temporalización.
4.1.
Métodos docentes
4.1.1.
Parte teórica de las sesiones DHOf
Todas las sesiones DHOf1 se impartirán en el Centro de Cálculo (CC). Durante la parte de
exposición de teorı́a se introducirá cada uno de los temas ayudándose de ejemplos (ver parte
I), utilizando la pizarra electrónica que proporciona la interfaz tablet del portátil. Además,
se comentarán los problemas observados durante la parte más práctica de la clase y cómo
evitarlos. Asimismo, al principio de cada sesión habrá un recordatorio de las sesiones previas
utilizando el archivo que para cada grupo se guarda en el tablet PC.
El objetivo de las clase teóricas es exponer los conceptos básicos y errores frecuentes a todos
los alumnos a la vez, tratando de evitar repetirlos a cada uno por separado.
4.1.2.
Parte práctica de las sesiones DHOf
La parte práctica consistirá en la realización de ejercicios en el CC (ver parte I), con la supervisión de uno o varios profesores, dependiendo del número de alumnos y de la disponibilidad de
docentes. Esta parte práctica, de acuerdo con la distribución de créditos, cubrirá dos terceras
partes de la asignatura.
Los alumnos se organizarán en parejas para que empleen la técnica de “pair programming” de
la metodologı́a “extreme programming”. En cada pareja de programadores/alumnos, uno de
ellos diseña el programa y el otro lo codifica (escribe el código) siguiendo las instrucciones del
anterior, mientras trata de encontrar los fallos que pueda tener el diseño. Al terminar cada ejercicio se intercambian los papeles. El objetivo del “pair programming” es que el conocimiento
esté igualmente repartido entre los miembros de la pareja, lo que es muy conveniente durante
el examen individual y en general, al final del proceso de aprendizaje planteado en LP.
Se potenciará el que los alumnos defiendan sus propios códigos proyectando los mismos en
1
DHOf por dentro del horario oficial
Pág. 93
Lenguajes de Programación: Guı́a ECTS
la pizarra electrónica. Ello es posible porque la carpeta Mis Documentos de cada máquina
está compartida, y puede ser accedida desde el PC del profesor, proyectando desde éste, el
ejercicio correspondiente.
4.2.
Temario y estimación del tiempo de estudio
4.2.1.
Temario
Unidad 0. Introducción a MATLAB.
Introducción al curso. Conceptos básicos del entorno MATLAB. Operaciones elementales. Variables.
Actividades:
Sesiones en el CC (4h).
Repaso y estudio I2 FHOf3 (2h).
Unidad 1. Funciones.
Definición y uso de las funciones. Variables de entrada y salida. Condicionales. Funciones
que 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.
Definición de vector. Recorrido de un vector. Selección de ı́ndices. Funciones con vectores.
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.).
2
I por individual
FHOf por fuera del horario oficial
4
G por en grupo
3
Pág. 94
CAPÍTULO 4. PROGRAMA Y METODOLOGÍA
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
Presentación del curso. (1h)
Prueba de control por parejas. (2 o 3 horas)
Repaso en la última semana. (3h en el CC + 2h (I o G) para completar ejercicios)
Examen final. (2h de examen + 10h de repaso)
Pág. 95
Lenguajes de Programación: Guı́a ECTS
Pág. 96
Capı́tulo 5
Recursos
5.1.
Guı́a
El más importante de todos los recursos es esta Guı́a Docente. En ella, además de definir el
contexto del curso de modo preciso se muestran los ejemplos y ejercicios correspondientes al
mismo en la parte I. También se disponen de exámenes propuestos en otras convocatorias, el
tutorial de MATLAB y diversa documentación importante para el alumno.
5.2.
Tutorı́as
Para los horarios y ubicación de las tutorı́as podéis consultar la página web de la escuela:
http://www.etsin.upm.es/
Independientemente de esas horas, y dado que los tres profesores tienen dedicación completa,
no tendrán inconveniente en resolver dudas a cualquier hora, salvo que tuviesen alguna urgencia
puntual o no estuviesen en sus despachos.
Algunas de estas tutorı́as podrı́an ser en algunos casos en el CC, lo cual se anunciará a lo largo
del curso en clase, en la página 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 formará una lista de correo
para informarles de asuntos relativos a la asignatura (publicación de notas, sesiones especiales
de prácticas, ...). Los estudiantes pueden consultar sus dudas mandándolas a las direcciones de
correo de los profesores, antonio.souto@upm.es, alicia.canton@upm.es, leo.gonzalez@upm.es.
5.4.
Página web - Plataforma de B-learning
La asignatura tiene vida paralela en la plataforma de B-learning del Gabinete de tele-educación
de 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 través de Politécnica Virtual en la web de la UPM. El curso 20072008 fue la primera edición de esta plataforma, la cual sustituye y supera a la página web de la
Pág. 97
Lenguajes de Programación: Guı́a ECTS
asignatura. En ella se irá colgando toda la información relativa a la asignatura, ası́ como calificaciones(la publicación de las mismas será anunciada por correo electrónico), documentación,
ejercicios y se utilizará como tablón de anuncios. Se dispone además de un foro, la participación
en el cual forma parte del item Participación de la evaluación de la asignatura. Para acceder a
esta plataforma necesitais disponer de una dirección de correo electrónico de la UPM, la cual
os es facilitada al matricularos.
5.5.
Copias
En copias estará disponible una versión completa encuadernada de esta guı́a docente.
5.6.
Centro de Cálculo
Los estudiantes pueden y deben usar el CC para estudiar LP, aunque han de respetar las normas(ver apéndice B). De vez en cuando, organizaremos sesiones de tutorı́as allı́ (sobre todo
hacia el final del curso), para que el estudiante pregunte dudas mientras estudia. Para poder
usar el CC hay que estar dado de alta como usuario (hablar con el personal del CC para este
trámite y ver las normas en el apéndice B).
5.7.
Bibliografı́a
Los siguientes libros, de los cuales damos un pequeño comentario, los podéis encontrar en la
biblioteca de la ETSIN:
1. Tı́tulo: MATLAB. Una introducción con ejemplos prácticos.
Autores: Amos Gilat
Editorial: Reverté
Año: 2006
Excelente texto introductorio a MATLAB y a la Programación con MATLAB. Creemos
que es el que mejor trata la parte de Programación, aunque el orden de los temas no
es el mismo que el que seguimos en el curso. No obstante hay que tener en cuenta que
en el libro se tratan comandos de MATLAB que no permitimos en clase, por ser muy
especı́ficos y no estar disponibles en general en los lenguajes de programación.
2. Tı́tulo: Aprenda MATLAB 5.3 como si estuviera en primero.
Autores: Javier Garcı́a de Jalón, José Ignacio Rodrı́guez, Alfonso Brazález
Editorial: Escuela Superior de Ingenieros Industriales
Año: 2001
Guı́a para aprender MATLAB paso a paso. Está pensada para estudiantes de primero y
se puede seguir con facilidad. Aunque la parte de Programación es demasiado escueta,
es interesante tenerla para utilizarla como ayuda cuando utilicemos el MATLAB para
otras asignaturas. Se puede comprar en reprografı́a de la ETSII o descargar de
Pág. 98
CAPÍTULO 5. RECURSOS
http://mat21.etsii.upm.es/ayudainf/aprendainf/MATLAB53/matlab53.pdf
3. Tı́tulo: MATLAB, edición de estudiante. Versión 4 guı́a de usuario.
Autores: The Math Works inc.
Editorial: Prentice Hall
Año: 1998
Manual de referencia para la versión de estudiante. Recoge todos los aspectos del programa e incluye ejemplos para cada uno. Es muy escueta en la parte de Programación.
4. Tı́tulo: MATLAB guide
Autores: Desmond J. Higham, Nicolas J. Higham
Editorial: Siam
Año: 2000
Otra guı́a de referencia de MATLAB. Más técnica que las anteriores y un poco más
extensa en el apartado de Programación.
5. Tı́tulo: Programing in MATLAB
Autor: Marc E. Herniter
Editorial: Thomson learning
Año: 2001
Guı́a de programación con MATLAB. Contiene numerosos ejemplos y ejercicios. Es muy
técnica, por lo que es más recomendable para profundizar en lo aprendido que como
libro de texto.
6. Tı́tulo: Getting Started with MATLAB
Autor: Rudra Pratap
Editorial: Oxford University Press
Año: 2002
Comentario: Otra guı́a de MATLAB. La parte de Programación está más detallada que
en algunas de las otras guı́as y contiene algunos ejercicios.
7. Tı́tulo: Algoritmos en C++
Autor: Robert Sedgewick
Editorial: Addison-Wesley Iberoamericana
Año: 1995 Comentario: Otra guı́a de MATLAB. La parte de Programación está más
detallada que en algunas de las otras guı́as y contiene algunos ejercicios.
Pág. 99
Lenguajes de Programación: Guı́a ECTS
Pág. 100
Capı́tulo 6
Evaluación
6.1.
General
La parte de evaluación del curso tiene como objetivo detectar si el estudiante ha conseguido
los objetivos que se persiguen con la asignatura, los cuales hemos enumerado en el capı́tulo 3
de esta guı́a. En LP tratamos también que las propias actividades de evaluación contribuyan
en sı́ mismas al proceso formativo. Para ello, el alumno podrá elegir entre dos modelos de
evaluación, el tradicional, que se ha venido utilizando hasta ahora, y el modelo ECTS, que se
deberá implantar en Europa en cumplimiento de la declaración de Bolonia y de lo que ésta ha
implicado en la configuración del Espacio Europeo de la Educación Superior. Por otro lado, se
ha establecido el Premio SENER a la mejor progresión durante el desarrollo de la asignatura
LP con el objeto de motivar a los estudiantes que llegan a la titulación con unas notas medias
de la educación secundaria 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. Las bases de este premio están descritas en el apéndice D.
6.2.
Evaluación tradicional
Consistirá en un examen final en el que se tratará de evaluar en qué grado se han alcanzado
los objetivos descritos en 3.2. Los objetivos y estructura del examen están descritos en 6.4.
Dado el carácter eminentemente práctico de la asignatura (3 de los 4.5 créditos de LP son
prácticos) y el cambio importante que para un estudiante de primer año supone su entrada
en la universidad, creemos que es necesario que sigan el curso de modo regular. En la planificación que se ha hecho del curso no se ha considerado adecuado establecer sesiones teóricas y
prácticas especı́ficas, conviviendo ambos aspectos en casi todas ellas. Debido a ello, el criterio
de superación de las prácticas será simplemente asistir a dos tercios (3/4.5) de las clases, para
lo cual llevaremos un registro de asistencia.
En las convocatorias extraordinarias de Junio y Septiembre solo se podrá optar a la evaluación
tradicional.
6.3.
Evaluación ECTS
La calificación ECTS está desglosada a partir de la evaluación de las siguientes actividades:
Pág. 101
Lenguajes de Programación: Guı́a ECTS
1. Trabajo en equipo: 35 %. En algunas de las sesiones se propondrá una prueba-control a
realizar en pareja. Estos controles pretenden evaluar la dinámica del grupo (AcB) y que
el alumno compruebe la evolución de los conocimientos (AcD). Los controles consistirán
en la realización de unos ejercicios similares a los de las hojas del tema en curso (CoA,
CoB, CpA y CpC). Los controles se deberán hacer en pareja, no pudiendo hacerlo en
caso de que falte uno de sus integrantes. Estos exámenes no serán anunciados. Además,
no se permitirá el acceso al aula a los estudiantes que lleguen más de 5 minutos tarde.
2. Examen final consistente en la resolución de una serie de problemas prácticos: 35 %. Los
objetivos y estructura del examen están descritos en 6.4.
3. Participación activa en las clases: 15 %. El profesor valorará la participación (AcA) y la
actitud positiva ante los problemas (AcC) a partir de la participación de los alumnos en
clase: preguntas, salir a la pizarra, comentarios, etc.
Se valorará que el alumno sea activo con hasta cinco puntos, es decir, que salga a
explicar sus programas, comente los de los demás, pregunte lo que no quede claro, etc, y
con otros cinco puntos la calidad de esa participación, es decir, que los programas sean
interesantes y las explicaciones claras, que las preguntas sean interesantes y demuestren
saber de lo que se está hablando, etc.
Para que a los profesores les sea más fácil la evaluación de la participación, los alumnos
deberá 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 decisión de optar al premio
SENER.
Se realizarán y publicarán dos calificaciones, una cuando haya transcurrido la mitad del
curso con efectos informativos, y la otra cuando haya transcurrido el curso completo. La
nota será la correspondiente a la valoración final.
4. Otras actividades: 10 %. Las actividades que forman parte de este apartado corresponden
a la valoración de las intervenciones en el foro de la plataforma de B-learning (ver secc.
5.4), las cuales permitirán valor objetivos relativos a conocimientos (CoB) y los objetivos
actitudinales de actitud positiva y de mejora continua (AcC, AcD). Los comentarios y
sugerencias sobre esta propia Guı́a ası́ como la corrección de erratas de la misma se
considera parte de este item de evaluación.
Además, y más importante, se propondrán actividades para realizar fuera de clase durante
el curso, como por ejemplo que el estudiante proponga ejercicios similares a los del curso,
los cuales serán resueltos o al menos intentados por parte del compañero de grupo.
Con ello se pretenden evaluar los objetivos de capacidades relativos a diseño(CpB),
codificación(CpA) y validación(CpC).
Finalmente, dentro de este item se considerará también el llevar al dı́a la hoja de control
y contabilización de tiempo y esfuerzo (objetivo AcD), la cual además ayuda al alumno
a establecer si está realizando el esfuerzo recomendado por los profesores para seguir el
curso (objetivo AcE).
5. Realización de la encuesta sobre la asignatura (3 %) y participación en el debate posterior
(2 %). Esta encuesta será realizada una vez publicadas las notas de la asignatura. En el
debate se mostrarán los resultados de la encuesta y se pedirá la opinión de los alumnos.
Pág. 102
CAPÍTULO 6. EVALUACIÓN
Estas dos notas se conservarán para las convocatorias de junio y septiembre a los que
hayan suspendido. Se valorará de este modo también la la actitud positiva ante los
problemas (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 métodos
de evaluación (tradicional y ECTS), su nota final será la mayor de las dos calificaciones.
6.4.
El examen
6.4.1.
Tipo de examen
El examen consistirá en la codificación en el Centro de Cálculo de una serie de ejercicios
similares a los propuestos de modo continuo durante el curso y similares también a los que
forman los exámenes por grupos. Se facilitan ejemplos de enunciados en el apéndice A. Estos
exámenes se realizarán en clase en la última parte del curso.
El código a entregar no debe tener errores y debe realizar las tareas correspondientes al correspondiente ejercicio. Se nombrarán los códigos correspondientes a cada ejercicio como f1.m,
f2.m etc.... Las normas para escribir los códigos son las habituales con la que se trabaja en el
curso y están explicadas en la sección 6.4.3.
6.4.2.
Criterios de evaluación
El examen individual tendrá ejercicios diversos, con los cuales evaluar la consecución de los
tipos de objetivos CpA y CpB.
Ası́, habrá ejercicios en los cuales se detallará un algoritmo que el alumno tendrá que codificar
en MATLAB. En estos ejercicios no se esperan capacidades innovadoras y su puntuación
acumulada será suficiente para aprobar el examen. Algunos de estos algoritmos tendrán cierta
complejidad.
También habrá ejercicios un poco más abiertos en los que el propio estudiante tenga que
pensar y diseñar los algoritmos. Finalmente, reconocemos que de manera implı́cita estamos
valorando CpC. Por ello, cuando proceda, proporcionaremos al alumno una serie de ejemplos
que funcionarán como baterı́a de pruebas del código.
6.4.3.
Normas del examen
Normas para la realización de los ejercicios en los exámenes.
1. Las funciones se ubicarán en ficheros independientes, cuyo nombre coincidirá con el de
la función a falta por supuesto de la extensión .m.
2. La función del ejercicio 1 se llamará f 1, la del ejercicio 2 se llamará f 2, y ası́ sucesivamente. ESTO ES IMPORTANTE!. No se llamarán ni examen1, ni examen f 1, etc...
Los nombres han de ser f 1, f 2, etc...
3. El único material permitido es un bolı́grafo. No se permite el uso de ningún dispositivo
de almacenamiento, incluidas memorias USB.
Pág. 103
Lenguajes de Programación: Guı́a ECTS
4. Deberá estar escrito en MATLAB. No se permitirá usar funciones propias de MATLAB
no estudiadas durante el curso, ni conceptos o estructuras correspondientes a ejemplos
y unidades didácticas que todavı́a no se hayan explicado. No se permitirá el uso de la
vectorización de operaciones explicada en el tutorial, ni la multiplicación directa de matrices. O sea, todas las operaciones hay que realizarlas siempre componente a componente
cuando se trate con vectores.
5. Cuando en el enunciado se exija la utilización de una rutina estudiada en el
curso o incluida en el enunciado, ésta no podrá ser modificada. Deberá ser
usada tal y como está escrita en los apuntes o en el enunciado. Si crees que
necesitas modificarla para poderla utilizar es que lo estás haciendo mal.
6. Las funciones se ubicarán en ficheros independientes, cuyo nombre coincidirá con el de la
función a falta por supuesto de la extensión .m. La función del ejercicio 1 se llamará f 1,
la del ejercicio 2 se llamará f 2, y ası́ sucesivamente.
7. En las funciones sólo se utilizarán aquellos argumentos de entrada y salida que se especifiquen en el enunciado.
8. La primera lı́nea de cada programa o función será un comentario con vuestros apellidos,
nombres y el número de máquina en la que estáis.
9. Todos los ficheros estarán ubicados en la carpeta C : \examenes.
10. Se podrán usar todos los ejemplos (no ejercicios) que se han estudiado en el curso hasta
el dı́a del examen, los cuales puedes encontrar en la carpeta correspondiente.
11. Se podrán 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 cerrará la sesión pero NO se apagará el ordenador.
6.4.4.
Publicación de calificaciones
La publicación de calificaciones será únicamente online mientras estas calificaciones sean provisionales. Una vez definitivas, se redactará el acta correspondiente para pasarla a los servicios
de Secretarı́a de la ETSIN.
Se dispone en la web de la asignatura (ver 5.4) de una utilidad en la que introduciendo el DNI
se puede ver la nota de la última convocatoria. Con ello conseguimos una privacidad relativa
pero creemos que suficiente.
6.4.5.
Revisión del examen
En el enunciado de cada examen se anunciará una fecha aproximada de publicación de las
notas y un dı́a y hora para la revisión de examen. Los estudiantes que deseen revisar su examen
deberán comunicarlo, por email o por cualquier otro medio a los profesores. En la revisión se
facilitará a cada estudiante su examen ası́ como una copia de las soluciones. Durante 60’
tendrá a los profesores de LP a su disposición para responder todas las dudas que considere
pertinentes.
Pág. 104
CAPÍTULO 6. EVALUACIÓN
6.5.
Evaluación de los objetivos
La siguiente tabla relaciona los objetivos generales de la asignatura, descritos en la sección 3.2,
con los diferentes apartados de la evaluación ECTS descritos en 6.3. Es decir, resume qué se
califica en cada ı́tem de la evaluación.
CoA
CoB
CpA
CpB
CpC
AcA
AcB
AcC
AcD
AcE
Participación Examen
x
x
x
x
x
x
x
x
x
Otras act. Grupos
x
x
x
x
x
x
x
x
x
x
Encuesta/debate
x
x
x
x
x
x
x
x
x
x
Pág. 105
Lenguajes de Programación: Guı́a ECTS
Pág. 106
Parte III
Apéndices
Pág. 107
Apéndice A
Ejemplos de Exámenes
Pág. 109
Examen final de Lenguajes de Programación. Febrero 2008
Escuela Técnica Superior de Ingenieros Navales
Fecha aproximada de publicación de las notas: 29/02/2008
Dı́a y hora de la revisión: 03/03/2008, 12h30m
Tiempo para esta parte : 85 minutos
Puntuación: 10 puntos.
Normas para la realización de los ejercicios en los exámenes.
1. Las funciones se ubicarán en ficheros independientes, cuyo nombre coincidirá con
el de la función a falta por supuesto de la extensión .m.
2. La función del ejercicio 1 se llamará f 1, la del ejercicio 2 se llamará f 2, y ası́ sucesivamente. ESTO ES IMPORTANTE!. No se llamarán ni examen1, ni examen f 1,
etc... Los nombres han de ser f 1, f 2, etc...
3. El único material permitido es un bolı́grafo. No se permite el uso de ningún dispositivo de almacenamiento, incluidas memorias USB.
4. Deberá estar escrito en MATLAB. No se permitirá usar funciones propias de MATLAB no estudiadas durante el curso, ni conceptos o estructuras correspondientes a
ejemplos y unidades didácticas que todavı́a no se hayan explicado. No se permitirá
el uso de la vectorización de operaciones explicada en el tutorial, ni la multiplicación
directa de matrices. O sea, todas las operaciones hay que realizarlas siempre componente a componente cuando se trate con vectores.
5. Cuando en el enunciado se exija la utilización de una rutina estudiada en
el curso o incluida en el enunciado, ésta no podrá ser modificada. Deberá
ser usada tal y como está escrita en los apuntes o en el enunciado. Si
crees que necesitas modificarla para poderla utilizar es que lo estás haciendo mal.
6. Las funciones se ubicarán en ficheros independientes, cuyo nombre coincidirá con
el de la función a falta por supuesto de la extensión .m. La función del ejercicio 1
se llamará f 1, la del ejercicio 2 se llamará f 2, y ası́ sucesivamente.
7. En las funciones sólo se utilizarán aquellos argumentos de entrada y salida que se
especifiquen en el enunciado.
8. La primera lı́nea de cada programa o función será un comentario con vuestros
apellidos, nombres y el número de máquina en la que estáis.
9. Todos los ficheros estarán ubicados en la carpeta C : \examenes.
10. Se podrán usar todos los ejemplos (no ejercicios) que se han estudiado en el curso
hasta el dı́a del examen, los cuales puedes encontrar en la carpeta correspondiente.
11. Se podrán 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 cerrará la sesión pero NO se apagará el ordenador.
Ejercicios.
1. Crea una función que reciba un vector v de números naturales y un natural m
y nos devuelva el número de elementos de v que son múltiplos de m. Devolverá
además el número de elementos de v que son múltiplos de m + 1. Por ejemplo, si
v = (7, 6, 15, 8, 5) y m = 2, devolverı́a 2 y 2, porque el 6 y el 8 son múltiplos de 2,
y el 6 y el 15 son múltiplos de 3 (2.5 puntos).
2. Construir una función que reciba un número n y devuelva un vector que contenga
a todos los números mágicos menores o iguales que n. Se define un número mágico
como 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, cuyo
único divisor es el mismo. Por ejemplo, si n = 30, la función devolverá el vector
[1 6 28] (2.5 puntos).
3. Crea una función que reciba un número natural n, un número real x y devuelva el
polinomio de Mc-Laurin de de grado n de la función ex , evaluado en x.
ex ∼ 1 + x +
x2 x3
xn
+
+ ··· +
2!
3!
n!
Para evaluar el polinomio de Mc-Laurin, se construirá éste componente a componente y se utilizará del modo adecuado la función ud3 f evalua. No se podrá usar
la función propia de MATLAB f actorial para hacer el cálculo del factorial. La
alternativa es o bien escribir una función aparte que calcule el factorial, o bien
cualquier 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, que
es bastante similar a e0.5 = 1.6487.
La función devolverá también la diferencia en valor absoluto entre ex y el polinomio
citado evaluado en x. Por tanto, en este caso, devolverı́a también 0.0029 (2.5
puntos).
4. Codifica una función que reciba dos vectores u y v ordenados de modo creciente
por hipótesis, que carecen de elementos comunes y de dimensiones m y n que son
en general distintas. La función devolverá otro vector w construido a partir de
todas las componentes de u y v, tales que el vector w también esté ordenado. No se
podrá llamar a ninguna función. Por ejemplo, si u = (2, 4, 5, 9, 10) y v = (1, 3, 6, 8),
el resultado será w = (1, 2, 3, 4, 5, 6, 8, 9, 10). Como comprobación adicional, si
intercambiamos u y v en la llamada, el resultado tiene que ser el mismo (2.5 puntos).
Ejercicios.
Examen final de Lenguajes de Programación. Junio 2008
Escuela Técnica Superior de Ingenieros Navales
Fecha aproximada de publicación de las notas: 30/06/2008
Dı́a y hora de la revisión: 03/07/2008, 19h30m
Tiempo para esta parte : 85 minutos
Puntuación: 10 puntos.
1. Crea una función que reciba un vector u de números positivos y devuelva un vector
ue con los números enteros que contiene y otro ur con los no enteros, ası́ como sus
respectivos mı́nimos me, mr. Por ejemplo, si u = (3, 20.3, 7, 5, 12.7, 13) el resultado
ha de ser ue = (3, 7, 5, 13), un = (20.3, 12.7), me = 3 y mr = 12.7. Se podrá
suponer que en el vector u siempre va a haber enteros y no enteros (2.5 puntos).
2. Crea una función que reciba un vector v de naturales y te devuelva 1 si la resta
de dos cualesquiera de los números es igual a un tercero. Por ejemplo, si v =
(3, 10, 7, 14, 6), la función devolverá un 1, pues 10 − 7 = 3. Sin embargo, si el vector
es v = (3, 11, 7, 15, 6) la función devolverá 0. Se recomienda probar la función
cambiando de orden los elementos del primer ejemplo (2.5 puntos).
3. Crea una función que reciba un vector p cuyas componentes asimilamos a los coeficientes de un polinomio del modo como se ha hecho en el curso. La función
ha de recibir también un vector x de n números reales y devolverá el elemento
del vector x que se encuentra más cerca de la media que resulta de que se evalúe
el polinomio p en todos los elementos del vector x. Ası́, si p = [1 − 1 2] y
x = [1.1 3.5 2.1 − 0.7], el resultado de evaluar el polinomio p en todos los puntos de
x es un vector y = [2.3200 22.0000 7.7200 2.6800] cuya media vale 8.6800, siendo
2.1 el punto que más cerca tiene su valor de la media (2.5 puntos).
4. Construye una función que reciba dos números naturales p, q y devuelva el menor
primo mayor que p y q que pertenezca a la sucesión de Fibonacci iniciada por p
y q (2.5 puntos). No se tendrán en cuenta ni p ni q. La sucesión de Fibonacci se
construye de tal modo que.
xi = xi−1 + xi−2 ,
x1 = p, x2 = q, i > 2
Por ejemplo, si p = 1 y q = 3, la sucesión 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).
Ejercicios.
Examen final de Lenguajes de Programación. Sept 2008
Escuela Técnica Superior de Ingenieros Navales
Fecha aproximada de publicación de las notas: 22/09/2008
Dı́a y hora de la revisión: 24/09/2008, 19h30m
Tiempo : 90 minutos
Puntuación: 10 puntos.
Nombre:
Número de PC:
Firma:
1. Crea una función que reciba un vector v de naturales y te devuelva un vector vp
formado por aquellas componentes de v que sean primas y otro vnp formado por
aquellas componentes que no sean primas. Por ejemplo, si v = (3, 10, 7, 14, 6), la
función devolverá un los vectores vp = (3, 7) y vnp = (10, 14, 6) (2.5 puntos).
2. Crea una función que reciba un vector p cuyas componentes asimilamos a los coeficientes de un polinomio del modo como se ha hecho en el curso. La función
ha de recibir también un vector x de n números reales y devolverá el ı́ndice del
elemento del vector x que se encuentra más cerca de la media que resulta de que
se evalúe el polinomio p en todos los elementos del vector x. Ası́, si p = [1 − 1 2] y
x = [1.1 3.5 2.1 − 0.7], el resultado de evaluar el polinomio p en todos los puntos de
x es un vector y = [2.3200 22.0000 7.7200 2.6800] cuya media vale 8.6800, siendo
2.1 el punto que más cerca tiene su valor de la media, cuyo ı́ndice es 3, que ha de
ser el único valor que finalmente devuelva la función (2.5 puntos).
3. Construye una función que reciba tres números naturales p, q y r. La función irá
calculando términos de la sucesión de Fibonacci iniciada por p y q e irá comprobando si son múltiplos de p. En el momento en que hayamos encontrado r múltiplos
de p la función terminará, devolviendo el término en que estemos de la sucesión de
Fibonacci (2.5 puntos). No se tendrán en cuenta los valores p y q. La sucesión de
Fibonacci 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 sucesión de Fibonacci estarı́a formada por
3, 4, 7, 11, 18, 29, 47, 76, 123..... Como 18 y 123 son los dos primeros múltiplos
de 3, el valor a devolver será 123 (2.5 puntos). Si p = 2, q = 1 y r = 3, la función
devolverı́a en este caso 76, pues los tres primeros múltiplos de 2 serı́an 4, 18 y 76.
4. Crea una función que reciba un vector u de números naturales y otro vector v de
números racionales positivos. La función devolverá 1 si existe alguna combinación
de fracciones formadas por elementos del vector u tomados de dos en dos, que sea
igual a algún elemento del vector v y 0 en caso contrario. Se definirá en la función
una variable prec igual a la milésima parte de la suma de los elementos de u. Se
considerará que dos números son iguales si su diferencia en valor absoluto es menor
que prec.
Por ejemplo, si u = (3, 20, 7, 5, 12, 13) y v = (2.98, 1.8571) el resultado ha de ser 1
pues prec = 0.06, y |13/7 − 1.8571| = 0.00004 < prec. Si ponemos como ejemplo el
mismo u pero ahora v = (2.98, 1.2571) la respuesta ha de ser 0 (2.5 puntos).
Lenguajes de Programación: Guı́a ECTS
Pág. 116
Apéndice B
Gestión del CC
Pág. 117
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:
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
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
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
centrodecalculo.navales@upm.es 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.
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.
Apéndice C
Control de tiempos y ficha
Pág. 123
ETSI NAVALES - UPM
LENGUAJES DE PROGRAMACIÓN (LP)
CURSO 2008-2009.
FICHA PERSONAL - URGENTE!!!!!!!!!!!!!
FOTO
(pegadla por
donde querais,
en zonas
blancas de esta
ficha)
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:
FICHA DE CONTROL DE TIEMPOS
APELLIDOS:
NOMBRE:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
16
17
16
Semana
Fecha DHOf Acum InFHOf Acum
29/09/2008
0
0
06/10/2008
0
0
13/10/2008
0
0
20/10/2008
0
0
27/10/2008
0
0
03/11/2008
0
0
10/11/2008
0
0
17/11/2008
0
0
24/11/2008
0
0
01/12/2008
0
0
08/12/2008
0
0
15/12/2008
0
0
22/12/2008
0
0
29/12/2008
0
0
05/01/2009
0
0
12/01/2009
0
0
19/01/2009
0
0
26/01/2009
0
0
02/02/2009
0
0
09/02/2009
0
0
EqFHOf
Acum
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Total
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Acum
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
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
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ía
InFHOf: por horas de trabajo individual fuera del horario oficial
EqFHOf: por horas de trabajo en equipo fuera del horario oficial
Lenguajes de Programación: Guı́a ECTS
Pág. 126
Apéndice D
Premio SENER
Pág. 127
PREMIO SENER A LA MEJOR PROGRESIÓN
EN LA ASIGNATURA LENGUAJES DE PROGRAMACIÓN
- Bases del premio 1 . Obj e t o de l pr e m io:
El obj et o de est e prem io es recom pensar la m ej or progresión durant e el
desarrollo de la asignat ura de Lenguaj es de Program ación de Prim er Curso de la
t it ulación de I ngenieros Navales y Oceánicos, Plan 2002, de la Universidad
Polit écnica de Madrid.
De est e m odo se pret ende m ot ivar a los est udiant es que llegan a la t it ulación
con unas not as m edias de Bachillerat o baj as, ofreciéndoles la oport unidad de
que una buena progresión respect o a la posición de part ida suponga una
recom pensa económ ica, con repercusión pública y curricular. Lo habit ual es que
est os prem ios que pret enden servir para m ot ivar, no m ot iven a los que m ás lo
necesit an, y t erm inen sim plem ent e por confirm ar la buena preparación y act it ud
de ciert os est udiant es. En est e sent ido, est e prem io t iene m ás m at ices, pues son
precisam ent e los " peores" est udiant es, los que part en de una posición m ás baj a,
los que m ás pueden progresar, y los que por t ant o se conviert en en m ej ores
candidat os para obt enerlo.
SENER es la em presa líder en el sect or de las aplicaciones inform át icas para el
m undo naval, y su fundación, la Fundación SENER, a part es iguales con el
Depart am ent o Naval de SENER se han ofrecido a dot ar y dar nom bre a est e
prem io. ETSI N cree que el prem io, dada su nat uraleza, lleva el m ej or nom bre
posible, y es de agradecer la im plicación de SENER en el m ism o.
2 . Re qu isit os de los solicit a n t e s:
Alum nos m at riculados en la asignat ura de Lenguaj es de Program ación de Prim er
Curso de la t it ulación de I ngenieros Navales y Oceánicos, Plan 2002, de la
Universidad Polit écnica de Madrid, que deseen opt ar al Prem io.
3 . Pr oce dim ie n t o de va lor a ción :
Los alum nos est án organizados por grupos de 2 com ponent es durant e el
desarrollo del curso, t rat ando de que los est udiant es adquieran hábit os de
t rabaj o en equipo y se fam iliaricen con los problem as y vent aj as de est a form a
de t rabaj o. De hecho, el m odus operandi de cada equipo t iene su repercusión en
la evaluación ECTS que se viene desarrollando desde el curso 2005- 2006.
Al final de est a evaluación, los com ponent es del grupo habrán obt enido una not a
final. El barem o para fij ar la punt uación para el prem io pasa por rest ar, de cada
una de las not as de cada uno de los 2 com ponent es, la not a m edia del
1/4
bachillerat o 1 . Así, si los est udiant es de un grupo obt uviesen un 7.5 y un 9.0 en
la evaluación ECTS de Lenguaj es de Program ación y sus not as del bachillerat o
fuesen 5.4 y 6.2 respect ivam ent e, su punt uación para el prem io será de ( 7.55.4) + ( 9.0- 6.2) = 4.9 punt os. La punt uación m áxim a será de 10 punt os, ( 105) + ( 10- 5) = 10, y la m ínim a de –20 punt os, ( 0- 10) + ( 0- 10) = - 20. El grupo
ganador será aquel que m ayor punt uación t enga siguiendo est e barem o.
Para el prem io se t endrá en cuent a únicam ent e la not a correspondient e a la
evaluación ECTS y no la correspondient e a la evaluación convencional. La
evaluación ECTS cont em pla diferent es ít em s a lo largo del curso ( ver Guía
Docent e de la asignat ura) . Teniendo est o en cuent a se arbit rará una form a de
seguim ient o consist ent e en la publicación de las not as de los diferent es grupos
en 2 inst ant es del curso, ident ificando a los alum nos a t ravés de su DNI . Ello les
perm it irá conocer su posición e im plicarse m ás en la part e final del curso, en la
que se consigue la part e m ás im port ant e de la not a. Para ello, la Secret aría de
la ETSI N facilit ará a los profesores una list a de alum nos m at riculados con una
colum na correspondient e a las not as de acceso a la universidad de aquellos
alum nos que deseen opt ar al Prem io, que previam ent e habrán firm ado su
aut orización para que se facilit e dicho dat o de su expedient e.
4 . D ot a ción :
La dot ación será de 1200€ a repart ir a part es iguales ent re los 2 com ponent es
del grupo. Est a dot ación se increm ent ará cada año aplicando el I PC
correspondient e. ETSI N em it irá un diplom a acredit at ivo, el cual cont endrá un
suplem ent o al m ism o consist ent e en un hist ogram a de las not as con la
punt uación de los diferent es grupos, para que quede const ancia de m odo
cuant it at ivo del progreso del grupo ganador en t érm inos absolut os y relat ivos al
rest o de grupos de ese año académ ico. La inform ación para dicho hist ogram a
será facilit ada por el profesor responsable de la asignat ura.
5 . En t r e ga de pr e m ios:
La ent rega de prem ios se realizará durant e la cerem onia de ent rega de diplom as
a los nuevos egresados, y el abono de los prem ios se efect uará m ediant e
cheque nom inat ivo de 600€ em it ido por la Fundación SENER para uno de los
1
Con not a m edia del Bachillerat o nos referim os a la Calificación definit iva de las Pruebas
de Apt it ud de Acceso a la Universidad, la cual es a su vez la m edia de la not a m edia del
Expedient e del alum no correspondient e al Bachillerat o propiam ent e dicho y la not a de la
Select ividad. En aquellos casos en que este valor no esté correct am ent e definido por haber
ingresado el est udiant e con bachillerat o ext ranj ero o por pruebas en las que ese
parám et ro no sea relevant e, se considerará que su not a es la m edia de ent re t odos los
est udiant es para las que sí lo sea.
2/4
com ponent es del grupo ganador y ot ro de la m ism a cant idad em it ido por el
Depart am ent o Naval de SENER I ngeniería y Sist em as para el ot ro com ponent e
del grupo ganador.
Los fam iliares de prim er grado de los est udiant es prem iados, así com o 4
com pañeros a elegir por cada uno de ellos y el delegado de su clase durant e el
curso correspondient e, est arán invit ados a est a cerem onia. Se invit ará a SENER
y a Fundación SENER a que asist an y ent reguen direct am ent e el prem io a t ravés
de alguna o algunas personas indicadas por ellos m ism os.
3/4
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 grupos 1.
14
12
Número de
grupos
10
8
6
4
2
0
-8
-6
-4
-2
0
2
4
6
Puntuación <=
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.
Índice alfabético
abs, 50, 51
ASCII, 28
Ball, S., 1
contadores, 53
else, 42
elseif, 46
end, 41
ficheros
ASCII, 28
floor, 54
function, 36
if, 40
if-else, 42
if-elseif, 46
if-end, 40
MATLAB
cálculo simbólico, 32
carpeta activa, 29
ventana de comandos, 13
operadores lógicos, 47
Ó, 47
negación, 47
Y, 47
pi, 38
sumadores, 53
Taylor, Brook, 27
Wittgenstein, L., 1
Pág. 132