0% encontró este documento útil (0 votos)
18 vistas10 páginas

Taller de Algoritmos en Matlab y Python

El documento presenta un taller de introducción a los computadores de la Universidad de Antioquia, con una serie de ejercicios que deben ser implementados en Matlab, Octave, Scilab, R o Python. Los ejercicios abarcan temas como el manejo de arreglos, cálculos estadísticos, funciones matemáticas, y propiedades de secuencias numéricas. Se incluyen tareas como calcular promedios, varianza, y trabajar con progresiones aritméticas y geométricas, así como la implementación de algoritmos para resolver problemas específicos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
18 vistas10 páginas

Taller de Algoritmos en Matlab y Python

El documento presenta un taller de introducción a los computadores de la Universidad de Antioquia, con una serie de ejercicios que deben ser implementados en Matlab, Octave, Scilab, R o Python. Los ejercicios abarcan temas como el manejo de arreglos, cálculos estadísticos, funciones matemáticas, y propiedades de secuencias numéricas. Se incluyen tareas como calcular promedios, varianza, y trabajar con progresiones aritméticas y geométricas, así como la implementación de algoritmos para resolver problemas específicos.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Universidad de Antioquia

Facultad de Ciencias Exactas y Naturales


Instituto de Matemáticas
Taller 6 - Introducción a los computadores

Alejandro Piedrahita H.
Última actualización: 18 de junio de 2014

Nota: para cada uno de los ejercicios propuestos, implemente su respectivo algoritmo en
Matlab R , Octave, Scilab, R o Python. En cada ejercicio se asume que los vectores y/o
matrices son arreglos de números, a menos que se especifique lo contrario.

Arreglos

1. Realice un programa que reciba 8 números y los almacene en un vector y los imprima.
2. Escriba un programa que calcule la suma de las componentes de las posiciones impares de
un vector.
3. Dado un conjunto de n números {x1 , . . . , xn } almacenados en un vector x, implemente:
a) Una función llamada media(x) que calcule su promedio (media)1
Pn
i=1 xi x1 + · · · + xn
=
n n

b) Una función llamada armonica(x) que calcule su media armónica 2


n n
Pn 1 = 1 1
i=1 xi x1 + ··· + xn

4. Dado un vector de números enteros, implemente un programa que muestre:


a) número de datos repetidos en el arreglo,
b) número de valores impares,
c) número de valores pares.
5. La varianza de un conjunto de datos (números), {x1 , x2 , . . . , xn } se define como
n
1X 2
(xi − promedio) .
n i=1

Desarrolle un función llamada varianza() que calcule la varianza de un conjunto de


números almacenados en un vector. En Matlab y Octave dicha función ya viene imple-
mentada, se denomina var().
1 En Matlab y Octave dicha función ya viene implementada, se denomina mean(x).
2 En Octave el comando es mean(x,’’h’’) y en Matlab el comando es harmmean(x).
6. Sin utilizar los operadores de división entera, residuo, módulo, etc., elabore una función
llamada res(x) que reciba un vector x = [a b] cuyas componentes son un entero no
negativo a y un entero positivo b, y devuelva un vector [q r] con el cociente q y residuo
r que se obtiene al dividir a entre b, (Sugerencia: ver ejercicio 14 del taller 4).
7. Realice una función llamada digitos(n) que para cada entero positivo n (en base 10), de-
vuelva un vector cuyas componentes sean las unidades, decenas, centenas, etc. del número
n, en dicho orden. Por ejemplo, digitos(247) debe generar el vector [7 4 2].
8. Desarrolle una función llamada digitosinv(n) que genere un vector con los dı́gitos de n,
pero en orden inverso a lo especificado en el ejercicio 7. Por ejemplo, digitosinv(247)
debe devolver el vector [2 4 7].
9. Realice un programa que cuente el número de ceros de un vector.
10. Halle la mayor de las componentes x(1), x(2), . . . , x(n) de un vector x.
11. Desarrolle un programa que encuentre la posición de la mayor componente de un vector.
12. Suponga que x es un vector de tamaño n tal que x(1) ≤ x(2) ≤ · · · ≤ x(n). Halle el número
de elementos distintos de x.
13. Halle el número de elementos distintos de un vector.
14. En cada uno de los siguientes casos, fn representa el n-ésimo término de la sucesión
de Fibonacci. Demuestre, por inducción matemática, y verifique, utilizando la funcion
fibo(n) desarrollada en el ejemplo 2.1, de la sección 10: vectores y matrices en Matlab,
que:

