Beberapa metode statistik menggunakan metode pendugaan nilai optimum dari suatu fungsi tujuan
Mendapatkan nilai optimum dari suatu fungsi merupakan suatu teknik optimasi numerik. Beberapa metode yang sudah dikembangkan: - Golden section search - Newton-Raphson - Nelder-Mead - dan lainnya.
# Golden Section Search
golden<-function(a,b,f,eps){
while(abs(b-a)>eps){
rat<-(sqrt(5)+1)/2
x1<-b-(b-a)/rat
x2<-a+(b-a)/rat
if(f(x1)>=f(x2)){
a=x1
} else {
b=x2
}
}
return ((a+b)/2)
}
f=function(x) x^2
golden(-4,5,f,10^-6)
## [1] 2.03118e-07
golden(3,6,f,10^-7)
## [1] 3
f=function(x) 2*x-x^2-1
golden(0,9,f,10^-6)
## [1] 9
golden<-function(a,b,f,eps){
while(abs(b-a)>eps){
rat<-2
x1<-b-(b-a)/rat
x2<-a+(b-a)/rat
if(f(x1)>=f(x2)){
a=x1
} else {
b=x2
}
}
return ((a+b)/2)
}
f=function(x) 2*x-x^2-1
golden(0,9,f,10^-7)
## [1] 9
golden_max<-function(a,b,f,eps){
while(abs(b-a)>eps){
rat<-(sqrt(5)+1)/2
x1<-b-(b-a)/rat
x2<-a+(b-a)/rat
if(f(x1)<=f(x2)){
a=x1
} else {
b=x2
}
}
return ((a+b)/2)
}
f=function(x) 2*x-x^2-1
golden_max(0,9,f,10^-7)
## [1] 1
f=expression(x^2-x)
D(f,'x')
## 2 * x - 1
g=D(f,'x')
# g(8) #karena tidak fungsi dasar eval maka turunan tidak dapat ditemukan
f=expression(2*x^2+1)
fx=deriv(f,'x')
x=6
attr(eval(fx),'gradient')[1]
## [1] 24
f=expression(4*x^2+2*x)
fx=deriv(f,'x')
x=7
attr(eval(fx),'gradient')[1]
## [1] 58
attr(eval(fx),'gradient')[1]
## [1] 58
newrap=function(f,x0,eps){
f1x=deriv(f,'x')
f2x=deriv(D(f,'x'),'x')
e=eps+1
while(e>eps){
x=x0
f1=attr(eval(f1x),'gradient')[1]
f2=attr(eval(f2x),'gradient')[1]
e=abs(f1)
x0=x0-f1/f2
}
return(x0)
}
f=expression(x^2)
newrap(f,3,10^-5)
## [1] 0
f=expression(4*x^2-3*x-7)
newrap(f,4,10^-5)
## [1] 0.375
Latihan: Carilah nilai minimum dari fungsi berikut menggunakan metode Newton-Raphson - 𝑓(𝑥)=𝑒(−𝑥)+𝑥4
f1=expression(exp(1)^(-x)+x^(4))
newrap(f1,10,10^-5)
## [1] 0.5282519
f2=expression(x^2-x)
newrap(f2,7,10^-5)
## [1] 0.5
f<-function(x) x^2-4*x+4
xmin<-optimize(f,c(6,7),tol=10^-6)
xmin
## $minimum
## [1] 6
##
## $objective
## [1] 16
Latihan: Nilai minimum fungsi: 𝑓(𝑥)=𝑥3−2𝑥2+2𝑥−1 pada [-1,4]
f<-function(x) x^3-2*x^2+2*x-1
xmin<-optimize(f,c(-1,4),tol=10^-6)
xmin
## $minimum
## [1] -0.9999994
##
## $objective
## [1] -5.999994
f=function(x){
100*(x[1]-x[2]^2)^2+(1-x[1])^2
}
f(c(-1,2))
## [1] 2504
optim(c(-1.2,1),f)
## $par
## [1] 0.9993547 -0.9996045
##
## $value
## [1] 2.537102e-06
##
## $counts
## function gradient
## 65 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
f<-function(x1,x2){
100*(x1-x2^2)^2+(1-x1)^2
}
f(-1,2)
## [1] 2504
dat=data.frame(x=c(1,2,3,4,5,6), y=c(1,3,5,6,8,12))
LR=function(data,par){
with(data,sum((par[1]+par[2]*x-y)^2))
}
result=optim(par=c(0,1),fn=LR,data=dat)
result
## $par
## [1] -1.266846 2.028620
##
## $value
## [1] 2.819048
##
## $counts
## function gradient
## 89 NA
##
## $convergence
## [1] 0
##
## $message
## NULL
Latihan: Dengan data yang sama, berikan regresi kuadratiknya
dat=data.frame(x=c(1,2,3,4,5,6), y=c(1,3,5,6,8,12))
LR=function(data,par){
with(data,sum((par[1]+par[2]*x+par[3]*x^2-y)^2))
}
result=optim(par=c(0,1,0),fn=LR,data=dat)
result
## $par
## [1] 0.4002723 0.7782111 0.1786361
##
## $value
## [1] 1.628572
##
## $counts
## function gradient
## 100 NA
##
## $convergence
## [1] 0
##
## $message
## NULL