Tugas Praktikum 10

library(pracma)

Soal 1

1a

E(x) dengan metode Trapezoida

E(x) dengan metode Simpson

E(x) dengan metode Gauss-Quadrature

Perbandingan Hasil perhitungan Manual tiga Metode dengan n=4.

1b

Pada soal 1b) akan dihitung nilai E(X) menggunakan metode trapezoida, Simpson dan Gauss Quadrature dengan nilai toleransi sebesar 0.0001

a<-5
b<-3
meang <- b * gamma (1+1/a) * gamma (b) / gamma (1+1/a+b)
meang
## [1] 0.7102273

Maka Exact Value = 0.7102273

Metode Trapezoid

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

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

Metode Gauss-Quadrature

ft <- function(x){
  15*x^5 - 30*x^10 + 15*x^15
}
gL <- gaussLegendre(n = 4,a = 0,1)
Ci <- gL$w # koefisien
Ci
## [1] 0.1739274 0.3260726 0.3260726 0.1739274
xi <- gL$x # gauss point
xi
## [1] 0.06943184 0.33000948 0.66999052 0.93056816
I <- sum(Ci * ft(xi))
I
## [1] 0.6792999
exact_value=0.7102273
tol <-  0.0001
err <- 1
n = 4

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

 Ci <- gL$w # koefisien
 xi <- gL$x # gauss point
  
  res_gl <- sum(Ci * ft(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

Komparasi Hasil perhitungan tiga metode

Perbandingan banyaknya sub interval n untuk mendapatkan E(x) dengan nilai 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

Berdasarkan hasil iterasi metode yang terbaik adalah metode Gauss Quadrature karena hanya membutuhkan 6 sub interval.

Soal 2

a <- 0
b <- 4
lambda <- 2
fall <- function(x, lambda) lambda*exp(-lambda*x) 
integrate(fall, a, b, lambda)
## 0.9996645 with absolute error < 1.1e-14

Nilai eksak = 0.9996645

Dengan nilai exact =0.9996645, Menggunakan metode Trapezoida dan Simpson untuk n = 100, Gauss Quadrature dengan n = 6, dan Monte Carlo dengan m = 1000 akan diperoleh hasil yang akan dikomparasi.

Fungsi Integral Monte Carlo dengan m=1000

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

Menghitung CDF dari distribusi exponensial.

exact_value = 0.9996645
fp   = function(x){ 2*exp(-2*x) }

# Metode Trapezoida
ht  = trapezoid(fp,a=0,b=4,n=100)
e1 = abs(exact_value -ht)

# Metode Simpson
hs  = simpson_n(fp,a=0,b=4,n=100)
e2 = abs(exact_value -hs)

# Metode Gauss Quadrature
gL  = gaussLegendre(n = 100,a = 0,4)
Ci  = gL$w # koefisien
xi  = gL$x # gauss point
hg  = sum(Ci * fp(xi))
e3 = abs(hg-exact_value )

# Metode Monte Carlo
set.seed(41)
m=1000
hmc=mc_integral(fp,a=0,b=4,m=m)
e4 = abs(hmc-exact_value )

Metode = c("Trapezoida","Simpson","Gauss Quadrature","Monte Carlo")
n      = c(100,100,100,m)
Hasil  = c(ht,hs,hg,hmc)
Error  = c(e1,e2,e3,e4)

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  100 0.9996645 3.737209e-08
## 4      Monte Carlo 1000 0.9539666 4.569792e-02

Berdasarkan komparasi dari ke-empat metode tersebut, metode yang terbaik adalah gauss quadrature dengan hasil paling mendekati exact value dengan nilai error terkecil.