a) f12 + f22 + · · · + fn2 = fn · fn+1 2


d ) f0 · f1 + f1 · f2 + · · · + f2n−1 · f2n = f2n
b) f1 + f3 + · · · + f2n−1 = f2n e) f0 − f1 + f2 − · · · − f2n−1 + f2n =
c) fn+1 · fn−1 − fn2 = (−1)n f2n−1 − 1

y además  n  
1 1 fn+1 fn
= .
1 0 fn fn−1

15. Una progresión aritmética es una sucesión de números

a1 , a2 , a3 , . . . , an−1 , an , . . .

tales que la diferencia de dos términos consecutivos cualesquiera de la sucesión (an −an−1 ),
siempre es igual a una constante (d) llamada diferencia. Por ejemplo,

2, 5, 8, 11, 14, 17, 20, . . . Término inicial = 2 y diferencia = 3


9, 5, 1, −3, −7, −11, −15, −19, . . . Término inicial = 9 y diferencia = −4
π, π, π, π, π, π, π, . . . Término inicial = π y diferencia = 0

a) Realice una función llamada progresionarit(a,d,n) que devuelva un vector cuyas


componentes (n en total) formen una progresión aritmética con término inicial a y
diferencia d.
b) Implemente una función llamada esaritmetica(x) que devuelva 1 (“verdadero”)
si los números almacenados en un vector x forman una progresión aritmética y 0
(“falso”) sino.
16. Una progresión geométrica es una sucesión de números no nulos

a1 , a2 , a3 , . . . , an−1 , an , . . .

tales que cociente de dos términos consecutivos cualesquiera de la sucesión (an /an−1 ),
siempre es igual a una constante (r) llamada razon. Por ejemplo,

4, 12, 36, 108, 324, 972, 2916, . . . Término inicial = 4 y razón = 3


5, −10, 20, −40, 80, −160, 320, . . . Término inicial = 5 y razón = −2
3 3 3 3 3 3 3 3 1
, , , , , , ,... Término inicial = y razón =
2 4 8 16 32 64 128 2 2
a) Realice una función llamada progresiongeom(a,d,n) que devuelva un vector cuyas
componentes (n en total) formen una progresión aritmética con término inicial a y
razón r.
b) Implemente una función llamada esgeometrica(x) que devuelva 1 (“verdadero”)
si los números almacenados en un vector x forman una progresión geometrica y 0
(“falso”) sino.
17. En 1837 el matemático alemán J. Dirichlet demostró un teorema3 de gran importancia
que afirma que:
Si a y d son primos relativos y d > 0, entonces la progresión aritmética

a, a + d, a + 2d, a + 3d, . . . (1)

contiene un número infinito de primos.


Realice un algoritmo que tenga como entradas enteros a y d que satisfagan las hipótesis
del teorema, un entero N > 0 y que muestre:
a) La lista de los primeros N términos de la progresión aritmética (1).
b) Los primos (si existen) contenidos en la lista de la parte (a).
18. Las parejas de enteros
(3, 5), (11, 13), (41, 43) y (137, 139)
están formadas por números primos que difieren en 2. Una pareja de números primos que
diferan en 2 se denomina primos gemelos. La conjetura de los primos gemelos establece que
existe un número infinito de primos gemelos. En el sitio web de OEIS aparecen publicados
los primeros 100 000 primos gemelos.
a) Realice una función llamada gemelos(p) que devuelva 1 (“verdadero”) si (p, p + 2)
son primos gemelos y 0 (“falso”) sino lo son.
b) Halle, si existe, una pareja de primos gemelos en la lista del ejercicio (17a).
3 Ver teorema 1.1.5 de Crandall, C. Pomerance. Prime Numbers: A Computational Perspective, Springer

Science+Business Media, Inc., 2nd ed., 2005.


19. Implemente un algoritmo que realice el procedimiento a continuación descrito4 :

