Integrasi

Kaidah trapesium

# FUNGSI BUATAN
trapezoidal <- function(f, a, b, n) {
  # f : fungsi yang akan diintegralkan
  # a : batas bawah
  # b : batas atas
  # n : banyaknya partisi (subinterval)
  
  h <- (b - a) / n                 # panjang tiap subinterval
  x <- seq(a, b, by = h)           # titik-titik partisi
  y <- f(x)                        # nilai fungsi di titik-titik partisi
  
  integral <- (h/2) * (y[1] + 2*sum(y[2:n]) + y[n+1])
  return(integral)
}
# Ilustrasi
f <- function(x) x^3
a <- 0
b <- 1
n <- 1000

hasil <- trapezoidal(f, a, b, n)
print(hasil)
## [1] 0.2500003
# FUNGSI BAWAAN
library(pracma)
x <- seq(0, 1, length.out = 1000)
y <- x^3
trapz(x, y)
## [1] 0.2500003
# Bandingkan dengan nilai sejati
print(integrate(f, lower = 0, upper = 1)$value)
## [1] 0.25

Kaidah titik tengah

# FUNGSI BUATAN
midpoint_integral <- function(f, a, b, n) {
  h <- (b - a) / n
  sum(f(a + ( (1:n) - 0.5 ) * h)) * h
}
# Ilustrasi
f <- function(x) x^3
midpoint_integral(f, 0, 1, 1000)
## [1] 0.2499999

Metode Simpson 1/3

# FUNGSI BUATAN
simpson13 <- function(f, a, b, n) {
  if (n %% 2 != 0) {
    stop("Jumlah selang (n) harus genap untuk metode Simpson 1/3")
  }
  
  h <- (b - a) / n
  x <- seq(a, b, by = h)
  y <- f(x)
  
  # rumus Simpson 1/3
  hasil <- (h/3) * (y[1] + 
                     4 * sum(y[seq(2, n, by = 2)]) + 
                     2 * sum(y[seq(3, n-1, by = 2)]) + 
                     y[n+1])
  return(hasil)
}
# Ilustrasi
f <- function(x) x^3
simpson13(f, 0, 1, 4)
## [1] 0.25
# Bandingkan dengan nilai sejati
print(integrate(f, lower = 0, upper = 1)$value)
## [1] 0.25

Metode Simpson 3/8

# FUNGSI BUATAN
simpson38 <- function(f, a, b, n) {
  if (n %% 3 != 0) {
    stop("Jumlah selang (n) harus kelipatan 3 untuk metode Simpson 3/8")
  }
  h <- (b - a) / n
  x <- seq(a, b, by = h)
  y <- f(x)
  # rumus Simpson 3/8
  hasil <- (3*h/8) * (y[1] + 
                      3 * sum(y[seq(2, n, by = 3)]) + 
                      3 * sum(y[seq(3, n, by = 3)]) + 
                      2 * sum(y[seq(4, n-2, by = 3)]) +
                      y[n+1])
  return(hasil)
}
# Ilustrasi
f <- function(x) x^3
simpson38(f, 0, 1, 6)
## [1] 0.25

Metode Romberg

# FUNGSI BUATAN
mromberg <- function(f, a, b, nmax = 10, tol = 1e-8) {
  R <- matrix(0, nrow = nmax, ncol = nmax)
  h <- b - a
  R[1,1] <- 0.5 * h * (f(a) + f(b))
  
  for (i in 2:nmax) {
    h <- h / 2
    x <- seq(a + h, b - h, by = 2*h)
    R[i,1] <- 0.5 * R[i-1,1] + h * sum(f(x))
    for (k in 2:i) {
      R[i,k] <- (4^(k-1) * R[i,k-1] - R[i-1,k-1]) / (4^(k-1) - 1)
    }
    if (abs(R[i,i] - R[i-1,i-1]) < tol) {
      return(list(value = R[i,i], table = R[1:i,1:i]))
    }
  }
  return(list(value = R[nmax,nmax], table = R))
}
# ilustrasi
f <- function(x) x^3
mromberg(f, 0, 1)
## $value
## [1] 0.25
## 
## $table
##          [,1] [,2] [,3]
## [1,] 0.500000 0.00 0.00
## [2,] 0.312500 0.25 0.00
## [3,] 0.265625 0.25 0.25
# FUNGSI BAWAAN
library(pracma)
romberg(f, 0, 1)
## $value
## [1] 0.25
## 
## $iter
## [1] 6
## 
## $rel.error
## [1] 1.650902e-13

Metode Gauss-Kuadratur

#FUNGSI BAWAAN
library(statmod)
## Warning: package 'statmod' was built under R version 4.4.3
gauss_quad <- function(f, a, b, n = 5) {
  # f  : fungsi yang akan diintegralkan
  # a,b: batas bawah dan atas
  # n  : jumlah titik kuadratur
  
  # titik dan bobot Gauss-Legendre pada interval [-1,1]
  quad <- gauss.quad(n, kind = "legendre")
  x <- quad$nodes
  w <- quad$weights
  
  # transformasi ke interval [a,b]
  t <- ((b - a) * x + (b + a)) / 2
  integral <- ((b - a) / 2) * sum(w * f(t))
  
  return(integral)
}
# ilustrasi
f <- function(x) x^3
gauss_quad(f, a=0, b=1)
## [1] 0.25