Constrained optimization involves a set of Lagrange multipliers, as described in First-Order Optimality Measure. Solvers return estimated Lagrange
multipliers in a structure. The structure is called lambda
because
the conventional symbol for Lagrange multipliers is the Greek letter lambda
(λ). The structure separates the multipliers into the following
types, called fields:
lower
, associated with lower bounds
upper
, associated with upper bounds
eqlin
, associated with linear equalities
ineqlin
, associated with linear inequalities
eqnonlin
, associated with nonlinear equalities
ineqnonlin
, associated with nonlinear inequalities
soc
, associated with second-order cone constraints
To access, for example, the nonlinear inequality field of a Lagrange multiplier
structure, enter lambda.inqnonlin
. To access the third element of the
Lagrange multiplier associated with lower bounds, enter
lambda.lower(3)
.
The content of the Lagrange multiplier structure depends on the solver. For example,
linear programming has no nonlinearities, so it does not have
eqnonlin
or ineqnonlin
fields. Each applicable
solver's function reference pages contains a description of its Lagrange multiplier
structure under the heading “Outputs.”
Examine the Lagrange multiplier structure for the solution of a nonlinear problem with linear and nonlinear inequality constraints and bounds.
lb = [-3 -3]; % lower bounds ub = [3 3]; % upper bounds A = [1 1]; % linear inequality x(1) + x(2) <= 1 b = 1; Aeq = []; beq = []; x0 = [-1 1]; fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2; % Rosenbrock function nlcons = @(x)deal(x(1)^2 + x(2)^2 - 1,[]); % nonlinear inequality options = optimoptions('fmincon','Display','off'); [x,fval,exitflag,output,lambda] = ... fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nlcons,options); disp(lambda)
eqlin: [0×1 double] eqnonlin: [0×1 double] ineqlin: 0.3407 lower: [2×1 double] upper: [2×1 double] ineqnonlin: 1.7038e-07
Here is an interpretation of the Lagrange multiplier structure.
The lambda.eqlin
and lambda.eqnonlin
fields have size 0 because there are no linear equality constraints and no
nonlinear equality constraints.
The lambda.ineqlin
field has value
0.3407
, indicating that the linear inequality constraint
is active. The linear inequality constraint is x(1) + x(2) <=
1
. Check that the constraint is active at the solution, meaning
the solution causes the inequality to be an equality:
x(1) + x(2)
ans = 1.0000
Check the values of the lambda.lower
and
lambda.upper
fields.
lambda.lower
ans = 1.0e-07 * 0.2210 0.2365
lambda.upper
ans = 1.0e-07 * 0.3361 0.3056
These values are effectively zero, indicating that the solution is not near the bounds.
The value of the lambda.ineqnonlin
field is
1.7038e-07
, indicating that this constraint is not
active. Check the constraint, which is x(1)^2 + x(2)^2 <=
1
.
x(1)^2 + x(2)^2
ans = 0.5282
The nonlinear constraint function value is not near its limit, so the Lagrange multiplier is approximately 0.