QPS_MIPS Quadratic Program Solver based on MIPS. [X, F, EXITFLAG, OUTPUT, LAMBDA] = ... QPS_MIPS(H, C, A, L, U, XMIN, XMAX, X0, OPT) Uses the MATLAB Interior Point Solver (MIPS) to solve the following QP (quadratic programming) problem: min 1/2 X'*H*X + C'*X X subject to L <= A*X <= U (linear constraints) XMIN <= X <= XMAX (variable bounds) Inputs (all optional except H, C, A and L): H : matrix (possibly sparse) of quadratic cost coefficients C : vector of linear cost coefficients A, L, U : define the optional linear constraints. Default values for the elements of L and U are -Inf and Inf, respectively. XMIN, XMAX : optional lower and upper bounds on the X variables, defaults are -Inf and Inf, respectively. X0 : optional starting value of optimization vector X OPT : optional options structure with the following fields, all of which are also optional (default values shown in parentheses) verbose (0) - controls level of progress output displayed 0 = no progress output 1 = some progress output 2 = verbose progress output linsolver ('') - linear system solver for solving update steps '' = default solver (currently same as '\') '\' = built-in \ operator 'PARDISO' = PARDISO solver (if available) feastol (1e-6) - termination tolerance for feasibility condition gradtol (1e-6) - termination tolerance for gradient condition comptol (1e-6) - termination tolerance for complementarity condition costtol (1e-6) - termination tolerance for cost condition max_it (150) - maximum number of iterations step_control (0) - set to 1 to enable step-size control sc.red_it (20) - maximum number of step-size reductions if step-control is on cost_mult (1) - cost multiplier used to scale the objective function for improved conditioning. xi (0.99995) - constant used in alpha updates* sigma (0.1) - centering parameter* z0 (1) - used to initialize slack variables* alpha_min (1e-8) - returns EXITFLAG = -1 if either alpha parameter becomes smaller than this value* rho_min (0.95) - lower bound on rho_t* rho_max (1.05) - upper bound on rho_t* mu_threshold (1e-5) - KT multipliers smaller than this value for non-binding constraints are forced to zero max_stepsize (1e10) - returns EXITFLAG = -1 if the 2-norm of the reduced Newton step exceeds this value* * see the corresponding Appendix in the manual for details PROBLEM : The inputs can alternatively be supplied in a single PROBLEM struct with fields corresponding to the input arguments described above: H, c, A, l, u, xmin, xmax, x0, opt Outputs: X : solution vector F : final objective function value EXITFLAG : exit flag 1 = first order optimality conditions satisfied 0 = maximum number of iterations reached -1 = numerically failed OUTPUT : output struct with the following fields: iterations - number of iterations performed hist - struct array with trajectories of the following: feascond, gradcond, compcond, costcond, gamma, stepsize, obj, alphap, alphad message - exit message LAMBDA : struct containing the Langrange and Kuhn-Tucker multipliers on the constraints, with fields: mu_l - lower (left-hand) limit on linear constraints mu_u - upper (right-hand) limit on linear constraints lower - lower bound on optimization variables upper - upper bound on optimization variables Note the calling syntax is almost identical to that of QUADPROG from MathWorks' Optimization Toolbox. The main difference is that the linear constraints are specified with A, L, U instead of A, B, Aeq, Beq. Calling syntax options: [x, f, exitflag, output, lambda] = ... qps_mips(H, c, A, l, u, xmin, xmax, x0, opt) x = qps_mips(H, c, A, l, u) x = qps_mips(H, c, A, l, u, xmin, xmax) x = qps_mips(H, c, A, l, u, xmin, xmax, x0) x = qps_mips(H, c, A, l, u, xmin, xmax, x0, opt) x = qps_mips(problem), where problem is a struct with fields: H, c, A, l, u, xmin, xmax, x0, opt all fields except 'c', 'A' and 'l' or 'u' are optional x = qps_mips(...) [x, f] = qps_mips(...) [x, f, exitflag] = qps_mips(...) [x, f, exitflag, output] = qps_mips(...) [x, f, exitflag, output, lambda] = qps_mips(...) Example: (problem from from http://www.jmu.edu/docs/sasdoc/sashtml/iml/chap8/sect12.htm) H = [ 1003.1 4.3 6.3 5.9; 4.3 2.2 2.1 3.9; 6.3 2.1 3.5 4.8; 5.9 3.9 4.8 10 ]; c = zeros(4,1); A = [ 1 1 1 1; 0.17 0.11 0.10 0.18 ]; l = [1; 0.10]; u = [1; Inf]; xmin = zeros(4,1); x0 = [1; 0; 0; 1]; opt = struct('verbose', 2); [x, f, s, out, lambda] = qps_mips(H, c, A, l, u, xmin, [], x0, opt); See also MIPS.
0001 function [x, f, eflag, output, lambda] = qps_mips(H, c, A, l, u, xmin, xmax, x0, opt) 0002 %QPS_MIPS Quadratic Program Solver based on MIPS. 0003 % [X, F, EXITFLAG, OUTPUT, LAMBDA] = ... 0004 % QPS_MIPS(H, C, A, L, U, XMIN, XMAX, X0, OPT) 0005 % Uses the MATLAB Interior Point Solver (MIPS) to solve the following 0006 % QP (quadratic programming) problem: 0007 % 0008 % min 1/2 X'*H*X + C'*X 0009 % X 0010 % 0011 % subject to 0012 % 0013 % L <= A*X <= U (linear constraints) 0014 % XMIN <= X <= XMAX (variable bounds) 0015 % 0016 % Inputs (all optional except H, C, A and L): 0017 % H : matrix (possibly sparse) of quadratic cost coefficients 0018 % C : vector of linear cost coefficients 0019 % A, L, U : define the optional linear constraints. Default 0020 % values for the elements of L and U are -Inf and Inf, 0021 % respectively. 0022 % XMIN, XMAX : optional lower and upper bounds on the 0023 % X variables, defaults are -Inf and Inf, respectively. 0024 % X0 : optional starting value of optimization vector X 0025 % OPT : optional options structure with the following fields, 0026 % all of which are also optional (default values shown in 0027 % parentheses) 0028 % verbose (0) - controls level of progress output displayed 0029 % 0 = no progress output 0030 % 1 = some progress output 0031 % 2 = verbose progress output 0032 % linsolver ('') - linear system solver for solving update steps 0033 % '' = default solver (currently same as '\') 0034 % '\' = built-in \ operator 0035 % 'PARDISO' = PARDISO solver (if available) 0036 % feastol (1e-6) - termination tolerance for feasibility 0037 % condition 0038 % gradtol (1e-6) - termination tolerance for gradient 0039 % condition 0040 % comptol (1e-6) - termination tolerance for complementarity 0041 % condition 0042 % costtol (1e-6) - termination tolerance for cost condition 0043 % max_it (150) - maximum number of iterations 0044 % step_control (0) - set to 1 to enable step-size control 0045 % sc.red_it (20) - maximum number of step-size reductions if 0046 % step-control is on 0047 % cost_mult (1) - cost multiplier used to scale the objective 0048 % function for improved conditioning. 0049 % xi (0.99995) - constant used in alpha updates* 0050 % sigma (0.1) - centering parameter* 0051 % z0 (1) - used to initialize slack variables* 0052 % alpha_min (1e-8) - returns EXITFLAG = -1 if either alpha 0053 % parameter becomes smaller than this value* 0054 % rho_min (0.95) - lower bound on rho_t* 0055 % rho_max (1.05) - upper bound on rho_t* 0056 % mu_threshold (1e-5) - KT multipliers smaller than this value 0057 % for non-binding constraints are forced to zero 0058 % max_stepsize (1e10) - returns EXITFLAG = -1 if the 2-norm of 0059 % the reduced Newton step exceeds this value* 0060 % * see the corresponding Appendix in the manual for details 0061 % PROBLEM : The inputs can alternatively be supplied in a single 0062 % PROBLEM struct with fields corresponding to the input arguments 0063 % described above: H, c, A, l, u, xmin, xmax, x0, opt 0064 % 0065 % Outputs: 0066 % X : solution vector 0067 % F : final objective function value 0068 % EXITFLAG : exit flag 0069 % 1 = first order optimality conditions satisfied 0070 % 0 = maximum number of iterations reached 0071 % -1 = numerically failed 0072 % OUTPUT : output struct with the following fields: 0073 % iterations - number of iterations performed 0074 % hist - struct array with trajectories of the following: 0075 % feascond, gradcond, compcond, costcond, gamma, 0076 % stepsize, obj, alphap, alphad 0077 % message - exit message 0078 % LAMBDA : struct containing the Langrange and Kuhn-Tucker 0079 % multipliers on the constraints, with fields: 0080 % mu_l - lower (left-hand) limit on linear constraints 0081 % mu_u - upper (right-hand) limit on linear constraints 0082 % lower - lower bound on optimization variables 0083 % upper - upper bound on optimization variables 0084 % 0085 % Note the calling syntax is almost identical to that of QUADPROG 0086 % from MathWorks' Optimization Toolbox. The main difference is that 0087 % the linear constraints are specified with A, L, U instead of 0088 % A, B, Aeq, Beq. 0089 % 0090 % Calling syntax options: 0091 % [x, f, exitflag, output, lambda] = ... 0092 % qps_mips(H, c, A, l, u, xmin, xmax, x0, opt) 0093 % 0094 % x = qps_mips(H, c, A, l, u) 0095 % x = qps_mips(H, c, A, l, u, xmin, xmax) 0096 % x = qps_mips(H, c, A, l, u, xmin, xmax, x0) 0097 % x = qps_mips(H, c, A, l, u, xmin, xmax, x0, opt) 0098 % x = qps_mips(problem), where problem is a struct with fields: 0099 % H, c, A, l, u, xmin, xmax, x0, opt 0100 % all fields except 'c', 'A' and 'l' or 'u' are optional 0101 % x = qps_mips(...) 0102 % [x, f] = qps_mips(...) 0103 % [x, f, exitflag] = qps_mips(...) 0104 % [x, f, exitflag, output] = qps_mips(...) 0105 % [x, f, exitflag, output, lambda] = qps_mips(...) 0106 % 0107 % Example: (problem from from http://www.jmu.edu/docs/sasdoc/sashtml/iml/chap8/sect12.htm) 0108 % H = [ 1003.1 4.3 6.3 5.9; 0109 % 4.3 2.2 2.1 3.9; 0110 % 6.3 2.1 3.5 4.8; 0111 % 5.9 3.9 4.8 10 ]; 0112 % c = zeros(4,1); 0113 % A = [ 1 1 1 1; 0114 % 0.17 0.11 0.10 0.18 ]; 0115 % l = [1; 0.10]; 0116 % u = [1; Inf]; 0117 % xmin = zeros(4,1); 0118 % x0 = [1; 0; 0; 1]; 0119 % opt = struct('verbose', 2); 0120 % [x, f, s, out, lambda] = qps_mips(H, c, A, l, u, xmin, [], x0, opt); 0121 % 0122 % See also MIPS. 0123 0124 % MIPS 0125 % Copyright (c) 2010-2015 by Power System Engineering Research Center (PSERC) 0126 % by Ray Zimmerman, PSERC Cornell 0127 % 0128 % $Id: qps_mips.m 2660 2015-03-20 02:10:18Z ray $ 0129 % 0130 % This file is part of MIPS. 0131 % Covered by the 3-clause BSD License (see LICENSE file for details). 0132 % See http://www.pserc.cornell.edu/matpower/ for more info. 0133 0134 %%----- input argument handling ----- 0135 %% gather inputs 0136 if nargin == 1 && isstruct(H) %% problem struct 0137 p = H; 0138 else %% individual args 0139 p = struct('H', H, 'c', c, 'A', A, 'l', l, 'u', u); 0140 if nargin > 5 0141 p.xmin = xmin; 0142 if nargin > 6 0143 p.xmax = xmax; 0144 if nargin > 7 0145 p.x0 = x0; 0146 if nargin > 8 0147 p.opt = opt; 0148 end 0149 end 0150 end 0151 end 0152 end 0153 0154 %% define nx, set default values for H and c 0155 if ~isfield(p, 'H') || isempty(p.H) || ~any(any(p.H)) 0156 if (~isfield(p, 'A') || isempty(p.A)) && ... 0157 (~isfield(p, 'xmin') || isempty(p.xmin)) && ... 0158 (~isfield(p, 'xmax') || isempty(p.xmax)) 0159 error('qps_mips: LP problem must include constraints or variable bounds'); 0160 else 0161 if isfield(p, 'A') && ~isempty(p.A) 0162 nx = size(p.A, 2); 0163 elseif isfield(p, 'xmin') && ~isempty(p.xmin) 0164 nx = length(p.xmin); 0165 else % if isfield(p, 'xmax') && ~isempty(p.xmax) 0166 nx = length(p.xmax); 0167 end 0168 end 0169 p.H = sparse(nx, nx); 0170 else 0171 nx = size(p.H, 1); 0172 end 0173 if ~isfield(p, 'c') || isempty(p.c) 0174 p.c = zeros(nx, 1); 0175 end 0176 if ~isfield(p, 'x0') || isempty(p.x0) 0177 p.x0 = zeros(nx, 1); 0178 end 0179 0180 %%----- run optimization ----- 0181 p.f_fcn = @(x)qp_f(x, p.H, p.c); 0182 [x, f, eflag, output, lambda] = mips(p); 0183 0184 %%----- objective function ----- 0185 function [f, df, d2f] = qp_f(x, H, c) 0186 f = 0.5 * x' * H * x + c' * x; 0187 if nargout > 1 0188 df = H * x + c; 0189 if nargout > 2 0190 d2f = H; 0191 end 0192 end