0

このコードをより効率的なコードに変更し、p1-p2 の許容レベルに達するまで検索し、その結果、極値を得るにはどうすればよいでしょうか? この黄金分割検索よりも極値を見つけるための高速なアルゴリズムはありますか?

    lambda<-(sqrt(5)-1)/2

    golden.section<-function(f, pL, pU, p1, p2, top, result){
      if (top==26){
       return(result)
    }
    else if(top==1){
    p1<-pL + (1-lambda)*(pU - pL)
    p2<-pU - (1-lambda)*(pU - pL)
    } 
    result[top,]<-c(p1,p2)
    if(f(p2) < f(p1)){
    pU<-p2
    pL<-pL
    p2<-p1
    p1<-pL + (1-lambda)*(pU - pL)
    } else if (f(p2) > f(p1)){
    pU <- pU
    pL <- p1
    p1 <- p2
    p2<-pU - (1-lambda)*(pU - pL)
   }
   result<-golden.section(f, pL, pU, p1, p2, top=top+1, result)
   return(result)
   }

 result<-data.frame(p1=rep(NA, 25), p2=rep(NA, 25))
 result<-golden.section(function(x) -(x - 1.235)^2 + 0.78 * x + 0.2,
                   -5, 5, NA, NA, 1, result)
4

1 に答える 1

4

optimize()「黄金分割探索と逐次放物線補間の組み合わせ」を利用した組み込み関数を使わない理由はありますか?このベンチマークに基づくと、コードよりも 78 倍高速です (ただし、試行された連続する値のすべてが保存されるわけではありません)。

ff <- function(x) -(x - 1.235)^2 + 0.78 * x + 0.2
library(rbenchmark)
benchmark(golden.section(ff,-5, 5, NA, NA, 1, result),
          optimize(ff,c(-5,5)))
##                   test replications elapsed relative  user.self sys.self 
## 1 golden.section(...)           100   0.936       78     0.904    0.032 
## optimize(ff, c(-5, 5))          100   0.012        1     0.012    0.000
于 2012-07-17T02:15:29.830 に答える