Aplicación de números aleatorios a la aproximación de integrales

Problema

Supongamos que se quiere calcular la integral definida:

\[\begin{align} I = \int_a^b{f(x)dx} \end{align}\]

Se parte de la definición de esperanza, valor esperado o media de una variable aleatoria \(x\). Si \(x\) es una variable aleatoria y \(f(x)\) su función de densidad de probabilidad, entonces:

\[\begin{align} E(x) = \int_{-\infty}^\infty xf(x)dx \end{align}\]

Además:

\[\begin{align} E(g(x)) = \int_{-\infty}^\infty g(x)f(x)dx \end{align}\]

Por ejemplo, si \(g(x)=x^2\), entonces:

\[\begin{align} E(x^2) = \int_{-\infty}^\infty x^2f(x)dx \end{align}\]

Ahora, recuerde que, si \(x\) es una variable aleatoria que distribuye uniforme entre \(0\) y \(1\), esto es:

\[\begin{align} x \sim U(0,1) \end{align}\]

Entonces:

\[\begin{align} f(x) = \left\{ \begin{array}{lcc} 1 & si & 0 \leq x \leq 1 \\ \\ 0 & dlc \\ \end{array} \right. \end{align}\]

Entonces,

\[\begin{align} E(g(x))&= \int_0^1 g(x)*1~ dx\\ \\ E(g(x))&= \int_0^1 g(x) dx \end{align}\]

Es necesario tener en cuenta que:

\[\begin{align} E(x)&= \mu_x\\ \hat{\mu_x}&=\bar{x}\\ \bar{x} &= \frac{\sum_{i=1}^n xi}{n} \end{align}\]

Por lo tanto:

\[\begin{align} E(g(x)) &= \mu_{g(x)}\\ \hat{\mu}_{g(x)}&=\bar{g(x)}\\ \bar{g(x)} &= \frac{\sum_{i=1}^n g(xi)}{n} \end{align}\]

Por lo tanto:

\[\begin{align} \int_0^1 g(x)dx &= \frac{\sum_{i=1}^n g(xi)}{n} \end{align}\]

Ejemplo 1:

Resuelva \[\begin{align} \int_0^1 xe^x~dx \end{align}\]

De forma exacta y aproxime la solución usando números aleatorios.

De manera exacta usamos integración por partes. Recuerde LIATE y que:

\[\begin{align} \int u~dv &= uv - \int v~du \end{align}\]

Por lo tanto:

\[\begin{align} u&=x \rightarrow du = dx\\ \\ dv &= e^x~dx \rightarrow v=e^x \end{align}\]

Aplicando la ecuación de integración por partes:

\[\begin{align} \int_0^1 xe^x~dx &= xe^x - \int_0^1 e^x~dx\\ \\ \int_0^1 xe^x~dx &= xe^x -e^x \Big|_0^1\\ \\ xe^x -e^x \Big|_0^1 &=\left[ 1*e^1-e^1 \right] - \left[ 0*e^0-e^0 \right]\\ \\ \int_0^1 xe^x~dx &= 1 \end{align}\]

Ahora se realiza la aproximación mediante números pseudoaleatorios. Se generan \(20\) números aleatorios como sigue:

Warning: package 'knitr' was built under R version 4.4.2
Pseudoaleatorios \(x_i\)
0.2875775
0.7883051
0.4089769
0.8830174
0.9404673
0.0455565
0.5281055
0.8924190
0.5514350
0.4566147
0.9568333
0.4533342
0.6775706
0.5726334
0.1029247
0.8998250
0.2460877
0.0420595
0.3279207
0.9545036

Se evalúan los números aleatorios en \(g(x) = xe^x\), obteniendo lo siguiente:

Pseudoaleatorios \(x_i\) \(g(x_i) = x_ie^{x_i}\)
0.2875775 0.3833966
0.7883051 1.7340073
0.4089769 0.6156235
0.8830174 2.1352998
0.9404673 2.4087041
0.0455565 0.0476799
0.5281055 0.8955173
0.8924190 2.1784194
0.5514350 0.9571489
0.4566147 0.7208671
0.9568333 2.4910575
0.4533342 0.7133439
0.6775706 1.3341964
0.5726334 1.0152388
0.1029247 0.1140825
0.8998250 2.2128250
0.2460877 0.3147491
0.0420595 0.0438663
0.3279207 0.4551798
0.9545036 2.4792097

Si se realiza la suma de \(g(x_i)\) se obtiene:

\[ \sum_1^{20} g(x_i) = 23.25041 \]

Por lo tanto:

\[ \frac{\sum_1^{20}g(x_i)} {n} = \frac{23.25041}{20} =1.16 \]

Obteniendo una buena aproximación para

\[\int_0^1 xe^x \approx \frac{\sum_1^{20}f(x_i)} {n} =1.16 \]

Aproximación en ´´R´´

#Generando aleatorios
set.seed(123)
numeros <- runif(1000)

#Evaluando en g(x)
evaluacion <- numeros * exp(numeros)

#Aproximación
aproximacion <- mean(evaluacion)
aproximacion
[1] 0.9912536

Ejemplo 2:

Resuelva \[\begin{align} \int_0^1 xln(x)~dx \end{align}\]

De forma exacta y aproxime la solución usando números aleatorios.

De manera exacta usamos integración por partes. Recuerde LIATE y que:

\[\begin{align} \int u~dv &= uv - \int v~du \end{align}\]

Por lo tanto:

\[\begin{align} u&= ln (x) \rightarrow du = \frac{1}{x} dx\\ \\ dv &= x~dx \rightarrow v=\frac{x^2}{2} \end{align}\]

Aplicando la ecuación de integración por partes:

\[\begin{align} \int_0^1 xln(x)~dx &= ln(x)\frac{x^2}{2} - \int_0^1 \frac{x^2}{2} \frac{1}{x}~dx\\ \\ \int_0^1 xln(x)~dx &= ln(x)\frac{x^2}{2} - \frac{1}{2}\int_0^1 x~dx\\ \\ \int_0^1 xln(x)~dx &= ln(x) \frac{x^2}{2} - \frac{x^2}{4} \Big|_0^1\\ \\ \int_0^1 xln(x)~dx &= \left[ ln(1) \frac{1^2}{2} - \frac{1^2}{4} \right] - \left[ ln(0) \frac{0^2}{2} - \frac{0^2}{4} \right]\\ \\ \int_0^1 xln(x)~dx &= - \frac{1}{4} \end{align}\]

Ahora se realiza la aproximación mediante números pseudoaleatorios. Se generan \(20\) números aleatorios como sigue:

Pseudoaleatorios \(x_i\)
0.2875775
0.7883051
0.4089769
0.8830174
0.9404673
0.0455565
0.5281055
0.8924190
0.5514350
0.4566147
0.9568333
0.4533342
0.6775706
0.5726334
0.1029247
0.8998250
0.2460877
0.0420595
0.3279207
0.9545036

Se evalúan los números aleatorios en \(g(x) = xln(x)\), obteniendo lo siguiente:

Pseudoaleatorios \(x_i\) \(g(x_i) = x_iln{x_i}\)
0.2875775 -0.3583972
0.7883051 -0.1875142
0.4089769 -0.3656649
0.8830174 -0.1098565
0.9404673 -0.0577244
0.0455565 -0.1407150
0.5281055 -0.3371738
0.8924190 -0.1015747
0.5514350 -0.3282314
0.4566147 -0.3579473
0.9568333 -0.0422213
0.4533342 -0.3586443
0.6775706 -0.2637386
0.5726334 -0.3192486
0.1029247 -0.2340258
0.8998250 -0.0949810
0.2460877 -0.3450315
0.0420595 -0.1332727
0.3279207 -0.3656262
0.9545036 -0.0444453

Si se realiza la suma de \(f(x_i)\) se obtiene:

\[ \sum_1^{20} g(x_i) = -4.546035 \]

Por lo tanto:

\[ \frac{\sum_1^{20}g(x_i)} {n} = \frac{-4.546035}{20} =-0.2273017 \]

Obteniendo una buena aproximación para

\[\int_0^1 xln(x) \approx \frac{\sum_1^{20}g(x_i)} {n} =-0.2273017\]

Aproximación en ´´R´´

#Generando aleatorios
set.seed(123)
numeros <- runif(1000)

#Evaluando en g(x)
evaluacion <- numeros * log(numeros)

#Aproximación
aproximacion <- mean(evaluacion)
aproximacion
[1] -0.2514037

Caso límites de integración diferentes a 0, 1

En el caso en que los límites de integración \(a \neq 0\) y \(b \neq 1\) se puede aplicar la corrección siguiente para la aproximación:

\[\begin{align} \int_a^b g(x)~dx \approx (b-a) \frac{\sum_1^n g(x_i)}{n} \end{align}\]

Ejemplo 1:

Resuelva \[\begin{align} \int_2^5 xe^x~dx \end{align}\]

De forma exacta y aproxime la solución usando números aleatorios.

De manera exacta usamos integración por partes. Recuerde LIATE y que:

\[\begin{align} \int u~dv &= uv - \int v~du \end{align}\]

Por lo tanto:

\[\begin{align} u&=x \rightarrow du = dx\\ \\ dv &= e^x~dx \rightarrow v=e^x \end{align}\]

Aplicando la ecuación de integración por partes:

\[\begin{align} \int_2^5 xe^x~dx &= xe^x - \int_2^5 e^x~dx\\ \\ \int_2^5 xe^x~dx &= xe^x -e^x \Big|_2^5\\ \\ xe^x -e^x \Big|_2^5 &=\left[ 5*e^5-e^5 \right] - \left[ 2*e^2-e^2 \right]\\ \\ \int_2^5 xe^x~dx &= 4e^5-e^2 = 578.263 \end{align}\]

Ahora se realiza la aproximación mediante números pseudoaleatorios. Se generan \(20\) números aleatorios, entre \(a=2\) y \(b=5\) como sigue:

Pseudoaleatorios \(x_i\)
2.862733
4.364915
3.226931
4.649052
4.821402
2.136669
3.584316
4.677257
3.654305
3.369844
4.870500
3.360002
4.032712
3.717900
2.308774
4.699475
2.738263
2.126179
2.983762
4.863511

Se evalúan los números aleatorios en \(g(x) = xe^x\), obteniendo lo siguiente:

[1] 4848.976
Pseudoaleatorios \(x_i\) \(g(x_i) = e^{x_i}\)
2.862733 50.12446
4.364915 343.26894
3.226931 81.32571
4.649052 485.76044
4.821402 598.52397
2.136669 18.10011
3.584316 129.13834
4.677257 502.68764
3.654305 141.20475
3.369844 97.97484
4.870500 635.04550
3.360002 96.73199
4.032712 227.50017
3.717900 153.09509
2.308774 23.23107
4.699475 516.42274
2.738263 42.33385
2.126179 17.82327
2.983762 58.96518
4.863511 629.71765

Si se realiza la suma de \(g(x_i)\) se obtiene:

\[ \sum_1^{20} g(x_i) = 4848.976 \]

Por lo tanto:

\[ \frac{\sum_1^{20}g(x_i)} {n} = \frac{4848.976}{20} =242.4488 \]

Obteniendo una buena aproximación para

\[\int_2^5 xe^x \approx (b-a) \frac{\sum_1^{20}g(x_i)} {n} =727.3464\]

Aproximación en ´´R´´

#Generando aleatorios
set.seed(123)
a <- 2
b <- 5
numeros <- runif(1000, min = a, max=b)

#Evaluando en g(x)
evaluacion <- numeros * exp(numeros)
#Aproximación
aproximacion <- (b-a)*mean(evaluacion)
aproximacion
[1] 578.9831