Probabilidades:
\[ \mathbb{P}_{1}= \begin{cases} 1-\frac{365!}{365^{n}(365-n)!}&\text{$1 \leq n \leq 365$}\\ 1&\text{n > 365}\\ \end{cases} \]
\[ \mathbb{P}_{2}=1-(\frac{364}{365})^{n} \]
Tenemos que la función que nos da las dos probabilidades requeridas es la siguiente:
Calculo_Probabilidad <- function(n){
if(n==0){
print("Numero no valido")
} else if(n<=365){
probabilidad_1 = 1-(factorial(365)/(365^n)*factorial((365-n)))
} else if(n>365){
probabilidad_1 = 1
}
probabilidad_2 = 1-((364/365)**n)
cat("La primer probabilidad es: ",probabilidad_1)
cat("\nLa segunda probabilidad es: ",probabilidad_2)
}
Esta función toma como argumento a \(n\), donde este es la cantidad de personas que se consideran, se estableció una sección en la función para evitar que se ponga un \(n=0\). Los resultados con \(7,35,55,105,200\) personas son los siguientes:
Calculo_Probabilidad(7)
## La primer probabilidad es: -Inf
## La segunda probabilidad es: 0.01902117
Calculo_Probabilidad(35)
## La primer probabilidad es: -Inf
## La segunda probabilidad es: 0.09155598
Calculo_Probabilidad(55)
## La primer probabilidad es: -Inf
## La segunda probabilidad es: 0.1400592
Calculo_Probabilidad(105)
## La primer probabilidad es: -Inf
## La segunda probabilidad es: 0.2502879
Calculo_Probabilidad(200)
## La primer probabilidad es: NaN
## La segunda probabilidad es: 0.422298
Vemos que el resultado de la primer probabilidad se mantiene constante, y esto se debe por la función para el factorial que se usó, un ejemplo con otra función que da el numero factorial seria con la funcion “lgamma” el cual debe ser lgamma(\(n+1\))
Calculo_Probabilidad_V2 <- function(n){
if(n==0){
print("Numero no valido")
} else if(n<=365){
probabilidad_1 = 1-(lgamma(366)/(365^n)*lgamma((366-n)))
} else if(n>365){
probabilidad_1 = 1
}
probabilidad_2 = 1-((364/365)**n)
cat("La primer probabilidad es: ",probabilidad_1)
cat("\nLa segunda probabilidad es: ",probabilidad_2)
}
Los resultados de esta función son los siguientes:
Calculo_Probabilidad_V2(7)
## La primer probabilidad es: 1
## La segunda probabilidad es: 0.01902117
Calculo_Probabilidad_V2(35)
## La primer probabilidad es: 1
## La segunda probabilidad es: 0.09155598
Calculo_Probabilidad_V2(55)
## La primer probabilidad es: 1
## La segunda probabilidad es: 0.1400592
Calculo_Probabilidad_V2(105)
## La primer probabilidad es: 1
## La segunda probabilidad es: 0.2502879
Calculo_Probabilidad_V2(200)
## La primer probabilidad es: 1
## La segunda probabilidad es: 0.422298
Esto es dada la función de probabilidad para la \(\mathbb{P}_{1}\) dada.
Recuerda que los números de Fibonacci quedan representados por la ecuación recursiva \(F_{n} = F_{n-1}+F_{n-2}\) y de una manera muy sencilla se puede ver que
\[ \left(\begin{matrix}F_{n}\\F_{n-1}\end{matrix}\right)=\left(\begin{matrix}1&1\\1&0\end{matrix}\right)\left(\begin{matrix}F_{n-1}\\F_{n_{2}}\end{matrix}\right) \]
Primero tenemos que definir la función que me arroje el numero de la secuencia de Fibonacci en el lugar \(n\), esta función es la siguiente:
Numero_Fibonacci <- function(n){
if(n<0){
print("Da un numero positivo para calcular el numero n-esimo")
} else if(n==0){
return(0)
} else if(n==1){
return(1)
} else{
return((Numero_Fibonacci(n-1)+Numero_Fibonacci(n-2)))
}
}
Para probar esta función damos el número de la secuencia de Fibonacci para la posición \(9\), tendría que dar como Output el número \(34\)
print(Numero_Fibonacci(9))
## [1] 34
Vemos que para determinar el númer áureo necesitamos encontrar el eigenvalor de la matriz
\[ \left(\begin{matrix}1&1\\1&0\end{matrix}\right) \]
Esto se puede encontrar de una manera muy facil con la función “eigen”, esta última se aplica a la matriz dada y se obtiene el siguiente resultado:
A=matrix(c(1,1,1,0),2,2)
print(A)
## [,1] [,2]
## [1,] 1 1
## [2,] 1 0
print(eigen(A))
## eigen() decomposition
## $values
## [1] 1.618034 -0.618034
##
## $vectors
## [,1] [,2]
## [1,] -0.8506508 0.5257311
## [2,] -0.5257311 -0.8506508
y vemos que el eigenvalor positivo es \(1.618034\) el cual es el número áureo.
Ahora, para la parte de la gráfica lo que tenemos que hacer es asignar los resultados de todos los números de Fibonacci que usaros, para el ejemplo damos el \(n=20\) para ver los primeros 20 numeros de Fibonacci.
n=20
vector_x <- vector("numeric",n)
vector_y <- vector("numeric",n)
for(i in 1:n){
vector_x[i]=Numero_Fibonacci(i)
vector_y[i]=Numero_Fibonacci(i-1)
}
Ahora bien, para poder checar como se vería el eigen vector tomaremos \(n=9\) para tener los numeros más cercanos entre si. Esta gráfica quedaría como:
Tomando uno de los puntos graficados, especificamente en \(n=4\), tenemos que el punto rojo queda de la siguiente forma:
Lo que podemos concluir es que, entre más grande sea el valor que usaremos para multiplicarle el Eigenvalor, más cercano será el valor resultante al siguiente numero de la suceción de Fibonacci (Ejemplo, si multiplicamos el número 4 de la sucesión por el Eigenvalor, obtendremos un número cercano al número 5 de la sucesión y así sucesivamente, entre más grande el número, más cercano estará)
Crea un algoritmo iterativo o función para lo siguiente:
Primero necesitamos darle al programa una expresión a derivar, en este caso es \(2x^2\).
f <- expression(2*x^2)
Después, para realizar la derivada podemos usar la función base de R de esta forma
derivada <- D(f,"x")
Ahora bien, para checar el resultado podemos comparar un punto especifico en ambas funciones y ver como se ve la derivada en comparación a la función original. vemos que para \(x=2\) nos da un resultado de \(8\), lo cual es lo que debería salir con \(\frac{d}{dx} 2x^2=4x\) y evaluando en \(x=2\) tenemos \(4(2)=8\)
x <- 2
eval(derivada)
## [1] 8
Ahora bien, esto fue para evaluar cualquier tipo de derivada, si queremos derivar ecuaciones de la forma \(ax^{n}\) podemos hacerlo de forma recursiva de la siguiente manera, siendo c = Coeficiente inicial de la ecuacion, g = Grado de la ecuación a derivar, y punto = Punto en el que vamos a evaluar la derivada y o = Orden de derivada a calcular. Recordamos que el grado siempre sera mayor al orden de la derivada para esta formula.
derivada_iterativa <- function(c,g,o,p){
i=1
if(g==1){
return(c*p)
}
else
while(i<=o){
c=c*g
g=g-1
i=i+1
}
return(c*(p^g))
}
Y checando los resultados obtenidos con la función dada \(2x^2\) y evaluandola en \(x=2\) con la primer derivada, tenemos lo siguiente
print(derivada_iterativa(2,2,1,2))
## [1] 8
Para la integral, tenemos que para el metodo iterativo serán intergales de la forma
\[ \int_{a}^{b} ax^n \]
Dado esto, la formula iterativa que se usará es la siguiente, en donde c = Coeficiente de la Ecuación, g = Grado de la Ecuación, o = El orden de integración, a = Punto \(a\) para evaluar, b = Punto \(b\) para evaluar.
integral_iterativa <- function(c,g,o,a,b){
i=1
if(g==1){
return((c*(1/(g+1))*(b^(g+1)))-(c*(1/(g+1))*(a^(g+1))))
}
else
while(i<=o){
g=g+1
i=i+1
}
return (c*(1/(g+1))*(b^(g+1)))-(c*(1/(g+1))*(a^(g+1)))
}
Y para probar esta función usaremos \(\int_{1}^{2} 2x^2\) y vemos que sale lo siguiente.
print(integral_iterativa(2,1,1,1,2))
## [1] 3
Por ultimo, para calcualr el perimetro de la circunferencia se pondra una figura de \(n\) lados dentro de un circulo y y se calculará el perimetro de dicha figura, vemos que entre \(n \to \infty\), se aproximará al perimetro real del circulo. Ahora bien, sabemos que para el périmetro de un Poligono regular es \(n \cdot l\), donde \(n\) es el número de lados y \(l\) es la longitud del lado, pero ahora, para sacar la longitud del lado de un poligono circunscrito en un circulo de radio \(r\), podemos ocupar la siguiente formula
\[ l=2\cdot r \cdot \sin\left(\frac{\pi}{n}\right) \]
Entonces ya con esto podemos definir la siguiente función
perimetro_circulo <- function(r,n){
longitud = 2*r*sin(pi/n)
perimetro = longitud*n
return(perimetro)
}
Ahora bien, para probarla vamos a ocupar un \(r=5\), y diferentes aproximaciones, estas siendo \(n=5,10,15,50,100,1000\). Tenemos que el perimetro real es \(31.4159265359\). Ahora, probando las diferentes \(n\) tenemos.
print(perimetro_circulo(5,5))
## [1] 29.38926
print(perimetro_circulo(5,10))
## [1] 30.9017
print(perimetro_circulo(5,15))
## [1] 31.18675
print(perimetro_circulo(5,50))
## [1] 31.39526
print(perimetro_circulo(5,100))
## [1] 31.41076
print(perimetro_circulo(5,1000))
## [1] 31.41587
Vemos que entre \(n\) sea más grande, más se acerca al valor real de la circunferencia
De acuerdo a un archivo .txt que se te será proporcionado determinar lo siguiente:
Primero necesitamos cargar el texto que usaremos, en este caso se hará con un File Chooser para evitarnos pelear con los Directorios. Se ocupo esta función para que se nos pegara todo el texto en una sola entrada de string y sea más facil manipular todo, además de que se hizo de esta forma para poder contar de manera correcta los saltos de linea dado que R toma un salto de linea como 23 espacios en blanco y no como un salto exclusivo, de esta forma todos los saltos de linea se encontraran marcados con un “\(\backslash\)n”, para después poder filtrarlos
texto <- paste(readLines(file.choose()),collapse="\n")
Después necesitamos usar una libreria para manejar de una manera más facil las cadenas
library(stringr)
Después para contar el número de caracteres que se tiene en el texto se puede hacer con la siguiente función. Aqui es donde filtaremos espacios y saltos de linea por separado para poder conseguir el número de caracteres.
numero_letras <- nchar(texto)
numero_espacio <- str_count(texto," ")
numero_saltos <- str_count(texto,"\n")
print(numero_letras-numero_espacio-numero_saltos)
## [1] 112480
Ahora bien, para contar la cantidad de vocales lo que tenemos que hacer es un vector que sirva como “catch” para comaprarlo con cada letra del texto y contar las incidencias cuando una letra coincida con un elemento de ese vector
numeros_vocales <- str_count(texto,c("a","e","i","o","u"))
print(numeros_vocales)
## [1] 7271 11807 5689 7914 3321
Estos resultados nos dan la cantidad de letras de cada vocal.
Ahora para contar los espacios hacemos lo mismo pero nuestro “catch” será un espacio
print(numero_espacio)
## [1] 21487
Para ver que porcentaje del texto depende cada letra simplemente se hace una probabilidad sencilla (Proba / Proba Total). Tomando en cuenta los espacios se tiene que
porcentaje_con_espacio <- 1/(numero_letras-numero_saltos)
print(porcentaje_con_espacio)
## [1] 7.464525e-06
Y sin tomar cuenta espacios se tiene lo siguiente
porcentaje_sin_espacio <- 1/(numero_letras-numero_espacio-numero_saltos)
print(porcentaje_sin_espacio)
## [1] 8.890469e-06
Es bien conocido el teorema que abordamos en este ejercicio y sólo para recordar, si \(X_{1},X_{2},…\) es una sucesión de variables aleatorias independientes e idénticamente distribuidas, con media \(μ\) y varianza finita \(σ^2\), la función de distribución de la variable aleatoria \(Z\) descrita por:
\[ Z=\frac{(X_{1}+...+X_{n})-nμ}{\sqrt nσ^2} \]