Considere un número entero positivo de 9831 − 1389 = 8442


cuatro dı́gitos n = abcd (en base 10) con al 8442 − 2448 = 5994
menos dos de sus dı́gitos distintos; ordene
9954 − 4599 = 5355
los dı́gitos a, b, c y d de mayor a menor para
formar (en ese orden) un nuevo entero M y 5553 − 3555 = 1998
ordene ahora los mismos dı́gitos a, b, c y d de 9981 − 1899 = 8082
menor a mayor para formar (en ese orden) 8820 − 0288 = 8532
otro nuevo entero m (claramente M > n);
8532 − 2358 = 6174
sustituya a n por M − m y repita este pro-
cedimiento 10 veces. 7641 − 1467 = 6174
7641 − 1467 = 6174
El algoritmo debe mostrar el número final-
mente obtenido. Por ejemplo, con n = 9831, 7641 − 1467 = 6174
el número obtenido al final es 6174 porque 7641 − 1467 = 6174.

Ejecute el algoritmo repetidas veces con diversos valores de n:


a) ¿Siempre se obtiene al final el número 6174?
b) Si considera que lo conjeturado en (a) es cierto, modifique el algoritmo para que
cuente el número de repeticiones requeridas para llegar a 6174.
c) Utilice el algoritmo modificado de la parte (b) y conjeture cuál es el número mı́nimo
de repeticiones necesarias para garantizar que siempre se llegue al 6174, sin importar
el entero positivo n = abcd con el que se inicie el proceso.

Al número 6174 se le denomina constante de Kaprekar en honor a su descubridor, el


matemático indio D. R. Kaprekar5 . (Sugerencia: para hallar los dı́gitos que componen a n
utilice la función digitos() del ejercicio (7); para ordenar los dı́gitos de menor a mayor
y viceversa, utilice la función ordenar() desarrollada en clase).
20. Realice un algoritmo que determine si dos vectores son iguales.

21. Elabore una función llamada iguales(x) que para cada vector x devuelva 1 (“verdadero”)
si todas sus componentes son iguales y 0 (“falso”) en caso contrario.
22. Se tienen dos vectores a y b de tamaño n. Realice un programa que genere un nuevo vector
c de igual tamaño, cuya componente c(i) sea igual al producto a(i) · b(i).

23. Modifique el programa del problema (22) para que el arreglo c sea generado mediante el
producto de las componentes de los arreglos a y b pero tomados en orden inverso, es decir,
el producto del primer elemento de a con el último elemento de b, del segundo elemento
de a con el penúltimo de c, etc.
24. Un vector se dice que es simétrico si su primera compenente es igual a la última, la segunda
es igual a la penúltima, etc. Realice una función llamada simetrico(v) que devuelva 1
(verdadero) si v es simétrico y falso (0) en caso contrario. Por ejemplo,
4 Problema comunicado por el profesor Benjamı́n Buriticá.
5 Kaprekar DR (1955). An Interesting Property of the Number 6174. Scripta Mathematica 15: 244 − 245.
simetrico([3 7 5 7 3]) = 1.

25. Dado un vector con componentes x(1), x(2), . . . , x(n), implemente una función llamada
invertir(x) que modifique las posiciones de las entradas del vector x en orden inverso.
Por ejemplo, invertir([3 -2 0 4 7]) = [7 4 0 -2 3].

26. Dado un vector con m + n componentes

x(1), x(2), . . . , x(m), x(m + 1), . . . , x(m + n),

desarrolle un programa que intercambie las primeras m compontentes de x por sus últimas
n compontentes ası́:

x(m + 1), . . . , x(m + n), x(1), x(2), . . . , x(m).

27. Un vector a de enteros contiene los coeficientes de un polinomio de grado n. Calcule el


valor del polinomio en un número x, es decir, a(n + 1)xn + a(n)xn−1 + · · · + a(2)x + a(1).
28. Dos vectores de enteros x e y y de tamaños m y n respectivamente, tienen sus componentes
ordenadas ası́: x(1) ≤ x(2) ≤ · · · ≤ x(m) y y(1) ≤ y(2) ≤ · · · ≤ y(n). Encuentre el
número de elementos comunes en ambos arreglos, es decir, el número de enteros t tales
que t = x(i) = y(j) para algún i y para algún j.
29. Resuelva el ejercicio (28) asumiendo que las componentes de los vectores están ordenadas
ası́: x(1) < x(2) < · · · < x(m) y y(1) < y(2) < · · · < y(n).

