Prodi : Teknik Informatika

Lembaga : UIN Maulana Malik Ibrahim Malang

Diferensiasi Menggunakan Paket numDeriv

Terdapat sejumlah fungsi R yang dapat digunakan untuk menghitung turunan suatu persamaan matematik. Fungsi-fungsi tersebut tersedia dalam sejumlah Paket, baik base package maupun yang berasal dari Paket lainnya.

1. Diferensiasi Metode Titik Pusat Mengggunakan Fungsidiff()

Fungsi diff() pada Paket base dapat digunakan untuk menghitung turunan suatu persamaan menggunakan metode titik pusat. Fungsi ini pada umumnya digunakan untuk menghitung lag suatu data runtun waktu. Agar fungsi tersebut dapat digunakan untuk menghitung turunan pertama suatu persamaan, kita dapat menggunakan argumen lag = 2. Berikut adalah contoh penerapan fungsi diff() untuk memperoleh turunan pertama persamaan matematik pada Contoh 9.1:

f <- function(x){exp(-x)*sin(2*x)+1}
x <- 1
h <- x*.Machine$double.eps^(1/3)
xvec <- seq(x-h, x+h, h)

# turunan pertama
diff(f(xvec), lag=2)/(2*h)

## [1] -0.6407

2. Diferensiasi Menggunakan Paket numDeriv

Paket standar yang sering digunakan untuk melakukan taksiran numerik turunan suatu fungsi adalah Paket numDeriv. Pada Paket tersebut terdapat fungsi grad() yang digunakan untuk menaksir turunan pertama suatu persamaan. Format fungsi tersebut adalah sebagai berikut:

grad(func, x, method="Richardson", method.args=list(), ...)

Catatan:

  • func: Fungsi persamaan matematik yang akan dicari turunannya.

  • x: Lokasi atau titik yang akan dicari gradiennya

  • method: Metode estimasi yang digunakan. Metode yang dapat digunakan antara lain:

  • “simple”: metode selisih maju dengan h=10−4h=10−4

  • “Richardson”: metode interpolasi Richardson

  • “complex”: complex-step derivative approach dan dapat digunakan untuk persamaan complex-differentiable.

  • method.args: argumen tambahan yang digunakan bersama dengan argumen method. Jika metode yang digunakan adalah “simple”, nilai hh dapat dispesifikasikan pada method.args jika diinginkan nilai hh lainnya.

Berikut adalah contoh penerapan fungsi grad() untuk memperoleh turunan pertama persamaan matematik pada Contoh 9.1:

numDeriv::grad(function(x){exp(-x)*sin(2*x)+1},
     x=1, method = "simple", 
     method.args = list(eps=1*sqrt(.Machine$double.eps)))

## [1] -0.6407

3. Diferensiasi Menggunakan Paket

Terdapat sejumlah fungsi pada Paket pracma yang dapat digunakan untuk melakukan diferensiasi suatu persamaan matematik. FUngsi-fungsi yang dapat digunakan untuk melakukan diferensiasi sederhana antara lain: fderiv(), numderiv(), numdiff(), dan grad().

Fungsi fderiv() dapat digunakan untuk melakukan diferensiasi orde pertama sampai dengan orde tinggi. Perlu dicatat bahwa diferensiasi cenderung kurang akurat jika orde diferensiasi semakin tinggi. Format yang digunakan untuk melakukan diferensiasi menggunakan fungsi fderiv() adalah sebagai berikut:

fderiv(f, x, n = 1, h = 0,
        method = c("central", "forward", "backward"), 
       ...)

Catatan:

  • f: Fungsi persamaan matematik yang akan dicari turunannya.

  • x: Lokasi atau titik yang akan dicari gradiennya

  • n: Orde diferensiasi yang digunakan. Orde diferensiasi yang dapat digunakan adalah 1 sampai 8.

  • method: Metode estimasi yang digunakan. Metode yang dapat digunakan antara lain:

  • “central”: metode titik pusat

  • “forward”: metode selisih maju

  • “bacward”: metode selisih mundur.

  • : argumen tambahan fungsi f.

Berikut adalah contoh penerapan fungsi fderiv() untuk memperoleh turunan pertama dan kedua persamaan matematik pada Contoh 9.1:

library(pracma)

## Warning: package 'pracma' was built under R version
## 3.5.3

