Académique Documents
Professionnel Documents
Culture Documents
La simulación es, por una parte, una manera económica y útil de experimentación.
En muchas ocasiones, el científico o el técnico se encuentran con sistema reales cuyo
funcionamiento desea controlar o mejorar. Un método habitual para alcanzar esos
objetivos consiste en experimentar con el sistema real, si ello es posible, e intentar utilizar
los resultados de la experimentación para conocer y mejorar el funcionamiento del
sistema. En muchas ocasiones, sin embargo, tal experimentación es imposible o, aun
siendo posible, éticamente delicada, o muy costosa, siendo conveniente disponer de algún
método alternativo para ampliar el conocimiento del sistema real.
En ese sentido, los métodos de Montecarlo son métodos de simulación que usan números
(pseudo) aleatorios para investigar el comportamiento de sistemas físicos y matemáticos
y para otros tipos de cálculo.
Debido a que los algoritmos de este tipo deben repetir los cálculos un gran número de
veces, estos métodos requieren el uso de computadores y de diversas técnicas de
simulación.
Un algoritmo Montecarlo es un método numérico que se usa con frecuencia para atacar
problemas matemáticos que no pueden ser resueltos de forma sencilla, por ejemplo a
través del cálculo o por otros métodos numéricos. En muchos casos, su eficiencia respecto
a otras técnicas numéricas aumenta con la dimensión del problema.
Estos métodos tienen una larga historia pero su uso se popularizó después de la Segunda
Guerra Mundial, con el advenimiento de la computadora. El nombre, popularizado por
algunos de los pioneros en el área como S. Ulam, E. Fermi, J. von Neumann y N.
Metropolis, es una referencia al famoso casino en Mónaco. Ulam escribe en su
autobiografía que el método recibió este nombre a sugerencia de Metropolis en honor a
su tío, que era un jugador.
Una de las primeras aplicaciones exitosas del método Montecarlo en Física fue el estudio
de las propiedades del neutrón por Enrico Fermi en 1930 El uso de métodos Monte Carlo
requiere de grandes cantidades de números aleatorios.
Objetivos
Conocer y entender la técnica cuantitativa y estadística del método de
Montecarlo mediante la simulación de modelos matemáticos, para el análisis del
comportamiento de un sistema basado en componentes aleatorios.
Simulación de Montecarlo
El método fue llamado así por el principado de Mónaco por ser “la capital del
juego de azar”, al tomar una ruleta como un generador simple de números
aleatorios. El nombre y el desarrollo sistemático de los métodos de Montecarlo
data aproximadamente de 1944 con el desarrollo de la computadora electrónica.
Sin embargo hay varias instancias (aisladas y no desarrolladas) en muchas
ocasiones anteriores a 1944.
1.4. El método
La novedad que el método ofrece reside principalmente en su punto de vista. Con
pocas excepciones la mayoría de los autores parten de un problema probabilístico
hasta llegar a un problema con ecuaciones funcionales, cuya solución se obtiene
con los métodos clásicos, o al menos se demuestra que existe y que proporciona
la respuesta al problema probabilístico. En el método de Montecarlo la situación
se invierte. El problema probabilístico (del que puede siempre obtenerse una
solución aproximada mediante pruebas repetidas), se considera como el
instrumento para encontrar la solución numérica de una ecuación funcional. O en
alternativa, un problema físico que exige un modelo analítico, el problema
probabilístico equivalente es considerado corno un modelo suficiente y la
deducción de una solución analítica se considera superflua.
f x1 , f x2 , f x3 , , f xn
F x prob h x1 , x2 , x3 , , xn x
f x , f x , f x ,
R
1 2 3 , f xn dx1dx2 dx3 dxn
h x1 , x2 , x3 , , xn x
• Crear el modelo
Identificación • Realizar una simulación
Iteración
matemático del sistema del modelo, generando
• Identificar las variables números aleatorios para • Repetir n veces la
aleatorias que influyen las variables identificadas simulación, para poder
dentro del así contar con un mayor
comportamiento general muestreo que nos facilite
del sistema determinar su
comportamiento
Estructura Simulación
Para el caso de una sola variable los pasos son los siguientes:
o Transformada inversa
o Rechazo
o Composición
o Convolución
A continuación se muestra como ejemplo algunas distribuciones de
probabilidad discretas y continuas generadas a partir de uno de los
métodos mencionados:
12
Ni Ri 6
i 1
Ni
2 ln 1 Ri cos 2Ri 1
N i
2 ln 1 Ri sen 2Ri 1
Donde:
: media de la distribución normal.
: desviación estándar de la distribución normal.
Ni : número aleatorio con distribución normal.
E g x g x f x dx
x1 x2 x3 xn
lim
n n
b
i) Queremos calcular: f x dx
a
ii) Tomamos n muestras xi, con distribución uniforme, en el intervalo [a, b].
iii) Estimador de Montecarlo: E f x , entonces:
ba n
f xi
n i 1
f x dx
a
NE N
A R. M .b a E
N N
Precisión en el cálculo
NE
A R.
N
NE
pˆ
N
La distribución binomial se puede aproximar mediante una normal cuando: N.p >
5 y N.q >5.
Además para una distribución normal N(µ, σ) sabemos que el 95% de las
observaciones se encuentran en el intervalo:
(µ - 2σ, µ + 2σ)
Con lo que suponiendo N.p > 5 y N.q >5 tendremos que el intervalo de confianza
al 95% del número de aciertos NE en A estará en:
N. p 2 N . p.q , N . p 2 N . p.q
2.4. Ventajas del método de Montecarlo
Simulación de Montecarlo en R
x dx
2
Consideremos un caso más sencillo:
0
Tabla N° 1: Simulaciones
i x y f(x) y f(x)
1 0.883 0.682 0.7793 E
2 0.331 0.903 0.1099 F
3 0.354 0.957 0.1253 F
4 0.426 0.022 0.1811 E
5 0.756 0.978 0.5715 F
6 0.258 0.279 0.0664 F
7 0.909 0.124 0.8261 E
8 0.747 0.950 0.5573 F
9 0.889 0.518 0.7906 E
10 0.027 0.442 0.0007 F
NE 4
A M .b a 0.82611 0 0.33044
N 10
0.87%.
3.2. Scrip en R de la Integración de Montecarlo.
x dx
2
Implementaremos el ejemplo aplicativo desarrollado anteriormente:
0
Integra_montecarlo1.R
# Implementación de la INTEGRACIÓN DE MONTECARLO
# Calculo de la integral de f(x) en [a,b]
n=100 # Tamaño de muestra
ale1<-runif(n,0,1)
ale2<-runif(n,0,1)
X<-numeric(n); Y<-numeric(n) # Inicializa Eje x e y
f<-numeric(n) # Inicializa valores de la f(x)
NE<-0
a<-0; b<-1; M<-1 # límite superior de eje x e y
for(i in 1:n){
X[i]<-a+(b-a)*ale1[i]
Y[i]<-ale2[i]*M
f[i]<-X[i]^2
if(Y[i]<=f[i]){
NE<-NE+1
}
}
p<-NE/n
M<-max(f)
A<-M*(b-a)*p; A
Gráficos:
n = 10 n = 50
n = 100 n = 500
n = 1000
Integ_montecarlo2.R
# Implementación de la SIMULACIÓN DE MONTECARLO 2
# Calculo de la integral de f(x) en [a,b] Utilizando: runif(x,a,b)
# Ingrese el numero de simulaciones (N) con muestra n=100
N<-100
n<-100
# Integración de Montecarlo: I=f(x) en el intervalo [0,1]
a<-0; b<-pi/2 # limites eje x
M<-1 # limite superior de eje y
A<-numeric(N) # Inicializa las aproximaciones
for(j in 1:N){
ale1<-runif(n,0,1)
ale2<-runif(n,0,1)
X<-numeric(n); Y<-numeric(n) # Inicializa Eje X e Y
f<-numeric(n) # Inicializa valores de la f(x)
NE<-0
for(i in 1:n){
X[i]<-a+(b-a)*ale1[i]
Y[i]<-ale2[i]*M
f[i]<-X[i]^2
if(Y[i]<=f[i]){
NE<-NE+1
}
}
p<-NE/n; M<-max(f)
A[j]<-M*(b-a)*p
}
A #Aproximaciones de N simulaciones
summary(A) # Estadisticas descriptivas
ks.test(A,"pnorm",mean=mean(A),sd=sd(A)) # Prueba de normalidad
par(mfrow=c(1,3))
qqnorm(A); qqline(A,lty=2) # Grafico de normalidad
# Histograma de las aproximaciones del área bajo la curva
hist(A,freq=F,breaks=12,border="blue",main="Aproximación de área
f(x)=x^2",xlab="Aproximación",ylab="Casos")
boxplot(A,main="Aproximación de Área")
> A
[1] 0.3069706 0.2895117 0.3387596 0.2972500 0.3835348 0.2935657 0.2837584
0.2968663 0.3598796
[10] 0.3052450
> summary(A) # Estadísticas descriptivas
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.2838 0.2944 0.3012 0.3155 0.3308 0.3835
data: A
D = 0.30058, p-value = 0.2685
alternative hypothesis: two-sided
Gráficos:
N=10
N=50
N=100
N=500
N=1000
Figura 8: Análisis grafico de los resultados para diferente número de
simulaciones.
Integ_mc.R
# Implementación de la INTEGRACIÓN DE MONTECARLO
# Calculo de la integral de f(x) en [a,b] a partir de E[f(x)]
N<-100 # Número de simulaciones
n<-1000 # Tamaño de muestra
a<-0; b<-1 # Intervalo [a,b] de f(x)
VE<-numeric(N)
for(i in 1:N){
X<-runif(n,0,1)
f<-X^2 # Evaluación de la función f(x)
VE[i]<-(b-a)*mean(f)
}
VE
summary(VE) # Estadisticas descriptivas
# Histograma de las aproximaciones del área bajo la curva
hist(VE,freq=F,breaks=12,border="blue",main="Aproximación de
área f(x)=x^2",xlab="Aproximación",ylab="Casos")
> VE
[1] 0.3203896 0.3533141 0.3248397 0.3424682 0.3307663 0.3265752 0.3394397 0.3451242 0.3295113
[10] 0.3351824 0.3461745 0.3267319 0.3191494 0.3272869 0.3250745 0.3250282 0.3294878 0.3384200
[19] 0.3343114 0.3392624 0.3307482 0.3462076 0.3355858 0.3445354 0.3440985 0.3383918 0.3292284
[28] 0.3183935 0.3445569 0.3222936 0.3408717 0.3252232 0.3309071 0.3325074 0.3375263 0.3173681
[37] 0.3394264 0.3221398 0.3371886 0.3381269 0.3469979 0.3129660 0.3251183 0.3354699 0.3380065
[46] 0.3395206 0.3143291 0.3225172 0.3274109 0.3335922 0.3284824 0.3206352 0.3269811 0.3466037
[55] 0.3299163 0.3160367 0.3383403 0.3315029 0.3340625 0.3287183 0.3254946 0.3507176 0.3257238
[64] 0.3239582 0.3450534 0.3193494 0.3267240 0.3334620 0.3242506 0.3471939 0.3462986 0.3413239
[73] 0.3457088 0.3337415 0.3366540 0.3510426 0.3603581 0.3182624 0.3388698 0.3251513 0.3383262
[82] 0.3334701 0.3337680 0.3218603 0.3276790 0.3378639 0.3142044 0.3530233 0.3273847 0.3398311
[91] 0.3257180 0.3337078 0.3528527 0.3365291 0.3240713 0.3299805 0.3351605 0.3319708 0.3463832
[100] 0.3325417
Librería: {Agricolae}
Sintaxis:
montecarlo(data, k, ...)
Argumentos:
Ejemplo Aplicativo:
ejm_montecarlo.R
# Ejemplo de simulación de Montecarlo
# Utilizando librería AGRICOLAE y data SOIL
library(agricolae)
data(soil)
simulado<-montecarlo(soil$pH,1000)
h<-graph.freq(simulado,nclass=77,plot=F)
par(mar=c(2,0,2,1))
plot(density(soil$pH),axes=F,main="pH densidad del
suelo",xlab="",lwd=2)
lines(density(simulado),col="blue",lty=4,lwd=2)
axis(1,0:12)
legend("topright",c("Original","Simulado"),lty=c(1,4),col=c("bla
ck","blue"),lwd=4)
round(table.freq(h),2)
# Estadisiticas descriptivas
summary(soil$pH) # Estadísticas datos originales
summary(simulado) # Estadísticas datos simulados
Podemos decir que el método Montecarlo es aplicable en todos aquellos sistemas que
cuenten con un factor de aleatoriedad. Con lo cual podemos concluir que se puede aplicar
a sistemas complejos, de los cuales podemos destacar áreas como informática, financiera,
industrial, entre otras.
La calidad de la aproximación tanto para el cálculo del área como del volumen depende
de la cantidad de puntos aleatorios generados como de las simulaciones realizadas, al
aumentar estas dos variables los resultados generados tendrán una mejor aproximación.
Bibliografía
P. Robert, C. y Casella, G. (2010). Introducing Monte carlo Methods with R. Springer.
USA – New York.
Illana, J. I. (2013). Métodos Monte Carlo. Departamento de Física Teórica y del Cosmos.
Universidad de Granada.
Rios, D. (2009). Simulación, Métodos y Aplicaciones. España, Ed. RA-MA, 2ª. Edición.
México.
Implementado con:
Integ_montecarlo.R
# Implementación de la SIMULACIÓN DE MONTECARLO
# Calculo de la integral de f(x) en [a,b]
U<-numeric(n)
li<-0 # límite inferior
ls<-1 # límite superior
for(i in 1:n){
U[i]<-li+(ls-li)*m.ale[i]
}
return(U)
}
# Integración de Montecarlo
# I=f(x) en [0,1]
# Intervalo [a=0,b=1]
a<-0; b<-1 #limites eje x
M<-1 #limite superior de eje y
ale1<-aleatorio(n)
ale2<-aleatorio(n)
X<-numeric(n) # Inicializa Eje X
Y<-numeric(n) # Inicializa Eje y
f<-numeric(n) # Inicializa valores de la f(x)
NE<-0
for(i in 1:n){
X[i]<-a+(b-a)*ale1[i]
Y[i]<-ale2[i]*M
f[i]<-X[i]^2
if(Y[i]<=f[i]){
NE<-NE+1
}
}
p<-NE/n
M<-max(f)
A<-M*(b-a)*p; A
# OPTIMIZACIÓN DE BENEFICIO
aleatorio<-function(x){
a<-13
b<-65
m<-3456
y<-56
datos<-1
for(i in 1:x){
y<-(((y*a)+b)%%m)
datos[i]<-c(y/m)
}
return(datos)
}
dat<-aleatorio(1000)
plot(dat)
##datos<-c(10,20,10,50,60,80,85,99,35,55)
##recodificacion de varaibles
nuv<-recode(dat,
"0:.30=100;.30:.50=150;.50:.80=200;.80:.95=250;.95:1=300")
hist(nuv)
cant_lic<-200 ## cantidad de liciencias vendidas
dev<-1
for(i in 1:1000){
if(nuv[i]>cant_lic){
nuv[i]<-200
}
}
for(i in 1:1000){
dev[i]<-cant_lic-nuv[i]
}
##dev
## Calculo de ingreso de ventas
ing_ventas<-1
costo_lic<-75
costo<-costo_lic*cant_lic
precio_ven<-100
for(i in 1:1000){
ing_ventas[i]<-precio_ven*nuv[i]
}
##Ingreso por liciencias devueltas
ing_dev<-1
ing_devolucion<-25
for(i in 1:1000){
ing_dev[i]<-ing_devolucion*dev[i]
}
## Calculo beneficio
beneficio<-1
for(i in 1:1000){
beneficio[i]<-ing_dev[i]+ing_ventas[i]-costo
}
##calculo de Promedio del veneficio
suma<-0
for(i in 1:1000){
suma<-suma+beneficio[i]
}
media<-suma/1000; media
sd(beneficio)
Resultados:
> media
[1] 1812.5
> sd(beneficio)
[1] 3243.8