Root Finding

Annebel D Clarissa

4/21/2021

Root Finding

Penentuan akar persamaan dari suatu fungsi dapat dilakukan dengan berbagai metode, seperti :

  • Metode Fixed Point
  • Metode Newton Raphson
  • Metode Secant
  • Metode Bisection

Setiap metode memiliki algoritma dan kelebihan serta kekurangannya masing-masing, namun pada tulisan ini hanya akan dibahas mengenai metode bisection.

Metode Bisection

Metode Bisection adalah pendekatan lain untuk mencari akar dari fungsi kontinu f (x) pada interval [a, b]. Metode ini memanfaatkan teorema nilai tengah yang disebut teorema Bolzano yang menyatakan bahwa jika nilai f (a) dan f (b) memiliki tanda yang berlawanan, selang/interval harus mengandung setidaknya satu akar. Kelebihan dari metode bisection adalah langkah-langkah iterasi yang relatif lebih mudah, namun kekurangannya adalah konvergensi menuju solusi lebih lambat dibandingkan dengan metode pencarian akar lainnya.

Algoritma - Metode Bisection

Metode bisection dimulai dengan menghitung titik tengah, \(\mathrm{m=\frac {a+b}{2}}\) dari interval. Selanjutnya, fungsi dievaluasi pada titik f(m). Sesuai teorema Bolzano, jika f(a) dan f(m) memiliki tanda yang berlawanan, metode bisection menggantikan nilai b dengan titik tengah yang dihitung (m). Begitu juga jika f (b) dan f(m) memiliki tanda yang berlawanan, a akan diganti dengan titik tengah (m). Langkah ini memastikan masih ada root yang terkandung dalam interval. Prosedur kemudian berlanjut ke iterasi berikutnya. Solusinya dikatakan ditemukan setelah fungsinya sama dengan 0 pada f(m).

Sehingga jika dirangkum cara kerja dari metode bisection tersebut adalah :

Tetapkan dua nilai a dan b sehingga f(a)f(b) < 0.

  1. Jika |b – al| ≤ ε maka stop.
  2. Tetapkan \(\mathrm{m=\frac {a+b}{2}}\) ; jika f(m) = 0 maka stop.
  3. Jika f(a)f(m) < 0 maka tetapkan b = m; selainnya, tetapkan a = m.
  4. Lanjutkan ke langkah 1.

Flowchart

Program R - Metode Bisection

Misal akan dicari akar persamaan dari fungsi \(\mathrm{log(x)-e^{-x}}\).

Grafik fungsi

Buat terlebih dahulu grafik fungsi untuk mengetahui interval yang berisi root.

func <- function(x) {
  log(x) - exp(-x)
}

curve(func, xlim=c(0,7), col='red', lwd=1.5, lty=2)
abline(h=0)
abline(v=0)

Terlihat dari plot, akar persamaan tampaknya mendekati nilai 1.5, jadi akan digunakan interval [1,2].

Fungsi Metode Bisection

metodebisection <- function(func, a, b, tol = 1e-5, max.iter = 100) {
    fa <- func(a)
    fb <- func(b)
    iter <- 0
    
    if(fa*fb<0) {
      while ((abs(b-a) > tol) && (iter < max.iter)) {
         m <- (a+b)/2   #menghitung nilai tengah m
         fm <- func(m)
         
         if(fm==0){  #jika fm=0 maka stop dan kembalikan nilai
           return(m)
         }
         
         else{  #jika fm tidak sama dengan 0, iterasi
           iter <- iter+1
           cat("At iteration", iter, "value of x is:", m, "\n")
         
            if(fa*fm<0){ #fa dan fm berbeda tanda
              b <- m 
            }
            else{
              a <- m
            }
         }
      }
    }
    else { 
      cat("Change initiation that fulfills \n")
    }
# output depends on success of algorithm
   if (abs(b-a) > tol) {
       cat("Algorithm failed to converge\n")
       return(NULL)
       } else {
            cat("Algorithm converged\n")
            return(m)
            }
     }

Perhitungan akar persamaan dengan Fungsi metodebisection

Selanjutnya akan dicari akar persamaan dari fungsi \(\mathrm{log(x)-e^{-x}}\) pada interval [1,2] dengan fungsi metodebisection yang telah dibuat

metodebisection(func, 1, 2)
## At iteration 1 value of x is: 1.5 
## At iteration 2 value of x is: 1.25 
## At iteration 3 value of x is: 1.375 
## At iteration 4 value of x is: 1.3125 
## At iteration 5 value of x is: 1.28125 
## At iteration 6 value of x is: 1.296875 
## At iteration 7 value of x is: 1.304688 
## At iteration 8 value of x is: 1.308594 
## At iteration 9 value of x is: 1.310547 
## At iteration 10 value of x is: 1.30957 
## At iteration 11 value of x is: 1.310059 
## At iteration 12 value of x is: 1.309814 
## At iteration 13 value of x is: 1.309692 
## At iteration 14 value of x is: 1.309753 
## At iteration 15 value of x is: 1.309784 
## At iteration 16 value of x is: 1.309799 
## At iteration 17 value of x is: 1.309807 
## Algorithm converged
## [1] 1.309807