30. Dos vectores de enteros x e y y de tamaños m y n respectivamente, tienen sus componentes


ordenadas ası́: x(1) ≤ x(2) ≤ · · · ≤ x(m) y y(1) ≤ y(2) ≤ · · · ≤ y(n). Encuentre el número
de elementos distintos entre x(1), x(2), · · · , x(m), y(1), y(2), · · · , y(n).
31. Dos vectores de enteros x e y y de tamaños k y l respectivamente, tienen sus componentes
ordenadas ası́: x(1) ≤ x(2) ≤ · · · ≤ x(k) y y(1) ≤ y(2) ≤ · · · ≤ y(l). Realice un programa
que genere un nuevo vector z de tamaño k +l con componentes z(1) ≤ z(2) ≤ · · · ≤ z(k +l)
y tal que cada elemento en z debe aparecer el mismo número de veces que aparece en x y
en y juntos.
32. Dados dos vectores con componentes x(1) ≤ x(2) ≤ · · · ≤ x(k) y y(1) ≤ y(2) ≤ · · · ≤ y(l),
halle su “intersección”, es decir, un vector con componentes z(1) ≤ z(2) ≤ · · · ≤ z(m) que
contenga todos los elementos comunes de x e y. El número de veces que cada elemento en
z aparece debe ser igual al menor entre los números de veces que aparece en x e y.
33. Se tienen tres vectores con componentes

x(1) ≤ x(2) ≤ · · · ≤ x(p), y(1) ≤ y(2) ≤ · · · ≤ y(q) y z(1) ≤ z(2) ≤ · · · ≤ z(r).

y se sabe que al menos existe un número que está en los tres vectores. Desarrolle un
programa que halle dicho número o al menos uno de ellos en caso de existir otros.
34. Resuelva el ejercicio (33) sin asumir que existe un número que está en los tres vectores. El
programa debe determinar si dicho número existe o no y hallarlo en caso de que exista.
35. Sea A una matriz m × n tal que

A(1, 1) ≤ · · · ≤ A(1, n), A(2, 1) ≤ · · · ≤ A(2, n), . . . , A(m, 1) ≤ · · · ≤ A(m, n).

Se sabe que existe un número que está presente en todas las filas de A, es decir, existe
un x tal que para todo i ∈ {1, . . . , m}, existe un j ∈ {1, . . . , n} que satisface A(i, j) = x.
Implemente un programa que encuentre dicho número.
36. Sea B una matriz m × n tal que

B(i, j) ≤ B(i, j + 1) y B(i, j) ≤ B(i + 1, j)

Realice un programa que determine si un número dado hace parte de una de las entradas
de B.
37. Se tiene un vector cuyas componentes son números positivos x(1) ≤ x(2) ≤ · · · ≤ x(n).
Desarrolle un programa que encuentre el menor entero positivo que no pueda ser repre-
sentado como la suma de las entradas del vector.

38. Sea C una matriz cuadrada n × n y m un entero tal que 1 ≤ m ≤ n. Escriba un programa
que calcule la suma de las entradas de cualquier sub-matriz m × m de C.
39. Un vector de tamaño n se dice que es corrupto si existe un elemento almacenado en el
vector que aparece repetido más de n/2 veces. Escriba una función llamada corrupto(v)
que devuelva 1 (verdadero) si v es corrupto y 0 (falso) en caso contrario.

40. La mediana Me de un conjunto de datos (números) {x1 , x2 , . . . , xn }, ordenados de manera


creciente x1 ≤ x2 ≤ · · · ≤ xn , se define como

x n+1

2
si n es impar,
Me = x n + x n +1
 2
 2
si n es par
2
Realice una función llamada mediana() que halle la mediana de un conjunto de datos
almacenados en un vector. En Matlab dicha función ya viene implementada, se denomina
median(). (Sugerencia: utilice la función ordenar() desarrollada en clase).
41. Escriba un programa que elimine las entradas repetidas de un vector, dejando una entrada
en cada caso.

