26/8/22, 13:07 EXAMEN FINAL - FC2 - Colaboratory
1
#PREGUNTA 1
2
#Mètodo de transformaciòn
3
"""
4
Obtener la distribucion de NA de acuerdo a p(x)=exp(-x)
5
mediante el metodo de inversion
6
A(int(e^-x))=1->A=1/(1-e^-1)
7
r=integral(p(x))->x=-ln(1-r/A)
8
x = -ln(1-r/A)
9
"""
10
11
import numpy as np
12
from random import random
13
import [Link] as plt
14
from math import *
15
#Constante de normalizaciòn
16
A=1/(1-e**-1)
17
# numero de eventos (puntos)
18
N = 10000
19
def transformacion(N):
20
vx=[]
21
vr = []
22
for i in range(N):
23
r = random() # na entre 0 y 1
24
x = -[Link](1-r/A) # transformacion
25
[Link](x)
26
[Link](r)
27
return (vx,vr)
28
29
# llamado de la funcion
30
gx,gr =transformacion(N)
31
32
33
34
[Link](1)
35
[Link]('Distribución homogónea')
36
[Link](gr, color="firebrick")
37
[Link]('r')
38
39
40
[Link](2)
41
[Link]('Distribución exponencial')
42
[Link](gx, color="lightblue")
43
[Link]('x')
44
[Link] 1/5
26/8/22, 13:07 EXAMEN FINAL - FC2 - Colaboratory
Text(0.5, 0, 'x')
1 #PREGUNTA 2 (integral de una variable con puntos aleatorios)
2 #A
3 from math import *
4 import numpy as np
5 from random import random
6 from random import seed
7 import [Link] as plt
8 from [Link] import quad
9 from sympy import symbols, integrate
10 #solucion analitica
11 a= symbols('a')
12 integrate(np.e**(-a**2),a)
13 g=lambda a:np.e**(-a**2)
14 #algoritmo MC
15 def mcp(a,b,N):
16 """
17 Parameters
18 ----------
19 xi : conjunto de N numeros aleatorios uniformemente distribuidos
20 en el intervalo a,b
21 fi: vector con los valores de la funcion f(xi)
22 sigma : desviacion standart
23
24 Returns
25 -------
26 integ, sigma
27 """
28 xi = [Link](a,b,N)
29 fi = f(xi)
30 mean = [Link](fi)/N
31 suma2 = [Link](fi**2)/N
32 integ = mean*(b-a)
[Link] 2/5
26/8/22, 13:07 EXAMEN FINAL - FC2 - Colaboratory
33 sigma = sqrt(suma2-mean**2)
34 return integ , sigma
35
36 # limites de integracion y la funcion a integrar
37 a,b = 0,1
38 f = lambda x: e**(-x**2)
39 N = 1000
40 integral, sigma = mcp(a,b,N)
41 error = abs(sigma/sqrt(N))
42 print('Integracion con Monte Carlo')
43 print('===============')
44 print('integral analítica y error de método = ',(quad(g,0,1)))
45 print('integral_MC = ','{:6.3f}'.format(integral))
46 print('sigma = ','{:6.3f}'.format(sigma))
47 print('error (tolerancia) = ','{:6.2f}'.format(error))
Integracion con Monte Carlo
===============
integral analítica y error de método = (0.7468241328124271, 8.291413475940725e-15)
integral_MC = 0.743
sigma = 0.202
error (tolerancia) = 0.01
1 #PREGUNTA 2 (integral de una variable con puntos aleatorios)
2 #B
3 from math import *
4 import numpy as np
5 from random import random
6 from random import seed
7 import [Link] as plt
8 from [Link] import quad
9 from sympy import symbols, integrate
10 #solucion analitica
11 a= symbols('a')
12 integrate(np.e**(-a**2),a)
13 g=lambda a:np.e**(-a**2)
14 #algoritmo MC
15 def mcp(a,b,N):
16 """
17 Parameters
18 ----------
19 xi : conjunto de N numeros aleatorios uniformemente distribuidos
20 en el intervalo a,b
21 fi: vector con los valores de la funcion f(xi)
22 sigma : desviacion standart
23
24 Returns
25 -------
26 integ, sigma
27 """
28 xi = [Link](a,b,N)
29 fi = f(xi)
30 pi= p(xi)
31 zi=f(xi)/p(xi)
32 mean = [Link](zi)/N
[Link] 3/5
26/8/22, 13:07 EXAMEN FINAL - FC2 - Colaboratory
p ( )
33 suma2 = [Link](zi**2)/N
34 integ = mean*(b-a)
35 sigma = sqrt(suma2-mean**2)
36 return integ , sigma
37
38 # limites de integracion y la funcion a integrar
39 a,b = 0,1
40 A=1/(1-e**-1)
41 f = lambda x: e**(-x**2)
42 p= lambda x: A*e**-x
43 N = 100
44 integral, sigma = mcp(a,b,N)
45 error = abs(sigma/sqrt(N))
46 print('Integracion con Monte Carlo')
47 print('===============')
48 print('integral analítica y error de método = ',(quad(g,0,1)))
49 print('integral_MC = ','{:6.3f}'.format(integral))
50 print('sigma (varianza)= ','{:6.3f}'.format(sigma))
51 print('error (tolerancia) = ','{:6.2f}'.format(error))
Integracion con Monte Carlo
===============
integral analítica y error de método = (0.7468241328124271, 8.291413475940725e-15)
integral_MC = 0.744
sigma (varianza)= 0.053
error (tolerancia) = 0.01
1
#C
2
from math import *
3
import numpy as np
4
from random import random
5
from random import seed
6
import [Link] as plt
7
from [Link] import quad
8
from sympy import symbols, integrate
9
#Resultado de integral con metodo tradicional
10
I1=0.743
11
#Resultado de integral con muestreo por importancia
12
I2=0.746
13
#comparacion de resultados
14
C=I2-I1
15
print("Diferencia de resultados respecto a cada uno de los metodos:",C)
Diferencia de resultados respecto a cada uno de los metodos: 0.0030000000000000027
Como podemos observar, hay una diferencia de 3e-3 de acuerdo a los resultados de cada
integral, lo que significa que ambos métodos son eficientes si tomamos en cuenta que el
resultado analìtico de nuestra integral tiene un valor de 0.746824 aproximadamente.
Es
importante resaltar el hecho de que estamos considerando una tolerancia de ϵ=0.01, y estamos
tomando N1=1000 iteraciones para el primer caso y N2=100 iteraciones para el segundo, por lo
que a grandes rasgos esto significa que el mètodo de muestreo por importancia es mucho más
[Link] 4/5
26/8/22, 13:07 EXAMEN FINAL - FC2 - Colaboratory
eficiente respecto al tradicional, tal como predice la teorìa.
Con respecto a los valores obtenidos
de cada una de las varianzas, podemos observar que la varianza de σ2=0.054 es mucho menor
a σ1=0.202, esto significa que el mètodo de muestreo por importancia presenta una dispersión
ínfima de datos con respecto al primer caso.
Finalmente, podemos decir que es mucho mejor
utilizar el método de muestreo por importancia por los motivos descritos anteriormente.
Productos de pago de Colab
-
Cancelar contratos
check 0 s completado a las 12:58
[Link] 5/5