Latihan 1

Lakukan Modifikasi pada fungsi newtonraphson sehingga output dari fungsi tersebut berupa list dengan tiga object:

  1. Object pertama bernama root berisi akar persamaan.
  2. Object kedua bernama x_values berisi semua nilai x yang dicobakan
  3. Object ketiga bernama error berisi nilai dari hasil operasi abs(fx[1]) Gunakan persamaan pada contoh soal 1 untuk menujukkan hasil output-nya!

Berikut fungsi newtonraphson

newtonraphson <- function(ftn, x0, tol = 1e-5, max.iter = 100) {
  x <- x0
  fx <- ftn(x)
  xvalue<-max.iter
  error<-max.iter
  iter <- 0
  while ((abs(fx[1]) > tol) && (iter < max.iter)) {
    x <- x - fx[1]/fx[2]
    fx <- ftn(x)
    iter <- iter + 1
    xvalue[iter]<-x
    error[iter]<-abs(fx[1])
  }
  # output bergantung pada kesuksesan algoritma
  if (abs(fx[1]) > tol) {
    cat("Algorithm failed to converge\n")
    return(NULL)
  } else {
    cat("Algorithm converged\n")
    root <- tail(xvalue, n=1)
    list(root=root,x_values=xvalue,error=error)
  }
}

Selanjutnya, persamaan yang digunakan untuk menunjukkan output dari fungsi di atas adalah:

fx <- function(x) {
  x^3 - 2 * x - 5
}

Mendefinikan persamaan dalam bentuk fungsi untuk newton-raphson:

library(Deriv)
## Warning: package 'Deriv' was built under R version 4.4.1
fx_nr <- function(x) {
  rumus_fungsi <- function(x) x^3-2*x-5
  fungsi <- rumus_fungsi(x)
  # mencari turunan dengan menggunakan fungsi Deriv
  # dari package Deriv
  rumus_turunan <- Deriv::Deriv(fx)
  turunan <- rumus_turunan(x)
  return(c("fungsi"=fungsi,"turunan"=turunan))
}
newtonraphson(ftn=fx_nr,x0=0)
## Algorithm converged
## $root
## [1] 2.094551
## 
## $x_values
##  [1] -2.5000000 -1.5671642 -0.5025924 -3.8207065 -2.5493934 -1.6081115
##  [7] -0.5761004 -4.5977096 -3.0835431 -2.0221943 -1.1237641  1.2086516
## [13]  3.5807900  2.6552332  2.2161063  2.1021250  2.0945836  2.0945515
## 
## $error
##  [1] 1.562500e+01 5.714632e+00 4.121770e+00 5.313249e+01 1.647076e+01
##  [6] 5.942390e+00 4.039002e+00 9.299526e+01 2.815198e+01 9.224909e+00
## [11] 4.171613e+00 5.651658e+00 3.375152e+01 8.409627e+00 1.451367e+00
## [16] 8.489238e-02 3.582354e-04 6.472653e-09

Latihan 2

Selidiki penggunaan fungsi browser() di R. Gunakan fungsi newtonraphson untuk ilustrasi penggunaan. Laporkan hasil penyelidikanmu beserta ilustrasi koding!

Fungsi browser() diletakkan atau diselipkan sebelum output list pada fungsi newtonraphson

newtonraphson <- function(ftn, x0, tol = 1e-5, max.iter = 100) {
  x <- x0
  fx <- ftn(x)
  xvalue<-max.iter
  error<-max.iter
  iter <- 0
  while ((abs(fx[1]) > tol) && (iter < max.iter)) {
    x <- x - fx[1]/fx[2]
    fx <- ftn(x)
    iter <- iter + 1
    xvalue[iter]<-x
    error[iter]<-abs(fx[1])
  }
  # output bergantung pada kesuksesan algoritma
  if (abs(fx[1]) > tol) {
    cat("Algorithm failed to converge\n")
    return(NULL)
  } else {
    cat("Algorithm converged\n")
    root <- tail(xvalue, n=1)
    browser()
    list(root=root,x_values=xvalue,error=error)
  }
}

