[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

59. lapack


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

59.1 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.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

59.2 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: dgeqrf (A)

Calcula la descomposición QR de la matriz A. Todos los elementos de A deben ser enteros o números reales. No es necesario que A tenga el mismo número de filas que de columnas.

La función devuelve una lista con dos elementos; el primero es la matriz cuadrada ortonormal Q, con el mismo número de filas que A, y el segundo es la matriz triangular superior R, de iguales dimensiones que A. El producto Q . R, siendo "." el operador de la multiplicación matricial, es igual a A, ignorando errores de redondeo.

(%i1) load (lapack) $
(%i2) fpprintprec : 6 $
(%i3) M : matrix ([1, -3.2, 8], [-11, 2.7, 5.9]) $
(%i4) [q, r] : dgeqrf (M);
       [ - .0905357  .995893  ]
(%o4) [[                      ], 
       [  .995893    .0905357 ]
                               [ - 11.0454   2.97863   5.15148 ]
                               [                               ]]
                               [     0      - 2.94241  8.50131 ]
(%i5) q . r - M;
         [ - 7.77156E-16   1.77636E-15   - 8.88178E-16 ]
(%o5)    [                                             ]
         [      0.0       - 1.33227E-15   8.88178E-16  ]
(%i6) mat_norm (%, 1);
(%o6)                      3.10862E-15
Función: dgesv (A, b)

Calcula la solución x de la ecuación A x = b, siendo A una matriz cuadrada y b otra matriz con el mismo número de filas que A y un número arbitrario de columnas. Las dimensiones de la solución x son las mismas de b.

Los elementos de A y b deben ser reducibles a números decimales si se les aplica la función float, por lo que tales elementos pueden en principio ser de cualquier tipo numérico, constantes numéricas simbólicas o cualesquiera expresiones reducibles a un número decimal. Los elementos de x son siempre números decimales. Todas las operaciones aritméticas se realizan en coma flotante.

dgesv calcula la solución mediante la descomposición LU de A.

Ejemplos:

dgesv calcula la solución x de la ecuación A x = b.

(%i1) A : matrix ([1, -2.5], [0.375, 5]);
                               [   1    - 2.5 ]
(%o1)                          [              ]
                               [ 0.375    5   ]
(%i2) b : matrix ([1.75], [-0.625]);
                                  [  1.75   ]
(%o2)                             [         ]
                                  [ - 0.625 ]
(%i3) x : dgesv (A, b);
                            [  1.210526315789474  ]
(%o3)                       [                     ]
                            [ - 0.215789473684211 ]
(%i4) dlange (inf_norm, b - A.x);
(%o4)                                 0.0

b una matriz con el mismo número de filas que A y un número arbitrario de columnas. Las dimensiones de x son las mismas de b.

(%o0)                                done
(%i1) A : matrix ([1, -0.15], [1.82, 2]);
                               [  1    - 0.15 ]
(%o1)                          [              ]
                               [ 1.82    2    ]
(%i2) b : matrix ([3.7, 1, 8], [-2.3, 5, -3.9]);
                              [  3.7   1    8   ]
(%o2)                         [                 ]
                              [ - 2.3  5  - 3.9 ]
(%i3) x : dgesv (A, b);
        [  3.103827540695117   1.20985481742191    6.781786185657722  ]
(%o3)   [                                                             ]
        [ - 3.974483062032557  1.399032116146062  - 8.121425428948527 ]
(%i4) dlange (inf_norm, b - A . x);
(%o4)                       1.1102230246251565E-15

Los elementos de A y b deben ser reducibles a números decimales.

(%i1) A : matrix ([5, -%pi], [1b0, 11/17]);
                               [   5    - %pi ]
                               [              ]
(%o1)                          [         11   ]
                               [ 1.0b0   --   ]
                               [         17   ]
(%i2) b : matrix ([%e], [sin(1)]);
                                  [   %e   ]
(%o2)                             [        ]
                                  [ sin(1) ]
(%i3) x : dgesv (A, b);
                             [ 0.690375643155986 ]
(%o3)                        [                   ]
                             [ 0.233510982552952 ]
(%i4) dlange (inf_norm, b - A . x);
(%o4)                        2.220446049250313E-16
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.

Función: dgemm (A, B)
Función: dgemm (A, B, options)

Calcula el producto de dos matrices y, opcionalmente, suma este producto con una tercera matriz.

En su forma más simple, dgemm(A, B) calcula el producto de las matrices reales A y B.

En la segunda forma, dgemm calcula alpha * A * B + beta * C, donde A, B y C son matrices reales de dimensiones apropiadas, siendo alpha y beta números reales. De forma opcional, tanto A como B pueden transponerse antes de calcular su producto. Los parámetros adicionales se pueden especificar en cualquier orden, siendo su sintaxis de la forma clave=valor. Las claves reconocidas son:

C

La matriz C que debe ser sumada. El valor por defecto es false, lo que significa que no se sumará ninguna matriz.

alpha

El producto de A por B se multiplicará por este vaalor. El valor por defecto es 1.

beta

Si se da la matriz C, se multiplicará por este valor antes de ser sumada. El valor por defecto es 0, lo que significa que C no se suma, incluso estando presente. Por lo tanto, téngase cuidado en especificar un valor no nulo para beta.

transpose_a

Si toma el valor true, se utilizará la transpuesta de A, en lugar de la propia matriz A, en el producto. El valor por defecto es false.

transpose_b

Si toma el valor true, se utilizará la transpuesta de B, en lugar de la propia matriz B, en el producto. El valor por defecto es false.

(%i1) load (lapack)$
(%i2) A : matrix([1,2,3],[4,5,6],[7,8,9]);
                                  [ 1  2  3 ]
                                  [         ]
(%o2)                             [ 4  5  6 ]
                                  [         ]
                                  [ 7  8  9 ]
(%i3) B : matrix([-1,-2,-3],[-4,-5,-6],[-7,-8,-9]);
                               [ - 1  - 2  - 3 ]
                               [               ]
(%o3)                          [ - 4  - 5  - 6 ]
                               [               ]
                               [ - 7  - 8  - 9 ]
(%i4) C : matrix([3,2,1],[6,5,4],[9,8,7]);
                                  [ 3  2  1 ]
                                  [         ]
(%o4)                             [ 6  5  4 ]
                                  [         ]
                                  [ 9  8  7 ]
(%i5) dgemm(A,B);
                         [ - 30.0   - 36.0   - 42.0  ]
                         [                           ]
(%o5)                    [ - 66.0   - 81.0   - 96.0  ]
                         [                           ]
                         [ - 102.0  - 126.0  - 150.0 ]
(%i6) A . B;
                            [ - 30   - 36   - 42  ]
                            [                     ]
(%o6)                       [ - 66   - 81   - 96  ]
                            [                     ]
                            [ - 102  - 126  - 150 ]
(%i7) dgemm(A,B,transpose_a=true);
                         [ - 66.0  - 78.0   - 90.0  ]
                         [                          ]
(%o7)                    [ - 78.0  - 93.0   - 108.0 ]
                         [                          ]
                         [ - 90.0  - 108.0  - 126.0 ]
(%i8) transpose(A) . B;
                           [ - 66  - 78   - 90  ]
                           [                    ]
(%o8)                      [ - 78  - 93   - 108 ]
                           [                    ]
                           [ - 90  - 108  - 126 ]
(%i9) dgemm(A,B,c=C,beta=1);
                         [ - 27.0  - 34.0   - 41.0  ]
                         [                          ]
(%o9)                    [ - 60.0  - 76.0   - 92.0  ]
                         [                          ]
                         [ - 93.0  - 118.0  - 143.0 ]
(%i10) A . B + C;
                            [ - 27  - 34   - 41  ]
                            [                    ]
(%o10)                      [ - 60  - 76   - 92  ]
                            [                    ]
                            [ - 93  - 118  - 143 ]
(%i11) dgemm(A,B,c=C,beta=1, alpha=-1);
                            [ 33.0   38.0   43.0  ]
                            [                     ]
(%o11)                      [ 72.0   86.0   100.0 ]
                            [                     ]
                            [ 111.0  134.0  157.0 ]
(%i12) -A . B + C;
                               [ 33   38   43  ]
                               [               ]
(%o12)                         [ 72   86   100 ]
                               [               ]
                               [ 111  134  157 ]


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Robert on agosto, 12 2012 using texi2html 1.76.