The LA_GM_LINEAR_MODEL function is used to solve a general Gauss-Markov linear model problem:

minimize_{x}*||y||*_{2 }with constraint *d* = *Ax + By*

where *A* is an *m*-column by *n*-row array, *B* is a *p*-column by *n*-row array, and *d* is an *n*-element input vector with *m* ≤ *n* ≤ *m+p*.

The following items should be noted:

- If
*A*has full column rank*m*and the array (*A B*) has full row rank*n*, then there is a unique solution*x*and a minimal 2-norm solution*y*. - If
*B*is square and nonsingular then the problem is equivalent to a weighted linear least-squares problem, minimize_{x}*||B*^{-1}*(Ax - d)||*_{2}. - If
*B*is the identity matrix then the problem reduces to the ordinary linear least-squares problem, minimize_{x}*||Ax - d||*_{2}.

LA_ GM_LINEAR_MODEL is based on the following LAPACK routines:

Output Type |
LAPACK Routine |

Float |
sggglm |

Double |
dggglm |

Complex |
cggglm |

Double complex |
zggglm |

## Examples

Given the constraint equation *d = Ax + By*, (where *A*, *B*, and *d* are defined in the program below) the following example program solves the general Gauss-Markov problem:

`; Define some example coefficient arrays:`

a = [[2, 7, 4], $

[5, 1, 3], $

[3, 3, 6], $

[4, 5, 2]]

b = [[-3, 2], $

[1, 5], $

[2, 9], $

[4, 1]]

; Define a sample left-hand side vector D:

d = [-1, 2, -3, 4]

; Find and print the solution x:

`x = LA_GM_LINEAR_MODEL(a, b, d, y)`

PRINT, 'LA_GM_LINEAR_MODEL solution:'

`PRINT, X`

PRINT, 'LA_GM_LINEAR_MODEL 2-norm solution:'

`PRINT, Y`

When this program is compiled and run, IDL prints:

LA_GM_LINEAR_MODEL solution:

1.04668 0.350346 -1.28445

`LA_GM_LINEAR_MODEL 2-norm solution:`

0.151716 0.0235733

## Syntax

*Result* = LA_GM_LINEAR_MODEL( *A*, *B*, *D*, *Y* [, /DOUBLE] [, STATUS=*variable*] )

## Return Value

The result (*x*) is an *m*-element vector whose type is identical to *A*.

## Arguments

### A

The *m*-by-*n* array used in the constraint equation.

### B

The* p*-by-*n* array used in the constraint equation.

### D

An *n*-element input vector used in the constraint equation.

### Y

Set this argument to a named variable, which will contain the *p*-element output vector.

## Keywords

### DOUBLE

Set this keyword to use double-precision for computations and to return a double-precision (real or complex) result. Set DOUBLE = 0 to use single-precision for computations and to return a single-precision (real or complex) result. The default is /DOUBLE if *A* is double precision, otherwise the default is DOUBLE = 0.

### STATUS

Set this keyword to a named variable that will contain the status of the computation. Possible values are:

- STATUS = 0: The computation was successful.
- STATUS = 1: The factorization of
*B*is singular, so*rank(B) < p*. No least squares solution can be computed. - STATUS = 2: The factorization of A is singular, so
*rank(AB)< n*. No least squares solution can be computed. - STATUS < 0: One of the input arguments had an illegal value.

*Note: *If STATUS is not specified, any error messages will output to the screen.

## Version History

5.6 |
Introduced |

## Resources and References

For details see Anderson et al., *LAPACK Users' Guide*, 3rd ed., SIAM, 1999.