<jupyter_start><jupyter_text>Simulación de procesos financieros. **Nombres:** <NAME> , <NAME>**Fecha:** 17 de septiembre del 2020.**Expediente** : IF707135.**Profesor:** <NAME>. Tarea 7: Clase 15  Github de la Tareahttps://github.com/CarlosRumo/Tarea7_CRuiz_RRodriguez.git  Enunciado de tarea Aproxime el valor de la siguiente integral usando el método monte carlo crudo y método de reducción de varianza de muestreo estratíficado$$I=\int_{0}^{1}x^2\text{d}x=\left.\frac{x^3}{3}\right|_{x=0}^{x=1}=\frac{1}{3}\approx 0.33333$$  Ejercicio 1:1. Cree una función que realice el método de muestreo estratíficado, recibiendo como único parámetro de entrada la cantidad de estratos y retornando las variables estratíficadas correspondientes.<jupyter_code>import numpy as np
from functools import reduce
import time
import matplotlib.pyplot as plt
import scipy.stats as st     
import pandas as pd
def int_montecarlo(f, a, b, U):
    return (b-a)/len(U)*np.sum(f(U))
F = lambda x: x**2
def int_estratificado(t):
    U_2 = np.random.rand(t)
    i = np.arange(0,t)
    int_estratificado = (U_2+i)/t
    return int_estratificado
N = np.logspace(1,7,7,dtype=int)
estratos = list(map(lambda x: int_estratificado(x),N))
muestras = list(map(lambda x : F(x),estratos))
medias = (list(map(lambda x : np.mean(x),muestras)))<jupyter_output><empty_output><jupyter_text>Ejercicio 2:2. Reporte los resultados de la aproximación de la integral usando montecarlo crudo y muestreo estratíficado, en un Dataframe con la información mostrada en la siguiente imagen:<jupyter_code>I = 1/3
# intervalo de integración
a = 0; b = 1

# Definimos la tabla donde se mostrarán los resultados
df = pd.DataFrame(index=N,columns=['Montecarlo crudo', 'Error_relativo1%', 'Muestreo estratificado', 'Error_relativo2%'], dtype='float')
df.index.name = "Cantidad_terminos"

# Números aleatorios dependiente de la cantidad de términos N
ui = list(map(lambda N:np.random.uniform(a,b,N),N))

# Calculamos la aproximación por montecarlo dependiendo de la cantidad de términos que hayamos creado con ui
I_mc = list(map(lambda Y:int_montecarlo(lambda x:x**2,a,b,Y),ui))

# Mostramos los resultados en la tabla previamente creada
df.loc[N,"Montecarlo crudo"] = I_mc
df.loc[N,"Error_relativo1%"] = np.abs(df.loc[N,"Montecarlo crudo"]-I)*100/I
df.loc[N,"Muestreo estratificado"] = medias
df.loc[N,"Error_relativo2%"] = np.abs(df.loc[N,"Muestreo estratificado"]-I)*100/I
df<jupyter_output><empty_output><jupyter_text>![download.png](attachment:download.png)    Además use el método de estratificación donde se divide en B estratos, visto la clase pasada y compare el resultado con los métodos anteriores cuando se toman $2,4,6,10$ estratos respectivamente, concluya.<jupyter_code>f_x=lambda x: 3*x**2/2 if x>=-1 and x<=1 else 0 
x1 = lambda x: x**(1/3) if x>=0 else -(-x)**(1/3)
x2 = lambda u: x1(2*u-1)
N= 10**5
u1= np.random.uniform(0,1,N)
f_u1= list(map(lambda x:x2(x), u1))
f_u1 = np.asarray(f_u1)
y, x, p= plt.hist(f_u1, bins= 100, density=True)
y2= list(map(lambda x: f_x(x), x))
plt.plot(x,y2)
plt.show()<jupyter_output><empty_output><jupyter_text>a) Montecarlo Crudo<jupyter_code># Crude MonteCarlo technique
print(f_u1.mean())<jupyter_output>0.0008196029957459106<jupyter_text>b) Muestreo estratificado<jupyter_code># Stratified sample technique
np.random.seed(100)
r1= np.random.uniform(0,.6,3)
r2= np.random.uniform(.6,.9,3)
r3= np.random.uniform(.9,1,4)
r=[r1,r2,r3]

w1 = (3/10)/.6
w2 = (3/10)/.3
w3 = (4/10)/.1
w=[w1,w2,w3]

muestras2= list(map(lambda x,a: np.asarray([x2(i) for i in x])/a,r,w))
media = np.concatenate(muestras2).mean()
media<jupyter_output><empty_output><jupyter_text>c) Método complementario<jupyter_code>u1= np.random.rand(5)
u2= 1-u1
U = [u1,u2]
muestras3 = list(map(lambda u:np.asarray([x2(u) for u in x]), U))
muestras3 
np.concatenate(muestras3).mean()<jupyter_output><empty_output><jupyter_text>d) Estratificado 2<jupyter_code>f_xi = lambda u: -(-2*u+1)**(1/3) if u<.5 else (2*u-1)**(1/3)

def estratif(B):
    U2 = np.random.rand(B)
    i = np.arange(0,B)
    v = (U2+i)/B
    return v

N_estratos = [2, 4, 6, 10]
muestras4 = list(map(estratif,N_estratos))
al = list(map(lambda m_i:list(map(lambda m:f_xi(m),m_i)),muestras4))
m_estratos = list(map(lambda i:np.mean(i),al))

resultados = list(map(lambda b,mean:print((b,mean)),N_estratos,m_estratos))<jupyter_output>(2, 0.32764238072615637)
(4, -0.0029039483391337106)
(6, -0.03118705849138363)
(10, -0.018379701278666515)
StarcoderdataJupyterStructuredCleanDedup