Numerical Integration

Soal

  1. Diketahui pdf (probability density function) dari distirbusi Kumaraswamy adalah sebagai berikut \[f(x|a,b)=ab\ x^{a-1}(1-x^a)^{b-1}\ ,\ dimana \ x \in (0,1)\] Jika diketahui a = 5 dan b = 3

    1. Hitunglah E(X) dengan menggunakan metode Trapezoida untuk n=4, Simpson untuk n=4 dan four -point Gauss Quadrature tanpa menggunakan software apapun. (Boleh diketik ataupun ditulis tangan kemudian difoto).

    2. Jika diketahui nilai exact dari \(E(x)= \frac{b\ \Gamma(1+\frac{1}{2})\ \Gamma(b)}{\Gamma(1+\frac{1}{a}+b)}\), metode mana yang paling mendekati untuk menghitung nilai \(E(x)\) dengan toleransi 0.0001? Gunakan R!

  2. Diketahui pdf (probability density function) dari distirbusi Eksponensial adalah sebagai berikut \[f(x|\lambda)=\lambda \ exp(-\lambda x)\ ,\ dimana \ x \in (0,\infty)\] Jika diketahui \(\lambda =2\). Hitunglah CDF dari distribusi exponensial tersebut untuk \(x = 4\), dengan menggunakan metode Trapezoida, Simpson, Gauss Quadrature dan Monte Carlo dengan R. Metode mana yang paling baik? Silahkan tentukan nilai toleransi, n dan m sendiri.

Jawaban Soal 1

Pdf dari distirbusi Kumaraswamy adalah \[f(x|a,b)=ab\ x^{a-1}(1-x^a)^{b-1}\] Karena \(a=5\) dan \(b =3\), maka fungsinya dapat ditulis:
\[f(x)=15x^4(1-x^5)^2\] dengan batas \(0<x<1\). Sehingga untuk \(E(x)\) dapat diperoleh sebagai berikut: \[E(x)=\int_{0}^{1}x\cdot f(x)\ dx=\int_{0}^{1} 15x^5(1-x^5)^2\ dx\] Dengan kata lain, akan dicari luas daerah di bawah kurva \(f(x)=15x^5(1-x^5)^2\)

x <- seq(0,1,0.01)
y <- x*(15*x^4 * (1-x^5)^2)
plot(x,y,type = "l", ylab = "y",main=expression(f(x)==15*x^5 * (1-x^5)^2))
abline(h=0,v=c(0,1))
polygon(x,y,col = "grey")

a. Menghitung E(x) secara manual

Metode Trapezoida

Jadi, melalui metode Trapezoida untuk \(n=4\), diperoleh \(E(x)\approx0.6312869\)

Metode Simpson

Jadi, melalui metode Simpson untuk \(n=4\), diperoleh \(E(x)\approx0.7683974\)

Metode Four-Point Gauss Quadrature

Jadi, melalui metode Four-Point Gauss Quadrature, diperoleh \(E(x)\approx0.6792999\)

Tabel Hasil Perhitungan Manual

Metode n Hasil
Trapezoida 4 0.6312869
Simpson 4 0.7683974
Gauss Quadrature 4 0.6792999

b. Menghitung E(x) Menggunakan R

Pada bagian ini akan dihitung \(E(x)\) menggunakan metode Trapezoida, Simpson, dan Gauss Quadrature dengan toleransi 0.0001.

Diketahui bahwa Mean dari distirbusi Kumaraswamy adalah \(E(x)= \frac{b\ \Gamma(1+\frac{1}{2})\ \Gamma(b)}{\Gamma(1+\frac{1}{a}+b)}\)

a=5;b=3
meank = b * gamma(1+1/a) * gamma(b) / gamma(1+1/a+b)
meank
## [1] 0.7102273

Jadi, secara exact, \(E(x)=0.7102273\)

Metode Trapezoida

trapezoid <- function(ftn, a, b, n = 100) {
     h <- (b-a)/n
     x.vec <- seq(a, b, by = h)
     f.vec <- sapply(x.vec, ftn)     # ftn(x.vec)
     Trap <- h*(f.vec[1]/2 + sum(f.vec[2:n]) + f.vec[n+1]/2)
     return(Trap)
}
f = function(x){15*x^5 - 30*x^10 + 15*x^15}
exact_value=0.7102273
tol <-  0.0001
err <- 1
n = 4

