# chex84.r # Example 8.4 -- zig-zag behavior of steepest descent search # ########################## # create function to be minimized (& gradient) mkqfun <- function(A,b,c) { list( f = function(x){ t(x)%*%A%*%x+t(b)%*%x+c}, # function gr = function(x) as.vector( 2*A%*%x + b ) ) } # gradient # # create functions qfun <- mkqfun(matrix(c(1,0,0,.5),2,2),c(0,0),0) # # start here and then loop xcur <- c(1,2) x1s <- 1 x2s <- 1 fs <- qfun$f(xcur) fs qfun$gr(xcur) # start loop for (i in(1:10) ) { grad <- qfun$gr(xcur) # gradient at current lfun <- function(u) qfun$f(xcur-u*grad) # function on line ym1 <- lfun(-1) y0 <- lfun(0) yp1 <- lfun(+1) ustar <- - (yp1-ym1)/(2*(yp1-2*y0+ym1)) # best point on line xcur <- xcur - ustar*grad # new point x1s <- c(x1s,xcur[1]) x2s <- c(x2s,xcur[2]) fs <- c(fs,qfun$f(xcur)) } # new f & end loop cbind(x1s,x2s,fs) # done rm(list=ls()) q()