quadprog
Quadratic programming
Syntax
Description
Solver for quadratic objective functions with linear constraints.
quadprog finds a minimum for a problem specified by
H, A, and Aeq are matrices, and f, b, beq, lb, ub, and x are vectors.
You can pass f, lb, and ub as vectors or matrices; see Matrix Arguments.
Note
quadprog applies only to the solver-based approach. Use solve for the
        problem-based approach. For a discussion of the two optimization approaches, see First Choose Problem-Based or Solver-Based Approach.
x = quadprog(H,f,A,b,Aeq,beq,lb,ub)lb ≤ x ≤ ub.
                    The inputs lb and ub are vectors of
                    doubles, and the restrictions hold for each x component. If
                    no equalities exist, set Aeq = [] and
                        beq = [].
Note
If the specified input bounds for a problem are inconsistent, the
                            output x is x0 and the output
                                fval is [].
quadprog resets components of
                                x0 that violate the bounds
                                lb ≤ x ≤ ub
                            to the interior of the box defined by the bounds.
                                quadprog does not change components that
                            respect the bounds.
x = quadprog(problem)problem, a structure described in
                        problem. Create the
                        problem structure using dot notation or the struct function. Alternatively,
                    create a problem structure from an
                        OptimizationProblem object by using prob2struct.
[
                    starts wsout,fval,exitflag,output,lambda]
= quadprog(H,f,A,b,Aeq,beq,lb,ub,ws)quadprog from the data in the warm start object
                        ws, using the options in ws. The
                    returned argument wsout contains the solution point in
                        wsout.X. By using wsout as the initial
                    warm start object in a subsequent solver call, quadprog
                    can work faster.
Examples
Find the minimum of
subject to the constraints
In quadprog syntax, this problem is to minimize
,
where
subject to the linear constraints.
To solve this problem, first enter the coefficient matrices.
H = [1 -1; -1 2]; f = [-2; -6]; A = [1 1; -1 2; 2 1]; b = [2; 2; 3];
Call quadprog.
[x,fval,exitflag,output,lambda] = ...
   quadprog(H,f,A,b);Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
Examine the final point, function value, and exit flag.
x,fval,exitflag
x = 2×1
    0.6667
    1.3333
fval = -8.2222
exitflag = 1
An exit flag of 1 means the result is a local minimum. Because H is a positive definite matrix, this problem is convex, so the minimum is a global minimum.
Confirm that H is positive definite by checking its eigenvalues.
eig(H)
ans = 2×1
    0.3820
    2.6180
Find the minimum of
subject to the constraint
In quadprog syntax, this problem is to minimize
,
where
subject to the linear constraint.
To solve this problem, first enter the coefficient matrices.
H = [1 -1; -1 2]; f = [-2; -6]; Aeq = [1 1]; beq = 0;
Call quadprog, entering [] for the inputs A and b.
[x,fval,exitflag,output,lambda] = ...
   quadprog(H,f,[],[],Aeq,beq);Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
Examine the final point, function value, and exit flag.
x,fval,exitflag
x = 2×1
   -0.8000
    0.8000
fval = -1.6000
exitflag = 1
An exit flag of 1 means the result is a local minimum. Because H is a positive definite matrix, this problem is convex, so the minimum is a global minimum.
Confirm that H is positive definite by checking its eigenvalues.
eig(H)
ans = 2×1
    0.3820
    2.6180
Find the x that minimizes the quadratic expression
where
, ,
subject to the constraints
, .
To solve this problem, first enter the coefficients.
H = [1,-1,1
    -1,2,-2
    1,-2,4];
f = [2;-3;1];
lb = zeros(3,1);
ub = ones(size(lb));
Aeq = ones(1,3);
beq = 1/2;Call quadprog, entering [] for the inputs A and b.
x = quadprog(H,f,[],[],Aeq,beq,lb,ub)
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 3×1
    0.0000
    0.5000
    0.0000
