Documentation

## Lagrange Multiplier Structures

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`, since 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

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.

Watch now