42. Escriba una función llamada transpuesta(A) que halle la transpuesta de una matriz A.
En Matlab dicha función ya viene implementada, se denomina transpose(A) ó A’.
43. Implemente un programa que encuentre la mayor y la menor entrada de una matriz con
sus respectivas posiciones.

44. Realice un programa que convierta una matriz en un vector “moviendo” las filas, es decir,
la segunda fila “se mueve” a la derecha de la primera fila, la tercera fila a la derecha de la
segunda fila, etc.
45. Resuelva el ejercicio (44) pero por columnas.
46. Elabore un programa que intercambie la primera y última columna de una matriz, la
segunda y la penúltima columna, etc.
47. Resuelva el ejercicio (46) pero intercambiando las filas.
48. Implemente un programa que calcule el promedio de las componentes de un vector y forme
dos nuevos vectores, uno con los elementos menores o iguales que el promedio y otro con
los mayores.
49. Escriba un programa que genere la siguiente matriz:
a) La primera fila y la primera columna tienen como entradas los números enteros del
0 al n.
b) Las demás entradas se obtienen de multiplicar cada entradas de la fila uno por cada
entradas de la columna uno.
El programa debe imprimir la matriz. Ejemplo:
 
0 1 2 3 4 ··· n

 1 1 2 3 4 ··· · 


 2 2 4 6 8 ··· · 


 3 3 6 9 12 ··· · 


 4 4 8 12 16 ··· · 

 .. .. .. .. .. .. .. 
 . . . . . . . 
n · · · · ··· n2

50. Realice un programa que determine si una matriz A es simétrica (A es simétrica si AT =


A).
51. Elabore un programa que determine si una matriz A es antisimétrica (A es antisimétrica
si AT = −A).
52. Implemente un programa que ingrese una matriz m × n y ordene en forma creciente los
elementos de las columnas del arreglo.
53. Dada una matriz simétrica, realice un programa que la convierta a triangular inferior (el
“triángulo superior derecho” debe contener ceros, exceptuándo la diagonal principal).
54. Escriba un programa que modifique una matriz, cuyas entradas sean enteros del 0 al 9, de
la siguiente forma: las entradas no nulas se ubican en forma consecutiva desde la fila uno
en adelante, conservando el orden original y el resto de las entrdas se llenan con ceros.
Ejemplo:

0 0 4 0 0 4 6 7 8 9
0 6 0 0 7 −→ 1 0 0 0 0
0 8 0 9 1 0 0 0 0 0

55. Se tiene una matriz m × n. Cada entrada del arreglo representa las ventas atribuibles a
cada uno de los m vendedores de una empresa, para cada uno de los n años de operaciones
que ha tenido la misma. Implemente un programa que calcule:
a) Total de ventas de cada vendedor en los n años.
b) Total de ventas en cada año.
c) Gran total de ventas de la empresa.
56. Desarrolle una versión “recursiva” del algoritmo de la criba de Eratóstenes, estudiado en
el ejemplo 2.3 de la sección 10: vectores y matrices en Matlab6 . (Sugerencia: modifique
la función eratostenes(n) ası́: ahora la función es de la forma

eratostenes(cribado,nocribado),

donde nocribado = 2:n para algún entero n>2 y cribado es un vector que almacenará los
primos <=n. La función debe retornar eratostenes(cribado,nocribado). Por ejemplo
eratostenes([],2:30) debe generar un vector con los primos <=30 ).
57. Investigue si existe un algoritmo no recursivo para resolver el problema de las Torres de
Hanói, estudiado en el ejemplo 2.5 de la sección 10: vectores y matrices en Matlab.
58. Considere la función logı́stica fr (x) = rx(1 − x), x ∈ [0, 1], con 0 ≤ r ≤ 4, estudiada
en el archivo logistica.m que define el sistema dinámico discreto del ejemplo 2.4 de la
sección 10: vectores y matrices en Matlab. Grafique el comportamiento del sistema para
r = 3.1, 3.56, 3.57, 3.58, 3.8 y r = 4.
59. En álgebra lineal, una Matriz de Hilbert es una matriz cuadrada de la forma