Set options to monitor the progress of quadprog.
options = optimoptions('quadprog','Display','iter');
Define a problem with a quadratic objective and linear inequality constraints.
H = [1 -1; -1 2]; f = [-2; -6]; A = [1 1; -1 2; 2 1]; b = [2; 2; 3];
To help write the quadprog function call, set the unnecessary inputs to [].
Aeq = []; beq = []; lb = []; ub = []; x0 = [];
Call quadprog to solve the problem.
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
 Iter            Fval  Primal Infeas    Dual Infeas  Complementarity  
    0   -8.884885e+00   3.214286e+00   1.071429e-01     1.000000e+00  
    1   -8.331868e+00   1.321041e-01   4.403472e-03     1.910489e-01  
    2   -8.212804e+00   1.676295e-03   5.587652e-05     1.009601e-02  
    3   -8.222204e+00   8.381476e-07   2.793826e-08     1.809485e-05  
    4   -8.222222e+00   4.190781e-11   1.396827e-12     9.047989e-10  
Minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
<stopping criteria details>
x = 2×1
    0.6667
    1.3333
Create a problem structure using a Problem-Based Optimization Workflow. Create an optimization problem equivalent to Quadratic Program with Linear Constraints.
x = optimvar('x',2); objec = x(1)^2/2 + x(2)^2 - x(1)*x(2) - 2*x(1) - 6*x(2); prob = optimproblem('Objective',objec); prob.Constraints.cons1 = sum(x) <= 2; prob.Constraints.cons2 = -x(1) + 2*x(2) <= 2; prob.Constraints.cons3 = 2*x(1) + x(2) <= 3;
Convert prob to a problem structure.
problem = prob2struct(prob);
Solve the problem using quadprog.
[x,fval] = quadprog(problem)
Warning: Your Hessian is not symmetric. Resetting H=(H+H')/2.
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 2×1
    0.6667
    1.3333
fval = -8.2222
Solve a quadratic program and return both the solution and the objective function value.
H = [1,-1,1
    -1,2,-2
    1,-2,4];
f = [-7;-12;-15];
A = [1,1,1];
b = 3;
[x,fval] = quadprog(H,f,A,b)Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
x = 3×1
   -3.5714
    2.9286
    3.6429
fval = -47.1786
Check that the returned objective function value matches the value computed from the quadprog objective function definition.
fval2 = 1/2*x'*H*x + f'*x
fval2 = -47.1786
To see the optimization process for quadprog, set options to show an iterative display and return four outputs. The problem is to minimize
subject to
,
where
, .
Enter the problem coefficients.
H = [2 1 -1
    1 3 1/2
    -1 1/2 5];
f = [4;-7;12];
lb = zeros(3,1);
ub = ones(3,1);Set the options to display iterative progress of the solver.
options = optimoptions('quadprog','Display','iter');
Call quadprog with four outputs.
[x fval,exitflag,output] = quadprog(H,f,[],[],[],[],lb,ub,[],options)
 Iter            Fval  Primal Infeas    Dual Infeas  Complementarity  
    0    2.691769e+01   1.582123e+00   1.712849e+01     1.680447e+00  
    1   -3.889430e+00   0.000000e+00   8.564246e-03     9.971731e-01  
    2   -5.451769e+00   0.000000e+00   4.282123e-06     2.710131e-02  
    3   -5.499995e+00   0.000000e+00   2.878422e-10     1.750743e-06  
    4   -5.500000e+00   0.000000e+00   1.454808e-13     8.753723e-10  
Minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
<stopping criteria details>
x = 3×1
    0.0000
    1.0000
    0.0000
fval = -5.5000
exitflag = 1
output = struct with fields:
            message: 'Minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative dual feasibility, 1.212340e-14,↵is less than options.OptimalityTolerance = 1.000000e-08, the complementarity measure,↵8.753723e-10, is less than options.OptimalityTolerance, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-08.'
          algorithm: 'interior-point-convex'
      firstorderopt: 2.3577e-09
    constrviolation: 0
         iterations: 4
       linearsolver: 'dense'
       cgiterations: []
Solve a quadratic programming problem and return the Lagrange multipliers.
H = [1,-1,1
    -1,2,-2
    1,-2,4];
f = [-7;-12;-15];
A = [1,1,1];
b = 3;
lb = zeros(3,1);
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb);Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
Examine the Lagrange multiplier structure lambda.
disp(lambda)
    ineqlin: 12.0000
      eqlin: [0×1 double]
      lower: [3×1 double]
      upper: [3×1 double]
The linear inequality constraint has an associated Lagrange multiplier of 12.
Display the multipliers associated with the lower bound.
disp(lambda.lower)
    5.0000
    0.0000
    0.0000
