Index of Functions: A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 
Index Page
diags2

Table of contents
Procedure
Abstract
Required_Reading
Keywords
Declarations
Brief_I/O
Detailed_Input
Detailed_Output
Parameters
Exceptions
Files
Particulars
Examples
Restrictions
Literature_References
Author_and_Institution
Version

Procedure

     DIAGS2   ( Diagonalize symmetric 2x2 matrix )

     SUBROUTINE DIAGS2 ( SYMMAT, DIAG, ROTATE )

Abstract

     Diagonalize a symmetric 2x2 matrix.

Required_Reading

     ROTATION

Keywords

     ELLIPSE
     MATRIX
     ROTATION
     TRANSFORMATION

Declarations

     IMPLICIT NONE

     DOUBLE PRECISION      SYMMAT ( 2, 2 )
     DOUBLE PRECISION      DIAG   ( 2, 2 )
     DOUBLE PRECISION      ROTATE ( 2, 2 )

Brief_I/O

     VARIABLE  I/O  DESCRIPTION
     --------  ---  --------------------------------------------------
     SYMMAT     I   A symmetric 2x2 matrix.
     DIAG       O   A diagonal matrix similar to SYMMAT.
     ROTATE     O   A rotation used as the similarity transformation.

Detailed_Input

     SYMMAT   is a symmetric 2x2 matrix. That is, SYMMAT has the
              form

                 .-        -.
                 |  A    B  |
                 |          |
                 |  B    C  |
                 `-        -'

              This routine uses only the upper-triangular
              elements of SYMMAT, that is, the elements

                 SYMMAT(1,1)
                 SYMMAT(1,2)
                 SYMMAT(2,2)

              to determine the outputs DIAG and ROTATE.

Detailed_Output

     DIAG,
     ROTATE   are, respectively, a diagonal matrix and a 2x2
              rotation matrix that satisfy the equation

                                  T
                 DIAG   =   ROTATE   *  SYMMAT  *  ROTATE.

              In other words, DIAG is similar to SYMMAT, and ROTATE is
              a change-of-basis matrix that diagonalizes SYMMAT. DIAGS2
              chooses ROTATE so that its angle of rotation has the
              smallest possible magnitude. If there are two rotations
              that meet these criteria (they will be inverses of one
              another), either rotation may be chosen.

Parameters

     None.

Exceptions

     Error free.

     1)  The matrix element SYMMAT(2,1) is not used in this routine's
         computations, so the condition

            SYMMAT(1,2)  .NE.  SYMMAT(2,1)

         has no effect on this routine's outputs.

Files

     None.

Particulars

     The capability of diagonalizing a 2x2 symmetric matrix is
     especially useful in a number of geometric applications
     involving quadratic curves such as ellipses. Such curves are
     described by expressions of the form

           2                    2
        A x   +   B xy   +   C y   +   D x    +    E y   +   F   =   0.

     Diagonalization of the matrix

        .-         -.
        | A     B/2 |
        |           |
        | B/2     C |
        `-         -'

     allows us to perform a coordinate transformation (a rotation,
     specifically) such that the equation of the curve becomes

           2         2
        P u   +   Q v   +   R u    +    S v   +   T   =   0

     in the transformed coordinates. This form is much easier to
     handle. If the quadratic curve in question is an ellipse,
     we can easily find its center, semi-major axis, and semi-minor
     axis from the second equation.

     Ellipses turn up frequently in navigation geometry problems;
     for example, the limb and terminator (if we treat the Sun as a
     point source) of a body modeled as a tri-axial ellipsoid are
     ellipses.

     A mathematical note: because SYMMAT is symmetric, we can ALWAYS
     find an orthogonal similarity transformation that diagonalizes
     SYMMAT, and we can choose the similarity transformation to be a
     rotation matrix. By `orthogonal' we mean that if the ROTATE is
     the matrix in question, then

              T                         T
        ROTATE  ROTATE  =  ROTATE ROTATE  =  I.

     The reasons this routine handles only the 2x2 case are: first,
     the 2x2 case is much simpler than the general case, in which
     iterative diagonalization methods must be used, and second, the
     2x2 case is adequate for solving problems involving ellipses in
     3 dimensional space. Finally, this routine can be used to
     support a routine that solves the general-dimension
     diagonalization problem for symmetric matrices.

     Another feature of the routine that might provoke curiosity is
     its insistence on choosing the diagonalization matrix that
     rotates the original basis vectors by the smallest amount. The
     rotation angle of ROTATE is of no concern for most applications,
     but can be important if this routine is used as part of an
     iterative diagonalization method for higher-dimensional matrices.
     In that case, it is most undesirable to interchange diagonal
     matrix elements willy-nilly; the matrix to be diagonalized could
     get ever closer to being diagonal without converging. Choosing
     the smallest rotation angle precludes this possibility.

Examples

     1)  A case that can be verified by hand computation:
         Suppose SYMMAT is

            +-                -+
            |  1.0D0    4.0D0  |
            |                  |
            |  4.0D0   -5.0D0  |
            +-                -+

         Then SYMMAT is similar to the diagonal matrix

            +-                -+
            |  3.0D0    0.0D0  |
            |                  |
            |  0.0D0   -7.0D0  |
            +-                -+

         so

            DIAG(1,1) =  3.D0
            DIAG(2,1) =  0.D0
            DIAG(1,2) =  0.D0
            DIAG(2,2) = -7.D0

         and ROTATE is

            +-                                   -+
            |   0.894427191          -0.447213595 |
            |                                     |
            |   0.447213595           0.894427191 |
            +-                                   -+

        which is an approximation to

            +-                                   -+
            |  0.4 * 5**(1/2)     -0.2 * 5**(1/2) |
            |                                     |
            |  0.2 * 5**(1/2)      0.4 * 5**(1/2) |
            +-                                   -+


     2)  Suppose we want to find the semi-axes of the ellipse defined
         by
                2                 2
            27 x  +  10 xy  +  3 y   =  1.

         We can write the above equation as the matrix equation

            +-     -+  +-         -+  +- -+
            | x   y |  | 27     5  |  | x |    =   1;
            +-     -+  |           |  |   |
                       |  5     3  |  | y |
                       +-         -+  +- -+

         let SYMMAT be the symmetric matrix on the left. The code
         fragment

            SYMMAT(1,1)  =  27.D0
            SYMMAT(2,1)  =   5.D0
            SYMMAT(1,2)  =   5.D0
            SYMMAT(2,2)  =   3.D0

            CALL DIAGS2 ( SYMMAT, DIAG, ROTATE )

         will return DIAG, an array containing the eigenvalues of
         SYMMAT, and ROTATE, the coordinate transformation required
         to diagonalize SYMMAT. In this case,

            DIAG(1,1)   =  28.D0
            DIAG(2,1)   =  0.D0
            DIAG(1,2)   =  0.D0
            DIAG(2,2)   =  2.D0

          and

            ROTATE(1,1) =  0.980580676D0
            ROTATE(2,1) =  0.196116135D0
            ROTATE(1,2) = -0.196116135D0
            ROTATE(2,2) =  0.980580676D0

         The columns of ROTATE give the ellipse's axes, after scaling
         them by

                   1                            1
            ----------------     and     ---------------
              ____________                 ____________
            \/  DIAG(1,1)                \/  DIAG(2,2)

         respectively.

         If SMAJOR and SMINOR are semi-major and semi-minor axes,
         we can find them as shown below. For brevity, we omit the
         check for zero or negative eigenvalues. Negative or zero
         eigenvalues will occur only as a result of round-off error;
         mathematically, the eigenvalues of the matrix SYMMAT are
         guaranteed to be positive, since they are the reciprocals of
         the squares of the lengths of the ellipse's semi-axes.

            DO I = 1, 2
               SMAJOR(I) = ROTATE(I,1)  /  DSQRT( DIAG(1,1) )
               SMINOR(I) = ROTATE(I,2)  /  DSQRT( DIAG(2,2) )
            END DO

Restrictions

     None.

Literature_References

     [1]  T. Apostol, "Calculus, Vol. II," chapter 5, "Eigenvalues of
          Operators Acting on Euclidean Spaces," John Wiley & Sons,
          1969.

Author_and_Institution

     N.J. Bachman       (JPL)
     J. Diaz del Rio    (ODC Space)
     W.L. Taber         (JPL)
     E.D. Wright        (JPL)

Version

    SPICELIB Version 1.3.0, 17-JUN-2021 (JDR)

        Added IMPLICIT NONE statement.

        Edited the header to comply with NAIF standard. Added
        "Error free." to $Exceptions section. Removed unnecessary
        $Revisions section.

    SPICELIB Version 1.2.0, 06-SEP-2005 (NJB)

        Updated to remove non-standard use of duplicate arguments
        in VHATG and SWAPD calls.

    SPICELIB Version 1.1.0, 24-JAN-2002 (EDW)

        Edited incorrect examples in the header. The example
        outputs did not correspond to the actual function
        of the routine.

    SPICELIB Version 1.0.1, 10-MAR-1992 (WLT)

        Comment section for permuted index source lines was added
        following the header.

    SPICELIB Version 1.0.0, 04-NOV-1990 (NJB)
Fri Dec 31 18:36:13 2021