Root Finding-STA561

Endang Yuliani

Metode Fixed Point

fixedpoint <- function(ftn, x0, tol = 1e-9, max.iter = 100) {
  
  xold <- x0
  xnew <- ftn(xold)
  iter <- 1
  cat("At iteration 1 value of x is:", xnew, "\n")
  
  
  while ((abs(xnew-xold) > tol) && (iter < max.iter)) {
    # xold digunakan untuk menyimpan akar-akar persamaan dari iterasi sebelumnya
    xold <- xnew
    # xnew digunakan untuk menghitung akar-akar persamaan pada iterasi yang sedang berjalan
    xnew <- ftn(xold) #ingat ftn bentuknya fungsi
    # iter digunakan untuk menyimpan banyaknya iterasi
    iter <- iter + 1
    cat("At iteration", iter, "value of x is:", xnew, "\n")
  }
  # output bergantung pada kesuksesan algoritma
  if (abs(xnew-xold) > tol) {
    cat("Algorithm failed to converge\n")
    return(NULL)
  } else {
    cat("Algorithm converged\n")
    return(xnew)
  }
}
ftn1 <- function(x) return(exp(exp(-x)))
fixedpoint(ftn1, 2, tol=1e-6)
## At iteration 1 value of x is: 1.144921 
## At iteration 2 value of x is: 1.374719 
## At iteration 3 value of x is: 1.287768 
## At iteration 4 value of x is: 1.317697 
## At iteration 5 value of x is: 1.307022 
## At iteration 6 value of x is: 1.310783 
## At iteration 7 value of x is: 1.309452 
## At iteration 8 value of x is: 1.309922 
## At iteration 9 value of x is: 1.309756 
## At iteration 10 value of x is: 1.309815 
## At iteration 11 value of x is: 1.309794 
## At iteration 12 value of x is: 1.309802 
## At iteration 13 value of x is: 1.309799 
## At iteration 14 value of x is: 1.3098 
## Algorithm converged
## [1] 1.3098

Metode Newton Raphson

newtonraphson <- function(ftn, x0, tol = 1e-5, max.iter = 100) {
  
  x <- x0
  fx <- ftn(x)
  iter <- 0
  while ((abs(fx[1]) > tol) && (iter < max.iter)) {
    x <- x - fx[1]/fx[2]
    fx <- ftn(x)
    iter <- iter + 1
    cat("At iteration", iter, "value of x is:", x, "\n")
  }
  # output bergantung pada kesuksesan algoritma
  if (abs(fx[1]) > tol) {
    cat("Algorithm failed to converge\n")
    return(NULL)
  } else {
    cat("Algorithm converged\n")
    return(x)
  }
}
ftn <- function(x){
  fx <- log(x)-exp(-x) #fungsi f(x)
  dfx <- 1/x+exp(-x) #turunan pertama f(x)
  return(c(fx,dfx))
}

newtonraphson(ftn,3,1e-4)
## At iteration 1 value of x is: 0.2624136 
## At iteration 2 value of x is: 0.7224658 
## At iteration 3 value of x is: 1.156032 
## At iteration 4 value of x is: 1.299908 
## At iteration 5 value of x is: 1.309759 
## Algorithm converged
## [1] 1.309759

Metode Secant

secant <- function(ftn, x0, x1, tol = 1e-9, max.iter = 100) 
{
  xa <- x0
  fxa <- ftn(xa)
  xb <- x1
  fxb <- ftn(xb)
  iter <- 0
  while ((abs(xb-xa) > tol) && (iter < max.iter)) 
  {
    xt <- fxb*((xb-xa)/(fxb-fxa))
    xc <- xb-xt
    # fxc <- ftn(xc)
    iter <- iter + 1
    cat("At iteration", iter, "value of x is:", xc, "\n")
    xa <- xb
    xb <- xc
    fxa <- ftn(xa)
    fxb <- ftn(xb)
    
    
    if (abs(xb-xa) > tol) {
      cat("Algorithm failed to converge\n")
      return(NULL)
    } else {
      cat("Algorithm converged\n")
      return(xb)
    }
  }
}
ftnsec <- function(x) return(log(x)-exp(-x))
secant(ftnsec,1,2,tol=1e-6)
## At iteration 1 value of x is: 1.39741 
## Algorithm failed to converge
## NULL

Metode Bisection

bisection <- function(f, xl, xr, tol = 1e-7,max.iter = 100) {
  # Jika tanda dari hasil evaluasi fungsi pada titik xl dan xr berbeda maka program dihentikan
  if (!(f(xl) > 0) && (f(xr) < 0)) {
    stop('signs of f(xl) and f(xr) differ')
  }
  
  for (iter in 1:max.iter) {
    xm <- (xl + xr) / 2 # menghitung nilai tengah
    
    cat("At iteration", iter, "value of x is:", xm, "\n")       
    #Jika fungsinya sama dengan 0 di titik tengah atau titik tengah di bawah toleransi yang diinginkan, hentikan dan keluarkan nilai tengah sebagai akar
    if ((f(xm) == 0) || abs(xr - xl) < tol) {
      return(xm)
    }
    # Jika diperlukan iterasi lain,
    # periksa tanda-tanda fungsi pada titik xm dan xl dan tetapkan kembali
    # xl atau xr sebagai titik tengah yang akan digunakan pada iterasi berikutnya.    
    ifelse(sign(f(xm)) == sign(f(xl)), 
           xl <- xm,xr <- xm)
  }
}
fbisec <- function(x) return(x^3-2*x-5)
bisection(fbisec, xl=-3, xr=3)
## At iteration 1 value of x is: 0 
## At iteration 2 value of x is: 1.5 
## At iteration 3 value of x is: 2.25 
## At iteration 4 value of x is: 1.875 
## At iteration 5 value of x is: 2.0625 
## At iteration 6 value of x is: 2.15625 
## At iteration 7 value of x is: 2.109375 
## At iteration 8 value of x is: 2.085938 
## At iteration 9 value of x is: 2.097656 
## At iteration 10 value of x is: 2.091797 
## At iteration 11 value of x is: 2.094727 
## At iteration 12 value of x is: 2.093262 
## At iteration 13 value of x is: 2.093994 
## At iteration 14 value of x is: 2.09436 
## At iteration 15 value of x is: 2.094543 
## At iteration 16 value of x is: 2.094635 
## At iteration 17 value of x is: 2.094589 
## At iteration 18 value of x is: 2.094566 
## At iteration 19 value of x is: 2.094555 
## At iteration 20 value of x is: 2.094549 
## At iteration 21 value of x is: 2.094552 
## At iteration 22 value of x is: 2.094551 
## At iteration 23 value of x is: 2.094551 
## At iteration 24 value of x is: 2.094552 
## At iteration 25 value of x is: 2.094552 
## At iteration 26 value of x is: 2.094551 
## At iteration 27 value of x is: 2.094551
## [1] 2.094551