constrOptim              package:stats              R Documentation

_L_i_n_e_a_r_l_y _c_o_n_s_t_r_a_i_n_e_d _o_p_t_i_m_i_s_a_t_i_o_n

_D_e_s_c_r_i_p_t_i_o_n:

     Minimise a function subject to linear inequality constraints using
     an adaptive barrier algorithm.

_U_s_a_g_e:

     constrOptim(theta, f, grad, ui, ci, mu = 1e-04, control = list(),
                 method = if(is.null(grad)) "Nelder-Mead" else "BFGS",
                 outer.iterations = 100, outer.eps = 1e-05, ...)

_A_r_g_u_m_e_n_t_s:

   theta: Starting value: must be in the feasible region.

       f: Function to minimise.

    grad: Gradient of 'f'.

      ui: Constraints (see below).

      ci: Constraints (see below).

      mu: (Small) tuning parameter.

 control: Passed to 'optim'.

  method: Passed to 'optim'.

outer.iterations: Iterations of the barrier algorithm.

outer.eps: Criterion for relative convergence of the barrier algorithm.

     ...: Other arguments passed to 'optim', which will pass them to
          'f' and 'grad' if it does not used them.

_D_e_t_a_i_l_s:

     The feasible region is defined by 'ui %*% theta - ci >= 0'. The
     starting value must be in the interior of the feasible region, but
     the minimum may be on the boundary. 

     A logarithmic barrier is added to enforce the constraints and then
     'optim' is called. The barrier function is chosen so that the
     objective function should decrease at each outer iteration. Minima
     in the interior of the feasible region are typically found quite
     quickly, but a substantial number of outer iterations may be
     needed for a minimum on the boundary.

     The tuning parameter 'mu' multiplies the barrier term. Its precise
     value is often relatively unimportant. As 'mu' increases the
     augmented objective function becomes closer to the original
     objective function but also less smooth near the boundary of the
     feasible region.

     Any 'optim' method that permits infinite values for the objective
     function may be used (currently all but "L-BFGS-B").  The gradient
     function must be supplied except with 'method="Nelder-Mead"'.

     As with 'optim', the default is to minimise and maximisation can
     be performed by setting 'control$fnscale' to a negative value.

_V_a_l_u_e:

     As for 'optim', but with two extra components: 'barrier.value'
     giving the value of the barrier function at the optimum and
     'outer.iterations' gives the number of outer iterations (calls to
     'optim')

_R_e_f_e_r_e_n_c_e_s:

     K. Lange _Numerical Analysis for Statisticians._ Springer 2001,
     p185ff

_S_e_e _A_l_s_o:

     'optim', especially 'method="L-BGFS-B"' which does box-constrained
     optimisation.

_E_x_a_m_p_l_e_s:

     ## from optim
     fr <- function(x) {   ## Rosenbrock Banana function
         x1 <- x[1]
         x2 <- x[2]
         100 * (x2 - x1 * x1)^2 + (1 - x1)^2
     }
     grr <- function(x) { ## Gradient of 'fr'
         x1 <- x[1]
         x2 <- x[2]
         c(-400 * x1 * (x2 - x1 * x1) - 2 * (1 - x1),
            200 *      (x2 - x1 * x1))
     }

     optim(c(-1.2,1), fr, grr)
     #Box-constraint, optimum on the boundary
     constrOptim(c(-1.2,0.9), fr, grr, ui=rbind(c(-1,0),c(0,-1)), ci=c(-1,-1))
     #  x<=0.9,  y-x>0.1
     constrOptim(c(.5,0), fr, grr, ui=rbind(c(-1,0),c(1,-1)), ci=c(-0.9,0.1))

     ## Solves linear and quadratic programming problems
     ## but needs a feasible starting value
     #
     # from example(solve.QP) in 'quadprog'
     # no derivative
     fQP <- function(b) {-sum(c(0,5,0)*b)+0.5*sum(b*b)}
     Amat       <- matrix(c(-4,-3,0,2,1,0,0,-2,1),3,3)
     bvec       <- c(-8,2,0)
     constrOptim(c(2,-1,-1), fQP, NULL, ui=t(Amat),ci=bvec)
     # derivative
     gQP <- function(b) {-c(0,5,0)+b}
     constrOptim(c(2,-1,-1), fQP, gQP, ui=t(Amat), ci=bvec)

     ## Now with maximisation instead of minimisation
     hQP <- function(b) {sum(c(0,5,0)*b)-0.5*sum(b*b)}
     constrOptim(c(2,-1,-1), hQP, NULL, ui=t(Amat), ci=bvec,
                 control=list(fnscale=-1))