1 21 1 1 1
 
3 4 5 ···
 1 1 1 1 1


 2 3 4 5 6 ···  
 1 1 1 1 1


 3 4 5 6 7 · · · 

 1 1 1 1 1


 4 5 6 7 8 ···  
 1 1 1 1 1


 5 6 7 8 9 · · · 
.. .. .. .. .. . .

. . . . . .

Elabore un algoritmo que genere una matriz de Hilbert n × n.

60. El problema de las ocho reinas es un acerti-


jo clásico que consiste en ubicar a ocho rei-
nas en un tablero de ajedrez convencional,
sin que éstas se amenacen, es decir, sin que
ningún par de reinas ocupen la misma fila,
columna y diagonal. El problema tiene va-
rias soluciones y en la figura se ilustra una
de ellas. Investigue la historia del problema,
sus soluciones y si existen algoritmos para
resolverlo.

61.
6 [Link]
El problema del caballo es un acertijo clási-
co que consiste en hallar una sucesión de
movimientos que le permitan a un caballo,
ubicado en una casilla cualquiera de un ta-
blero de ajedrez, desplazarse de manera tal
que éste pase por cada una de las casillas del
tablero, exactamente una vez. En la imagen
se ilustra una solución. Investigue la histo-
ria del problema, sus soluciones y si existen
algoritmos para resolverlo.

Para los ejercicios (62) - (64), considere el ejemplo 4.3 de la sección 10: vectores y matrices en
Matlab7 con el juego de la vida de Conway.

62. Modifique el programa vida.m desarrollado en clase para estudiar el comportamiento en


el tiempo de “las células”, cuando la primera generación está dada por cada una de las
figuras ilustradas a continuación.

63. Un glider gun (“arma de fuego”), en un


autómata celular, es una configuración de
“células” que evolucionan en el tiempo si-
guiendo un patrón que se repite periódica-
mente, tanto en el “arma” como en la “bala
disparada”.

Modifique el programa vida.m para estu-


diar el comportamiento en el tiempo de
“las células” cuando la primera generación
está dada por el glider gun glidergun.m8 ,
ilustrado en la figura. Se trata de un “ar-
ma de fuego” descubierta por Bill Gosper
en 1970. Conway habı́a conjecturado la exis-
tencia de patrones que crecerı́an indefini-
damente, y ofreció una recompensa por un
ejemplo. Gosper fue el primero en encontrar
un patrón que cumpliera esa premisa
7 [Link]
8 [Link]
64. En teorı́a, el juego de la vida de Conway ba), entonces sus vecinas de arriba (que no
se desarrolla en una “malla infinita”, don- existen) serán las células de la última fila,
de cada célula siempre tiene 8 células ve- etc.)
cinas. Modifique el programa vida.m para
que ahora las células se encuentren en una
malla “doblada” como un toro9 , como se
ilustra en la figura. En este video10 se pre-
sentan aplicaciones de dicho modelo a la vi-
da real. (Sugerencia: modifique la función
vecinos.m del ejemplo 4.2 para que ahora,
si una célula se encuentra en la primera co-
lumna (izquierda), entonces sus vecinas de
la izquierda (que no existen) serán las célu-
las de la última columna (derecha) y si la
célula se encuentra en la primera fila (arri-

65. Yahtzee11 es un juego de dados de Hasbro en el que hay que lanzar 5 dados corrientes.
Dependiendo de los números obtenidos, a cada jugador se le asigna un puntaje. Un jugador
obtiene un yahtzee cuando al lanzar los cinco dados, obtiene cinco números iguales. Obtener
un yahtzee es “poco probable” (6 casos favorables de 65 = 7776 posibles o equivalentemente
1 de 64 = 1296 casos posibles) y un poco frustrante como lo muestra este video12 . Utilice
números pseudo-aleatorios para simular el lanzamiento de cinco dados corrientes, hasta
obtener un yahtzee; el programa debe mostrar el yahtzee obtenido (los números obtenidos)
y el número de lanzamiento que fueron necesarios para obtener dicho yahtzee. (Sugerencia:
utilice la función iguales() del ejercicio (21)).

9 [Link]
10 [Link]
11 [Link]
12 [Link]

También podría gustarte