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