Problemas Matlab I PDF
Problemas Matlab I PDF
programación en MATLAB®
Todos los derechos reservados. Queda prohibida, salvo excepción prevista en la Ley, cualquier forma de repro-
ducción, distribución, comunicación pública y transformación de esta obra sin contar con la autorización expresa
de Editorial Tébar. La infracción de estos derechos puede ser constitutiva de delito contra la propiedad intelec-
tual (arts. 270 y siguientes del Código Penal).
ISBN: 978-84-7360-505-2
Depósito legal: M-39418-2012
Foto de portada: Horacio Diez, horaciodiez.com
Imprime: Publiequio
A mi padre, a quien tanto le hubiese
gustado hablar conmigo de estas
y de otras muchas cosas.
A. Souto Iglesias
Notación y abreviaturas 13
Prólogo 15
Introducción 21
2. Funciones y Condicionales 49
2.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.2. MATLAB como un lenguaje de programación . . . . . . . . . . . . . . . . . . 49
2.3. Funciones y variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.4. Funciones con varios argumentos de entrada . . . . . . . . . . . . . . . . . . 54
2.5. Estructura de control condicional if . . . . . . . . . . . . . . . . . . . . . . . 57
2.6. Estructura de control condicional if-else . . . . . . . . . . . . . . . . . . . . . 60
2.7. Función que llama a otra función . . . . . . . . . . . . . . . . . . . . . . . . 61
2.8. Condicionales anidados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
2.9. Variante elseif en el condicional . . . . . . . . . . . . . . . . . . . . . . . . . 66
2.10. Depuración de códigos: debugger . . . . . . . . . . . . . . . . . . . . . . . . 68
2.11. Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
2.12. Operadores de comparación: ¿son iguales? . . . . . . . . . . . . . . . . . . . 72
2.13. Variables enteras y reales como argumentos . . . . . . . . . . . . . . . . . . . 74
2.14. Variables contador y sumador . . . . . . . . . . . . . . . . . . . . . . . . . . 76
2.15. Función parte entera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
3. Bucles 79
3.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.2. Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.3. Bucles y relaciones de recurrencia . . . . . . . . . . . . . . . . . . . . . . . . 86
3.4. Bucles y condicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.5. Bucles inconclusos: la sentencia break . . . . . . . . . . . . . . . . . . . . . . 92
3.6. Bucles en los que la condición no se refiere a un ı́ndice . . . . . . . . . . . . . 95
4. Vectores 101
4.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.2. Vectores como argumentos de funciones . . . . . . . . . . . . . . . . . . . . . 101
4.3. Funciones que llaman a funciones con argumentos vectores . . . . . . . . . . . 104
4.4. Cálculo de extremos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.5. Cálculo de extremos utilizando un vector auxiliar . . . . . . . . . . . . . . . . 108
4.6. Cálculo de posición de extremos . . . . . . . . . . . . . . . . . . . . . . . . . 110
4.7. Vectores y bucles anidados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
4.8. Función que devuelve un vector definido a partir de escalares . . . . . . . . . . 116
4.9. Funciones que reciben y devuelven vectores . . . . . . . . . . . . . . . . . . . 118
4.10. Construcción de vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
4.11. Funciones con salidas múltiples . . . . . . . . . . . . . . . . . . . . . . . . . 124
4.12. Vectores y polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
4.13. Evaluación de un polinomio . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
6. Matrices 163
6.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
6.2. Bucles for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
6.3. Matrices como argumentos de funciones . . . . . . . . . . . . . . . . . . . . 165
6.4. Submatrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
6.5. Resolución de un sistema lineal mediante eliminación Gaussiana . . . . . . . . 173
6.6. Proyectos de programación . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
7. Algoritmos 185
7.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
7.2. Algoritmos de búsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
7.3. Algoritmos de ordenación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
7.4. Algoritmos geométricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
7.5. Proyectos de programación . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Epı́logo 215
Referencias 217
Además de las abreviaturas mencionadas más arriba es necesario comentar los siguientes as-
pectos relativos a convenciones utilizadas:
1. Nos referiremos indistintamente a los programas como programas o como scripts ya que
en MATLAB ambos conceptos son equivalentes.
2. Dado que seguiremos la formalidad de ubicar cada función en archivo cuyo nombre es
el de la propia función más la extensión .m de MATLAB, a menudo abusaremos de la
notación y nos referiremos indistintamente a la función y al archivo que la contiene. Algo
similar pasa con los “scripts” y archivos que los contienen.
5. Para simplificar la notación, se usará siempre como separador decimal el punto, tanto
en el texto como en los códigos, dado que en estos es el obligatorio. Usaremos ocasio-
nalmente la notación cientı́fica (por ejemplo, nos referiremos a 0.0005 como 5e-4).
6. Cuando en un ejercicio se indica que se supone por ejemplo que los valores de entrada
son diferentes entre sı́, la función se codificará para que resuelva el problema planteado
asumiendo que esa esa suposición es cierta y no necesita por tanto ser comprobada.
13
Prólogo
Al escribir este libro hemos pretendido ofrecer una herramienta sobre la que articular un curso de
introducción a la programación de ordenadores para titulaciones fuera del ámbito informático.
Para los profesionales cuyas titulaciones están directamente relacionadas con las tecnologı́as de
la información y la comunicación (TIC), como los titulados en informática, ingenierı́a de tele-
comunicación, etc., la programación es una herramienta esencial de su trabajo y a ella dedican
mucho esfuerzo durante los estudios. Sin embargo, para otros profesionales, la programación es
un medio de solucionar problemas puntuales1 como codificar alguna pequeña aplicación para
resolver un problema especı́fico, extender las funcionalidades de algún programa, subcontratar
a alguna empresa que haga alguna de estas tareas, etc. También es importante aprender a
programar para poder desarrollar estrategias para análisis de datos con otras herramientas
informáticas.
Con esos otros profesionales nos referimos en particular a los titulados de ingenierı́a industrial,
matemáticas, ciencias fı́sicas y otras titulaciones en el ámbito de la ingenierı́a con menos alum-
nado como ingenierı́a civil, quı́mica, minas, energı́a, etc.... De hecho, el libro nace a partir de la
asignatura de introducción a la programación del que los autores han sido o son responsables,
en la titulación de ingenierı́a naval y oceánica de la Universidad Politécnica de Madrid.
Más recientemente, las TIC han entrado de lleno en titulaciones como ingenierı́a forestal,
agrónoma, ciencias económicas, empresariales, biologı́a, etc., incorporando transversalmente
formación en aspectos especı́ficos de programación aplicada a las mismas. La importancia
global de estas titulaciones y los sectores económicos para los que se forman sus estudiantes
es enorme dentro de nuestra economı́a. Para todos estos titulados es una ventaja competitiva
el tener una formación básica en programación de ordenadores, y nos parece adecuado que
esa empiece con un curso con una filosofı́a en la lı́nea del aquı́ descrito y continúe de modo
natural aprendiendo a escribir funciones para hojas de cálculo o bases de datos, con las dife-
rentes posibilidades disponibles en el mercado.
1
Ello no es óbice para que haya un porcentaje significativo de titulados no informáticos que se dediquen
profesionalmente a las TIC y en particular dentro de estas a la programación de aplicaciones.
15
Curso básico de programación en MATLAB
R
quedan intuiciones fuertes y coherentes de lo que hay en las tripas de la máquina, y sobre
todo de lo que un ordenador puede y no puede hacer. En otras asignaturas de estas titula-
ciones se manejan programas de aplicación, cuyo conocimiento y manejo con soltura, también
son vitales -una hoja de cálculo, un procesador de textos, un programa de CAD, el sistema
operativo, un gestor de proyectos, etc.- pero la programación contempla otros matices. Para
nuestros titulados, la posibilidad de abstraer los elementos esenciales de un problema, analizan-
do los escasos elementos de los que dispone para solucionarlo y establecer una metodologı́a,
estrategia y procedimiento para abordarlo, son elementos básicos de su trabajo. Precisamente
en esto último consiste una forma de ver la programación de ordenadores. De hecho, como
dice Soloway2 , en la vida diaria, todo el mundo está construyendo mecanismos y explicaciones
para solucionar problemas y programar es llevar esto a su extremo de abstracción.
1. El libro esta concebido para que se pueda articular en torno a él un curso de introducción a
la programación para titulaciones no informáticas, utilizando el lenguaje de comandos de
MATLAB como lenguaje de referencia. Se pretende de este modo que, al final del curso,
el estudiante haya asimilado los conceptos básicos de la programación estructurada y que
además se sienta cómodo y seguro dentro del entorno MATLAB; esto le será útil en otros
contextos, dado el amplio ámbito de aplicación del programa. La elección de MATLAB,
aunque se justificará de modo detallado en la introducción a la primera parte del libro,
se fundamenta en ese amplio ámbito de aplicación del programa y en su facilidad de
uso.
2. Hemos pretendido que el libro proporcione material docente tanto teórico como práctico
para que los estudiantes puedan seguir de modo efectivo el curso.
3. Pretendemos que sea interesante sobre todo para los estudiantes de titulaciones fuera
del ámbito informático y para los colegas profesores de este tipo de materias. Para
ello, los elementos que conforman la programación estructurada (estructuras de control,
funciones, entrada y salida con formato, vectores y matrices, algoritmos, etc.) se intro-
ducen de modo progresivo y se vuelve sobre ellos continuamente. Al final, el alumno
conocerá todos esos elementos y podrá usarlos con autonomı́a.
2
Soloway, E., Learning to program = learning to construct mechanisms and explanations. Communications
of the ACM, Volume 29, Number 9, September, 1986.
16
Prólogo
Junto a los objetivos que perseguimos, es importante resaltar lo que no hemos pretendido con
el libro:
1. Aunque el estudiante se sienta más cómodo al final del curso en el entorno MATLAB,
no hemos pretendido enseñar al estudiante a calcular y resolver problemas complejos
utilizando las posibilidades de MATLAB. Nos hemos centrado en una serie de comandos
e ideas canónicas como base para construir lo que es un curso de introducción a la
programación.
Esperamos que el libro sea interesante sobre todo para los estudiantes de las titulaciones
citadas al principio, para los colegas profesores de este tipo de materias, y para aquellos que
se enfrentarán en breve a la redacción de nuevos planes de estudio incorporando a los mismos
formación obligatoria en programación. Se ha tratado de detallar todo el planteamiento del
curso, bajo el cual subyace la cita de Wittgenstein que aparece un poco más adelante: se
introducen elementos de modo paulatino y se vuelve sobre ellos continuamente. Al final, el
alumno conocerá todos esos elementos y podrá usarlos con autonomı́a.
El libro ha sido escrito en LATEX, procesador de textos para Matemáticas desarrollado a partir
de TEX, el cual debemos a Donald Knuth3 , una de las figuras más importantes en el mundo
de la programación de ordenadores. Escribir en LATEX es metodológicamente completamente
3
Donald Knuth, matemático y profesor de Informática en la Universidad de Stanford, nació en Estados
Unidos en 1938. Mientras realizaba su tesis doctoral en Matemáticas, la editorial Addison-Wesley le propuso
escribir un libro de texto sobre compiladores que acabó siendo su obra más importante “El arte de programar
ordenadores”, compuesta por múltiples volúmenes, y sobre la cual sigue trabajando en la actualidad. Corrigiendo
la re-edición de uno de los volúmenes, Knuth se dió cuenta que la calidad de la impresión y de los caracteres
matemáticos dejaba mucho que desear. Decidió desarrollar un lenguaje especı́fico para escribir textos y artı́culos
matemáticos y cientı́ficos. Ası́ nació TEX, con la intención de que pudiera ser usado directamente por los autores
de los artı́culos, que fuera de acceso gratuito y que pudiera estar soportado en cualquier sistema operativo.
Posteriormente han surgido extensiones de TEX, como LATEX (que es una colección de comandos definidos de
uso más simple que el TeX) y que es actualmente la principal herramienta para escribir en Matemáticas y
otras disciplinas cientı́ficas. Knuth es un personaje muy interesante, que ha ido contra-corriente no solo cuando
empezó con TEX. Por ejemplo, carece de correo electrónico y argumenta su postura con cierta lucidez, como
se puede comprobar en este enlace (http://www-cs-faculty.stanford.edu/ knuth/email.html).
17
Curso básico de programación en MATLAB
R
diferente a hacerlo en MS-WORD por ejemplo, dado que recuerda bastante a generar un pro-
grama que después hay que compilar para tener el PDF del libro. Sobre la idea inicial de Knuth,
TEX ha evolucionado mucho en los últimos 30 años a partir del trabajo cooperativo de muchas
personas en el mundo, desde la esfera del software libre, y se ha convertido en una aplicación
fundamental para la generación de documentos cientı́ficos de alta calidad formal.
Para terminar, retomamos la maravillosa cita de Stephen Ball que aparece un poco más ade-
lante y que junto a la de Wittgenstein y la de Vic Muniz que también encontramos ahı́, inspiran
todo este trabajo. En un momento que el que se coincide en resaltar la escasa motivación de
los estudiantes, enriquecer la evaluación les proporciona mecanismos de enganche continuo
con el curso, y les permite potenciar muchas facetas tomando como punto de partida aquellas
en las que por diferentes razones ya son más válidos. Con este libro hemos pretendido pro-
porcionar materiales que faciliten esa tarea y ası́ los hemos utilizado en nuestras asignaturas4 .
Para nosotros, como docentes, mantener a los estudiantes en el sistema, comprometidos y
progresando, es un motivo de satisfacción profesional y personal.
4
Souto-Iglesias, A., Bravo-Trinidad, J. L. (2008). Implementación ECTS en un curso de programación en
Ingenierı́a. Revista de Educación, (346), 487-511.
18
....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.
L. Wittgenstein.
Vic Muniz.
Introducción
A los códigos utilizados como ejemplo en el libro ası́ como a las soluciones de una selección
de ejercicios propuestos se puede acceder en la dirección:
http://canal.etsin.upm.es/matlab/
21
Curso básico de programación en MATLAB
R
5
Cleve Moler nació en Estados Unidos en 1939. Estudió matemáticas en Caltech (“California Institute of
Technology”) y leyó su tesis doctoral en Stanford en Análisis Numérico. Junto con otros autores creó LINPACK
y EISPACK dos librerı́as de subrutinas de computación numérica para FORTRAN.
A finales de los 70, dando clases en la universidad de Nuevo México en análisis numérico y teorı́a de matrices,
Moler quiso que sus alumnos utilizaran esas librerı́as sin necesidad de escribir complejos programas en Fortran,
ası́ que siguiendo un manual de Wirth, creó su propio lenguaje de programación: MATLAB (“Laboratorio de
Matrices”). En esta primera versión de MATLAB el único tipo de dato eran matrices y solamente habı́a 80
funciones incorporadas. No existı́an los “M-files”, y si se querı́a añadir una función habı́a que modificar el
código fuente en Fortran y recompilar el programa completo. Aún ası́ esta versión tenı́a la cualidad de que
corrı́a en todos los ordenadores que existı́an en la época. A comienzo de los 80 Moler conoció a Jack Little,
un ingeniero del MIT (“Massachusetts Institute of Technology”) que sabı́a cómo usar matrices en Teorı́a del
Control, aplicación que incorporaron al programa. Juntos fundaron la compañı́a MathWork que dio salida
comercial a MATLAB (su principal producto). Hoy en dı́a MATLAB es usado por millones de ingenieros y
cientı́ficos de todo el mundo.
22
Introducción
4. MATLAB proporciona una interfaz que permite probar las funciones directamente sin
necesidad de llamarlas desde un programa principal. Esto permite comprobar su fun-
cionamiento de un modo sencillo e inmediato, y como comentamos más abajo, ha permi-
tido 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.
1. Tutorial de MATLAB.
2. Funciones y Condicionales.
3. Bucles.
4. Vectores.
6. Matrices.
7. Algoritmos en MATLAB.
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 este capı́tulo 1 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.
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 ”Ho-
la 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 el capı́tulo 2 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.
23
Curso básico de programación en MATLAB
R
En el capı́tulo 4 se introducen los vectores, pues ya se tienen las herramientas para mane-
jarlos. Dependiendo de la duración del curso, este podrı́a ser un momento para terminar, en
cursos de 40 o 45 horas, habiendo utilizado MATLAB básicamente como el lenguaje de base
para aprender a programar. Para asignaturas más largas se puede continuar con los temas
5, dedicado a entrada y salida con formato (y ficheros), el 6, dedicado a matrices, y el 7,
donde se trabajan algoritmos elementales de búsqueda, ordenación y geométricos. Además,
en estos últimos temas, se trata de hacer uso de toda la potencialidad de MATLAB pues se
pretende aprovechar esta parte del libro para adquirir competencias relevantes en ese sentido.
Se incluyen además proyectos de programación de cierta complejidad que serán útiles para
proporcionar a los estudiantes una visión global de todo lo aprendido.
24
Capı́tulo 1
1.1. Introducción
En este capı́tulo inicial 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.
Utilizaremos en este libro 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, tiene como objetivo que
el estudiante se sienta cómodo con la interfaz del programa y aprenda a usarlo como si fuese
una calculadora. Al final del tutorial será capaz de utilizar MATLAB como una versátil herra-
mienta para realizar operaciones matemáticas escalares, vectoriales y matriciales complejas,
manejando sus elementos de cálculo en lı́nea de comandos y mediante ”scripts”(programas
de MATLAB) pero sin entrar en la programación de funciones, a lo cual nos dedicaremos en
capı́tulos posteriores.
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.
25
Curso básico de programación en MATLAB
R
La utilización más básica de MATLAB es como calculadora 1 . Ası́, por ejemplo, para calcular
cos(5) · 27.3 , se debe introducir 2 :
>>cos(5)*2ˆ7.3
ans =
44.7013
Es importante resaltar que tanto para las variables como para las funciones MATLAB distingue
entre mayúsculas y minúsculas. En este caso concreto el coseno se ha de invocar escribiendo
cos en minúsculas.
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
1
Funcionando de este modo, es similar a una calculadora programable, aunque bastante más versátil.
2
Los argumentos de las funciones trigonométricas siempre están en radianes.
26
1. MATLAB como calculadora
En este momento cabrı́a preguntarnos si tratamos con un logaritmo decimal o con uno nepe-
riano (natural). Para saberlo, pedimos ayuda acerca del comando log utilizando:
>>help log
LOG Natural logarithm.
LOG(X) is the natural logarithm of the elements of X.
Complex results are produced if X is not positive.
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. MATLAB dispone de un sistema de ayuda más
sofisticado al cual se accede mediante la orden doc, tanto de modo genérico o haciendo
referencia especı́fica a un comando, como:
>>doc log
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 1.1 Cambiar el formato para que otra vez se vean sólo cuatro decimales.
2.1 +log
Ejercicio 1.4 Realizar la siguiente operación e2.7 10 108.2
.
El resultado del ejercicio 1.4 aparecerá como 2.3992e+004. La notación 2.3992+004, significa
2.3992 · 104 o lo que es lo mismo 23992.
27
Curso básico de programación en MATLAB
R
>>x=cos(5)*2ˆ7.3
x =
44.7013
MATLAB buscará en la memoria RAM del ordenador un espacio para guardar esa variable a
la que nos referiremos mediante la letra x.
Los nombres de las variables en MATLAB han de comenzar por una letra; además, no con-
tendrán sı́mbolos que no sean letras, números o el guión bajo (que está en la misma tecla que
el signo menos). Ya hemos comentado que MATLAB distingue entre mayúsculas y minúsculas
y podrı́amos tener simultáneamente por tanto en memoria una variable X mayúscula con un
valor diferente.
>>y=log(x)
y =
3.8000
Es muy importante señalar aquı́ que el sı́mbolo = en programación está vinculado a la idea de
asignación. Se asigna a lo que hay a la izquierda del = el valor de lo que hay a la derecha del
mismo, una vez que se haya realizado la operación que hay a la derecha.
Ejercicio 1.5 Realizar la siguiente operación: 2.72.1 + log10 108.2 y asignarla a la variable x.
2.1 +log
Ejercicio 1.6 Realizar la siguiente operación: e2.7 10 108.2
y asignarla a la variable t.
>> x=3
x =
3
>> x=2*x
x =
6
>> x=2*x
x =
12
>> x=2*x
x =
28
1. MATLAB como calculadora
24
>> x=2*x
x =
48
>> x=2*x
x =
96
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.8000
>> 4+3ˆ2*5
ans =
49
Esta jerarquı́a de operaciones se puede alterar por supuesto con la utilización adecuada de
paréntesis.
>> (4+3)ˆ2*5
ans =
245
x2 − 81
x=x−
2x
hasta que se hasta que se estabilice el cuarto decimal de x. ¿Qué relación hay entre el último
x y 81?
Ejercicio 1.8 Definir A como vuestro código postal. Empezando por x = 100 repetir la ope-
ración
x2 − A
x=x−
2x
hasta que se estabilice el cuarto decimal. ¿A qué ha convergido la sucesión? 3
3
Las calculadoras obtienen la raı́z cuadrada de un número mediante esta sucesión.
29
Curso básico de programación en MATLAB
R
A veces es bueno apagar y encender la calculadora para borrar todo y empezar de nuevo. Esto
se hace con la orden clear all. Hay que tener cuidado al utilizarla, ya que borra todas las
variables que estén en la memoria sin pedir confirmación.
>>clear all
>>x
??? Undefined function or variable ’x’.
Ejercicio 1.9 Preguntar el valor de A igual que acabamos de preguntar x. ¿Tiene sentido el
resultado?
Podemos construir el vector v editando directamente entre los corchetes sus componentes:
>>v = [0 2 4 6 8]
v =
0 2 4 6 8
30
1. MATLAB como calculadora
>> v = [0:2:8]
v =
0 2 4 6 8
Podemos, para simplificar la sintaxis, prescindir de los corchetes al definir los vectores mediante
incrementos.
>> v = 0:2:8
v =
0 2 4 6 8
Ejercicio 1.10 Si escribimos la siguiente orden, cuál será el resultado que aparecerá por pan-
talla:
>> v = 0:2:9
Si ponemos ; (punto y coma) al final de una lı́nea en la ventana de comandos, cuando pulsemos
la tecla Enter (tecla de retorno de carro) 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
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
>> v(2)*v(5)ˆ3
ans =
1024
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 “?”.
31
Curso básico de programación en MATLAB
R
>> v’
ans =
-3
2
4
6
8
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;
>> 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
Ejercicio 1.12 Definir un nuevo vector que sea el traspuesto de v y aplicar a ese vector el
comando size. ¿Es coherente el resultado?
Podemos también eliminar una componente de un vector utilizando el operador []. Por ejem-
plo:
>> v(5)=[]
v =
0 2 4 6
>> v(5)=8
v =
0 2 4 6 8
32
1. MATLAB como calculadora
>> A = [ 1 2 3; 3 4 5; 6 7 8]
A =
1 2 3
3 4 5
6 7 8
>> A = [ 1 2 3
3 4 5
6 7 8]
A =
1 2 3
3 4 5
6 7 8
>> A(2,2)=-9
A =
1 2 3
3 -9 5
6 7 8
>> A(2,2)=4;
33
Curso básico de programación en MATLAB
R
Ejercicio 1.14 Sumar los elementos diagonales de la matriz A refiriéndonse a ellos elemento
a elemento.
>>C=A+B
C =
2 4 6
5 8 10
9 14 16
>>C=A*B
C =
14 31 37
26 57 69
44 96 117
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
>>I(1,1)=1;
>>I(2,2)=1;
>>I(3,3)=1
I =
1 0 0
0 1 0
0 0 1
Ejercicio 1.18 Repetir el ejercicio 1.16 sacando factor común y utilizando la matriz identidad.
34
1. MATLAB como calculadora
Otra forma de definir la matriz identidad es a través de la función diag, que recibe un vector
y lo 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 1.19 Definir una matriz D diagonal cuyos elementos sean −2, 1, 0.2 y −0.7.
Ejercicio 1.20 Pedir ayuda de la función eye, y definir la matriz identidad de 10 × 10.
Ejercicio 1.21 Repetir el ejercicio 1.16 sacando factor común y utilizando la función eye.
>> 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 entre paréntesis indica que nos referimos como primer elemento al 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
Ejercicio 1.22 Deducir cuál va a ser el resultado de las dos órdenes siguientes:
>> e=v(2:2:5)
>> e=v(1:3:5)
35
Curso básico de programación en MATLAB
R
Como comentamos al principio, la notación usada por MATLAB sigue en lo posible la notación
estándar de Álgebra Lineal. 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 1.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
>>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 1.24 Definir una matriz de nombre D1 formada por la primera y tercera columnas
de la matriz A.
36
1. MATLAB como calculadora
Una vez que se es capaz de crear y manipular una matriz, se pueden realizar muchas ope-
raciones 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 ya que los errores de redondeo
durante su cálculo convierten en invertible a dicha matriz.
>> 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
>>inv(B)
ans =
-3.0000 5.0000 -2.0000
-1.0000 -1.0000 1.0000
2.0000 -1.0000 0
Ejercicio 1.25 Definir una matriz de nombre B1 como la inversa de B. Multiplicar B por B1
y razonar la coherencia del resultado.
Hay que recordar 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.
>>v = [1 3 5]’
v =
1
3
5
>>B = [ [1 2 3]’ [2 4 7]’ [3 5 8]’];
37
Curso básico de programación en MATLAB
R
se resuelve con:
>> x = inv(B)*v
x =
2
1
-1
Para comprobar:
>> B*x
ans =
1
3
5
Ejercicio 1.27 Encontrar la solución del sistema lineal BB t x = v asignando esa solución al
vector x.
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 transforma-
ciones 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:
38
1. MATLAB como calculadora
Ejercicio 1.29 Definir una matriz H de 3 × 3 a partir de las tres primeras columnas de la
matriz BA.
Ejercicio 1.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.
>> v = [1 2 3]’
v =
1
2
3
>> b = [2 4 6]’
b =
2
4
6
>> v+b
ans =
39
Curso básico de programación en MATLAB
R
3
6
9
>> v-b
ans =
-1
-2
-3
Ahora multiplicaremos uno de esos vectores por un escalar cualquiera. Eso se traduce en un
nuevo vector cuyas componentes, una a una, han sido afectadas por ese producto:
>> 2.4*v
ans =
2.4000
4.8000
7.2000
Cuando se trata de sumar(restar) un escalar a un vector, MATLAB asume que esa suma se
refiere a todos los elementos del vector.
>> 1.7+v
ans =
2.7000
3.7000
4.7000
En la multiplicación de vectores y matrices, hay que recordar que MATLAB trata a los vectores
(en este caso columna) como matrices de n filas (siendo n la dimensión del vector) y 1 columna
y hay que resaltar también que MATLAB sigue de modo estricto las reglas del Álgebra Lineal.
En el ejemplo anterior los vectores son por tanto matrices de 3×1, que no pueden ser por tanto
multiplicadas directamente. Se debe recordar que en una multiplicación matricial, 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 =
2 4 6
4 8 12
6 12 18
>> v’*b
ans =
28
40
1. MATLAB como calculadora
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 1.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.
>> x = [0:0.1:100]
x =
41
Curso básico de programación en MATLAB
R
Columns 1 through 7
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000
......................
Columns 995 through 1001
99.4000 99.5000 99.6000 99.7000 99.8000 99.9000 100.0000
>> y = sin(x).*x./(1+cos(x));
Usando este tratamiento vectorial, se pueden generar gráficos de modo muy sencillo. Damos
una muestra de esto que luego completaremos:
>> plot(x,y)
Ejercicio 1.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 1.37 Definir un vector y a partir de cada componente del vector t como:
2
y = 5e−t + sin(10t)
Ejercicio 1.38 Dibujar la curva (t, y) utilizando de modo adecuado la orden plot.
>>h=0.1
>>xmin=-2;
>>xmax=2;
>>x=xmin:h:xmax;
>>yseno=sin(x);
>>ytaylor=x-x.ˆ3/6;
4
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 par-
ticipó activamente en las agrias disputas entre matemáticos británicos (“newtonianos”) y matemáticos eu-
ropeos (“leibnitzianos”) sobre la adjudicación del descubrimiento del Cálculo Diferencial.
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 (fuente: http://www-history.mcs.st-
and.ac.uk/).
42
1. MATLAB como calculadora
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.
>>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. Una vez en la ventana gráfica se puede entrar en modo Edición, y
cambiar el aspecto del gráfico, activando el icono de la flecha y haciendo doble-click sobre el
gráfico.
Ejercicio 1.39 En la ventana en la que aparece la figura, seleccionar Edit, Copy Figure.
Abrir un nuevo documento de Ms-WORD y pegar la figura en ese documento.
>>plot(x,abs(yseno-ytaylor),’mx’);
Ejercicio 1.42 Dibujar la curva (t, y) del ejercicio 1.37 con cruces rojas y con una retı́cula
incorporada.
Ejercicio 1.43 Hacer doble click sobre la curva tras seleccionar la herramienta flecha en el
menú superior de la ventana de la gráfica. Cambiar la figura de color (violeta) y de grosor (a
6).
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 1.39.
43
Curso básico de programación en MATLAB
R
activas.
Como ejemplo, consideramos el script correspondiente al dibujo de las gráficas de la sección
1.7. 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
entornos 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 senotaylor.m. Para abrir el editor
clickamos 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. Es interesante
que se pueden comentar o “descomentar”varias simultáneamente sin más que seleccionarlas
en el editor, clickando con el botón derecho del ratón y eligiendo la opción correspondiente en
el menú flotante que aparece.
Una vez que se hayan introducido las sentencias, se guarda el fichero en la carpeta que creamos
conveniente. Ahora hay que informar a MATLAB de 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.1); para volver a activar
la vista inicial de MATLAB se procede como se indica en la figura 1.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 la carpeta ..\matlab\bin,
MATLAB lo encontrará 5 .
5
Si se utiliza MATLAB en el aula de ordenadores o laboratorio de una facultad o escuela, probablemente
44
1. MATLAB como calculadora
>>senotaylor
Figura 1.2: Recuperar vista por defecto del entorno MATLAB (ver figura 1.1)
el usuario no tenga permiso de escritura en esa carpeta 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.
45
Curso básico de programación en MATLAB
R
Ejercicio 1.44 Estimar la dimensión que tienen que tener los vectores x, yseno, ytaylor y
confirmar el resultado utilizando la orden size.
Ejercicio 1.45 Crear y ejecutar desde MATLAB un fichero que se llame CURVATY.m con una
secuencia de comandos que realicen las operaciones siguientes:
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 incorporada.
Ejercicio 1.46 Crear y ejecutar desde MATLAB un fichero que se llame BAIP.m con la se-
cuencia de comandos siguiente:
v = [1 3 5]’;
B = [ [1 2 3]’ [2 4 7]’ [3 5 8]’];
BA=[B v]
BA(2,:)=BA(2,:)-2*BA(1,:)
BA(3,:)=BA(3,:)-3*BA(1,:)
IP=[1 0 0;0 0 1;0 1 0];
BA=IP*BA
46
1. MATLAB como calculadora
Ejercicio 1.47 Pedir ayuda del comando pause e incorporarlo entre algunas lı́neas del ejercicio
anterior para ver todos los pasos de la secuencia de comandos.
>>(2+3i)*(3-7i)
ans =
27.0000 - 5.0000i
O dividirlos como:
>>(2+3i)/(3-7i)
ans =
-0.2586 + 0.3966i
>>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]
47
Curso básico de programación en MATLAB
R
>> det(A)
ans =
-2*y*x+2*yˆ2+xˆ4-xˆ3*y
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
>>syms x
2
Ejercicio 1.49 Definir una función f como e−x .
Ejercicio 1.50 Pedir ayuda de la función diff y calcular la derivada de f . Evaluar esta
derivada para x = −3.327.
48
Capı́tulo 2
Funciones y Condicionales
2.1. General
Una vez que en el capı́tulo 1 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, el
capı́tulo 2, dedicado al concepto de función y la estructura de control condicional, y el capı́tulo
3, dedicado al estudio de los bucles, son los más importantes. Constituyen la base sobre la que
se cimenta el resto del curso.
1
Von Neumann nació en 1903 en Budapest (Hungrı́a) con el nombre de János. Estudió Quı́mica en la
Universidad de Berlı́n debido a que su familia se oponı́a a que se dedicara a una carrera como las Matemáticas
sin perspectiva de reportarle beneficios económicos. Sin previos estudios matemáticos escribió su tesis doc-
toral en teorı́a de conjuntos. Impartió clases en las universidades de Berlı́n y Hamburgo y posteriormente
realizó estudios postdoctorales en Göttingen con Hilbert. En 1930 se mudó a Princenton donde dió clases en la
universidad durante tres años para posteriormente ser uno de los seis primeros matemáticos en el Instituto de
Estudios Avanzados de Princeton. Durante la Segunda Guerra Mundial participó en el Proyecto Manhattan.
Las contribuciones de Von Neumann son muy variadas y profundas en matemáticas y se extienden hasta
otros campos, principalmente la fı́sica. Desarrolló el formalismo matemático en el que se fundamenta la
Mecánica Cuántica. Ha contribuido con importantes aportaciones en economı́a, teorı́a ergódica, teorı́a de
juegos, teorı́a de conjuntos, etc... En los años 30, se interesó en el estudio de la turbulencia hidrodinámica.
Para Von Nuemnan, la mejor manera de obtener intuición en los fenómenos no lineales que aparecen en las
ecuaciones de la hidrodinámica era a través de los métodos numéricos. A finales de su vida se dedicó al
49
Curso básico de programación en MATLAB
R
en diseñar las instrucciones adecuadas (que se almacenarán en la memoria) para que la unidad
de procesado realice ciertas tareas utilizando los datos almacenados en la memoria. Un ejemplo
de programación lo hemos visto en el capı́tulo 1 al estudiar los scripts.
Los lenguajes de programación han evolucionado mucho desde la aparición de los primeros
computadores. En un principio, los programas se tenı́an que escribir directamente en el código
interno del ordenador. Con el incremento de la potencia de los ordenadores y del tamaño de
los programas que en ellos se utilizan, este sistema de programación dejó de usarse (salvo
en ciertas ocasiones para escribir partes de programas que han de ser muy rápidos o realizar
funciones muy especı́ficas) y se comenzaron a usar lenguajes de programación. Un lenguaje
de programación es un “idioma” en el que escribir programas más o menos universal (es
decir, hasta cierto punto independiente del ordenador) que se entiende más fácilmente por las
personas. Este lenguaje ha de traducirse después al lenguaje del ordenador, lo que hace de
modo automático un programa llamado compilador.
Según el momento en el que se use el compilador se distinguen dos tipos de lenguajes. Cuando
la compilación se hace del programa entero se habla de lenguajes compilados (por ejemplo C o
Fortran) y cuando se va compilando cuando se ejecuta se denominan lenguajes interpretados
(por ejemplo Basic o MATLAB).
En este libro haremos una introducción general a la programación, válida para los lenguajes de
programación más utilizados. Hemos elegido MATLAB porque tiene una sintaxis más sencilla
y flexible que los lenguajes usuales y además es interpretado, lo que nos permite dedicar mucho
tiempo a entender las estructuras de programación y poco a depurar errores de sintaxis, manejar
la entrada y salida, compilar los programas, etc. De hecho, muchos programadores explotan
estas caracterı́sticas de MATLAB y lo utilizan para probar sus algoritmos antes de codificarlos
en lenguajes con sintaxis más compleja.
estudio de los autómatas celulares. Creó el primer automáta autorreplicante con lápiz y papel, sin ayuda del
ordenador. Defendió el uso del bit como medida de la memoria de un ordenador y resolvió el problema de
obtener respuestas fiables a partir de componentes no fiables del ordenador.
Von Neumann no fue un matemático antisocial encerrado en sus problemas. Le gustaban las fiestas y estaba
bien relacionado socialmente, siendo respetado por polı́ticos y hombres de negocios. Murió a causa de un
cáncer en 1957 (fuente: http://www-history.mcs.st-and.ac.uk/).
50
Capı́tulo 2. Funciones y Condicionales
% ud2_f1.m
% Una función sencilla. Un solo argumento
function y=ud2_f1(x)
y=xˆ2-log(x);
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 ud2_f1,
debemos guardarla en el archivo ud2_f1.m. Nombraremos a las funciones de cada capı́tulo
con el prefijo udX_ (por unidad didáctica) siendo X el número del capı́tulo.
La primera lı́nea realmente ejecutable de cualquier función comienza siempre con la palabra
reservada function lo cual es común a todas las funciones que veremos en el libro.
Las lı́neas iniciales de la función están precedidas del sı́mbolo %. Eso significa que son comen-
tarios que nosotros incluimos para documentar lo que hace la función y el significado de los
argumentos de la misma. Además si pedimos ayuda de la función, aparecen esas lı́neas como
explicación de la misma.
Lo más interesante de este ejemplo es entender a partir cómo se pasan los argumentos desde
la lı́nea de comandos hacia las funciones. Para invocar a la función ud2_f1 desde la lı́nea de
comandos, se puede hacer por ejemplo del siguiente modo:
>> ud2_f1(5)
51
Curso básico de programación en MATLAB
R
ans =
23.3906
Cuando se pulsa Enter se carga en memoria RAM la función ud2_f1, 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 hacia 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
ud2_f12 .
Podemos invocar a la función ud2_f1 ahora del siguiente modo:
>> t=5;
>> z=ud2_f1(t)
z =
23.3906
>> x=5;
>> y=ud2_f1(x)
y =
23.3906
function y=ud2_f1(x)
x=2;
y=xˆ2-log(x);
2
Este proceso no es exactamente ası́, pero ésta es la imagen más adecuada para un principiante en progra-
mación.
52
Capı́tulo 2. Funciones y Condicionales
ESPACIO DE MEMORIA
CORRESPONDIENTE A
LA VENTANA DE COMANDOS
function y=ud2_f1(x)
2
y=x -log(x);
RAM
>> x=5;
>> y=ud2_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 2.1 Crea una carpeta llamada ud2 en donde consideres oportuno. Esta será tu carpeta de
trabajo para todos los ejercicios y ejemplos del capı́tulo 2
Ejercicio 2.2 Edita manualmente la función ud2 f1 creando un archivo nuevo con el editor abriéndo-
lo desde la ventana de comandos (con File, New), guárdala en tu carpeta de trabajo y ejecuta:
>>ud2 f1(2.3)
53
Curso básico de programación en MATLAB
R
>>ud2 f1(0.1)
>>ud2 f1(0)
>>ud2 f1(-2.2)
¿Son correctos los resultados? ¿Qué errores o problemas da?
Ejercicio 2.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 2.4 Prueba la función que has creado con un cı́rculo de radio la unidad. Deberı́a devolver
3.1416, aproximación del número π. Pruébala con 2; deberı́a devolver 12.5664 (aproximación de 4π).
% ud2_farea
% primera función con más de un argumento.
% área del rectángulo de lados a y b
function area=ud2_farea(a,b)
area=a*b;
Para invocarla, se nos ocurren estas tres posibilidades, aprovechando lo explicado en la sección
2.3:
>> ud2_farea(2,3)
ans =
6
>> x=3;
>> y=5;
>> ud2_farea(x,y)
ans =
15
>> ud2_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 función, a y b, a través de la lista de argumentos. Finalmente, en la
54
Capı́tulo 2. Funciones y Condicionales
% ud2_fareapol.m
% Area de un polı́gono regular de n lados, y lado l
% Primeras variables propias de la rutina, P,a,
% Las variables no conmutan pues juegan distinto papel
function area=ud2_fareapol(l,n)
P=n*l; % perı́metro
a=l/(2*tan(pi/n));
area=P*a/2;
Esta es la primera función en la que usamos variables estrictamente locales a la función, las
cuales no aparecen en la lista de argumentos de la misma. 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:
>> ud2_fareapol(3,4)
ans =
9.0000
>> ud2_fareapol(4,3)
ans =
6.9282
>> P
??? Undefined function or variable ’P’.
>> a
??? Undefined function or variable ’a’.
>>
Es interesante la posibilidad que ofrece MATLAB de abreviar la llamada a una función; con
escribir ud2_ y pulsar la tecla de tabulador MATLAB muestra todas las funciones y scripts
que comienzan con esos caracteres y es más rápido invocarlos. Los ejercicios correspondientes
a estos ejemplos son los siguientes:
Ejercicio 2.5 Edita manualmente las funciones ud2 farea y ud2 fareapol, guárdalas en tu
carpeta de trabajo y pruébalas desde la ventana de comandos de MATLAB.
Ejercicio 2.6 Crea una función que reciba la base b y la altura h de un triángulo y devuelva su área
A.
55
Curso básico de programación en MATLAB
R
Ejercicio 2.7 Crea una función que reciba la masa m y la velocidad v de un móvil y devuelva la
energı́a cinética Ec.
1
Ec = mv 2
2
Ejercicio 2.8 Crea una función que reciba dos alturas, h1 y h2 y una masa m y devuelva la energı́a
potencial Ep perdida/ganada por dicha masa al caer/subir de h1 a h2 . Se utilizarán unidades del
sistema internacional.
Ep = mg(h1 − h2 ), g = 9.81
Ejercicio 2.9 Consideramos la función ud2 fprueba(1,2,3) siguiente. Sin ejecutarla, calcula
qué valor devolverá si invocamos desde MATLAB ud2 fprueba(1,2,3)?. Razónalo primero y
compruébalo después editando la función y ejecutando esa orden. ¿Conmutan entre sı́ los argumentos
de entrada?
function d=ud2_fprueba(a,b,c)
b=c;
a=b;
d=a+b+c;
Ejercicio 2.10 Crea una función que reciba los tres coeficientes a, b, c, de un polinomio de segundo
grado ax2 + bx + c y devuelva la raı́z
√
−b + b2 − 4ac
x1 = .
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
2x2 + 5x − 3, que tiene como raı́ces −3 y 0.5. ¿Por qué solo aparece una de las dos raı́ces al invocar
la función?
Ejercicio 2.12 Codifica una función que reciba los 3 coeficientes (a, b, c) de un polinomio p(x) =
ax2 + bx + c de segundo grado y un escalar T . La función devolverá la integral definida del polinomio
p evaluada entre 0 y T , es decir
T
T3 T2
Z
p(x)dx = a +b + cT
0 3 2
Ejercicio 2.13 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
56
Capı́tulo 2. Funciones y Condicionales
Por cond1 nos referimos a una condición lógica o combinación de ellas. Ası́, cond1 puede
ser que una variable sea mayor que un determinado valor, igual, mayor o igual (>=) etc. En
caso de que la condición, en tiempo de ejecución, sea cierta, se ejecutarán las sentencias que
hemos identificado como bloque1 y que están entre la sentencia del if y la sentencia end
que cierre dicho bloque.
Dentro de una misma función puede haber varias estructuras condicionales, en principio inde-
pendientes entre sı́, como mostramos también en el mismo esquema.
Es importante para que los códigos sean legibles tabular o indentar las instrucciones corres-
pondientes a una estructura de control 3 o 4 espacios (serán 4 en nuestros ejemplos), como
hemos hecho con bloque1 y bloque2 en el esquema 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 más básica es mediante dos estructuras if, una de las cuales
identifica el mayor de los valores caso de que a y la segunda identifica el mayor caso de que
sea b. En este caso los dos bloques no son en realidad independientes, y veremos más adelante
que esta no es la forma más natural de resolver este problema, aunque se considera adecuado
ahora como ejemplo sencillo para introducir la estructura de control.
57
Curso básico de programación en MATLAB
R
% ud2_fmayorab0
% primer uso del condicional if
% Devuelve el mayor de dos números a,b
% a,b se supondrán diferentes
function mayor=ud2_fmayorab0(a,b)
if a>b
mayor=a;
end
%
if b>a
mayor=b;
end
En el ejemplo anterior, los dos valores a comparar han de ser por hipótesis distintos. Es fácil
comprobar que si los dos valores son iguales, en cuyo caso, habrı́a que devolver cualquiera de
ellos, la función ud2_fmayorab no va a ser capaz de tomar ninguno de ellos como mayor.
Para evitar este pequeño inconveniente, se incluye una variante de esa función que utiliza una
comprobación (>=) en uno de los casos con lo que si los dos valores son iguales tomará uno
de ellos como mayor, que es lo más recomendable.
% ud2_fmayorab1
% primer uso del operador >=
% Devuelve el mayor de dos números a,b
function mayor=ud2_fmayorab1(a,b)
if a>=b
mayor=a;
end
%
if b>a
mayor=b;
end
En la tercera 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. Esta posibilidad es
mejor porque ahorra el cálculo de un condicional.
% ud2_fmayorab2
% Devuelve el mayor de dos números a,b
function mayor=ud2_fmayorab2(a,b)
mayor=a;
if b>a
mayor=b;
end
En la cuarta 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.
58
Capı́tulo 2. Funciones y Condicionales
Esta es la mejor de las posibilidades porque permitirá de modo sencillo la generalización del
algoritmo para encontrar el mayor de una cantidad de números tan grande como queramos.
% ud2_fmayorab3
% Devuelve el mayor de dos números a,b
function mayor=ud2_fmayorab3(a,b)
mayor=a;
if b>mayor
mayor=b;
end
Ejercicio 2.14 Abre el editor de MATLAB y transcribe las funciones ejemplo estudiadas en esta
sección: ud2 fmayorab0, ud2 fmayorab1, ud2 fmayorab2 y ud2 fmayorab3. Guárdalas
en tu carpeta de trabajo y pruébalas.
Ejercicio 2.15 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. Por tanto, se definirá en suma una variable area como
π · r2 , r ≥ 0
area =
−1, r<0
Ejercicio 2.16 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 2.17 (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. Este es un ejercicio muy interesante, extensión
de la última variante de este ejemplo, ud2 fmayorab3.
Ejercicio 2.18 Codifica una función que reciba tres valores supuestos diferentes a, b, c y devuelva el
mayor de ellos elevado al menor. Por ejemplo, si los números son a = 3, b = 4 y c = −1, la función
devolverá 4−1 = 0.25
Ejercicio 2.19 Crea una función que reciba cinco números naturales distintos entre si y devuelva la
√
media geométrica del mayor y del menor. La media geométrica de a y b se define como a · b. Por
√ √
ejemplo, si los números son 2,3,7,4 y 5 entonces la función devuelve 2 · 7 = 14 = 3.7417.
Ejercicio 2.20 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
59
Curso básico de programación en MATLAB
R
Ejercicio 2.22 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 2.23 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
60
Capı́tulo 2. Funciones y Condicionales
Ejercicio 2.24 Codifica una funciónque reciba un número x y devuelva su valor absoluto (sin usar
la función abs ni sqrt, sino mediante condicionales).
Ejercicio 2.25 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
% ud2_ftrozos
% primera funcion q llama a otra funcion
% Devuelve el valor de la función:
% f(x)=x si x<1
% f(x)=xˆ2-ln(x) si x>=1
function y=ud2_ftrozos(x)
if x<1
y=x;
else
y=ud2_f1(x);
end
El concepto de llamar a una función desde otra es muy poderoso y es la base tanto para
resolver grandes problemas como para ser capaz de repartir la escritura de grandes códigos
entre un equipo de programadores. Haremos uso abundante de esta técnica en el libro 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 2.26 Edita manualmente la función ud2 ftrozos, guárdala en tu carpeta de trabajo
y pruébala con los siguientes argumentos de entrada valorando si son correctos los resultados y
encontrando el origen de posibles errores:
61
Curso básico de programación en MATLAB
R
>> ud2_ftrozos(2.3)
>> ud2_ftrozos(1.1)
>> ud2_ftrozos(0)
>> ud2_ftrozos(0.9)
Ejercicio 2.27 Utilizando la función que calcula el área de un rectángulo (ud2 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 un tercio del área de la base por la altura). Por ejemplo la
pirámide de Keops tiene una base cuadrada de 230.5 metros de lado y una altura de 146.6 metros.
Por tanto, su volumen aproximado es de 2.5 millones de metros cúbicos.
Ejercicio 2.28 Usando las funciones de los ejercicios 2.10 y 2.11, crea una función que reciba los tres
coeficientes A, B, C de un polinomio de segundo grado de raı́ces reales (se elegirán los coeficientes
para que ası́ sean) Ax2 +Bx+C y devuelva el producto de las mismas. Prueba con varios polinomios
(el producto de las dos raı́ces ha de ser C/A).
Ejercicio 2.29 (Para los valientes) Codifica una función que reciba los tres coeficientes a0, a1, a2 de
un polinomio de grado 2, a0 +a1 x+a2 x2 . Internamente calculará el discriminante D = a21 −4a0 a2 de
la ecuación a0 + a1 x + a2 x2 = 0 para calcular sus raı́ces. En función del valor de dicho discriminante,
cuando el polinomio tenga raı́ces positivas distintas, devolverá el producto de sus raı́ces calculado
invocando la función del ejercicio 2.28. Cuando las raı́ces tengan parte imaginaria o cuando sea una
raı́z doble, la función devolverá 0 en lugar del producto de las raı́ces.
Ejercicio 2.30 Codifica una función que reciba tres valores x, y y z (que se supondrán diferentes)
y devuelva el mayor de ellos. Se podrá utilizar solo un bloque if-else y una llamada a la función
ud2 fmayorab0
Ejercicio 2.31 Codifica una función que, llamando a ud2 fmayorab0 ,devuelva el máximo de
cuatro valores supuestos distintos. Se utilizará la notación x, y, z, t, para esos valores y M para el
resultado.
Ejercicio 2.32 Crea una función que reciba tres valores x, y, prec y devuelva 1 si la diferencia en
valor absoluto entre x e y es estrictamente menor que prec y 0 en caso contrario. Por ejemplo, si
x = 0.87, y = 0.83 y prec = 0.05, la función devolverá 1. Si x = 0.87, y = 0.83 y prec = 0.01, la
función devolverá 0. Para calcular el valor absoluto se utilizará la función del ejercicio 2.24.
Ejercicio 2.33 (Para valientes) Idem con seis valores. Trata de hacerlo con un único if-else y
utilizando dos veces la función del apartado 2.30.
Ejercicio 2.34 (Para valientes) Idem con siete valores. Trata de hacerlo con el menor número posible
de if-else (ninguno).
Ejercicio 2.35 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
62
Capı́tulo 2. Funciones y Condicionales
function y=nombrefuncion(arg1,arg2,....)
....
....
if cond es cierta
bloque10
if cond1 es cierta
bloque11
end
bloque12
else
bloque2
end
....
....
% ud2_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=ud2_fsigno(n)
if n<0
signo=-1;
else
if n>0
signo=1;
else
63
Curso básico de programación en MATLAB
R
signo=0;
end
end
Hay otras variantes análogas dependiendo de cómo discriminemos los grupos. Es interesante
reformular este ejemplo para introducir (un poco con calzador) una sentencia MATLAB im-
portante, abs, la cual extrae el valor absoluto de un número:
>> abs(-2.5)
ans =
2.5000
>> abs(3.1)
ans =
3.1000
>> abs(0)
ans =
0
% ud2_fsignoabs
% Variante de ud2_fsigno utilizando
% la función propia de MATLAB abs
function signo=ud2_fsignoabs(n)
if n<abs(n)
signo=-1;
else
if n>0
signo=1;
else
signo=0;
end
end
En una tercera variante se hace uso del operador de comparación compuesto mayor o igual
(>=).
% ud2_fsignocomp
% Variante de ud2_fsigno utilizando >=
function signo=ud2_fsignocomp(n)
if n>=0
if n>0
64
Capı́tulo 2. Funciones y Condicionales
signo=1;
else
signo=0;
end
else
signo=-1;
end
Ejercicio 2.36 Transcribe las funciones ud2 fsigno, ud2 fsignoabs y ud2 fsignocomp.
Guárdalas en tu carpeta de trabajo y pruébalas desde la ventana de comandos de MATLAB.
Ejercicio 2.37 Crea una función que reciba un valor x y devuelva el valor y de la función definida
a trozos:
sin(x)
x<0
y= x 0≤x<1
2
x + log(x) x≥1
Para comprobar el resultado, se tiene que si x = −π/2, entonces y = −1. Si x = 0.5, y = 0.5, y si
x = 2, entonces y = 4.6931
function mayor=ud2_fquehace(a,b,c)
mayor=a;
if b>mayor
mayor=b;
if c>mayor
mayor=c;
end
end
Ejercicio 2.39 Se trata de codificar una función que reciba una calificación y devuelva un variable
clave que ha de valer 0 si la calificación es estrictamente menor que 5, 1 si la calificación es mayor
o igual que 5 y menor que 7, 2 si la calificación es mayor o igual que 7 y menor que 9, 3 si la
calificación es mayor o igual que 9 y menor o igual que 10 y y -1 si el argumento de entrada no
está entre 0 y 10 (solución en apéndice).
Ejercicio 2.40 Codifica una función que devuelva el salario semanal de un trabajador en función del
coste hora, c, de las horas que ha trabajado, h, y de un fijo de productividad, p, 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). Por ejemplo, si c = 10, p = 100 y h = 30, el salario es 300. Con
iguales coste hora y productividad pero h = 35, el salario es 450, y si h = 45, el salario es 575.
65
Curso básico de programación en MATLAB
R
donde máx significa máximo. Hay que tener en cuenta que en la definición de ud2 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. Para comprobar
el resultado, se tiene que si x = −π/6, entonces y = −7. Si x = π/3, y = 7, y si x = 0.5, entonces
y = 0.9431
Ejercicio 2.42 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
function y=nombrefuncion(arg1,arg2,....)
....
....
if cond1 es cierta
bloque 1
elseif cond2 es cierta
bloque 2
elseif cond3 es cierta
bloque 3
elseif......
.....
elseif cond n-1 es cierta
bloque n-1
else
bloque n
66
Capı́tulo 2. Funciones y Condicionales
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). Si por error se introduce una calificación que no está entre 0 y 10, la función
devolverá -1. Para codificar este ejemplo, lo primero que comprobamos es si la nota es menor
que 0. Si no lo es, sólo comprobamos si es menor que 5, por que ya sabemos que va a ser
mayor o igual que 0. Los demás casos son análogos.
% ud2_fnotas
% primera vez q usamos el elseif
function clave=ud2_fnotas(nota)
if nota<0
clave=-1;
elseif nota<5
clave=0;
elseif nota<7
clave=1;
elseif nota<9
clave=2;
elseif nota <=10
clave=3;
else
clave=-1;
end
Ejercicio 2.43 Edita manualmente la función ud2 fnotas, guárdala en tu carpeta de trabajo y
pruébala desde la ventana de comandos de MATLAB.
Ejercicio 2.44 Crea una función que reciba un valor x y devuelva el valor y de la función definida
a trozos:
sin(x)
x<0
y= x 0≤x<1
2
x + log(x) x≥1
67
Curso básico de programación en MATLAB
R
Ejercicio 2.45 Codifica una función que 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 2.46 Codifica una función que reciba el salario anual bruto de un trabajador y calcule
el impuesto de la renta de las personas fı́sicas correspondiente a ese salario. Se supondrá que los
primeros 9000e están exentos. Hasta 17360e al año se aplicará una retención del 24 %. Desde
17360 hasta 32360, la retención será del 28 %. Desde 32360, hasta los 52360e anuales, pagaremos
a Hacienda 37 %. Con ingresos anuales superiores a 52360e, el porcentaje se sitúa en el 43 %. Para
probar la función, si el salario son 7000e, el impuesto será 0. Si el salario es 11000e, el impuesto
son 480e. Si son 22000e, el impuesto es de 3305.6e. Si son 40000, el impuesto son 9033.2. Si son
100000, el impuesto será de 34092e.
donde máx significa máximo. En la definición de ud2 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.
Ejercicio 2.48 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
68
Capı́tulo 2. Funciones y Condicionales
>> ud2_fnotas(9.5)
Veremos que nos aparece la ventana del editor con un punto verde a la izquierda de la sentencia
4, la cual todavı́a no se ha ejecutado. Podemos ver aquı́ el valor de una determinada variable,
para lo cual simplemente flotamos con el cursor del ratón encima de la misma, como en la
figura 2.3. Es posible cambiar el valor de la variable en tiempo de ejecución sin más que asignar
un nuevo valor a la misma en la ventana de comandos. Para seguir ejecutando podemos usar
los iconos o pulsar F10. Veremos que vamos saltando los “elseif”hasta llegar a la lı́nea 12,
en la que la condición es cierta y entramos dentro del bloque correspondiente para asignar el
valor 3 a la variable clave. Finalmente, si seguimos pulsando F10 terminaremos la función.
Es posible salirse de este modo pulsando el icono correspondiente (explorar los iconos en la
barra), es posible también entrar dentro de funciones ası́ como borrar todos los breakpoints.
69
Curso básico de programación en MATLAB
R
%% operadores logicos.
function mayor=ud2_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 ||4 , que se
obtiene pulsando 2 veces la combinación de teclas AltGr y la del 1. En los siguientes ejercicios
veremos algún ejemplo de utilización de este operador.
Ejercicio 2.49 Edita manualmente la función ud2 fmayor, guárdala en tu carpeta de trabajo y
pruébala desde la ventana de comandos de MATLAB.
Ejercicio 2.50 Codifica una función que reciba tres valores a, b y c (que se supondrán diferentes) y
devuelva una variable flag que ha de valer 1 si a es el mayor, 2 si b es el mayor, y 3 si lo es c. Por
ejemplo, si a = 2.3, b = 5.1 y c = −3.4, la función devolverá 2.
Ejercicio 2.51 Codifica una función que reciba tres valores a, b y c devuelva el mayor si alguno
de ellos es estrictamente positivo y el menor en caso contrario. Por ejemplo, si a = 2.3, b = 5.1
y c = −3.4, la función devolverá 5.1. Sin embargo, si si a = −2.3, b = −2.1 y c = 0, la función
devolverá -2.3 (solución en apéndice).
3
Se puede usar también solamente &, pero hay ciertos matices que diferencian ambos operadores. Cuando
se usa &&, caso de que la primera condición sea falsa, MATLAB ni siquiera evalúa la segunda dado que ya la
sentencia lógica global va a ser falsa independientemente del valor que tome la segunda condición
4
Se puede usar también solamente |; sin embargo || es más eficiente dado que si la primera condición
es cierta, MATLAB ni siquiera evalúa la segunda dado que ya la sentencia lógica global va a ser cierta
independientemente del valor que tome la segunda condición
70
Capı́tulo 2. Funciones y Condicionales
Ejercicio 2.52 Crea una función que reciba reciba la longitud de los tres lados a, b, c de un triángulo y
devuelva su área A obtenida mediante la fórmula de Herón. Caso de que los tres lados no correspondan
a un triángulo la función devolverá -1. La fórmula de Herón es:
p a+b+c
A= p · (p − a) · (p − b) · (p − c); p=
2
Por ejemplo si los lados son 3/2, 5/3 y 17/6 la función devolverá que el área es 1, y si los lados son
1, 2, 4 devolverá -1.
Ejercicio 2.53 Busca 3 valores a, b y c para los que la siguiente función no devuelva el mayor de
los 3.
function y=ud2_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
Ejercicio 2.54 (Para valientes) ¿Qué errores hay en la siguiente función, la cual se supone que
deberı́a devolver la potencia de los dos segmentos definidos por las tres abscisas a, b, c? La potencia
es 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). 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).
function pot=ud2_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)
71
Curso básico de programación en MATLAB
R
else
pot=(b-c)*(c-a)
end
else
if a>b
pot=(c-a)*(a-b)
else
pot=(c-b)*(b-a)
end
end
Ejercicio 2.55 (Para valientes) Codifica una función que reciba cuatro valores x, y, z, t supuestos
todos diferentes entre sı́, y devuelva el menor de los estrictamente positivos. Si no hay ningún positivo,
la función devolverá 0. Por ejemplo, si x = −2, y = 3, z = 7, t = −1, la función devolverá 3.
Ejercicio 2.56 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
% ud2_figuales
% operador de comprobacion de igualdad
function flag=ud2_figuales(m,n)
if m==n
flag=1;
else
flag=0;
end
5
La comparación para comprobar si dos valores son iguales tiene más matices cuando alguna de las variables
no es un número entero. En realidad el concepto matemático de igualdad entre números no enteros exige tener
en cuenta un umbral para su diferencia, lo cual es más delicado de programar y no será tenido en cuenta en
este texto, en el cual daremos por buena la comparación entre cualquier tipo de variable mediante el operador
aquı́ explicado.
72
Capı́tulo 2. Funciones y Condicionales
% ud2_figualesb
% operador de comprobacion "distinto de"
function flag=ud2_figualesb(m,n)
if m˜=n
flag=0;
else
flag=1;
end
Ejercicio 2.57 Edita manualmente la función ud2 figuales, guárdala en tu carpeta de trabajo
y pruébala, desde la ventana de comandos de MATLAB.
Ejercicio 2.58 Codifica una función que reciba tres números a, b y c y devuelva una variable flag
que ha de valer 1 si son iguales entre si, y 0 en caso contrario.
Ejercicio 2.59 Codifica una función que reciba tres números x, y, z y devuelva una variable flag
que ha de valer 1 si x 6= y, 2 si x = y y y 6= z y 3 si los tres valores son iguales
Ejercicio 2.60 Codifica una función que reciba tres números a, b y c y devuelva una variable flag
que ha de valer 2 si los tres son iguales entre si, 1 si dos de ellos son iguales entre si pero el otro es
diferente, y 0 si los tres son distintos.
Ejercicio 2.62 Codifica una función que reciba tres valores x, y, z supuestos todos diferentes entre
si, y devuelva el del medio. Por ejemplo, si x = −2, y = 3, z = 1, la función devolverá 1.
Ejercicio 2.63 Codifica una función que reciba cuatro valores x, y, z, t supuestos todos diferentes
entre si, y devuelva el segundo mayor. Por ejemplo, si x = −2, y = 3, z = 7, t = 1, la función
devolverá 3.
Ejercicio 2.64 Codifica una función que reciba cinco valores x, y, z, t, s supuestos todos diferentes
entre si, y devuelva el del medio. Por ejemplo, si x = −2, y = 3, z = 7, t = 1, s = 9, la función
devolverá 3.
Ejercicio 2.65 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
73
Curso básico de programación en MATLAB
R
74
Capı́tulo 2. Funciones y Condicionales
Ejercicio 2.67 Modifica la función ud2 fareafig para que también calcule el área del rombo.
Ejercicio 2.69 Codifica una función que reciba un parámetro signo, y los coeficientes a, b y c de
un polinomio de segundo grado. Devolverá la raı́z con el ’+’ en la fórmula si signo es 1 y la raı́z
con el ’-’ si signo es 6= 1. Para calcular estas raı́ces llamaremos a las funciones 2.10 y 2.11. Para
comprobar si tu código es correcto, usa los coeficientes del polinomio 2.34x2 + 4.29x − 3.71, que
tiene como raı́ces −2.4741 y 0.6408.
Ejercicio 2.70 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 2.69. Para
comprobar si tu código es correcto, usa los coeficientes del polinomio 2.34x2 + 4.29x − 3.71, que
tiene como raı́ces −2.4741 y 0.6408, cuya suma es -1.8333 que será lo que devuelva la función.
Ejercicio 2.71 (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.
Ejercicio 2.72 Codifica una función que calcule la factura mensual de un teléfono móvil en euros,
de acuerdo con los siguientes datos:
75
Curso básico de programación en MATLAB
R
Por ejemplo: si las entradas son 25, 180, 16, 2, la función devolverá 16.95e. Si las entradas son 10,
5, 3, 2 no se llega al consumo mı́nimo y la función devolverá por tanto 15e.
Ejercicio 2.73 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
%% ud2_fsumapos
%% primera variable sumadora (x=x+algo)
%% suma de los positivos entre 4 números.
function suma=ud2_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
76
Capı́tulo 2. Funciones y Condicionales
suma=suma+d;
end
Ejercicio 2.75 Codifica una función que reciba 5 números a, b, c, d, y e y devuelva cuántos son
estrictamente positivos.
Ejercicio 2.76 Codifica una función que reciba 5 números x, y, z, t, y s y dos números a y b (con
a 6= b por hipótesis) y devuelva la suma de aquellos números de entre esos 5 que son mayores o
iguales que el mayor de a y b, o menores o iguales que el menor de a y b. Por ejemplo, si x = 7,
y = 11, z = 3, t = −1, y s = 5, y a = 4 y b = 6, la suma en cuestión es 7 + 11 + 3 + (−1) = 20.
Ejercicio 2.77 Codifica una función que reciba 5 números x, y, z, t, y s y dos números a y b (con
a 6= b por hipótesis) y devuelva el producto de aquellos números de entre esos 5 que son mayores o
iguales que el mayor de a y b, o menores o iguales que el menor de a y b. Por ejemplo, si x = 7,
y = 11, z = 3, t = −1, y s = 5, y a = 4 y b = 6, el producto en cuestión es 7 · 11 · 3 · (−1) = −231.
Ejercicio 2.78 Codifica una función que reciba 5 números x, y, z, t, y s y un número a y devuelva
la media aritmética de aquellos que son mayores que a. Si no hay ninguno, devolverá 0. Por ejemplo,
si x = 7, y = 11, z = 3, t = −1, y s = 5, y a = 4, la media en cuestión es (7 + 11 + 5)/3 = 7.6666.
Ejercicio 2.79 Codifica una función que reciba 5 números x, y, z, t, y s y un número a > 0, por
hipótesis, y devuelva la media geométrica de aquellos que son mayores que a. Si no hay ninguno,
devolverá 0. Por ejemplo, si x = 7, y = 11, z = 3, t = −1, s = 5, a = 4, la media en cuestión es
(7 · 11 · 5)(1/3) = 7.2748 (solución en apéndice).
Ejercicio 2.80 Codifica 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 . Si no hay ninguno, devolverá 0. Por ejemplo, si los números son, -7, 12, 4, -3,
-6 y ref vale 3.7, la suma serı́a -7-6-=-13.
Ejercicio 2.81 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
77
Curso básico de programación en MATLAB
R
% ud2_fesentero
% comprueba si un numero x es entero (funcion floor)
function flag=ud2_fesentero(x)
if x==floor(x)
flag=1;
else
flag=0;
end
Ejercicio 2.83 Codifica una función que reciba 4 números a, b, c, d y devuelva la suma de los que
entre ellos son enteros. Por ejemplo, si los números son 6.3, −4, 5.4, −7, la función devolverá -4-
7=-11 (solución en apéndice).
Ejercicio 2.84 Codifica una función que reciba un número natural n y devuelva una variable flag
que valga 0 si n es par y 1 si n es impar.
Ejercicio 2.85 (Para valientes) Codifica 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 o aquellos tales que no siendo enteros,
su parte entera es múltiplo de n. Por ejemplo, si los números son 6.3, −4, 5.4, −7.2 y n = 2, la
función devolverá 6.3-4-7.2=-4.9 (solución en apéndice).
Ejercicio 2.86 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
78
Capı́tulo 3
Bucles
3.1. General
Como ya se indicó al comienzo del capı́tulo 2, el capı́tulo 3 contiene junto con aquel la mayorı́a
de las herramientas que un alumno va a tener que utilizar a lo largo de este curso, y para ello
nos centraremos en la estructura de control más importante: el bucle. El bucle permite ejecutar
de modo repetido bloques de instrucciones sin que estas tengan que aparecer codificadas de
modo repetido. Los bucles junto con los condicionales representan la base de la programación
estructurada.
Uno de los objetivos de este curso es que los estudiantes adquieran habilidades referidas a
la depuración de códigos, cuando estos no funcionen o funcionen pero no proporcionen el
resultado correcto. Aunque ya hemos introducido la herramienta de depuración en la sección
2.10, el capı́tulo que que ahora comienza es muy adecuado para profundizar en estos aspectos,
dada la importancia que tiene la posición de determinadas sentencias dentro del código, las
cuales afectan a veces no tanto al funcionamiento del mismo como a su funcionamiento
correcto.
3.2. Bucles
3.2.1. General
En muchos problemas abordados desde una metodologı́a cientı́fica se requiere repetir o iterar
un mismo procedimiento. Por ejemplo, un ingeniero tendrá que ver como responde un sistema
fı́sico para diversos valores de una de las variables de las que depende. Esta es una tarea
repetitiva y susceptible de ser automatizada mediante un bucle. Es por ello que todos los
lenguajes de programación contienen la posibilidad de crear bucles que permitirán realizar una
misma tarea repetidas veces. Los bucles se utilizan para ejecutar un bloque de instrucciones,
conocidas como cuerpo del bucle, de forma reiterada sin tener que repetir varias veces el mismo
código, lo cual podrı́a ser imposible de codificar cuando el número de veces a repetir la tarea
79
Curso básico de programación en MATLAB
R
Durante este capı́tulo y gran parte del libro implementaremos los bucles mediante la utilización
adecuada de la sentencia while y de su sentencia de cierre correspondiente end. Hay otra
sintaxis posible para los bucles, utilizando la sentencia for, que veremos en el capı́tulo 6. El
cuerpo de un bucle (sentencias entre while y end) se ejecutará mientras la condición que
acompaña a la sentencia while sea cierta, de acuerdo con el siguiente esquema.
function y=nombrefuncion(arg1,arg2,....)
....
....
while cond sea cierta
cuerpo del bucle
end
....
....
En los primeros bucles que utilizaremos se define una variable entera que controla mediante
incrementos o decrementos la evolución del bucle. A esa variable entera se la conoce como
ı́ndice del bucle e irá cambiando su valor a medida que se pasa una y otra vez sobre el cuerpo
del bucle.
La gran ventaja de los bucles escritos mediante el uso de la sentencia while frente a otras
formas de escribir un bucle (sentencia for) 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. Sin embar-
go, un eventual error de programación podrı́a llevar a que el ı́ndice nunca llegase a cumplir la
condición que pare la ejecución del bucle. Cuando en programación nos encontramos con un
bucle en la que la condición de corte o ruptura no se llega a dar, nos referimos a él como bucle
infinito. Este error conlleva que no vuelva a aparecer el sı́mbolo tı́pico >> que nos indica que
la anterior ejecución ha finalizado. En estos casos MATLAB da al usuario la oportunidad de
reaccionar y cortar el proceso pulsando “CTRL+C”. Es posible que tras entrar en un bucle
infinito MATLAB pierda su estabilidad e interrumpa su funcionamiento normal, algo que colo-
quialmente denominamos “cuelgue del programa”.
80
Capı́tulo 3. Bucles
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 por haber superado el ı́ndice el valor n, la variable suma
contendrá el valor resultante de la suma de los n primeros números naturales.
%ud3_fsuma
% Suma de todos los naturales entre 1 y n
% primer bucle
function suma=ud3_fsuma(n)
suma=0;
i=1;
while i<=n
suma=suma+i;
i=i+1;
end
Se puede introducir la sentencia pause dentro del bucle y eliminar el punto y coma al final de
las sentencias en el cuerpo del bucle para comprobar la evolución de las variables en el mismo:
function suma=ud3_fsuma(n)
suma=0;
i=1;
while i<=n
suma=suma+i
i=i+1
pause
end
Este tipo de técnicas permiten corregir errores asociados a un mal posicionamiento o ini-
cialización de determinadas variables. Ası́, si cambiamos de orden las sentencias dentro del
bucle, podemos comprobar por qué el resultado obtenido finalmente es incorrecto. Mediante
los siguientes ejercicios se podrá afianzar el concepto de bucle.
Ejercicio 3.1 Crea una carpeta llamada ud3 en donde consideres oportuno. Esta será tu carpeta de
trabajo para todos los ejercicios y ejemplos del capı́tulo 3.
Ejercicio 3.3 Codifica una función que reciba dos números naturales, m y n, con m < n por
hipótesis, y devuelva la suma de los naturales entre m y n, incluyendo en dicha suma a m y n. Por
ejemplo, si m = 3 y n = 5 el resultado será 3 + 4 + 5 = 12.
Ejercicio 3.4 Ídem sin usar bucles y llamando a la función ud3 fsuma.
81
Curso básico de programación en MATLAB
R
Ejercicio 3.5 Codifica una función que reciba un número natural, n y devuelva la media de la función
seno evaluada en los naturales entre 0 y n, ambos inclusive.
Ejercicio 3.6 (Para valientes) Codifica 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
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. Para vuestra comprobación, si a = 0,
b = 2 y n = 2, el resultado deberı́a ser 0.5836.
Ejercicio 3.7 (Para valientes) Codifica 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 (ambos inclusive). Hay que tener en cuenta que los diferentes tramos de
la poligonal pueden tener por supuesto distinta longitud. Por ejemplo, si a = 0, b = 1.5708 y n = 3,
los puntos considerados son 0, 0.5236, 1.0472 y 1.5708, cuyas ordenadas son 0, 0.5, 0.866 y 1. La
coordenada y del centro de gravedad de estos puntos considerados de igual masa es 0.5893 (solución
en apéndice).
Ejercicio 3.8 (Para valientes) Codifica 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
tienen como base h = (b − a)/n y como altura sin(xi ), con xi = a + i ∗ h, 0 ≤ i < n. Por ejemplo,
si a = 0, b = 1.5708 y n = 3, los puntos considerados son 0, 0.5236 y 1.0472, cuyas ordenadas son
0, 0.5 y 0.866. La coordenada y del centro de gravedad de los rectángulos que tienen como altura
esos puntos es 0.3660 (solución en apéndice). La solución analı́tica a este problema (0.3927) pasa
por evaluar la integral siguiente, algo que podéis intentar utilizando las herramientas simbólicas de
MATLAB, introducidas en la sección 1.10
R π/2
0 0.5 sin2 (x)dx
ycg = R π/2
0 sin(x)dx
Ejercicio 3.9 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
82
Capı́tulo 3. Bucles
Ejercicio 3.11 Codifica una función que reciba un número natural, n, y devuelva la suma de los
impares entre 1 y n inclusive. Por ejemplo, si n = 7, la suma de impares hasta n es 1+3+5+7=16
Ejercicio 3.12 Codifica una función que reciba un número natural, n, y devuelva la suma de los
múltiplos de 3 entre 1 y n inclusive. Por ejemplo, si n = 7, la suma buscada es 9.
Ejercicio 3.13 (Para valientes) Codifica una función que reciba un número natural n y 3 números
reales a, b, c. Se trata de calcular la media de los impares menores o iguales que n. Se calculará cuál
de los tres valores - a, b o c - tiene una diferencia en valor absoluto con la media más pequeña.
Se devolverá ese valor. Por ejemplo, si n = 7, la suma de los impares es 1 + 3 + 5 + 7 = 16, y la
media es 16/4 = 4. Si a = 7.1, b = 5.5, c = 2.3, tenemos que |7.1 − 4| = 3.1, |5.5 − 4| = 1.5 y
|2.3 − 4| = 1.7. Por tanto, el valor de los tres que está más cerca de la media es b = 5.5 y la función
devolverá este valor.
Ejercicio 3.14 (Para valientes) Codifica una función que reciba un número natural n y devuelva
una variable flag que valga 0 si n es par y 1 si n es impar. No se podrá usar la orden floor, ni
llamar a ninguna función.
Ejercicio 3.15 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
83
Curso básico de programación en MATLAB
R
n! = n · (n − 1) · (n − 2) . . . 3 · 2
Otra variante interesante que introduce este ejemplo respecto a los anteriores es que el ı́ndice
recorre valores decrecientes.
% ud3_ffactorial
% Calcula factorial de n
function fact=ud3_ffactorial(n)
fact=1; % factorial de 0 es 1 por definición.
i=n;
while i>=2
fact=fact*i;
i=i-1;
end
Ejercicio 3.16 Prueba la función ud3 ffactorial. Compara los valores que obtienes con ella
con los que obtienes usando la función propia de MATLAB factorial.
Ejercicio 3.17 ¿Qué devuelve la siguiente función? Sin ejecutarla, trata de calcular qué devolverı́a
ud3 fprueba(2,15,3). Compruébalo con MATLAB.
function y=ud3_fprueba(m,n,k)
y=1;
i=m;
while i<=n
y=y*i
i=i+k;
end
Ejercicio 3.18 Codifica una función que reciba x y n con n natural y devuelva xn , para lo cual no
se podrá usar el operador ∧ sino que se ha de repetir la operación x · x · · · · x mediante un bucle el
número de veces que sea necesario. Por ejemplo, si x = 3 y n = 4 el resultado ha de ser 81.
84
Capı́tulo 3. Bucles
Para calcular cada uno de los términos de la suma, se llamará a la función del ejercicio 3.18 como
corresponda. Por ejemplo, si x = 3 y n = 4, el resultado es 31 + 32 + 33 + 34 = 120.
Ejercicio 3.20 (Para valientes) Codifica una función que reciba x y n, y calcule:
n
X
xi
i=1
No se podrá usar el operador ∧ ni llamar a ninguna función y solo se podrá usar un bucle. Por
ejemplo, si x = 3 y n = 4, el resultado es 31 + 32 + 33 + 34 = 120.
Ejercicio 3.21 Codifica una función que reciba 2 números naturales m y j siendo j < m, y devuelva,
utilizando un solo bucle y sin llamar a ninguna función, el resultado de la siguiente operación:
m!
(m − j)!
Ejercicio 3.22 Codifica una función que reciba 2 números naturales n y m siendo n < m, y devuelva
la suma
m
!
X m
i=n
i
donde !
m m!
= , 0! = 1
i i!(m − i)!
Ejercicio 3.23 ¿Qué calcula la siguiente función? Sin ejecutarla, trata de deducir cuánto vale
ud3 fguess(2,5). Compruébalo con MATLAB.
function suma=ud3_fguess(x,n)
suma=0;
i=1;
pot=x;
while i<=n
suma=suma+pot;
pot=pot*x;
i=i+1;
end
85
Curso básico de programación en MATLAB
R
Codifica una función que reciba un número natural n y devuelva la aproximación de π mediante los
n + 1 primeros sumandos de la expresión anterior (solución en apéndice). Por ejemplo, si n = 3, los
sumandos y el resultado son:
1 1 1
4 1− + − = 2.8952
3 5 7
Ejercicio 3.25 Crea una función que dado un natural n, devuelva el error que se comete al sustituir
n
X 1
π/4 por la serie (−1)i , es decir
2i + 1
i=0
n
X
i 1
error = π/4 − (−1)
2i + 1
i=0
La alternancia de signo se debe conseguir sin utilizar ∧. No se podrá llamar a ninguna función.
Ejercicio 3.26 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
1
Isaac Newton (1642-1727). Fue el creador de la fı́sica moderna, y de influencia por tanto decisiva en el
desarrollo de la humanidad. Nació en una granja en Lincolnshire, al oeste de Inglaterra, el dı́a de Navidad de
86
Capı́tulo 3. Bucles
x2i − 81
xi+1 = xi −
2xi
% ud3_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=ud3_fnewton(a,n)
x=a;
i=2;
while i<=n
x=x-(xˆ2-81)/(2*x);
i=i+1;
end
Ejercicio 3.28 Codifica una función que reciba un número natural n y devuelva el término n-ésimo
de la sucesión
√
xi+1 = 2xi , i ∈ N, x1 = 3.57
1642. Su padre habı́a muerto dos meses antes y su madre pronto se volvió a casar dejando a Newton al cuidado
de sus padres. Su infancia fue solitaria e influyó en su carácter introvertido y en la tendencia al secretismo
que luego se mostró a lo largo de su vida, especialmente en la resistencia a publicar sus monumentales
descubrimientos que guardó para sı́ mismo durante larguı́simos periodos de tiempo.
En 1661 Newton dejó Lincolnshire para seguir sus estudios en Cambridge. El periodo 1661-1665 de sus
estudios de grado fue irrelevante pero en 1665 regresó a pueblo natal huyendo de la peste que habı́a obligado
a cerrar las universidades. Allı́, en la soledad del campo, se produjo un arrebato de creatividad incomparable,
de dos años de duración, entre los 22 y los 24 años, en el que descubrió el cálculo diferencial, la composición
de la luz blanca y la ley de gravitación universal.
Fue un soltero de gustos simples, muy sensible a las crı́ticas que le producı́an amargos resentimientos y
enfados. Como reacción a las crı́ticas de Robert Hooke (el de la ley del muelle) a finales de 1670 escribió, en
otro periodo de 18 meses de concentración increı́ble, su trabajo más importante, el Principia Mathematica,
donde enunció las leyes de la dinámica (fuente: http://www-history.mcs.st-and.ac.uk/).
87
Curso básico de programación en MATLAB
R
√ √
Si por ejemplo n = 3, x2 = 2x1 = 2.6721, x3 = 2x2 = 2.3117 que es lo que devolverá la función.
Prueba con valores de n más grande. ¿A qué valor parece converger la sucesión cuando n tiende a
∞?
Ejercicio 3.29 Codifica una función que reciba un número natural n, con n ≥ 2 por hipótesis, y
devuelva |xn − xn−1 |, siendo xn y xn−1 los términos n y n − 1 de la sucesión del ejercicio 3.28. No
se podrá llamar a ninguna función y solo se podrá usar un bucle. Por ejemplo, si n = 5, el resultado
ha de ser 0.0765 (solución en apéndice).
Ejercicio 3.30 Codifica una función que reciba un número natural n, con n ≥ 3 por hipótesis, y
devuelva el n-ésimo término de la sucesión de Fibonacci2 .
xn = xn−1 + xn−2 , x1 = 1, x2 = 1.
Ejercicio 3.31 Modifica el ejemplo 3.30 para que reciba un número natural n, con n ≥ 3 por
hipótesis, y dos números x1 y x2 y devuelva el término n-ésimo de la sucesión de Fibonacci iniciada
por esos valores. Por ejemplo, si x1 = −0.5, x2 = 1 y n = 6, los términos de la sucesión son -0.5, 1,
0.5, 1.5, 2, 3.5 y función devolverá 3.5.
Ejercicio 3.32 Codifica una función que reciba un número natural n (con n ≥ 4 por hipótesis), tres
valores x1 , x2 , y x3 , y devuelva el n-ésimo término de la siguiente sucesión:
x4 = −x3 + x2 + x1 = 3 − 1 + 4 = 6,
2
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 engendra a su vez un nuevo par(ver fig. 3.1)?
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 (fuente: http://www-
history.mcs.st-and.ac.uk/).
88
Capı́tulo 3. Bucles
y para n = 5 tendrı́amos:
x5 = −x4 + x3 + x2 = −6 − 3 − 1 = −10.
Ejercicio 3.33 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
Como ejemplo de lo dicho vamos a combinar un bucle y un condicional para contar los divisores
de un número natural n. Para comprobar si un número es divisor de otro utilizaremos la función
propia de MATLAB mod, que devuelve el resto de la división entera entre dos números. Ası́ por
ejemplo:
>> mod(14,6)
ans =
89
Curso básico de programación en MATLAB
R
2
>> mod(14,7)
ans =
0
Para contar los divisores se recorrerán todos los potenciales candidatos a divisor, o sea los
números naturales que van desde 1 a n. Se comprobará si cada uno de esos números verifica
la condición, en cuyo caso, la variable de conteo cont se incrementa en una unidad. Si no se
verifica la condición, dicha variable no se modifica.
% ud3_fcuentadiv
% ud3_fcuentadiv(n) cuenta los divisores de n
% primer uso de mod, y primer condicional dentro de un bucle.
function cont=ud3_fcuentadiv(n)
cont=0;
i=1;
while i<=n
if mod(n,i)==0
cont=cont+1;
end
i=i+1;
end
Ejercicio 3.34 Copia el ejemplo ud3 fcuentadiv a tu carpeta de trabajo. Pruébalo con algunos
valores y comprueba que los resultados son correctos.
Ejercicio 3.35 Codifica una función que devuelva el número de divisores impares de un número
natural n. Por ejemplo, si n = 50, la respuesta es 3, dado que 50 tiene como divisores a 1, 2, 5, 10,
25 y 50, de los cuales 3 son impares.
Ejercicio 3.36 Codifica una función que reciba un número natural n y devuelva una variable flag
que ha de valer 0 si n es par y 1 si n es impar. Se usará la orden mod.
Ejercicio 3.37 Codifica una función que reciba un número natural n, con n > 1 por hipótesis, y
devuelva el divisor máximo estrictamente menor que n. Por ejemplo, si n = 12, el resultado serı́a 6,
mientras que si n = 7, el resultado serı́a 1.
Ejercicio 3.38 Codifica una función que reciba un número x, sume los números naturales estricta-
mente menores que x que son pares y no son múltiplos de 3 entre 1 y x y devuelva ese valor. Por
ejemplo, si x = 10.47, la función devolverá 24, pues 2,4,8,10 son pares, no son múltiplos de 3, y son
menores que 10.47.
90
Capı́tulo 3. Bucles
Ejercicio 3.39 Codifica una función que reciba dos números naturales a y b y devuelva una variable
flag que ha de valer 1 si a y b son una pareja de números amigos, y 0 en caso contrario. Se dice
que dos números a y b son una pareja de números amigos si la suma de los divisores propios3 de a
dividida por a es igual a la suma de los divisores propios de b dividida por b.
Por ejemplo, si a = 30 y b = 140 entonces la función deberı́a devolver 1, ya que la suma de los
divisores propios de 30 es 1 + 2 + 3 + 5 + 6 + 10 + 15 = 42 y la suma de los divisores propios de
140 es 1 + 2 + 4 + 5 + 7 + 10 + 14 + 20 + +28 + 35 + 70 = 196. Como se tiene que 42/30 = 1.4
es igual a 196/140, se puede ver que (30, 140) son una pareja de números amigos. También deberı́a
devolver 1 si a = 6 y b = 28. Por otro lado, si a = 8 y b = 12 la función deberı́a devolver 0 ya que
no son pareja de números amigos.
Ejercicio 3.40 Codifica una función que reciba un número natural n, recorra los valores
y devuelva el número de ellos que son positivos. Por ejemplo, si n = 5, hay 3 positivos.
Ejercicio 3.41 Codifica una función que reciba un número n, recorra los valores
y devuelva el producto de los que son positivos. Por ejemplo, si n = 5, el producto es 0.1080.
Ejercicio 3.42 La siguiente función recibe un número n y deberı́a devolver el número de valores
entre 1 y n para los que el seno es mayor que 0.5 menos el número de aquellos para los que es menor
que -0.5. Corrı́gela para que funcione correctamente.
function c=ud3_fprueba2(n)
i=1;
while i<=n
if sin(i)>0.5
c=c+1;
else
c=c-1;
end
i=1+1;
end
Ejercicio 3.43 Codifica una función que reciba dos números naturales m, n y devuelva la cantidad
de divisores comunes. Por ejemplo, m = 14 y n = 6 tienen dos divisores comunes, el 2 y el 1.
3
Los divisores propios de un números son los divisores del número sin incluir el propio número e incluyendo
el 1.
91
Curso básico de programación en MATLAB
R
Ejercicio 3.44 Codifica una función que reciba dos números naturales m y n. La función devolverá el
resultado de dividir el factorial de su suma por el número de divisores comunes. Por ejemplo, si m = 4
y n = 6, tienen 2 divisores comunes, el 1 y el 2. El factorial de la suma de 4 y 6 es el factorial de 10,
que es 3628800. El resultado de dividir este valor por 2 es 1814400 que habrı́a de ser el resultado de
la función en este caso.
Ejercicio 3.45 (Para valientes) Codifica una función que reciba dos números naturales m y n, y
devuelva su máximo común divisor mcd. Por ejemplo, si m = 12 y n = 18, mcd = 6 (solución en
apéndice).
Ejercicio 3.46 (Para valientes) Codifica una función que reciba dos números naturales m y n, y
devuelva su mı́nimo común múltiplo mcm. Por ejemplo, si m = 12 y n = 18, mcm = 36 (solución
en apéndice).
Ejercicio 3.47 (Para valientes) Codifica una función que reciba 3 naturales m, n, p y devuelva una
variable flag tal que flag=1 si el mı́nimo de los máximos comunes divisores entre dos de estos
números corresponde a la pareja m, n; flag=2 si corresponde a la pareja m, p y flag=3 si es n,
p. Si por ejemplo m = 20, n = 30, p = 15, flag valdrı́a 2.
Ejercicio 3.48 Repetir el ejercicio 3.47 pero sin llamar ahora a ninguna función, en particular a la
del ejercicio 3.45.
Ejercicio 3.49 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
4
En Matemáticas, no se considera que 1 sea un número primo para mantener la propiedad de que la
descomposición de naturales como producto de primos es única. Ası́, 12=2*2*3, y esta descomposición es
única. Si el 1 se considerase como primo, obviamente esta propiedad deja cumplirse dado que podemos
multiplicar por uno tantas veces como queramos sin cambiar el resultado final del producto. En este libro, sin
embargo, para hacer menos engorroso este ejemplo, hacemos notar que la función tal como está codificada
considerará al 1 como primo
92
Capı́tulo 3. Bucles
que en el caso anterior, el bucle cumple la función de recorrer todos los posibles candidatos
que pueden cumplir una condición, en este caso ser divisor del argumento numero. Ası́, basta
con que la condición en el cuerpo del bucle 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.
% ud3_fesprimo
% ud3_fesprimo(numero) devuelve 1 si numero es primo
% y 0 si no lo es
% orden break.
function primo=ud3_fesprimo(numero)
primo=1;
i=2;
while i<=sqrt(numero)
if mod(numero,i)==0
primo=0;
break;
end
i=i+1;
end
Es interesante notar que cualquier número no primo tiene divisores menores o iguales que su
raı́z cuadrada. Si un número no los tiene es que es primo. Por eso el ı́ndice del bucle solo
llega hasta la raı́z del número analizado. Los ejercicios correspondientes a este ejemplo son los
siguientes:
Ejercicio 3.51 Codifica una función que reciba un número natural n y devuelva su divisor de valor
máximo, excluyendo al propio n. Por ejemplo, si n = 27, su divisor de valor máximo es 9. Para ello,
se montará un bucle que arranque en n − 1 y vaya bajando hasta que encuentre un divisor de n,
rompiendo el bucle en ese momento y devolviendo ese valor.
Ejercicio 3.53 Codifica una función que reciba dos enteros m, n, con m < n por hipótesis, y de-
vuelva el menor número entero r entre m y n (ambos inclusive) tal que sin(r) > 0 (se usará break).
Si no hubiese ninguno, la función devolverá 0. Por ejemplo, si m = 16 y n = 27 el resultado debe
ser 19 ya que sin(16) = −0.2, sin(17) = −0.9, sin(18) = −0.7, y sin(19) = 0.1.
Ejercicio 3.55 Codifica 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.
93
Curso básico de programación en MATLAB
R
Ejercicio 3.57 Utilizando la función ud3 fcuentadiv, construye una función que haga lo mismo
que ud3 fesprimo.
Ejercicio 3.58 Codifica una función que calcule el número de primos menores o iguales que un
número natural n, llamando a ud3 fesprimo. Por ejemplo, si n = 10, los primos menores o
iguales que n son 2,3,5 y 7. La función devolverı́a por tanto 4.
Ejercicio 3.59 Codifica una función que calcule la suma de de los primos menores o iguales que un
número natural n. Por ejemplo, si n = 10, los primos menores o iguales que n son 2,3,5 y 7, cuya
suma es 17, que es lo que debe devolver la función.
Ejercicio 3.60 Codifica una función que reciba dos naturales estrictamente positivos por hipótesis,
m y n, con m < n por hipótesis, y devuelva la suma de los números primos entre m y n, ambos
inclusive. Por ejemplo si m = 17 y n = 27, los primos entre ambos son 17, 19 y 23, cuya suma es
59.
Ejercicio 3.61 Codifica una función que reciba dos naturales estrictamente positivos por hipótesis,
m y n, con m < n por hipótesis, y devuelva el producto de los números primos entre m y n. Por
ejemplo si m = 17 y n = 27, los primos entre ambos son 17, 19 y 23, cuyo producto es 7429.
Ejercicio 3.62 Codifica una función que reciba dos naturales, m y n, con m < n por hipótesis, y
devuelva el mayor número primo entre m y n, ambos inclusive. (Para valientes) Hacerlo sin usar
break. Si no hubiere ningún primo, la función devolverá 0. Por ejemplo si m = 17 y n = 27, los
primos entre ambos son 17, 19 y 23 siendo el más grande el 23.
Ejercicio 3.63 Codifica una función que reciba dos naturales, m y n, con m < n por hipótesis, y
devuelva el menor número primo entre m y n, ambos inclusive. (Para valientes) Hacerlo sin usar
break. Si no hubiere ningún primo, la función devolverá 0. Por ejemplo si m = 17 y n = 27, los
primos entre ambos son 17, 19 y 23 siendo el más pequeño el 17.
Ejercicio 3.64 (Para valientes) Codifica una función que reciba un número num y devuelva una
variable flag que ha de valer 1 si num 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.
Ejercicio 3.65 (Para los más valientes) Este ejercicio está inspirado en la estupenda novela de Mark
Haddon, The curious incident of the dog in the night-time, publicada en el año 2003. Codifica una
función que reciba un número n y devuelva el mayor primo menor o igual que n terminado en 3 tal
que el primo anterior termine en 1 y tal que la diferencia entre ambos sea 2. Por ejemplo, si n = 55,
la respuesta serı́a 43.
Ejercicio 3.66 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
94
Capı́tulo 3. Bucles
% ud3_fdigitos.m
% Cuenta los digitos de n natural mayor que 0.
% Bucle con condicion no relativa a un indice.
function cont=ud3_fdigitos(n)
cont=0;
while n>=1
n=n/10;
cont=cont+1;
end
Otro ejemplo, un poco más complicado, es contar los elementos de la sucesión de Fibonacci
menores que cierto número r. La sucesión estará iniciada por x1 y x2 , supuestos estrictamente
positivos y menores que r. A priori, no se sabe cuántos términos de la sucesión van a cumplir
esa propiedad, ası́ que no se puede crear un bucle con un ı́ndice de 1 a un determinado n con
la seguridad de que vamos a recorrer todos los términos posibles menores que r (hay que tener
en cuenta que x1 y x2 pueden ser números tan pequeños como queramos, por ejemplo, 0.0023
y 0.0001). La manera de resolver este problema es implementar esa condición directamente
en el while del bucle. Es decir, el bucle estará corriendo mientras que los elementos de la
sucesión sean menores que r. Concretamente:
% ud3_ffibonacci.m
% devuelve el numero de términos de la sucesion de
% Fibonacci menores que r
% (iniciada por x1, x2 positivos, con x1<r, x2<r)
function cont=ud3_ffibonacci(x1,x2,r)
x3=x1+x2;
cont=2;
while x3<r
cont=cont+1;
95
Curso básico de programación en MATLAB
R
x1=x2;
x2=x3;
x3=x1+x2;
end
A continuación se presentan algunos ejercicios que inciden en la misma idea que el ejemplo
expuesto:
Ejercicio 3.67 Prueba las funciones ud3 fdigitos y ud3 ffibonacci con algunos valores y
comprueba que los resultados son correctos.
Ejercicio 3.68 Codifica una función que reciba un número num ≥ 2, y devuelva el primer elemento
xn de la sucesión de Fibonacci xn = xn−1 + xn−2 , con x1 = 1 = x2 = 1, tal que xn sea mayor o
igual que num. Por ejemplo, si num = 18, la función devolverá 21, pues los términos de la sucesión
de Fibonacci son 1, 1, 2, 3, 5, 8, 13, 21, 34, . . . , y el primero mayor o igual que 18 es 21.
Ejercicio 3.69 Escribe una función que reciba un número natural n, con n ≥ 2 por hipótesis, y
calcule la media aritmética de los elementos de la sucesión de Fibonacci (con x1 = 1 y x2 = 1)
que son menores o iguales que n. Por ejemplo, si n = 15, los elementos de la sucesión de Fibonacci
menores que 15 son 1, 1, 2, 3, 5, 8 y 13 y su media es
Ejercicio 3.70 Crea una función que reciba un número natural n, con n ≥ 2 por hipótesis, y devuelva
el número de elementos de la sucesión de Fibonacci (con x1 = 1 y x2 = 1) que son primos y menores
que n. Por ejemplo, si n = 100 la función deberı́a devolver 5 ya que los elementos de la sucesión de
Fibonacci menores que 100 son 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 y 89 y de ellos solamente 2, 3, 5, 13
y 89 son primos. La función devolverá por tanto 5.
Ejercicio 3.71 (Para valientes) Codifica una función que reciba tres números estrictamente positivos
p, q y r, y devuelva una variable flag que ha de valer 1 si r pertenece a la sucesión de Fibonacci
iniciada por p y q y 0 en caso contrario. O sea:
xn = xn−1 + xn−2 , x1 = p, x2 = q
Por ejemplo, si p = 0.2, q = 0.5 y r = 1.2, la respuesta es 1, mientras que si r = 1.5, la respuesta
ha de ser 0.
Ejercicio 3.72 Codifica una función que reciba dos números naturales m y n, con 1 < m < n por
hipótesis, y que cuente el número de veces que m divide a n. Si m no es divisor de n la función
deberá devolver 0. Por ejemplo, si m = 2 y n = 8, el resultado es 3. Si m = 2 y n = 9 , el resultado
es 0.
96
Capı́tulo 3. Bucles
Ejercicio 3.73 Codifica 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)
(solución en apéndice).
Ejercicio 3.74 Dado un número natural n escribir una función que halle la media aritmética de los
dı́gitos de n. Es decir, si n = 204 entonces la función ha de devolver (2 + 0 + 4)/3 = 2.
Ejercicio 3.75 (Para valientes) Construir una función que reciba dos naturales m, n, con m entre 0
y 9 ambos inclusive. La función devolverá el número de veces que aparece m entre los dı́gitos de n.
Por ejemplo, si n = 304, y m = 0 el resultado será 1, pero si m = 7, el resultado será 0.
Ejercicio 3.76 Hay números de 5 dı́gitos del tipo abbbb tales que cuando los elevas al cuadrado y
les sumas o restas 1 queda un número que tiene 10 dı́gitos todos diferentes entre sı́. Por ejemplo
Codifica una función que reciba dos naturales a, b, con 0 ≤ a, b ≤ 9, y compruebe si el número abbbb
es de ese tipo, devolviendo una variable flag que valga 1 o 0 dependiendo de que lo sea o no.
Ejercicio 3.77 Considérese la serie del ejercicio 3.24 cuya suma es π. Es decir, las sumas parciales
1 1 1
Sn = 4 1 − + + · · · + (−1)n
3 5 2n + 1
son aproximaciones del número π que van mejorando a medida que n es más grande.
Escribe una función que dado un valor err devuelva el número aprox que será la primera suma parcial
Sn tal que aproxime a π con un error menor err es decir |Sn − π| < err. Por ejemplo, si err = 0.15,
dado que los términos de la sucesión Sn son 4.0000, 2.6667, 2.8952, 3.3397, 2.9760, 3.2837, 3.0171,
3.2524, la función devolverá 3.2837, pues es el primer término para el que |3.2837 − π| < 0.15.
Ejercicio 3.78 Codifica una función que reciba un valor real positivo prec, obtenga términos de la
sucesión
√
xi+1 = 2xi , x1 = 8.32, i ∈ N
y devuelva el primer xi para la que |xi − xi−1 | < prec. Por ejemplo, en la siguiente tabla se muestran
los valores de xi para i = 1, . . . , y de los correspondientes |xi − xi−1 |. Si la precisión es prec = 0.05
la primera vez que |xi − xi−1 | < 0.05 es para i = 7, ası́ que la función ha de devolver x7 = 2.0450.
97
Curso básico de programación en MATLAB
R
i xi |xi − xi−1 |
1 8.3200
2 4.0792 4.2408
3 2.8563 1.2229
4 2.3901 0.4662
5 2.1864 0.2037
6 2.0911 0.0953
7 2.0450 0.0461
8 2.0224 0.0226
.. .. ..
. . .
Ejercicio 3.79 Codifica una función que reciba 3 valores reales positivos A, a, prec, obtenga térmi-
nos de la sucesión
x2 − A
xi+1 = xi − i , x1 = a, i ≥ 1
2xi
y devuelva el primer xi para la que |xi − xi−1 | < prec. Por ejemplo, si A = 225, a = 100, prec =
0.5, en la siguiente tabla se muestran los valores de xi para i = 1, . . . , y de los correspondientes
|xi − xi−1 |. La primera vez que |xi − xi−1 | < 0.5 es para i = 6, ası́ que la función ha de devolver
x6 = 15.0019.
i xi |xi − xi−1 |
1 100
2 51.1250 48.8750
3 27.7630 23.3620
4 17.9337 9.8293
5 15.2399 2.6937
6 15.0019 0.2381
.. .. ..
. . .
Ejercicio 3.80 Codifica una función que reciba 2 números naturales p y q y genere términos de la
sucesión de Fibonacci iniciada por p y q. O sea:
Ejercicio 3.81 Crea una función que reciba un número real x y un número natural m y devuelva el
primer valor de k para el que suceda que | sin(x) − ak (x)| < 10−m , con
k
X (−1)n 2n+1
ak (x) = x
(2n + 1)!
n=0
98
Capı́tulo 3. Bucles
Por ejemplo, si x = 0.05 y m = 10 la función deberı́a devolver 3, ya que los tres primeros términos
de la sucesión verifican:
Por tanto, a3 es el primer término cuya diferencia con sin(x) es menor que 10−10 .
Ejercicio 3.82 Codifica una función que reciba tres números naturales p, q y r. La función calcu-
lará términos de la sucesión de Fibonacci iniciada por p y q y comprobará 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. No se tendrán en cuenta los valores p y q. 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ı́a 123. 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.
Ejercicio 3.83 Sea {an } la sucesión de números naturales tal que a1 > 0, a2 > 0 y definida para
n ≥ 3 como a
n−1
2 , si an−1 es par,
an =
nan−2 , si an−1 es impar.
Crea una función que reciba tres números naturales p, q y m (siendo p y q menores que m) y devuelva
el primer término de la sucesión {an } (con a1 = p y a2 = q) que sea mayor que m. Por ejemplo, si
p = 3, q = 5 y m = 15 entonces la función deberı́a devolver 20.
Ejercicio 3.84 (Para valientes) El algoritmo de Euclides permite hallar el máximo comúm divisor
de dos números naturales m y n dividiendo primero el mayor de los dos entre el otro y después
recursivamente el divisor entre el resto. El último resto que no es cero es el máximo común divisor.
(Si la primera división ya tuviera resto 0, entonces es que el máximo común divisor es el menor de
los dos números). Por ejemplo, si m = 21 y n = 15 el máximo común divisor calculado mediante el
algoritmo de Euclides es el siguiente:
21 = 1 · 15 + 6
15 = 2 · 6 + 3
6=2·3+0
El máximo común divisor de 21 y 15 es 3, el último resto no nulo. Escribe una función que dados
dos naturales, calcule el máximo común divisor mediante el algoritmo de Euclides.
Ejercicio 3.85 Imagina y especifica un problema susceptible de ser resuelto mediante el ordenador y
tal que el algoritmo que lo resuelva utilice las ideas utilizadas hasta ahora en el libro, y en particular,
las de esta sección.
99