Integer type:  int32  int64  nag_int  show int32  show int32  show int64  show int64  show nag_int  show nag_int

Chapter Contents
Chapter Introduction
NAG Toolbox

# NAG Toolbox: nag_lapack_dgges (f08xa)

## Purpose

nag_lapack_dgges (f08xa) computes the generalized eigenvalues, the generalized real Schur form $\left(S,T\right)$ and, optionally, the left and/or right generalized Schur vectors for a pair of $n$ by $n$ real nonsymmetric matrices $\left(A,B\right)$.

## Syntax

[a, b, sdim, alphar, alphai, beta, vsl, vsr, info] = f08xa(jobvsl, jobvsr, sort, selctg, a, b, 'n', n)
[a, b, sdim, alphar, alphai, beta, vsl, vsr, info] = nag_lapack_dgges(jobvsl, jobvsr, sort, selctg, a, b, 'n', n)

## Description

The generalized Schur factorization for a pair of real matrices $\left(A,B\right)$ is given by
 $A = QSZT , B = QTZT ,$
where $Q$ and $Z$ are orthogonal, $T$ is upper triangular and $S$ is upper quasi-triangular with $1$ by $1$ and $2$ by $2$ diagonal blocks. The generalized eigenvalues, $\lambda$, of $\left(A,B\right)$ are computed from the diagonals of $S$ and $T$ and satisfy
 $Az = λBz ,$
where $z$ is the corresponding generalized eigenvector. $\lambda$ is actually returned as the pair $\left(\alpha ,\beta \right)$ such that
 $λ = α/β$
since $\beta$, or even both $\alpha$ and $\beta$ can be zero. The columns of $Q$ and $Z$ are the left and right generalized Schur vectors of $\left(A,B\right)$.
Optionally, nag_lapack_dgges (f08xa) can order the generalized eigenvalues on the diagonals of $\left(S,T\right)$ so that selected eigenvalues are at the top left. The leading columns of $Q$ and $Z$ then form an orthonormal basis for the corresponding eigenspaces, the deflating subspaces.
nag_lapack_dgges (f08xa) computes $T$ to have non-negative diagonal elements, and the $2$ by $2$ blocks of $S$ correspond to complex conjugate pairs of generalized eigenvalues. The generalized Schur factorization, before reordering, is computed by the $QZ$ algorithm.

## References

Anderson E, Bai Z, Bischof C, Blackford S, Demmel J, Dongarra J J, Du Croz J J, Greenbaum A, Hammarling S, McKenney A and Sorensen D (1999) LAPACK Users' Guide (3rd Edition) SIAM, Philadelphia http://www.netlib.org/lapack/lug
Golub G H and Van Loan C F (1996) Matrix Computations (3rd Edition) Johns Hopkins University Press, Baltimore

## Parameters

### Compulsory Input Parameters

1:     $\mathrm{jobvsl}$ – string (length ≥ 1)
If ${\mathbf{jobvsl}}=\text{'N'}$, do not compute the left Schur vectors.
If ${\mathbf{jobvsl}}=\text{'V'}$, compute the left Schur vectors.
Constraint: ${\mathbf{jobvsl}}=\text{'N'}$ or $\text{'V'}$.
2:     $\mathrm{jobvsr}$ – string (length ≥ 1)
If ${\mathbf{jobvsr}}=\text{'N'}$, do not compute the right Schur vectors.
If ${\mathbf{jobvsr}}=\text{'V'}$, compute the right Schur vectors.
Constraint: ${\mathbf{jobvsr}}=\text{'N'}$ or $\text{'V'}$.
3:     $\mathrm{sort}$ – string (length ≥ 1)
Specifies whether or not to order the eigenvalues on the diagonal of the generalized Schur form.
${\mathbf{sort}}=\text{'N'}$
Eigenvalues are not ordered.
${\mathbf{sort}}=\text{'S'}$
Eigenvalues are ordered (see selctg).
Constraint: ${\mathbf{sort}}=\text{'N'}$ or $\text{'S'}$.
4:     $\mathrm{selctg}$ – function handle or string containing name of m-file
If ${\mathbf{sort}}=\text{'S'}$, selctg is used to select generalized eigenvalues to the top left of the generalized Schur form.
If ${\mathbf{sort}}=\text{'N'}$, selctg is not referenced by nag_lapack_dgges (f08xa), and may be called with the string 'f08xaz'.
[result] = selctg(ar, ai, b)

Input Parameters

1:     $\mathrm{ar}$ – double scalar
2:     $\mathrm{ai}$ – double scalar
3:     $\mathrm{b}$ – double scalar
An eigenvalue $\left({\mathbf{ar}}\left(j\right)+\sqrt{-1}×{\mathbf{ai}}\left(j\right)\right)/{\mathbf{b}}\left(j\right)$ is selected if ${\mathbf{selctg}}\left({\mathbf{ar}}\left(j\right),{\mathbf{ai}}\left(j\right),{\mathbf{b}}\left(j\right)\right)=\mathit{true}$. If either one of a complex conjugate pair is selected, then both complex generalized eigenvalues are selected.
Note that in the ill-conditioned case, a selected complex generalized eigenvalue may no longer satisfy ${\mathbf{selctg}}\left({\mathbf{ar}}\left(j\right),{\mathbf{ai}}\left(j\right),{\mathbf{b}}\left(j\right)\right)=\mathit{true}$ after ordering. ${\mathbf{info}}=\mathbf{n}+{\mathbf{2}}$ in this case.

