Introducción a lapack
=====================

lapack es una traducción automática a Common Lisp (con el programa f2c) de la librería LAPACK escrita en Fortran.

Funciones y variables para lapack
=================================

 -- Función: dgeev (A)
 -- Función: dgeev (A, RIGHT_P, LEFT_P)

     Calcula los autovalores y, opcionalmente, también los autovectores de la matriz A. Todos los elementos de A deben ser enteros o números decimales en coma flotante. Además, A debe ser cuadrada (igual número de filas que de columnas) y puede ser o no simétrica.

     dgeev(A) calcula sólo los autovalores de A. dgeev(A, RIGHT_P, LEFT_P) calcula los autovalores de A y los autovectores por la derecha cuando RIGHT_P = true, y los autovectores por la izquierda cuando LEFT_P = true.

     La función devuelve una lista de tres elementos. El primer elemento es una lista con los autovalores. El segundo elemento es false o la matriz de autovectores por la derecha. El tercer elemento es false o la matriz de autovectores por la izquierda.

     El autovector por la derecha v(j) (la j-ésima columna de la matriz de autovectores por la derecha) satisface

     A . v(j) = lambda(j) . v(j)

     donde lambda(j) es su autovalor asociado.

     El autovector por la izquierda u(j) (la j-ésima columna de la matriz de autovectores por la izquierda) satisface

     u(j)**H . A = lambda(j) . u(j)**H

     donde u(j)**H denota la transpuesta conjugada de u(j).

     La función de Maxima ctranspose calcula la transpuesta conjugada.

     Los autovectores calculados están normalizados para que su norma euclídea valga 1 y su componente mayor tenga su parte imaginaria igual a cero.

     Ejemplo:

          (%i1) load (lapack)$
          (%i2) fpprintprec : 6;
          (%o2)                           6
          (%i3) M : matrix ([9.5, 1.75], [3.25, 10.45]);
                                   [ 9.5   1.75  ]
          (%o3)                    [             ]
                                   [ 3.25  10.45 ]
          (%i4) dgeev (M);
          (%o4)          [[7.54331, 12.4067], false, false]
          (%i5) [L, v, u] : dgeev (M, true, true);
                                     [ - .666642  - .515792 ]
          (%o5) [[7.54331, 12.4067], [                      ],
                                     [  .745378   - .856714 ]
                                                  [ - .856714  - .745378 ]
                                                  [                      ]]
                                                  [  .515792   - .666642 ]
          (%i6) D : apply (diag_matrix, L);
                                [ 7.54331     0    ]
          (%o6)                 [                  ]
                                [    0     12.4067 ]
          (%i7) M . v - v . D;
                          [      0.0       - 8.88178E-16 ]
          (%o7)           [                              ]
                          [ - 8.88178E-16       0.0      ]
          (%i8) transpose (u) . M - D . transpose (u);
                               [ 0.0  - 4.44089E-16 ]
          (%o8)                [                    ]
                               [ 0.0       0.0      ]

 -- Función: dgesvd (A)
 -- Función: dgesvd (A, LEFT_P, RIGHT_P)

     Calcula la descomposición singular (SVD, en inglés) de la matriz A, que contiene los valores singulares y, opcionalmente, los vectores singulares por la derecha o por la izquierda. Todos los elementos de A deben ser enteros o números decimales en coma flotante. La matriz A puede ser cuadrada o no (igual número de filas que de columnas).

     Sea m el número de filas y n el de columnas de A. La descomposición singular de A consiste en calcular tres matrices: U, SIGMA y V^T, tales que

     A = U . SIGMA . V^T

     donde U es una matriz unitaria m-por-m, SIGMA es una matriz diagonal m-por-n y V^T es una matriz unitaria n-por-n.

     Sea sigma[i] un elemento diagonal de Sigma, esto es, SIGMA[i, i] = SIGMA[i]. Los elementos sigma[i] se llaman valores singulares de A, los cuales son reales y no negativos, siendo devueltos por la función dgesvd en orden descendente.

     Las primeras min(m, n) columnas de U y V son los vectores singulares izquierdo y derecho de A. Nótese que dgesvd devuelve la transpuesta de V, no la propia matriz V.

     dgesvd(A) calcula únicamente los valores singulares de A. dgesvd(A, LEFT_P, RIGHT_P) calcula los valores singulares de A y los vectores sigulares por la izquierda cuando LEFT_P = true, y los vectores sigulares por la derecha cuando RIGHT_P = true.

     La función devuelve una lista de tres elementos. El primer elemento es una lista con los valores singulares. El segundo elemento es false o la matriz de vectores singulares por la izquierda. El tercer elemento es false o la matriz de vectores singulares por la derecha.

     Ejemplo:

          (%i1) load (lapack)$
          (%i2) fpprintprec : 6;
          (%o2)                           6
          (%i3) M: matrix([1, 2, 3], [3.5, 0.5, 8], [-1, 2, -3], [4, 9, 7]);
                                  [  1    2    3  ]
                                  [               ]
                                  [ 3.5  0.5   8  ]
          (%o3)                   [               ]
                                  [ - 1   2   - 3 ]
                                  [               ]
                                  [  4    9    7  ]
          (%i4) dgesvd (M);
          (%o4)      [[14.4744, 6.38637, .452547], false, false]
          (%i5) [sigma, U, VT] : dgesvd (M, true, true);
          (%o5) [[14.4744, 6.38637, .452547],
          [ - .256731  .00816168   .959029    - .119523 ]
          [                                             ]
          [ - .526456   .672116   - .206236   - .478091 ]
          [                                             ],
          [  .107997   - .532278  - .0708315  - 0.83666 ]
          [                                             ]
          [ - .803287  - .514659  - .180867    .239046  ]
          [ - .374486  - .538209  - .755044 ]
          [                                 ]
          [  .130623   - .836799   0.5317   ]]
          [                                 ]
          [ - .917986   .100488    .383672  ]
          (%i6) m : length (U);
          (%o6)                           4
          (%i7) n : length (VT);
          (%o7)                           3
          (%i8) Sigma:
                  genmatrix(lambda ([i, j], if i=j then sigma[i] else 0),
                            m, n);
                            [ 14.4744     0        0    ]
                            [                           ]
                            [    0     6.38637     0    ]
          (%o8)             [                           ]
                            [    0        0     .452547 ]
                            [                           ]
                            [    0        0        0    ]
          (%i9) U . Sigma . VT - M;
                    [  1.11022E-15        0.0       1.77636E-15 ]
                    [                                           ]
                    [  1.33227E-15    1.66533E-15       0.0     ]
          (%o9)     [                                           ]
                    [ - 4.44089E-16  - 8.88178E-16  4.44089E-16 ]
                    [                                           ]
                    [  8.88178E-16    1.77636E-15   8.88178E-16 ]
          (%i10) transpose (U) . U;
                 [     1.0      5.55112E-17    2.498E-16     2.77556E-17  ]
                 [                                                        ]
                 [ 5.55112E-17      1.0       5.55112E-17    4.16334E-17  ]
          (%o10) [                                                        ]
                 [  2.498E-16   5.55112E-17       1.0       - 2.08167E-16 ]
                 [                                                        ]
                 [ 2.77556E-17  4.16334E-17  - 2.08167E-16       1.0      ]
          (%i11) VT . transpose (VT);
                    [      1.0           0.0      - 5.55112E-17 ]
                    [                                           ]
          (%o11)    [      0.0           1.0       5.55112E-17  ]
                    [                                           ]
                    [ - 5.55112E-17  5.55112E-17       1.0      ]

 -- Función: dlange (NORM, A)
 -- Función: zlange (NORM, A)

     Calcula una norma o seudonorma de la matriz A.

     max
          Calcula max(abs(A(i, j))), siendo i y j números de filas y columnas, respectivamente, de A. Nótese que esta función no es una norma matricial.

     one_norm
          Calcula la norma L[1] de A, esto es, el máximo de la suma de los valores absolutos de los elementos de cada columna.

     inf_norm
          Calcula la norma L[inf] de A, esto es, el máximo de la suma de los valores absolutos de los elementos de cada fila.

     frobenius
          Calcula la norma de Frobenius de A, esto es, la raíz cuadrada de la suma de los cuadrados de los elementos de la matriz.