Optimisasi Statistika - Metode Bisection, Newton, Secant
Video Pembelajaran - P3
Video Pembelajaran dapat diakses melalui link berikut : https://ipb.link/materiopstat
Persamaan Non-Linear
Persamaan non-linear adalah persamaan matematika yang tidak dapat direpresentasikan dalam bentuk linear. Contohnya adalah persamaan berbentuk \(x^2, x^3\), atau produk antar variabel seperti \(xy\). Akar dari persamaan non-linear adalah nilai \(x\) yang memenuhi kondisi berikut:
\[ f(x) = 0 \]
Mencari akar non-linear sering digunakan dalam berbagai aplikasi, seperti pemodelan fisika, teknik, ekonomi, dan optimasi. Metode pencarian akar non-linear melibatkan berbagai pendekatan tergantung pada sifat fungsi yang ditangani. Di bawah ini adalah penjelasan setiap metode pencarian akar, lengkap dengan algoritma, kelebihan, kekurangan, dan contoh implementasi dalam R.
1. Metode Tabel
Metode tabel adalah cara paling sederhana untuk menemukan nilai akar atau nilai minimum/maksimum suatu fungsi. Metode ini bekerja dengan menghitung nilai \(f(x)\) pada beberapa titik dalam interval tertentu, kemudian mencari nilai \(x\) yang menghasilkan \(f(x)\) terkecil (minimum) atau terbesar (maksimum).
Algoritma Metode Tabel
- Tentukan interval pencarian \([a, b]\) dan jumlah titik \(n\) yang diinginkan.
- Buat tabel berisi nilai \(x\) yang dibagi merata dalam interval tersebut.
- Hitung \(f(x)\) untuk setiap \(x\).
- Identifikasi nilai \(x\) yang menghasilkan \(f(x)\) terkecil (untuk mencari minimum) atau \(f(x)\) terbesar (untuk mencari maksimum).
Keunggulan dan Kekurangan
- Keunggulan:
- Sederhana dan mudah diimplementasikan.
- Tidak memerlukan syarat khusus pada fungsi.
- Kekurangan:
- Tidak efisien untuk interval yang besar.
- Akurasi tergantung pada jumlah titik \(n\) yang digunakan.
Fungsi R untuk Metode Tabel
table_method <- function(f, a, b, n = 100, method = "min") {
x <- seq(a, b, length.out = n)
y <- sapply(x, f)
if (method == "min") {
return(list(data=data.frame(x,y),x.opt=x[which.min(y)],y.opt=f(x[which.min(y)])))
} else if (method == "max") {
return(list(data=data.frame(x,y),x.opt=x[which.max(y)],y.opt=f(x[which.max(y)])))
}
}Contoh Implementasi
Misalkan fungsi \(f(x) = 3x^3 + 2x^{-1/2}\), kita ingin mencari nilai \(x\) yang menghasilkan \(f(x)\) minimum dalam interval \([-1, 1]\).
\[ f(x) = 3x^3 + 2x^{-1/2} \]
Kode R:
## $data
## x y
## 1 -1.0000000 -4.000000
## 2 -0.7777778 -2.697237
## 3 -0.5555556 -2.314403
## 4 -0.3333333 -3.111111
## 5 -0.1111111 -9.004115
## 6 0.1111111 9.004115
## 7 0.3333333 3.111111
## 8 0.5555556 2.314403
## 9 0.7777778 2.697237
## 10 1.0000000 4.000000
##
## $x.opt
## [1] -0.1111111
##
## $y.opt
## [1] -9.004115
Outputnya berupa data tabel dan nilai minimum \(f(x)\).
## $data
## x y
## 1 0.0000000 Inf
## 2 0.1111111 9.004115
## 3 0.2222222 4.532922
## 4 0.3333333 3.111111
## 5 0.4444444 2.513374
## 6 0.5555556 2.314403
## 7 0.6666667 2.388889
## 8 0.7777778 2.697237
## 9 0.8888889 3.231996
## 10 1.0000000 4.000000
##
## $x.opt
## [1] 0.5555556
##
## $y.opt
## [1] 2.314403
2. Metode Bisection
Metode Bisection mencari akar fungsi \(f(x) = 0\) dengan memotong interval menjadi dua bagian secara iteratif. Metode ini hanya berlaku jika fungsi kontinu dan memenuhi \(f(a) \cdot f(b) < 0\).
Algoritma Metode Bisection
- Tentukan interval \([a, b]\) di mana \(f(a) \cdot f(b) < 0\).
- Hitung nilai tengah: \[ c = \frac{a+b}{2} \]
- Periksa nilai \(f(c)\):
- Jika \(f(c) = 0\), maka \(c\) adalah akar.
- Jika \(f(a) \cdot f(c) < 0\), maka interval baru adalah \([a, c]\).
- Jika \(f(c) \cdot f(b) < 0\), maka interval baru adalah \([c, b]\).
- Ulangi langkah 2-3 hingga \(|b-a| < \text{toleransi}\).
Keunggulan dan Kekurangan
- Keunggulan:
- Sederhana dan selalu konvergen jika syarat \(f(a) \cdot f(b) < 0\) terpenuhi.
- Kekurangan:
- Lambat dibanding metode lain.
- Membutuhkan fungsi kontinu pada interval tertentu.
Fungsi R untuk Metode Bisection
bisection_method <- function(f, a, b, tol = 1e-6, max_iter = 100) {
if (f(a) * f(b) > 0) {
stop("f(a) dan f(b) harus beda tanda.")
}
iter <- 0
while (b - a > tol && iter < max_iter) {
c <- (a + b) / 2
if (f(c) == 0) {
return(list(x.opt=c,y.opt=f(c)))
}
if (f(a) * f(c) < 0) {
b <- c
} else {
a <- c
}
iter <- iter + 1
}
return(list(`function`=f,iter=iter,x.opt=mean(c(a, b)),y.opt=f(mean(c(a, b)))))
}Contoh Implementasi
Misalkan fungsi \(f(x) = 3x^3 + 2x^{-1/2}\), kita ingin mencari akar dalam interval \([-1, 0]\).
Kode R:
## $`function`
## function(x) 3*x^3+2*x^-1/2
## <bytecode: 0x0000022d77f47390>
##
## $iter
## [1] 20
##
## $x.opt
## [1] -4.768372e-07
##
## $y.opt
## [1] -2097152
Bila dibandingkan dengan metode tabel, bisection method menghasilkan nilai x yang jauh lebih meminimumkan y
#Atur max iter dan toleransi bisa mengubah hasil
bisection_method(f, -1, 0,max_iter = 1000,tol=1e-07)## $`function`
## function(x) 3*x^3+2*x^-1/2
## <bytecode: 0x0000022d77f47390>
##
## $iter
## [1] 24
##
## $x.opt
## [1] -2.980232e-08
##
## $y.opt
## [1] -33554432
Memperbesar max_iter dan memperkecil batas toleransi menghasilkan nilai yang lebih minimum
3. Metode Newton-Raphson
Metode ini menggunakan turunan fungsi untuk mendekati akar \(f(x) = 0\). Persamaan iteratifnya adalah:
\[ x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} \]
Keunggulan dan Kekurangan
- Keunggulan:
- Cepat dan efisien untuk fungsi tertentu.
- Kekurangan:
- Membutuhkan turunan \(f'(x)\).
- Tidak selalu konvergen jika titik awal buruk atau fungsi memiliki lebih dari satu akar.
Fungsi R untuk Metode Newton-Raphson
newton_method <- function(f, df, x0, tol=1e-7, max_iter=100){
iter <- 0
xold<-x0
xnew <- xold + 10*tol
while(abs(xnew-xold)>tol){
iter <- iter+1
xold<-xnew
xnew <- xold - f(xold)/df(xold)
}
root<-xnew
if(iter>max_iter){
cat("Error: Solusi tidak ditemukan karena iterasi > N mulai pada iterasi ke ",iter,"dengan x = ",round(xnew),"dan y = ",round(f(xnew)))
}
else{
return(list(`function`=f, x.opt=root,y.opt=f(root), iter=iter))
}
} Contoh Implementasi
Fungsi \(f(x) = 3x^3 + 2x^{-1/2}\) dan turunannya: \[ f'(x) = 9x^2 - x^{-3/2} \]
Kode R:
## Error: Solusi tidak ditemukan karena iterasi > N mulai pada iterasi ke 24872 dengan x = 0 dan y = 22797
Dalam kasus ini, algoritma mungkin tidak berhenti karena perbedaan antara x saat ini dan x sebelumnya selalu lebih besar dari toleransi. Ini mungkin terjadi karena fungsi dan turunannya tidak terdefinisi di sekitar akar yang diinginkan atau karena akar yang diinginkan tidak ada. Maka, bisa menggunakan metode bisection ataupun secant.
4. Metode Secant
Metode ini merupakan alternatif metode Newton-Raphson tanpa membutuhkan turunan \(f'(x)\). Persamaan iterasinya:
\[ x_{n+1} = x_n - f(x_n) \cdot \frac{x_n - x_{n-1}}{f(x_n) - f(x_{n-1})} \]
Keunggulan dan Kekurangan
- Keunggulan:
- Tidak memerlukan turunan.
- Kekurangan:
- Tidak secepat Newton-Raphson.
Fungsi R untuk Metode Secant
secant_method <- function(f, x, tol=1e-7, max_iter=100){
iter <- 0
xold <- x
fxold <- f(x)
x <- xold+10*tol
while(abs(x-xold)>tol){
iter <- iter+1
fx <- f(x)
xnew <- x - fx*((x-xold)/(fx-fxold))
xold <- x
fxold <- fx
x <- xnew
}
if(iter>max_iter){
cat("Error: Solusi tidak ditemukan karena iterasi > N mulai pada iterasi ke ",iter,"dengan x = ",round(xnew),"dan y = ",round(f(xnew)))
}
else{
root<-xnew
return(list(`function`=f, x.opt=root,y.opt=f(root), iter=iter))
}
}Contoh Implementasi
Fungsi \(f(x) = 3x^3 + 2x^{-1/2}\), nilai awal \(x_0 = -1, x_1 = 0\).
Kode R:
## Error: Solusi tidak ditemukan karena iterasi > N mulai pada iterasi ke 17315 dengan x = -1 dan y = -2
Dalam kasus ini, algoritma secant juga tidak berhenti sehingga akar yang diinginkan tidak ada. Hal ini dapat diamati dari bentuk kurva yang terbagi dalam selang tertentu serta tiap selang secara sekilas cenderung susah menemukan titik optimum (baik minimum maupun maksimum).
Kesimpulan
- Metode Tabel: Sederhana, cocok untuk eksplorasi fungsi dasar.
- Metode Bisection: Stabil untuk interval dengan perubahan tanda.
- Newton-Raphson: Cepat, cocok untuk fungsi dengan akar tunggal.
- Secant: Alternatif sederhana jika turunan tidak tersedia.
Setiap metode memiliki kelebihan dan kekurangan tergantung pada sifat fungsi yang dianalisis.