Output Parameters

1:     $\mathrm{result}$ – logical scalar
$\mathbf{result}=\mathit{true}$ for selected eigenvalues.
5:     $\mathrm{a}\left(\mathit{lda},:\right)$ – double array
The first dimension of the array a must be at least $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
The second dimension of the array a must be at least $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
The first of the pair of matrices, $A$.
6:     $\mathrm{b}\left(\mathit{ldb},:\right)$ – double array
The first dimension of the array b must be at least $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
The second dimension of the array b must be at least $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
The second of the pair of matrices, $B$.

### Optional Input Parameters

1:     $\mathrm{n}$int64int32nag_int scalar
Default: the first dimension of the arrays a, b and the second dimension of the arrays a, b. (An error is raised if these dimensions are not equal.)
$n$, the order of the matrices $A$ and $B$.
Constraint: ${\mathbf{n}}\ge 0$.

### Output Parameters

1:     $\mathrm{a}\left(\mathit{lda},:\right)$ – double array
The first dimension of the array a will be $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
The second dimension of the array a will be $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
a stores its generalized Schur form $S$.
2:     $\mathrm{b}\left(\mathit{ldb},:\right)$ – double array
The first dimension of the array b will be $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
The second dimension of the array b will be $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$.
b stores its generalized Schur form $T$.
3:     $\mathrm{sdim}$int64int32nag_int scalar
If ${\mathbf{sort}}=\text{'N'}$, ${\mathbf{sdim}}=0$.
If ${\mathbf{sort}}=\text{'S'}$, ${\mathbf{sdim}}=\text{}$ number of eigenvalues (after sorting) for which selctg is true. (Complex conjugate pairs for which selctg is true for either eigenvalue count as $2$.)
4:     $\mathrm{alphar}\left({\mathbf{n}}\right)$ – double array
See the description of beta.
5:     $\mathrm{alphai}\left({\mathbf{n}}\right)$ – double array
See the description of beta.
6:     $\mathrm{beta}\left({\mathbf{n}}\right)$ – double array
$\left({\mathbf{alphar}}\left(\mathit{j}\right)+{\mathbf{alphai}}\left(\mathit{j}\right)×i\right)/{\mathbf{beta}}\left(\mathit{j}\right)$, for $\mathit{j}=1,2,\dots ,{\mathbf{n}}$, will be the generalized eigenvalues. ${\mathbf{alphar}}\left(\mathit{j}\right)+{\mathbf{alphai}}\left(\mathit{j}\right)×i$, and ${\mathbf{beta}}\left(\mathit{j}\right)$, for $\mathit{j}=1,2,\dots ,{\mathbf{n}}$, are the diagonals of the complex Schur form $\left(S,T\right)$ that would result if the $2$ by $2$ diagonal blocks of the real Schur form of $\left(A,B\right)$ were further reduced to triangular form using $2$ by $2$ complex unitary transformations.
If ${\mathbf{alphai}}\left(j\right)$ is zero, then the $j$th eigenvalue is real; if positive, then the $j$th and $\left(j+1\right)$st eigenvalues are a complex conjugate pair, with ${\mathbf{alphai}}\left(j+1\right)$ negative.
Note:  the quotients ${\mathbf{alphar}}\left(j\right)/{\mathbf{beta}}\left(j\right)$ and ${\mathbf{alphai}}\left(j\right)/{\mathbf{beta}}\left(j\right)$ may easily overflow or underflow, and ${\mathbf{beta}}\left(j\right)$ may even be zero. Thus, you should avoid naively computing the ratio $\alpha /\beta$. However, alphar and alphai will always be less than and usually comparable with ${‖{\mathbf{a}}‖}_{2}$ in magnitude, and beta will always be less than and usually comparable with ${‖{\mathbf{b}}‖}_{2}$.
7:     $\mathrm{vsl}\left(\mathit{ldvsl},:\right)$ – double array
The first dimension, $\mathit{ldvsl}$, of the array vsl will be
• if ${\mathbf{jobvsl}}=\text{'V'}$, $\mathit{ldvsl}=\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$;
• otherwise $\mathit{ldvsl}=1$.
The second dimension of the array vsl will be $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$ if ${\mathbf{jobvsl}}=\text{'V'}$ and $1$ otherwise.
If ${\mathbf{jobvsl}}=\text{'V'}$, vsl will contain the left Schur vectors, $Q$.
If ${\mathbf{jobvsl}}=\text{'N'}$, vsl is not referenced.
8:     $\mathrm{vsr}\left(\mathit{ldvsr},:\right)$ – double array
The first dimension, $\mathit{ldvsr}$, of the array vsr will be
• if ${\mathbf{jobvsr}}=\text{'V'}$, $\mathit{ldvsr}=\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$;
• otherwise $\mathit{ldvsr}=1$.
The second dimension of the array vsr will be $\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{n}}\right)$ if ${\mathbf{jobvsr}}=\text{'V'}$ and $1$ otherwise.
If ${\mathbf{jobvsr}}=\text{'V'}$, vsr will contain the right Schur vectors, $Z$.
If ${\mathbf{jobvsr}}=\text{'N'}$, vsr is not referenced.
9:     $\mathrm{info}$int64int32nag_int scalar
${\mathbf{info}}=0$ unless the function detects an error (see Error Indicators and Warnings).