fx <- function(x) {
  x^3 - 2 * x - 5
}

library(Deriv)
fx_nr <- function(x) {
  rumus_fungsi <- function(x) x^3-2*x-5
  fungsi <- rumus_fungsi(x)
  # mencari turunan dengan menggunakan fungsi Deriv
  # dari package Deriv
  rumus_turunan <- Deriv::Deriv(fx)
  turunan <- rumus_turunan(x)
  return(c("fungsi"=fungsi,"turunan"=turunan))
}

Setelah itu, memanggil fungsi newtonrapshon() yang telah terdapat browser() didalamnya dengan menggunakan persamaan pada soal nomor 1.

newtonraphson(ftn=fx_nr,x0=0)
## Algorithm converged
## Called from: newtonraphson(ftn = fx_nr, x0 = 0)
## debug at <text>#22: list(root = root, x_values = xvalue, error = error)
## $root
## [1] 2.094551
## 
## $x_values
##  [1] -2.5000000 -1.5671642 -0.5025924 -3.8207065 -2.5493934 -1.6081115
##  [7] -0.5761004 -4.5977096 -3.0835431 -2.0221943 -1.1237641  1.2086516
## [13]  3.5807900  2.6552332  2.2161063  2.1021250  2.0945836  2.0945515
## 
## $error
##  [1] 1.562500e+01 5.714632e+00 4.121770e+00 5.313249e+01 1.647076e+01
##  [6] 5.942390e+00 4.039002e+00 9.299526e+01 2.815198e+01 9.224909e+00
## [11] 4.171613e+00 5.651658e+00 3.375152e+01 8.409627e+00 1.451367e+00
## [16] 8.489238e-02 3.582354e-04 6.472653e-09

Fungsi browser() tersebut berguna untuk melihat dalamnya fungsi seperti apa. Kita dapat memeriksa atau mengeksekusi nilai variabel, parameter atau output fungsi yang sudah dibuat serta menelusuri pernyataan fungsi baris demi baris.

Untuk melihat nama-nama variabel atau objek yang ada pada fungsi newtonraphson, maka dapat menggunakan perintah ls() seperti berikut:

Misalnya, kita memanggil output error, x_value, dan root serta objek atau nilai lainnya dari contoh persamaan fx. Memanggil nilai-nilai tersebut bisa ditulis di console, seperti berikut:

Untuk menutup fungsi browser() ini serta mengeluarkan output dari fungsi, dapat digunakan perintah cont seperti berikut:

Sedangkan untuk keluar dari fungsi browser() tanpa mengeluarkan output dari fungsi, dapat menggunakan perintah Q. Sedangkan perintah n digunakan untuk menelusuri pernyataan-pernyataan berikutnya.

Latihan 3

Buatlah gambar fungsi pada contoh soal 2 dengan menggunakan package ggplot dengan menggunakan fungsi geom_curve!

Persamaan

fx2 <- function(x) {
  x^3 - x - 1
}

Plot dari persamaan di atas dengan fungsi geom_curve

library(ggplot2)
x <- seq(-3,3,0.01)
y <- fx2(x)
data <- data.frame(x,y)
data
tail(data)
ggplot(data,aes(x=x,y=y)) +
  geom_curve(aes(x=-3,y=-25,xend=0,yend=-1),data=data,curvature =-0.35) +
  geom_curve(aes(x=0,y=-1,xend=3,yend=23),data=data,curvature=0.4)+
  geom_hline(yintercept=0) +
  geom_vline(xintercept=0)
## Warning in geom_curve(aes(x = -3, y = -25, xend = 0, yend = -1), data = data, : All aesthetics have length 1, but the data has 601 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
##   a single row.
## Warning in geom_curve(aes(x = 0, y = -1, xend = 3, yend = 23), data = data, : All aesthetics have length 1, but the data has 601 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
##   a single row.