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.
- Jika |b – al| ≤ ε maka stop.
- Tetapkan \(\mathrm{m=\frac {a+b}{2}}\) ; jika f(m) = 0 maka stop.
- Jika f(a)f(m) < 0 maka tetapkan b = m; selainnya, tetapkan a = m.
- 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