Learn R Programming

salad (version 1.2)

optiWrap: Wrapper for optimisation with automatically computed gradient

Description

Wrapper for calling stats::optim with a gradient computed by automatic differentiation

Usage

optiWrap(
  par,
  fn,
  ...,
  method = c("BFGS", "L-BFGS-B", "CG"),
  lower = -Inf,
  upper = Inf,
  control = list(),
  hessian = FALSE,
  trace = FALSE
)

Arguments

par

Initial value

fn

Function to be minimized

...

Further argument to be passed to 'fn'

method

Optimization method

lower, upper

Bounds on the variables for 'L-BFGS-B'

control

A list of control parameters passed to `optim`

hessian

If 'TRUE' a *numerically* differentiated matrix is returned.

trace

If 'TRUE', keep trace of the visited points

Details

The gradient of fn is computed using unlist(d(fn(x))). It is computed at the same time as fn(x)` and stored for when optim calls the gradient. In most cases this should be more efficient than defining gr = \(x) unlist(d(f(dual(x)))).

Parameters 'method' 'lower' 'upper' 'control' and 'hessian' are passed directly to optim.

See Also

Examples

Run this code
f <- function(x) (x[1] - x[2])**4 + (x[1] + 2*x[2])**2 + x[1] + x[2]

X <- seq(-1, 0.5, by = 0.01)
Y <- seq(-1, 0.5, by = 0.01)
Z <- matrix(NA_real_, nrow = length(X), ncol = length(Y))
for(i in seq_along(X)) for(j in seq_along(Y)) Z[i,j] <- f(c(X[i],Y[j]))

contour(X,Y,Z, levels = c(-0.2, 0, 0.3, 2**(0:6)), main = "BFGS")
opt <- optiWrap(c(0,0), f, method = "BFGS", trace = TRUE)
lines(t(opt$trace), type = "o", col = "red")

Run the code above in your browser using DataLab