while(err>tol){
  res_trap <- trapezoid(f,0,1,n = n)
  
  err <- abs(res_trap-exact_value)
  
  cat("n=",n,", result=",res_trap,", error=",err,"\n",sep = "")
  
  n=n+1
  if(n==1000){break}
}
## n=4, result=0.6312869, error=0.07894042
## n=5, result=0.6738123, error=0.03641497
## n=6, result=0.6914928, error=0.01873454
## n=7, result=0.6997126, error=0.01051473
## n=8, result=0.7039057, error=0.006321603
## n=9, result=0.7062116, error=0.004015656
## n=10, result=0.7075597, error=0.002667593
## n=11, result=0.7083885, error=0.001838822
## n=12, result=0.7089199, error=0.001307439
## n=13, result=0.7092729, error=0.0009544148
## n=14, result=0.7095147, error=0.000712649
## n=15, result=0.7096846, error=0.0005426739
## n=16, result=0.7098069, error=0.0004204042
## n=17, result=0.7098966, error=0.0003306616
## n=18, result=0.7099637, error=0.0002636072
## n=19, result=0.7100146, error=0.0002127014
## n=20, result=0.7100538, error=0.0001734994
## n=21, result=0.7100844, error=0.0001429188
## n=22, result=0.7101085, error=0.0001187833
## n=23, result=0.7101278, error=9.953088e-05

Jadi, dengan metode Trapezoida dibutuhkan n=23.

Metode Simpson

simpson_n <- function(ftn, a, b, n = 100) {
    n <- max(c(2*(n %/% 2), 4))
    h <- (b-a)/n
    x.vec1 <- seq(a+h, b-h, by = 2*h)       # ganjil
    x.vec2 <- seq(a+2*h, b-2*h, by = 2*h)   # genap
    f.vec1 <- sapply(x.vec1, ftn)   # ganjil
    f.vec2 <- sapply(x.vec2, ftn)   # genap
    S <- h/3*(ftn(a) + ftn(b) + 4*sum(f.vec1) + 2*sum(f.vec2))
    return(S)
}
f = function(x){15*x^5 - 30*x^10 + 15*x^15}
exact_value=0.7102273
tol <-  0.0001
err <- 1
n = 4

while(err>tol){
  res_simp <- simpson_n(f,0,1,n = n)
  
  err <- abs(res_simp-exact_value)
  
  cat("n=",n,", result=",res_simp,", error=",err,"\n",sep = "")
  
  n=n+1
  if(n==1000){break}
}
## n=4, result=0.7683974, error=0.05817006
## n=5, result=0.7683974, error=0.05817006
## n=6, result=0.7497082, error=0.03948094
## n=7, result=0.7497082, error=0.03948094
## n=8, result=0.728112, error=0.01788467
## n=9, result=0.728112, error=0.01788467
## n=10, result=0.7188088, error=0.008581532
## n=11, result=0.7188088, error=0.008581532
## n=12, result=0.7147289, error=0.004501593
## n=13, result=0.7147289, error=0.004501593
## n=14, result=0.712782, error=0.002554712
## n=15, result=0.712782, error=0.002554712
## n=16, result=0.711774, error=0.001546662
## n=17, result=0.711774, error=0.001546662
## n=18, result=0.7112144, error=0.0009870756
## n=19, result=0.7112144, error=0.0009870756
## n=20, result=0.7108852, error=0.0006578651
## n=21, result=0.7108852, error=0.0006578651
## n=22, result=0.7106819, error=0.0004545628
## n=23, result=0.7106819, error=0.0004545628
## n=24, result=0.7105511, error=0.0003237819
## n=25, result=0.7105511, error=0.0003237819
## n=26, result=0.710464, error=0.0002366803
## n=27, result=0.710464, error=0.0002366803
## n=28, result=0.7104042, error=0.0001769138
## n=29, result=0.7104042, error=0.0001769138
## n=30, result=0.7103621, error=0.0001348299
## n=31, result=0.7103621, error=0.0001348299
## n=32, result=0.7103318, error=0.0001045198
## n=33, result=0.7103318, error=0.0001045198
## n=34, result=0.7103096, error=8.225045e-05

Jadi, dengan metode Simpson dibutuhkan n=34.

Metode Gauss Quadrature

f = function(x){15*x^5 - 30*x^10 + 15*x^15}
exact_value=0.7102273
tol <-  0.0001
err <- 1
n = 4
library(pracma)