## Error Indicators and Warnings

Cases prefixed with W are classified as warnings and do not generate an error of type NAG:error_n. See nag_issue_warnings.

${\mathbf{info}}=-i$
If ${\mathbf{info}}=-i$, parameter $i$ had an illegal value on entry. The parameters are numbered as follows:
1: jobvsl, 2: jobvsr, 3: sort, 4: selctg, 5: n, 6: a, 7: lda, 8: b, 9: ldb, 10: sdim, 11: alphar, 12: alphai, 13: beta, 14: vsl, 15: ldvsl, 16: vsr, 17: ldvsr, 18: work, 19: lwork, 20: bwork, 21: info.
It is possible that info refers to a parameter that is omitted from the MATLAB interface. This usually indicates that an error in one of the other input parameters has caused an incorrect value to be inferred.
W  ${\mathbf{info}}=1 \text{to} {\mathbf{n}}$
The $QZ$ iteration failed. $\left(A,B\right)$ are not in Schur form, but ${\mathbf{alphar}}\left(j\right)$, ${\mathbf{alphai}}\left(j\right)$, and ${\mathbf{beta}}\left(j\right)$ should be correct for $j={\mathbf{info}}+1,\dots ,{\mathbf{n}}$.
${\mathbf{info}}={\mathbf{n}}+1$
Unexpected error returned from nag_lapack_dhgeqz (f08xe).
W  ${\mathbf{info}}={\mathbf{n}}+2$
After reordering, roundoff changed values of some complex eigenvalues so that leading eigenvalues in the generalized Schur form no longer satisfy ${\mathbf{selctg}}=\mathit{true}$. This could also be caused by underflow due to scaling.
W  ${\mathbf{info}}={\mathbf{n}}+3$
The eigenvalues could not be reordered because some eigenvalues were too close to separate (the problem is very ill-conditioned).

## Accuracy

The computed generalized Schur factorization satisfies
 $A+E = QS ZT , B+F = QT ZT ,$
where
 $E,F F = Oε A,B F$
and $\epsilon$ is the machine precision. See Section 4.11 of Anderson et al. (1999) for further details.

The total number of floating-point operations is proportional to ${n}^{3}$.
The complex analogue of this function is nag_lapack_zgges (f08xn).

## Example

This example finds the generalized Schur factorization of the matrix pair $\left(A,B\right)$, where
 $A = 3.9 12.5 -34.5 -0.5 4.3 21.5 -47.5 7.5 4.3 21.5 -43.5 3.5 4.4 26.0 -46.0 6.0 and B= 1.0 2.0 -3.0 1.0 1.0 3.0 -5.0 4.0 1.0 3.0 -4.0 3.0 1.0 3.0 -4.0 4.0 ,$
such that the real positive eigenvalues of $\left(A,B\right)$ correspond to the top left diagonal elements of the generalized Schur form, $\left(S,T\right)$.
Note that the block size (NB) of $64$ assumed in this example is not realistic for such a small problem, but should be suitable for large problems.
```function f08xa_example

fprintf('f08xa example results\n\n');

% Matrix pair (A,B)
A = [3.9, 12.5, -34.5, -0.5;
4.3, 21.5, -47.5,  7.5;
4.3, 21.5, -43.5,  3.5;
4.4, 26.0, -46.0,  6.0];
B = [1,    2,    -3,    1;
1,    3,    -5,    4;
1,    3,    -4,    3;
1,    3,    -4,    4];

% Generalized Schur form (S,T) of (A,B), generalized eigenvalues
% and Schur vectors Q and Z with sorting and selecting only
% real eigenvalues
jobvsl = 'Vectors (left)';
jobvsr = 'Vectors (right)';
sortp = 'Sort';
selctg = @(ar, ai, b) (ai == 0) ;

[S, T, sdim, alphar, alphai, beta, VSL, VSR, info] = ...
f08xa( ...
jobvsl, jobvsr, sortp, selctg, A, B);

fprintf('Number of selected eigenvalues = %4d\n\n', sdim);
disp('Selected generalized eigenvalues')
eigs = alphar./beta + i*alphai./beta;
disp(eigs(1:sdim));

```
```f08xa example results

Number of selected eigenvalues =    2

Selected generalized eigenvalues
2.0000
4.0000

```