library(optimization)
## Warning: package 'optimization' was built under R version 4.3.2
## Loading required package: Rcpp
library(Ryacas)
##
## Attaching package: 'Ryacas'
## The following object is masked from 'package:stats':
##
## integrate
## The following objects are masked from 'package:base':
##
## %*%, det, diag, diag<-, lower.tri, upper.tri
**Optimasi Numerik
Optimasi satu variabel digunakan saat fungsi objektif hanya memiliki 1 variabel penjelas.
Metode yang digunakan :
• Metode golden section • Metode Newton
Metode Golden Section
Golden section merupakan salah satu cara atau metode optimasi numerik yang dapat diterapkan untuk fungsi yang bersifat unimodal.
Ide dasar metode ini adalah memanfaatkan nilai yang lama sebagai nilai yang baru, secara iteratif. Sebagai akibatnya, rentang/ interval awal variabel yang dipilih semakin lama akan semakin menyempit, karena ada sebagian sub-interval variabel yang dieliminasi, hingga diperoleh tingkat konvergensi yang diinginkan.
Algoritma Golden Section (Untuk nilai minimum)
Perkecil selang menjadi [a’, b’] yang memuat nilai minimum atau maksimum. Kriteria pemilihan a’ dan b’ adalah nilai diantara a dan b, sesuai dengan golden ratio
a’ = a + d b’ = a - d
dengan d = R (b-a)
Hitung f(x1) dan f(x2)
Jika f(x1) > f(x2) maka [a’,b’]=[x1,b] Jika f(x1) < f(x2) maka [a’,b’]=[a,x2]
Metode Golden Section untuk nilai minimum:
goldenMin <- function (f, a, b,tol = 0.0000001) {
ratio <- 2 / ( sqrt (5) +1)
x1 <- b - ratio * (b - a)
x2 <- a + ratio * (b - a)
f1 <- f(x1)
f2 <- f(x2)
while (abs (b - a) > tol ) {
if (f2 > f1) {
b <- x2
x2 <- x1
f2 <- f1
x1 <- b - ratio * (b - a)
f1 <- f(x1)
} else {
a <- x1
x1 <- x2
f1 <- f2
x2 <- a + ratio * (b - a)
f2 <- f(x2)
}
}
return ((a + b) / 2)
}
Metode golden section untuk nilai maksimum
goldenMax <- function (f, a, b,tol = 0.0000001) {
ratio <- 2 / ( sqrt (5) +1)
x1 <- b - ratio * (b - a)
x2 <- a + ratio * (b - a)
f1 <- f(x1)
f2 <- f(x2)
while (abs (b - a) > tol ) {
if (f2 < f1) {
b <- x2
x2 <- x1
f2 <- f1
x1 <- b - ratio * (b - a)
f1 <- f(x1)
} else {
a <- x1
x1 <- x2
f1 <- f2
x2 <- a + ratio * (b - a)
f2 <- f(x2)
}
}
return ((a + b) / 2)
}
Mencari nilai minimum dari f(x)=|x−3.5|+(x−2)2
f <- function (x) { abs(x -3.5) + (x -2) ^2}
curve(f)