Академический Документы
Профессиональный Документы
Культура Документы
11 de julio de 2017
1. Soluciones
1.0.1. Solución 1
In [1]: x <-c(1,2,-3, 9, 0)
y <- c(2, 5,6, -1, 3)
1.0.2. Solución 2
In [3]: # Solucion dada por Luis Vasquez Espinoza
# Espiral de lineas
plot(c(1,5), c(1,
5), type = "n", xlab = "
Eje X azul", ylab = "Eje Y azul")
title(main = substitute(paste(italic("Espiral de lineas "))))
1
axis(1, col = "blue")
axis(2, col = "blue")
lines(c(1:5), rep(1, 5), col = "green")
lines(rep(5, 5), c(1:5), col = "green")
lines(c(1:5), rep(5, 5), col = "green")
lines(rep(1, 4), c(2:5), col = "green")
lines(c(1:4), rep(2, 4), col = "green")
lines(rep(4, 3), c(2:4), col = "green")
lines(c(2:4), rep(4, 3), col = "green")
lines(rep(2, 2),c(3:4), col = "green")
lines(c(2:3), rep(3, 2), col = "green")
# Funcion logaritmo
x <- seq(1, 10, 0.01)
y3 <- log(x)
plot(c(1,10), c(0.0, 2.5
), type = "n", xlab = "coordenada x", ylab = "coordenada y")
title(main = "Función logaritmo")
lines(x, y3)
legend("bottomright", legend = "f(x) = log(x)", inset = .05)
# Circunferencias concentricas
# Circ. de radio r = 1
x <- seq(-1, 1, 0.001)
c1 <- sqrt(1 - x^2)
c2 <- -c1
plot(c(-4,4), c(-4
,4), type = "n", xlab = "Eje x [-4;4]", ylab = "Eje y [-4;4]")
title(main = "Circunferencias concéntricas")
lines(x, c1, col = "orange")
lines(x, c2, col = "orange")
#Circ. de radio r = 2
x <- seq(-2, 2, 0.001)
c1 <- sqrt(2^2 - x^2)
c2 <- -c1
#Circ. de radio r = 3
x <- seq(-3, 3, 0.001)
c1 <- sqrt(3^2 - x^2)
c2 <- -c1
2
lines(x, c2, lty = 3)
1.0.3. Solución 3
In [4]: # Codigo del problema. Solucio dada por Luis Vasquez Espinoza.
options(width = 60)
sample(c(-1,1), size = 100, replace = TRUE)
par(mfrow = c(2,2))
for(j in 1:4){
win = sample(c(-1,1), size = 100, replace = TRUE)
plot(cumsum(win), type = "l" , ylim = c(-15,15))
abline(h = 0)
}
Respuesta:
3
[1] 0.0816
Respuesta:
# Realizamos simulaciones
turnos_victoriosos <- c()
for(i in 1:10000){
turnos_victoriosos <- c(turnos_victoriosos, TurnosAFavor(100))
}
turnos_victoriosos <- table(turnos_victoriosos)
print(turnos_victoriosos)
print(as.numeric(resultado))
4
}
GananciaMax(100)
1.0.4. Solución 4
In [8]: # Esta funcion no tiene casos entremos como len(xVect) = 0
tmpFn1(1:3)
tmpFn2(1:3)
1.0.5. Solución 5
In [10]: # Imprimimos la cuadricula. Solución dada por Jesús Rodriguez Felices
5
0 0 0 0 0 6 0 4 0
2 7 9 0 0 0 0 5 0
0 5 0 8 0 0 0 0 2
0 0 2 6 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 1 0 9 0 6 7 3
8 0 5 2 0 0 4 0 0
3 0 0 0 0 0 0 8 5
6 0 0 0 0 0 9 0 1
In [11]: pool <- array(TRUE, dim = c(9,9,9))
Comencemos por explicar que hace la función trunc(), esta función toma un argumento
numerico y retorna el siguiente entero entre dicho numero y el 0, es como un floor para los
positivos y un ceiling para los negativos. Como las entradas de la matriz están numeradas del
1 al 9, los bloques de 3x3 estarán divididos en los valores 1:3, 4:6 y 7:9. Tomando un a cualquiera
de 1:9, se cumplirá que:
6
3k ≤ a − 1 < 3(k + 1) = k ≤ (a − 1)/3 < k + 1,
Entonces, $k = trunc((a-1)/3) $.
De ello, 3*trunc((a-1)/3) nos dará el valor del múltiplo de 3 que está inmediatamente
antes que a. Los valores del bloque de 3 en el que esta contenido a son 3k+1, 3k+2 y 3k+3 y
ello es lo que se obtiene al sumar 1 a boxa y luego crea un vector desde ese valor hasta los dos
siguientes.
Por tanto, boxa nos dá el bloque de 3 en el que está contenido a y boxb nos da el bloque de 3
en el que está contenido b y al juntar ambos obtenemos el bloque de 3x3 en el que está contenida
la entrada (a,b).
Respuesta: La instrucción for hará que u tome los valores de los indices para los que se cum-
pla que pool[a,b,u] es diferente de cero, es decir, pool[a,b,u] = TRUE. Debido a ello es
que el bucle solo iterará sobre aquellos posibles valores para la entrada s[a,b] que aún no han
sido descartados. Antes de continuar, cabe resaltar que en una suma de valores lógicos (TRUE,
FALSE) a TRUE se le asocia el valor de 1 y FALSE el valor de 0. La única instrucción dentro del
bucle for verificará si dicho valor, u, aún es un candidato a la casilla (a,b) y modificará el valor
de la entrada pool[a,b,u] a FALSE en caso ya no sea un candidato.
Para ello se hace uso de 3 sumas de valores logicos, la primera verificará que el valor de u
no se repita en ninguna otra entrada de la fila a, la segunda suma verifica que u no este presente
en alguna otra entrada de la columna b y la última suma verifica el bloque de 3x3 en el que se
encuentra la entrada (a,b). Es suficiente que una de las igualdades a verificar sea TRUE para que
el resultado de la suma sea diferente de 0, y por ende, u quedará descartado como un candidato a
la entrada (a,b).
El resultado será 0 únicamente cuando todas las igualdades a verificar son falsas, y por tanto
ninguna otra entrada que pueda restringir el valor de u tiene dicho valor, por consiguiente, u
seguirá siendo un candidato a la entrada (a,b).
El segundo codigo R mostrado verifica si sólo existe un único candidato para la entrada (a,b),
pues si la suma es mayor o igual a 2 nos indicaría que hay 2 o más entradas TRUE en pool[a,b]
y si fuera 0 nos indicaría que el sudoku no se puede resolver o hicimos alguna mala operación.
Dado que solo existe un valor TRUE en pool[a,b,], (1:9)[pool[a,b,]] solo retornará un
valor, y dicho valor será asignado a la entrada s[a,b] pues es el único candidato a dicha entrada
y por tanto es el valor que debería ir ahí.
7
while(sum(s == 0) > 0){
# Seleccionamos la entrada de manera aleatoria
a <- ceiling(runif(1, min = 0, max = 9))
b <- ceiling(runif(1, min = 0, max = 9))
1.0.6. Solución 6
In [17]: # version for:
v = 0
for(i in 1:8) {
v = 10 * v + 8
cat(8 * v + 13, "\n")
}
77
717
7117
71117
711117
7111117
8
71111117
711111117
8 * cumsum(10^(0:7)) * 8 + 13
1.0.7. Solución 7
In [19]: set.seed(50)
xVec <- sample(0:999, 250, replace=T)
yVec <- sample(0:999, 250, replace=T)
yVec[-1] - xVec[-length(xVec)]
In [22]: sum(exp(-xVec[-1])/(xVec[-length(xVec)]+10))
0.0126987204660891
1.0.8. Solución 8
Asumiremos que el palillo tiene longitud 1 (por la opción de unidades). Podemos generar los
cuatro extremos de las partes y las longitudes de las partes de la siguiente manera.
Los palillos se pueden ensamblar en un triángulo si la suma de las longitudes de las dos piezas
más pequeñas es mayor que la longitud del más grande.
TRUE
Todo lo que necesitamos hacer ahora es agrupar esto en una función de simulación.
9
## Prueba del triangulo
mean(l1 + l2 >= l3)
}
palillosim(10000000)
0.7497734
1 1 3
5 2 6
-2 -1 -3
2 2 6
10 2 6
-2 -2 -6
1.0.9. Solución 9
Primero is.na(x) produce un vector lógico que contiene TRUE y FALSE dependiendo de
que si el valor correspondiente de x es NA o NaN. El operador ! invierte los valores TRUE y
FALSE. Finalmente, sum coacciona los valores lógicos a valores numéricos 0-1 y los suma.
El resultado es el número de valores de “no faltantes” en x.
La expresión x> mean(x) produce un vector de valores TRUE y FALSE que indican si los
valores en x son mayores que su media. Cuando se aplica sum a este valor, los valores se
coaccionan a valores 0-1 y se suman. El resultado es un recuento del número de valores en
x que exceden su media. (Sin embargo, si x contiene valores de NA, el resultado será NA).
10
fila = NA
for(i in 1:nrow(X))
if (all(!is.na(X[i,]) & X[i,] > 0)) {
fila = i
break
}
TRUE
Respuesta: Las matrices de Hilbert son invertibles. Toda la información de matrices de Hilbert,
aqui.
qr.solve(Hilbert(1))
In [32]: qr.solve(Hilbert(4))
In [33]: qr.solve(Hilbert(6))
11
36 -630 3360 -7560 7560 -2772
-630 14700 -88200 211680 -220500 83160
3360 -88200 564480 -1411200 1512000 -582120
-7560 211680 -1411200 3628800 -3969000 1552320
7560 -220500 1512000 -3969000 4410000 -1746360
-2772 83160 -582120 1552320 -1746360 698544
Respuesta: En el código iguiente ,uno de los autovalores está cerca de 1013 , que es muy peque-
ño, mientras que el autovalor más grande es superior a 1. Por lo tanto, las columnas de la matriz
están cerca de ser linealmente dependientes y eso produce un error.
eigen(Hilbert(10))$values
1.0.10. Solucion 10
In [35]: # Problema de un juego de tenis. Solución dada por Victor Galvan Oyola.
p <- 0.3
juegos <- 0.0
sets <- 0.0
partidos <- 0.0
tiebreak <- 0.0
tablaj <- matrix(0,nrow = 13,ncol=13)
visj <- matrix(F,nrow = 13,ncol=13)
tablas <- matrix(0,nrow = 7, ncol = 7)
viss <- matrix(F,nrow = 13,ncol=13)
12
visj[win,lose] = T
tablaj[win,lose] = ans
return(ans)
}
for (i in c(1:3)){
juegos = juegos + p*dpj(4,i)
}
juegos = juegos + dpj(4,4)*p*p/(2*p*p-2*p+1)
for (i in c(1:5)){
sets = sets + juegos*dps(6,i)
}
for (i in c(1:6)){
tiebreak = tiebreak + p*dpj(7,i)
}
tiebreak = tiebreak + dpj(7,7)*p*p/(2*p*p-2*p+1)
sets = sets + dps(6,6)*(juegos*juegos + 2*juegos*(1-juegos)*tiebreak)
partidos = sets*sets + 2*sets*sets*(1-sets)
13
Juego=0.09921103448 Set=0.00016770463 Partido=0.00000008437
1.0.11. Solución 11
In [36]: # Prueba Experimental
# Repeticion
for (i in 1:n)
{
prueba <- sample(0:1, 3, replace=TRUE)
exito <- if (sum(prueba )==3) 1 else 0
simlista[i] <- exito
}
# Resultado simulado
mean(simlista)
0
0.1255
0.2532
In [ ]:
14