Language Reference

LCP Call

CALL LCP (rc, w, z, m, q <, epsilon> ) ;

This subroutine is supported by the IML procedure and the iml action.

The LCP subroutine solves the linear complementarity problem:

That is, given a matrix bold upper M and a vector bold q, the LCP subroutine computes orthogonal, nonnegative vectors bold w and bold z which satisfy the previous equations.

The input arguments to the LCP subroutine are as follows:

m

is an m times m matrix.

q

is an m times 1 matrix.

epsilon

is a scalar that defines virtual zero. The default value of epsilon is 1E–8.

The LCP subroutine returns the following matrices:

rc

returns one of the following scalar return codes:

rc Termination
0 A solution is found.
1 No solution is possible.
5 The solution is numerically unstable.
6 The subroutine could not obtain enough memory.

w

returns an m-element column vector

z

returns an m-element column vector

The following statements give a simple example:

q = {1, 1};
m = {1 0,
     0 1};
call lcp(rc, w, z, m, q);
print rc, w, z;

Figure 220: Solution to a Linear Complementarity Problem

rc
0

w
1
1

z
0
0


The next example shows the relationship between quadratic programming and the linear complementarity problem. Consider the linearly constrained quadratic program:

If bold upper H is positive semidefinite, then a solution to the Kuhn-Tucker conditions solves QP. The Kuhn-Tucker conditions for QP are

In the linear complementarity problem, let

Then the Kuhn-Tucker conditions are expressed as finding bold w and bold z that satisfy

From the solution bold w and bold z to this linear complementarity problem, the solution to QP is obtained; namely, bold x is the primal structural variable, bold s equals bold upper G bold x minus bold b the surpluses, and bold-italic mu and bold-italic lamda are the dual variables. Consider a quadratic program with the following data:

This problem is solved by using the LCP subroutine as follows:

/*---- Data for the Quadratic Program -----*/
c = {1, 2, 3, 4};
h = {100 10 1 0, 10 100 10 1, 1 10 100 10, 0 1 10 100};
g = {1 2 3 4, 10 20 30 40};
b = {1, 1};

/*----- Express the Kuhn-Tucker Conditions as an LCP ----*/
m = h || -g`;
m = m // (g || j(nrow(g),nrow(g),0));
q = c // -b;

/*----- Solve for a Kuhn-Tucker Point --------*/
call lcp(rc, w, z, m, q);

/*------ Extract the Solution to the Quadratic Program ----*/
x = z[1:nrow(h)];
print rc x;

Figure 221: Solution to a Quadratic Programming Problem

rcx
00.0307522
 0.0619692
 0.0929721
 0.1415983


Last updated: April 16, 2021