7 minute read

Pada dua posts sebelumnya, saya pernah menulis bagaimana metode bisection dan metode Newton untuk mencari akar dari suatu fungsi.

Salah satu kelemahan dari metode bisection adalah running time. Salah satu kelemahan dari metode Newton adalah harus mencari turunan dari fungsi yang dikerjakan \frac{d}{dx}f(x).

Apakah ada metode yang cepat dan tidak memerlukan turunan?


Golden Ratio

Kalian semua pasti pernah mendengar tentang istilah golden ratio. Konon katanya kesempurnaan dan keseimbangan di dunia itu mengikuti aturan golden ratio.

Lantas apa hubungannya golden ratio dengan pendekatan numerik untuk mencari akar persamaan?

Ada satu metode numerik bernama Golden Section Search yang bisa dipakai untuk mencari nilai minimum global. Prinsipnya adalah sebagai berikut:

Misalkan f(x) disebut unimodal pada selang I = [a,b], jika terdapat sebuah titik p \in I sehingga f(x) monoton turun murni pada [a,p] dan monoton naik murni pada [p,b].

Dari definisi diatas dimungkinkan suatu cara untuk mengidentifikasi bahwa fungsi f(x) memiliki minimum global tunggal di titik p, dengan tidak secara eksplisit melibatkan turunan fungsi. Jika diperhatikan dengan baik, diharapkan titik p menjadi titik terendah dari grafik fungsinya sehingga masalah ini menjadi masalah minimisasi.

Jadi proses optimisasi bisa dimodifikasi untuk menghitung akar persamaan.

Sekarang permasalahannya adalah menentukan di mana letak titik p. Nah, si golden ratio masuk di tahap ini untuk menentukan dimana letak si titik p.


Cara Kerja Golden Section Search

Dari selang [a,b] yang ada, akan dicari dua titik baru (c,d) yang berada di dalam selang dengan menggunakan rumus:

c = b - (b - a) / r

d = a + (b - a) / r

dengan r adalah golden ratio.

r = \frac{1 + \sqrt5}{2} \simeq 0.618

Perhatikan bahwa a < d < c < b. Kita perlu cek nilai f(a), f(c), f(d), f(b).

Perhatikan bahwa karena f unimodal maka f(c) dan f(d) masing-masing bernilai lebih kecil dari max \{ f(a) , f(b) \}. Perhatikan dua kondisi berikut ini:

  1. Jika f(c) \leq f(d) maka dari sifat unimodal, f monoton naik di selang [d,b] dan dengan demikian maka p \in [a,d].
  2. Jika f(c) > f(d) maka dari sifat unimodal, f monoton turun di selang [a,c] dan dengan demikian maka p \in [c,b].

Situasi di atas memungkinkan kita untuk melakukan reduksi lebar selang pencarian untuk mencari titik p.

Algoritma iterasinya adalah sebagai berikut:

if f(c) <= f(d)
  b = d
  fb = fd
else
  a = c
  fa = fc
end
  c = a + r * (b-a) 
  fc = f(c) 
  d = a + (1-r)*(b-a) 
  fd = f(d)

Iterasi akan berhenti saat kita mendefinisikan toleransi error max yang diperbolehkan.


Dari Optimisasi ke Mencari Akar

Terdapat hubungan antara masalah optimisasi ini dengan akar persamaan. Persamaan f(x) = 0 memiliki solusi x jika fungsi objektif F dari masalah optimisasi yang didefinisikan sebagai berikut:

  • F(x) = (f(x))^2 memiliki nilai minimum global sebesar 0.
  • F(x) = |f(x)| memiliki nilai minimum global sebesar 0.
  • F(x) = - \frac{1}{a+ |f(x)|} memiliki nilai minimum global sebesar -1.

Contoh

Untuk fungsi f(x) = x^3 - 10x^2 + 29x -20 di 0 \leq x \leq 6, tentukan semua akarnya dengan metode Golden Section Search !

Jawab

Mari kita buat dulu grafik fungsinya di selang tersebut:

Kalau kita perhatikan, akar persamaan tersebut ada di selang [0,2],[3.5,4.5].[4.5,6].

Perlu saya ingatkan kembali, tujuan dari GSS adalah mencari titik minimum global di selang tertentu.

Oleh karena itu, jika kita ingin mencari akar, maka kita harus ubah terlebih dahulu fungsinya mejadi f'(x) = |f(x)|. Berikut adalah grafiknya:

Sekarang kita bisa mencari akarnya di selang [0,2], yakni:

rm(list=ls())

# definisikan r sebagai golden ratio
r = (1 + sqrt(5))/2
tol_max = 10^(-10)

# fungsi dari soal
f_awal = function(x){x^3 - 10*x^2 + 29*x -20}
f = function(x){abs(x^3 - 10*x^2 + 29*x -20)}

# initial
a = 0
b = 2

while(abs(b - a) > tol_max){
  c = b - (b - a) / r
  d = a + (b - a) / r
  
  if(f(c) < f(d)){
    b = d
    } else{
    a = c
    }
  
}

hasil = (a+b)/2

Akar pada selang tersebut adalah di x = 1.

Sekarang saya akan bikin function-nya di R untuk bisa mencari akar x di selang lainnya.

Kita akan coba pada selang [3.5,4.5] sebagai berikut:

golden_ss(3.5,4.5,f)
## [1] 4

Selanjutnya pada selang [4.5,6] sebagai berikut:

golden_ss(4.5,6,f)
## [1] 5

Secara iterasi, GSS memiliki processing time yang lebih cepat.

Sepertinya metode ini akan menjadi favorit saya karena tidak perlu mencari fungsi turunan.