while(err>tol){
  
  gL <- gaussLegendre(n = n,a = 0,1)

 Ci <- gL$w # koefisien
 xi <- gL$x # gauss point
  
  res_gl <- sum(Ci * f(xi))

  err <- abs(res_gl-exact_value)
  
  cat("n=",n,", result=",res_gl,", error=",err,"\n",sep = "")
  
  n=n+1
  if(n==1000){break}
}
## n=4, result=0.6792999, error=0.03092738
## n=5, result=0.707375, error=0.002852279
## n=6, result=0.7101422, error=8.507726e-05

Jadi, dengan Metode Gauss Quadrature dibutuhkan n=6.

Perbandingan

Berikut perbandingan banyaknya sub interval n untuk mendapatkan \(E(x)\) dengan toleransi 0.0001.

data.frame(Metode=c("Trapezoida","Simpson","Gauss Quadrature"),"Interval"=c(23,34,6))
##             Metode Interval
## 1       Trapezoida       23
## 2          Simpson       34
## 3 Gauss Quadrature        6

Terlihat bahwa Gauss Quadrature adalah metode terbaik karena hanya membutuhkan 6 sub interval atau iterasinya paling sedikit.

Jawaban Soal 2

Pdf dari distirbusi Eksponensial adalah \[f(x|\lambda)=\lambda \ e^{-\lambda x}\] Karena \(\lambda=2\), maka fungsinya dapat ditulis:
\[f(x)=2\ e^{-2x}\] Untuk \(x=4\), CDF-nya dapat diperoleh sebagai berikut: \[F(4)=\int_{0}^{4} f(x)\ dx=\int_{0}^{4} 2\ e^{-2x}\ dx\] Dengan kata lain, akan dicari luas daerah di bawah kurva \(f(x)=2\ e^{-2x}\) dari x=0 sampai x=4.

library(DescTools)
f2 = function(x){ 2*exp(-2*x) }
curve(f2,xlim=c(0,5),ylab="y",main=expression(paste("f(x) = 2 ",e^{-2*x})))
abline(c(h=0,v=0))
Shade(f2,breaks=c(0,4),col="green")
grid()

Secara exact CDF dari \(f(x|\lambda)=\lambda \ e^{-\lambda x}\) adalah \(F(x)=1-e^{-\lambda x}\)

Jadi untuk \(\lambda=2\) dan \(x=4\), diperoleh \(F(x)=1-e^{-8}\)

cdf = 1-exp(-8)
cdf
## [1] 0.9996645

Dengan nilai exact \(cdf=0.9996645\), berikut dibandingkan hasil yang diperoleh melalui metode Trapezoida dan Simpson untuk n = 100, Gauss Quadrature dengan n = 7, dan Monte Carlo dengan m = 10000.

# Fungsi untuk Metode Monte Carlo
mc_integral <- function(ftn, a, b,m=1000){
  #Membangkitkan x berdistribusi U(a,b)
  x <- runif(m,a,b)
  # Menghitung rata-rata dari output fungsi
  Gx <- ftn(x)
  Gx_m <- mean(Gx)
  theta.hat <- (b-a)*Gx_m
  return(theta.hat)
}

Menghitung CDF

cdf = 0.9996645
g   = function(x){ 2*exp(-2*x) }

# Metode Trapezoida
h1  = trapezoid(g,a=0,b=4,n=100)
er1 = abs(cdf-h1)

# Metode Simpson
h2  = simpson_n(g,a=0,b=4,n=100)
er2 = abs(cdf-h2)

# Metode Gauss Quadrature
gL  = gaussLegendre(n = 7,a = 0,4)
Ci  = gL$w # koefisien
xi  = gL$x # gauss point
h3  = sum(Ci * g(xi))
er3 = abs(h3-cdf)

# Metode Monte Carlo
set.seed(101)
m=10000
h4=mc_integral(g,a=0,b=4,m=m)
er4 = abs(h4-cdf)

Metode = c("Trapezoida","Simpson","Gauss Quadrature","Monte Carlo")
n      = c(100,100,7,m)
Hasil  = c(h1,h2,h3,h4)
Error  = c(er1,er2,er3,er4)

data.frame(Metode,n,Hasil,Error)
##             Metode     n     Hasil        Error
## 1       Trapezoida   100 1.0001976 5.331349e-04
## 2          Simpson   100 0.9996648 2.646781e-07
## 3 Gauss Quadrature     7 0.9996645 1.619311e-08
## 4      Monte Carlo 10000 0.9917179 7.946581e-03

Terlihat bahwa Metode Gauss Quadrature memberikan hasil yang terbaik karena memeiliki error yang paling kecil.