1 | #ifndef LINEARALGEBRA_H |
---|
2 | #define LINEARALGEBRA_H |
---|
3 | #include <Singular/lists.h> |
---|
4 | #include <kernel/linearAlgebra.h> |
---|
5 | |
---|
6 | /** |
---|
7 | * Computes all eigenvalues of a given real quadratic matrix with |
---|
8 | * multiplicites. |
---|
9 | * |
---|
10 | * The method assumes that the current ground field is the complex numbers. |
---|
11 | * Computations are based on the QR double shift algorithm involving |
---|
12 | * Hessenberg form and householder transformations. |
---|
13 | * If the algorithm works, then it returns a list with two entries which |
---|
14 | * are again lists of the same size: |
---|
15 | * _[1][i] is the i-th mutually distinct eigenvalue that was found, |
---|
16 | * _[2][i] is the (int) multiplicity of _[1][i]. |
---|
17 | * If the algorithm does not work (due to an ill-posed matrix), a list with |
---|
18 | * the single entry (int)0 is returned. |
---|
19 | * 'tol1' is used for detection of deflation in the actual qr double shift |
---|
20 | * algorithm. |
---|
21 | * 'tol2' is used for ending Heron's iteration whenever square roots |
---|
22 | * are being computed. |
---|
23 | * 'tol3' is used to distinguish between distinct eigenvalues: When |
---|
24 | * the Euclidean distance between two computed eigenvalues is less then |
---|
25 | * tol3, then they will be regarded equal, resulting in a higher |
---|
26 | * multiplicity of the corresponding eigenvalue. |
---|
27 | * |
---|
28 | * @return a list with one entry (int)0, or two entries which are again lists |
---|
29 | **/ |
---|
30 | lists qrDoubleShift( |
---|
31 | const matrix A, /**< [in] the quadratic matrix */ |
---|
32 | const number tol1, /**< [in] tolerance for deflation */ |
---|
33 | const number tol2, /**< [in] tolerance for square roots */ |
---|
34 | const number tol3, /**< [in] tolerance for distinguishing |
---|
35 | eigenvalues */ |
---|
36 | const ring r= currRing |
---|
37 | ); |
---|
38 | #endif |
---|