## 
## Attaching package: 'pracma'

## The following objects are masked from 'package:rootSolve':
## 
##     gradient, hessian

## The following objects are masked from 'package:Matrix':
## 
##     expm, lu, tril, triu

# turunan 1
fderiv(function(x){exp(-x)*sin(2*x)+1},
       x = 1, n = 1, h = 1*.Machine$double.eps^(1/3), 
       method = "central")

## [1] -0.6407

# turunan 2
fderiv(function(x){exp(-x)*sin(2*x)+1},
       x = 1, n = 2, h = 1*.Machine$double.eps^(1/3), 
       method = "central")

## [1] -0.3912

Fungsi numderiv() menggunakan ekstrapolasi Richardson untuk melakukan taksiran turunan suatu persamaan matematik. Berbeda dengan fungsi lainnya, fungsi numderiv() tidak hanya menampilkan hasil diferensiasi, fungsi ini juga menampilkan error absolut, error relatif, dan jumlah iterasi yang berlangsung. Berikut adalah format fungsi yang digunakan:

numderiv(f, x0, maxiter = 16, h = 1/2, ..., 
         tol = .Machine$double.eps)

Catatan:

  • f: Fungsi persamaan matematik yang akan dicari turunannya.

  • x0: Lokasi atau titik yang akan dicari gradiennya

  • maxiter: Iterasi maksimum yang digunakan.

  • h: step size yang digunakan

  • tol: toleransi error yang digunakan.

Berikut adalah contoh penerapan fungsi numderiv() untuk memperoleh turunan pertama persamaan matematik pada Contoh 9.1:

numderiv(function(x){exp(-x)*sin(2*x)+1},
       x0 = 1, h = 1*.Machine$double.eps^(1/3))

## $df
## [1] -0.6407
## 
## $rel.err
## [1] 7.631e-11
## 
## $niter
## [1] 2

Fungsi numderiv() memiliki keterbatasan dalam penggunaannya. Argumen x0 yang digunakan haruslah angka numerik tunggal. Fungsi numdiff() mengatasi keterbatasan tersebut. Fungsi ini dapat menerima input berupa vektor, sehingga dapat digunakan untuk mencari nilai turunan pada sejumlah titik. Selain itu, output fungsi ini lebih sederhana, dimana hanya menampilkan hasil diferensiasinya saja. Berikut adalah format fungsi numdiff():

numdiff(f, x, maxiter = 16, h = 1/2, ..., 
         tol = .Machine$double.eps)

Catatan:

  • f: Fungsi persamaan matematik yang akan dicari turunannya.

  • x: Vektor titik yang akan dicari gradiennya

  • maxiter: Iterasi maksimum yang digunakan.

  • h: step size yang digunakan

  • tol: toleransi error yang digunakan.

Berikut adalah contoh penerapan fungsi numdiff() untuk memperoleh turunan pertama persamaan matematik pada Contoh 9.1:

numdiff(function(x){exp(-x)*sin(2*x)+1},
       x = 1:4, h = 1*.Machine$double.eps^(1/3))

## [1] -0.64070 -0.07450  0.10952 -0.02345

Fungsi grad() pada Paket pracma berbeda dengan yang digunakan pada Paket numDeriv. Perbedaan utama fungsi pada kedua Paket tersebut adalah metode estimasi yang digunakan untuk menghitung turunan pertama suatu persamaan matematik. Pada Paket pracma, metode yang digunakan adalah metode titik pusat, sedangkan pada Paket numDeriv metode yang digunakan adalah metode selisih maju, ekstrapolasi Richardson, dan complex. Format fungsi grad() pada Paket pracma adalah sebagai berikut:

grad(f, x0, heps = .Machine$double.eps^(1/3), 
     ...)

Catatan:

  • f: Fungsi persamaan matematik yang akan dicari turunannya.

  • x0: Titik yang akan dicari gradiennya

  • heps: step size yang digunakan

  • : Argumen lain yang digunakan pada fungsi f.

Berikut adalah contoh penerapan fungsi grad() untuk memperoleh turunan pertama persamaan matematik pada Contoh 9.1:

grad(function(x){exp(-x)*sin(2*x)+1}, x0 = 1)

## [1] -0.6407


REFERENSI:

https://bookdown.org/moh_rosidi2610/Metode_Numerik/diffinteg.html#diffother