Only the first component of lambda.lower has a nonzero multiplier. This generally means that only the first component of x is at the lower bound of zero. Confirm by displaying the components of x.
disp(x)
    0.0000
    1.5000
    1.5000
To speed subsequent quadprog calls, create a warm start object.
options = optimoptions('quadprog','Algorithm','active-set'); x0 = [1 2 3]; ws = optimwarmstart(x0,options);
Solve a quadratic program using ws.
H = [1,-1,1
    -1,2,-2
    1,-2,4];
f = [-7;-12;-15];
A = [1,1,1];
b = 3;
lb = zeros(3,1);
tic
[ws,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb,[],ws);Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
toc
Elapsed time is 0.060411 seconds.
Change the objective function and solve the problem again.
f = [-10;-15;-20]; tic [ws,fval,exitflag,output,lambda] = quadprog(H,f,A,b,[],[],lb,[],ws);
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. <stopping criteria details>
toc
Elapsed time is 0.010756 seconds.
Input Arguments
Quadratic objective term, specified as a symmetric real matrix.
                            H represents the quadratic in the expression
                            1/2*x'*H*x + f'*x. If H
                        is not symmetric, quadprog issues a warning and uses the
                        symmetrized version (H + H')/2 instead.
If the quadratic matrix H is sparse, then by default,
                        the 'interior-point-convex' algorithm uses a slightly
                        different algorithm than when H is dense. Generally,
                        the sparse algorithm is faster on large, sparse problems, and the dense
                        algorithm is faster on dense or small problems. For more information, see
                        the LinearSolver option description and interior-point-convex quadprog Algorithm.
Example: [2,1;1,3]
Data Types: single | double
Linear objective term, specified as a real vector. f
                        represents the linear term in the expression
                            1/2*x'*H*x + f'*x.
Example: [1;3;2]
Data Types: single | double
Linear inequality constraints, specified as a real matrix. A is an
                                                  M-by-N
                                                matrix, where M is the number of
                                                inequalities, and N is the number
                                                of variables (number of elements in
                                                  x0). For large problems with
                                                algorithms that support sparse data, pass
                                                  A as a sparse matrix. See Sparsity in Optimization Algorithms.
A encodes the M linear
inequalities
A*x <= b,
where x is the column vector of N variables x(:),
and b is a column vector with M elements.
For example, consider these inequalities:
x1 + 2x2 ≤
10
3x1 +
4x2 ≤ 20
5x1 +
6x2 ≤ 30,
Specify the inequalities by entering the following constraints.
A = [1,2;3,4;5,6]; b = [10;20;30];
Example: To specify that the x components sum to 1 or less, use A =
                ones(1,N) and b = 1.
Data Types: single | double
Linear inequality constraints, specified as a real vector. b is an
                M-element vector related to the A matrix. If
            you pass b as a row vector, solvers internally convert
                b to the column vector b(:).
b encodes the M linear
inequalities
A*x <= b,
where x is the column vector of N variables x(:),
and A is a matrix of size M-by-N.
For example, consider these inequalities:
x1
                                                  + 2x2 ≤
                                                  10
3x1
                                                  + 4x2 ≤
                                                  20
5x1
                                                  + 6x2 ≤
                                                  30.
Specify the inequalities by entering the following constraints.
A = [1,2;3,4;5,6]; b = [10;20;30];
Example: To specify that the x components sum to 1 or less, use A =
                ones(1,N) and b = 1.
Data Types: single | double
Linear equality constraints, specified as a real matrix. Aeq is an
                                                  Me-by-N
                                                matrix, where Me is the number of
                                                equalities, and N is the number
                                                of variables (number of elements in
                                                  x0). For large problems with
                                                algorithms that support sparse data, pass
                                                  A as a sparse matrix. See Sparsity in Optimization Algorithms.
Aeq encodes the Me linear
equalities
Aeq*x = beq,
where x is the column vector of N variables x(:),
and beq is a column vector with Me elements.
For example, consider these inequalities:
x1 + 2x2 +
3x3 = 10
2x1 +
4x2 + x3 =
20,
Specify the inequalities by entering the following constraints.
Aeq = [1,2,3;2,4,1]; beq = [10;20];
Example: To specify that the x components sum to 1, use Aeq = ones(1,N) and
                beq = 1.
Data Types: single | double
Linear equality constraints, specified as a real vector. beq is an
                Me-element vector related to the Aeq matrix.
            If you pass beq as a row vector, solvers internally convert
                beq to the column vector beq(:).
beq encodes the Me linear
equalities
Aeq*x = beq,
where x is the column vector of N variables
                x(:), and Aeq is a matrix of size
                Me-by-N.
For example, consider these equalities:
x1
                                                  + 2x2 +
                                                  3x3 =
                                                  10
2x1
                                                  + 4x2 +
                                                  x3 =
                                                  20.
Specify the equalities by entering the following constraints.
Aeq = [1,2,3;2,4,1]; beq = [10;20];
Example: To specify that the x components sum to 1, use Aeq = ones(1,N) and
                beq = 1.
Data Types: single | double
Lower bounds, specified as a real vector or real array. If the number of elements in
                x0 is equal to the number of elements in lb,
            then lb specifies that
x(i) >= lb(i) for all i.
If numel(lb) < numel(x0), then lb specifies
that
x(i) >= lb(i) for 1 <=
i <= numel(lb).
If lb has fewer elements than x0, solvers issue a
            warning.
Example: To specify that all x components are positive, use lb =
                zeros(size(x0)).
Data Types: single | double
Upper bounds, specified as a real vector or real array. If the number of elements in
                x0 is equal to the number of elements in ub,
            then ub specifies that
x(i) <= ub(i) for all i.
If numel(ub) < numel(x0), then ub specifies
that
x(i) <= ub(i) for 1 <=
i <= numel(ub).
If ub has fewer elements than x0, solvers issue
            a warning.
Example: To specify that all x components are less than 1, use ub =
                ones(size(x0)).
Data Types: single | double
Initial point, specified as a real vector. The length of
                            x0 is the number of rows or columns of
                            H.
x0 applies to the
                            'trust-region-reflective' algorithm when the problem
                        has only bound constraints. x0 also applies to the
                            'active-set' algorithm.
Note
x0 is a required argument for the 'active-set' algorithm.
If you do not specify x0, quadprog
                        sets all components of x0 to a point in the interior of
                        the box defined by the bounds. quadprog ignores
                            x0 for the 'interior-point-convex'
                        algorithm and for the 'trust-region-reflective' algorithm
                        with equality constraints.
Example: [1;2;1]
Data Types: single | double
Optimization options, specified as the output of
                            optimoptions or a structure such as
                            optimset returns.
Some options are absent from the
        optimoptions display. These options appear in italics in the following
    table. For details, see View Optimization Options.
All Algorithms
| Algorithm | Choose the algorithm: 
 The
                                                 | 
| Diagnostics | Display diagnostic information about the function
                                            to be minimized or solved. The choices are
                                                 | 
| Display | Level of display (see Iterative Display): 
 The
                                                 
 | 
| MaxIterations | Maximum number of iterations allowed; a nonnegative integer. 
 For  | 
| OptimalityTolerance | Termination tolerance on the first-order optimality; a nonnegative scalar. 
 See Tolerances and Stopping Criteria. For  | 
| StepTolerance | Termination tolerance on  
 For  | 
'trust-region-reflective' Algorithm Only
| FunctionTolerance | Termination tolerance on the
                                            function value; a nonnegative scalar. The default value
                                            depends on the problem type: bound-constrained problems
                                            use  For  | 
| 
 | Hessian multiply
                                            function, specified as a function handle. For
                                            large-scale structured problems, this function computes
                                            the Hessian matrix product  W = hmfun(Hinfo,Y) where
                                                 See Quadratic Minimization with Dense, Structured Hessian for an example that uses this option. For
                                                 | 
| MaxPCGIter | Maximum number of PCG (preconditioned conjugate
                                            gradient) iterations; a positive scalar. The default is
                                                 | 
| PrecondBandWidth | Upper bandwidth of the preconditioner for PCG; a
                                            nonnegative integer. By default,
                                                 | 
| SubproblemAlgorithm | Determines how the iteration
                                            step is calculated. The default,
                                             | 
| TolPCG | Termination tolerance on the PCG iteration; a
                                            positive scalar. The default is
                                             | 
| TypicalX | Typical  | 
'interior-point-convex' Algorithm Only
| ConstraintTolerance | Tolerance on the constraint violation; a
                                            nonnegative scalar. The default is
                                                 For
                                                 | 
| LinearSolver | Type of internal linear solver in the algorithm: 
 | 
| ScaleProblem | When  On some
                                            problems with poorly-scaled linear constraint ( | 
'active-set' Algorithm Only
| ConstraintTolerance | Tolerance on the constraint violation; a
                                            nonnegative scalar. The default value is
                                                 For
                                                 | 
| ObjectiveLimit | A tolerance (stopping
                                            criterion) that is a scalar. If the objective function
                                            value goes below  | 
| UseCodegenSolver | Indication to use the version of the software that runs on
                                    target hardware, specified as  | 
Single-Precision Code Generation
| Algorithm | Must be  | 
| ConstraintTolerance | Tolerance on the constraint violation, a positive scalar. The default value is  For  | 
| MaxIterations | Maximum number of iterations allowed, a nonnegative integer. The default value is  | 
| ObjectiveLimit | A tolerance (stopping criterion) that is a scalar. If the objective function value goes below  | 
| OptimalityTolerance | Termination tolerance on the first-order optimality, a positive scalar. The default value is  For  | 
| StepTolerance | Termination tolerance on  For  | 
| UseCodegenSolver | Indication to use the version of the software that runs on
                                    target hardware, specified as  | 
Problem structure, specified as a structure with these fields:
| 
 | Symmetric matrix in 1/2*x'*H*x | 
| 
 | Vector in linear term f'*x | 
| 
 | Matrix in linear inequality
                                        constraints Aineq*x ≤ bineq | 
| 
 | Vector in linear inequality
                                        constraints Aineq*x ≤ bineq | 
| 
 | Matrix in linear equality
                                        constraints Aeq*x = beq | 
| 
 | Vector in linear equality
                                        constraints Aeq*x = beq | 
| lb | Vector of lower bounds | 
| ub | Vector of upper bounds | 
| 
 | Initial point for x | 
| 
 | 'quadprog' | 
| 
 | Options created using optimoptionsoroptimset | 
The required fields are H, f,
                            solver, and options. When solving,
                            quadprog ignores any fields in
                            problem other than those listed.
Note
You cannot use warm start with the problem argument.
Data Types: struct
Warm start object, specified as an object created using optimwarmstart. The warm start object contains the start point and
            options, and optional data for memory size in code generation. See Warm Start Best Practices.
Example: ws = optimwarmstart(x0,options)
Output Arguments
Solution, returned as a real vector. x is the vector
                        that minimizes 1/2*x'*H*x + f'*x subject to all
                        bounds and linear constraints. x can be a local minimum
                        for nonconvex problems. For convex problems, x is a
                        global minimum. For more information, see Local vs. Global Optima.
Solution warm start object, returned as a
                            QuadprogWarmStart object. The solution point is
                            wsout.X.
You can use wsout as the input warm start object in a
                        subsequent quadprog call.
Objective function value at the solution, returned as a real scalar.
                            fval is the value of
                            1/2*x'*H*x + f'*x at the solution
                            x.
Reason quadprog stopped, returned as an integer
                        described in this table.
| All Algorithms | |
| 
 | Function converged to the
                                            solution  | 
| 
 | Number of iterations exceeded
                                                 | 
| 
 | Problem is infeasible. Or,
                                            for  | 
| 
 | Problem is unbounded. | 
| 
 | |
| 
 | Step size was smaller than
                                                 | 
| 
 | Nonconvex problem detected. | 
| 
 | Unable to compute a step direction. | 
| 
 | |
| 
 | Local minimum found; minimum is not unique. | 
| 
 | Change in the objective
                                            function value was smaller than
                                                 | 
| 
 | Current search direction was not a direction of descent. No further progress could be made. | 
| 
 | |
| 
 | Nonconvex problem detected;
                                            projection of  | 
Note
Occasionally, the 'active-set' algorithm halts with
                            exit flag 0 when the problem is, in fact, unbounded.
                            Setting a higher iteration limit also results in exit flag
                                0.
Information about the optimization process, returned as a structure with these fields:
| 
 | Number of iterations taken | 
| 
 | Optimization algorithm used | 
| 
 | Total number of PCG
                                            iterations ( | 
| constrviolation | Maximum of constraint functions | 
| firstorderopt | Measure of first-order optimality | 
| linearsolver | Type of internal linear
                                            solver,  | 
| message | Exit message | 
Lagrange multipliers at the solution, returned as a structure with these fields:
| 
 | Lower bounds
                                                 | 
| 
 | Upper bounds
                                                 | 
| 
 | Linear inequalities | 
| 
 | Linear equalities | 
For details, see Lagrange Multiplier Structures.
More About
The next few items list the possible enhanced exit messages from
            quadprog. Enhanced exit messages give a link for more
        information as the first sentence of the message.
The solver found a minimizing point that satisfies all bounds and linear constraints. Since the problem is convex, the minimizing point is a global minimum. For more information, see Local vs. Global Optima.
The solver stopped because the last step was too small. When the relative step size goes below the StepTolerance tolerance, then the iterations end. Sometimes, this means that the solver located the minimum. However, the first-order optimality measure was not less than the OptimalityTolerance, so it is possible that the result is inaccurate. All constraints were satisfied.
To proceed, try the following:
- Examine the first-order optimality measure in the - outputstructure. If the first-order optimality measure is small, then it is likely that the returned solution is accurate.
- Set the - StepToleranceoption to- 0. Sometimes, this setting helps the solver proceed, though sometimes the solver remains stalled because of other issues.
- Try a different algorithm. If the solver offers a choice of algorithms, sometimes a different algorithm can succeed. 
- Try removing dependent constraints. This means ensure that none of the linear constraints are redundant. 
quadprog stopped because it appears to have found a direction
                that satisfies all constraints and causes the objective to decrease without
                bound.
To proceed,
- Ensure that you have finite bound for each component. 
- Check the objective function to ensure that it is strictly convex (the quadratic matrix has strictly positive eigenvalues). 
- See if the associated linear programming problem (the original problem without the quadratic term) has a finite solution. 
The solver was unable to proceed because it could not compute a direction leading to a minimum. It is likely that this trouble is due to redundant linear constraints or tolerances that are too small.
To proceed,
- Check your linear constraint matrices for redundancy. Try to identify and remove redundant linear constraints. 
- Ensure that your - FunctionTolerance,- OptimalityTolerance, and- ConstraintToleranceoptions are above- 1e-14, and are preferably above- 1e-12. See Tolerances and Stopping Criteria.
quadprog determined that the problem is not Convex. Try a different
                algorithm. For more information, see Quadratic Programming Algorithms.
The solver found the solution during the presolve phase. This means the bounds,
                linear constraints, and f (linear objective coefficient)
                immediately lead to a solution. For more information, see Presolve/Postsolve.
During presolve, the solver found that the problem has an inconsistent formulation. Inconsistent means not all constraints can be satisfied at a single point x. For more information, see Presolve/Postsolve.
During presolve, the solver found a feasible direction where the objective function decreases without bound. For more information, see Presolve/Postsolve.
quadprog converged to a point that does not satisfy all
                constraints to within the constraint tolerance called ConstraintTolerance. The reason
                    quadprog stopped is that the last step was too small. When
                the relative step size goes below the StepTolerance tolerance, then
                the iterations end.
For suggestions on how to proceed, see quadprog Converges to an Infeasible Point.
The solver converged to a point that does not satisfy all constraints to within the constraint tolerance called ConstraintTolerance. The reason the solver stopped is that the last step was too small. When the relative step size goes below the StepTolerance tolerance, then the iterations end.
There is no point satisfying all of the bounds and linear constraints. For help examining the inconsistent linear constraints, see Investigate Linear Infeasibilities.
There is only one feasible point. The number of independent linear equality constraints is the same as the number of variables in the problem.
The solver stopped because the first-order optimality
                    measure is less than the OptimalityTolerance
                tolerance.
The first-order optimality measure is the infinity norm of the projected gradient.
                The projection is onto the null space of the linear equality matrix
                    Aeq.
The solver stopped at a point of zero curvature that is a local minimum. There are other feasible points that have the same objective function value.
There are directions of zero or negative curvature along which the objective function decreases indefinitely. Therefore, for any target value, there are feasible points with objective value smaller than the target. Check whether you included enough constraints in the problem, such as bounds on all variables.
The solver stopped because the first-order optimality measure is less than the OptimalityTolerance tolerance.
The solver stopped because the relative change in function value was below the
                    FunctionTolerance
                tolerance. To check
                solution quality, see Local Minimum Possible.
The solver stopped because the relative change in function value was below the
                square root of the FunctionTolerance
                tolerance, and the change
                of function values in the previous iterations is decreasing by less than a factor of
                3.5. This criterion stops the solver when the difference of objective function
                values is relatively small, but does not decrease to zero quickly enough. To check
                solution quality, see Local Minimum Possible.
The next few items contain definitions for terms in the quadprog exit messages.
Generally, a tolerance is a threshold which, if crossed, stops the iterations of a solver. For more information on tolerances, see Tolerances and Stopping Criteria.
A quadratic program is convex if, from any feasible point, there is no feasible direction with negative curvature. A convex problem has only one local minimum, which is also the global minimum.
The feasible directions from a feasible point x are those vectors v such that for small enough positive a, x + av is feasible.
A feasible point is one satisfying all the constraints.
StepTolerance is a tolerance for the size of
                the last step, meaning the size of the change in location where
                    fsolve was evaluated.

The tolerance called OptimalityTolerance relates to the
                first-order optimality measure. Iterations end when the first-order optimality
                measure is less than OptimalityTolerance.
For constrained problems, the first-order optimality measure is the maximum of the following two quantities:
For unconstrained problems, the first-order optimality measure is the maximum of the absolute value of the components of the gradient vector (also known as the infinity norm).
The first-order optimality measure should be zero at a minimizing point.
For more information, including definitions of all the variables in these equations, see First-Order Optimality Measure.
For unconstrained problems, the first-order optimality measure is the maximum of the absolute value of the components of the gradient vector (also known as the infinity norm of the gradient). This should be zero at a minimizing point.
For problems with bounds, the first-order optimality measure is the maximum over i of |vi*gi|. Here gi is the ith component of the gradient, x is the current point, and
If xi is at a bound, vi is zero. If xi is not at a bound, then at a minimizing point the gradient gi should be zero. Therefore the first-order optimality measure should be zero at a minimizing point.
For more information, see First-Order Optimality Measure.
The constraint tolerance called
                    ConstraintTolerance is the maximum of the values of all
                constraint functions at the current point. 
ConstraintTolerance operates differently from other tolerances.
                If ConstraintTolerance is not satisfied (i.e., if the magnitude
                of the constraint function exceeds ConstraintTolerance), the
                solver attempts to continue, unless it is halted for another reason. A solver does
                not halt simply because ConstraintTolerance is satisfied.
The dual feasibility rd is defined in terms of the KKT conditions for the problem. The relative dual feasibility stopping condition is
| rd ≤
                        ρ OptimalityTolerance, | (1) | 
where ρ is a scale factor.
For more information, see Predictor-Corrector.
The KKT conditions state that at an optimum x, there are Lagrange multipliers and λeq such that
The variables , , and include bounds as part of the linear inequalities.
The dual feasibility rd is the absolute value of .
The scale factor ρ is
The norm is the maximum absolute value of the elements in the expression.
The complementarity measure is defined in terms of the KKT conditions for the problem. At an optimum x, there are Lagrange multipliers and λeq such that
The variables , , and include bounds as part of the linear inequalities.
The complementarity measure is :
For more information, see Predictor-Corrector.
The total relative error is defined in terms of the KKT conditions for the problem. The total relative error stopping condition holds when the Merit Function φ satisfies
| φ ≥
                        max( OptimalityTolerance,105φmin). | (2) | 
When this stopping condition holds, the solver determines that the quadratic program is infeasible.
The KKT conditions state that at an optimum x, there are Lagrange multipliers and λeq such that
The variables , , and include bounds as part of the linear inequalities.
The merit function φ is
The terms in the definition of φ are:
The expression φmin means the minimum of φ seen in all iterations.
Presolve is a set of algorithms that simplify a linear or quadratic programming problem. The algorithms look for simple inconsistencies such as inconsistent bounds and linear constraints. They also look for redundant bounds and linear inequalities. For more information, see Presolve/Postsolve.
The internally-calculated search direction does not decrease the objective
                function value. Perhaps the problem is poorly scaled or has an ill-conditioned
                matrix (H for quadprog, C
                for lsqlin). For suggestions on how to proceed, see When the Solver Fails or Local Minimum Possible.
Algorithms
The 'interior-point-convex' algorithm attempts to follow a path
                that is strictly inside the constraints. It uses a presolve module to remove
                redundancies and to simplify the problem by solving for components that are
                straightforward.
The algorithm has different implementations for a sparse Hessian matrix
                    H and for a dense matrix. Generally, the sparse
                implementation is faster on large, sparse problems, and the dense implementation is
                faster on dense or small problems. For more information, see interior-point-convex quadprog Algorithm.
The 'trust-region-reflective' algorithm is a subspace
                trust-region method based on the interior-reflective Newton method described in
                    [1]. Each iteration involves the approximate solution of a large linear system using
                the method of preconditioned conjugate gradients (PCG). For more information, see
                    trust-region-reflective quadprog Algorithm. 
The 'active-set' algorithm is a projection method, similar to
                the one described in [2]. The algorithm does not use sparse data; see
                    Sparsity in Optimization Algorithms. For more information, see active-set quadprog Algorithm.
A warm start object maintains a list of active constraints from the previous solved problem. The solver carries over as much active constraint information as possible to solve the current problem. If the previous problem is too different from the current one, no active set information is reused. In this case, the solver effectively executes a cold start in order to rebuild the list of active constraints.
Alternative Functionality
App
The Optimize Live Editor task provides a visual interface for quadprog.
References
[1] Coleman, T. F., and Y. Li. “A Reflective Newton Method for Minimizing a Quadratic Function Subject to Bounds on Some of the Variables.” SIAM Journal on Optimization. Vol. 6, Number 4, 1996, pp. 1040–1058.
[2] Gill, P. E., W. Murray, and M. H. Wright. Practical Optimization. London: Academic Press, 1981.
[3] Gould, N., and P. L. Toint. “Preprocessing for quadratic programming.” Mathematical Programming. Series B, Vol. 100, 2004, pp. 95–132.
Extended Capabilities
Usage notes and limitations:
- quadprogsupports code generation using either the- codegen(MATLAB Coder) function or the MATLAB® Coder™ app. You must have a MATLAB Coder license to generate code.
- The target hardware must support standard double-precision floating-point computations or standard single-precision floating-point computations. 
- Code generation targets do not use the same math kernel libraries as MATLAB solvers. Therefore, code generation solutions can vary from solver solutions, especially for poorly conditioned problems. 
- To test your code in MATLAB before generating code, set the - UseCodegenSolveroption to- true. That way, the solver uses the same code that code generation creates.
- quadprogdoes not support the- problemargument for code generation.- [x,fval] = quadprog(problem) % Not supported
- All - quadproginput matrices such as- A,- Aeq,- lb, and- ubmust be full, not sparse. You can convert sparse matrices to full by using the- fullfunction.
- The - lband- ubarguments must have the same number of entries as the number of columns in- Hor must be empty- [].
- If your target hardware does not support infinite bounds, use - optim.coder.infbound.
- For advanced code optimization involving embedded processors, you also need an Embedded Coder® license. 
- You must include options for - quadprogand specify them using- optimoptions. The options must include the- Algorithmoption, set to- 'active-set'.- options = optimoptions("quadprog",Algorithm="active-set"); [x,fval,exitflag] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options); 
- Code generation supports these options: - Algorithm— Must be- 'active-set'
- ConstraintTolerance
- MaxIterations
- ObjectiveLimit
- OptimalityTolerance
- StepTolerance
- UseCodegenSolver
 
- Generated code has limited error checking for options. The recommended way to update an option is to use - optimoptions, not dot notation.- opts = optimoptions('quadprog','Algorithm','active-set'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended 
- Do not load options from a file. Doing so can cause code generation to fail. Instead, create options in your code. 
- If you specify an option that is not supported, the option is typically ignored during code generation. For reliable results, specify only supported options. 
For an example, see Generate Code for quadprog.
Version History
Introduced before R2006aSet the new UseCodegenSolver option to true to have
            quadprog use the same version of the software that code
        generation creates. This option allows you to check the behavior of the solver before you
        generate code or deploy the code to hardware. For solvers that support single-precision code
        generation, the generated code can also support single-precision hardware. You can include
        the option when you generate code; the option has no effect in code generation, but leaving
        the option in saves you the step of removing it. Even though the generated code is identical
        to the MATLAB code, results can differ slightly because linked math libraries can
        differ.
You can generate code using quadprog for single-precision
                floating point hardware. For instructions, see Single-Precision Code Generation.
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)