Output dari fungsi metodebisection menunjukkan bahwa akar dari fungsi \(\mathrm{log(x)-e^{-x}}\) terletak di x=1.309807.


R juga telah menyediakan perhitungan bagi metode bisection dalam package NLRoot dan fungsi BFfzero(). Untuk mencocokan hasil dari fungsi metodebisection, akan digunakan fungsi BFfzero() dari package NLRoot

library(NLRoot)

BFfzero(func, 1, 2)
## [1] 1
## [1] 1.309799
## [1] -4.045236e-07
## [1] "finding root is successful"

Output dari fungsi BFfzero menunjukkan nilai yang sama dengan fungsi metodebisection yang telah dibuat yaitu akar persamaan terletak pada x=1.309799


Metode Newton Raphson

Metode Newton-Raphson adalah pendekatan untuk menemukan akar persamaan nonlinier dan merupakan salah satu algoritma pencarian akar yang paling umum karena kesederhanaan dan kecepatannya. Dalam metode newton-raphson, akar dari suatu fungsi adalah titik di mana f(x) = 0. Newton-Raphson adalah metode berulang yang dimulai dengan tebakan awal akar (x0). Metode ini menggunakan turunan dari fungsi f′(x) serta fungsi asli f(x) sehingga hanya dapat digunakan jika turunannya dapat ditentukan.

Formula dari Metode Newton-Raphson adalah :

\[\mathrm{x_{n+1}=x_n - \frac{f(x_1)}{f'(x_1)}}\]

Program R - 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 depends on success of algorithm
   if (abs(fx[1]) > tol) {
       cat("Algorithm failed to converge\n")
       return(NULL)
       } else {
            cat("Algorithm converged\n")
            return(x)
            }
     }

Perhitungan akar persamaan dengan Fungsi newtonraphson

Akan dilakukan perhitungan akar persamaan dengan soal yang sama dengan metode bisection yaitu \[\mathrm{f(x)=log(x)-e^{-x}}\]

ftn <- function(x) {
# returns function value and its derivative at 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

Kesimpulan : Dari perhitungan dengan metode Newton-Raphson, didapatkan nilai akar persamaan yang sama dengan metode bisection yaitu x=1.309759

Metode Secant

Metode secant adalah metode berulang yang membutuhkan dua tebakan awal akar, (sebelumnya metode Newton-Raphson hanya menggunakan satu tebakan awal akar). Karena membutuhkan dua pendekatan akar awal, metode secant lebih lambat menuju nilai konvergen dibandingkan dengan metode Newton-Raphson, namun biasanya hasilnya lebih stabil. Metode secant juga memiliki kelebihan lainnya dibandingkan dengan metode Newton-Raphson karena tidak memerlukan turunan dari fungsi yang akan dicari akar persamaannya. Metode secant menggunakan garis-garis potong (karena itu diperlukan dua nilai awal awal) untuk menemukan akar suatu fungsi sedangkan metode Newton-Raphson mendekati akar dengan garis singgung.

Formula dari Metode Secant adalah :

\[\mathrm{x_{n+1}=x_n - f(x_n)\frac{x_n-x_{n-1}}{f(x_n)-f(x_{n-1})}}\]

Program R - 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 x2 is:", xc, "\n")
    xa <- xb
    xb <- xc
    fxa <- ftn(xa)
    fxb <- ftn(xb)
  }
  
   # output depends on success of algorithm
 if (abs(xb-xa) > tol) {
     cat("Algorithm failed to converge\n")
     return(NULL)
  } else {
    cat("Algorithm converged\n")
    return(xb)
    }
}

Perhitungan akar persamaan dengan Fungsi secant

ftnsec <- function(x) return(log(x) - exp(-x))
secant(ftnsec, 1, 2, tol = 1e-6)
## At iteration 1 value of x2 is: 1.39741 
## At iteration 2 value of x2 is: 1.285476 
## At iteration 3 value of x2 is: 1.310677 
## At iteration 4 value of x2 is: 1.309808 
## At iteration 5 value of x2 is: 1.3098 
## At iteration 6 value of x2 is: 1.3098 
## Algorithm converged
## [1] 1.3098

Kesimpulan : Dari perhitungan dengan metode Secant, didapatkan nilai akar persamaan yang sama dengan metode Bisection dan Newton-Raphson yaitu x=1.3098

Metode Fixed Point

Metode fixed-point adalah metode iteratif untuk menyelesaikan persamaan dengan bentuk f(x) = x. Metode ini membangkitkan sekuen titik-titik x0, x1, x2, … xn yang diharapkan konvergen terhadap suatu titik sehingga f(a)=a. Suatu perkiraan nilai awal x0 diperlukan untuk menentukan dugaan berikutnya, yaitu x1=f(x0), x2=f(x1), … , xn+1=f(xn), terus berulang. Kelemahan dari metode ini adalah proses iterartif yang relatif lambat.

Formula dari Metode Fixed Point adalah :

\[\mathrm{x_{n+1}=g(x_n)}\]

Program R - 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 <- xnew;
      xnew <- ftn(xold);
      iter <- iter + 1
      cat("At iteration", iter, "value of x is:", xnew, "\n")
      }
  
  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