It is roughly equivalent. GSL nonsymmv will return an error (GSL_EMAXITER) if the algorithm fails to converge on all eigenvalues. The number of converged eigenvalues is stored in w->nonsymm_workspace_p->n_evals
Patrick On 1/20/21 1:36 AM, Patrick Dupre wrote: > Thank you Patrick, > > It seems that dgeev return INFO. > = 0: successful exit > < 0: if INFO = -i, the i-th argument had an illegal value. > > 0: if INFO = i, the QR algorithm failed to compute all the > eigenvalues, and no eigenvectors have been computed; elements i+1:N > of WR and WI contain eigenvalues which have converged. > > It is the same value returned by gsl_eigen_nonsymmv? > > >> The GSL algorithm does not check if the matrix is diagonalizable, so it >> assumes that the input matrix is. This is the same behavior as LAPACK >> DGEEV - in fact I ran your matrix through lapack and found the same answer. >> >> In order to check if your matrix is diagonalizable, one strategy is to >> compute the condition number of the eigenvector matrix V (after the >> nonsymmv computation). If the condition number is large (say > 1e7) then >> that is a bad sign. >> >> I don't think there is an explicit routine in GSL atm to compute the >> condition number of a complex matrix, but a quick way to do it would be >> to compute the LU decomposition of V, and then look at the diagonal >> elements of the U factor. If any of them are tiny, its badly conditioned. >> >> I can add a function to compute a more accurate estimate of the >> condition number if needed. >> >> Patrick >> >> On 1/19/21 1:51 PM, Patrick Dupre wrote: >>> gsl_eigen_nonsymmv_workspace >>> has no member n_evals >>> >>> issue: >>> >>> Diagonalizing >>> double data_3 [] = { 0.0, 0.0, 1.0, >>> 0.0, 0.0, 0.0, >>> 0.0, 0.0, 0.0 } ; >>> >>> I get >>> eigenvalue = 0 +0i >>> eigenvector = >>> 1 +0i >>> 0 +0i >>> 0 +0i >>> eigenvalue = 0 +0i >>> eigenvector = >>> 0 +0i >>> 1 +0i >>> 0 +0i >>> eigenvalue = 0 +0i >>> eigenvector = >>> -1 +0i >>> 0 +0i >>> 3.00625e-292 +0i >>> >>> >>> which is wrong. >>> The last eigenvector is not correct because this matrix is not >>> diagonalizable. >>> >>> I need to identify such matrices. >>> >>> >>> =========================================================================== >>> Patrick DUPRÉ | | email: pdu...@gmx.com >>> Laboratoire interdisciplinaire Carnot de Bourgogne >>> 9 Avenue Alain Savary, BP 47870, 21078 DIJON Cedex FRANCE >>> Tel: +33 (0)380395988 >>> =========================================================================== >>> >>> >>>> Sent: Tuesday, January 19, 2021 at 6:56 PM >>>> From: "Patrick Alken" <patrick.al...@colorado.edu> >>>> To: help-gsl@gnu.org >>>> Subject: Re: eigensystem >>>> >>>> What do you mean by handle it? According to the documentation, if the >>>> function cannot compute all eigenvalues, an error code is returned. In >>>> the case of gsl_eigen_nonsymm, the number of converged eigenvalues is >>>> stored in w->n_evals. >>>> >>>> Patrick >>>> >>>> On 1/19/21 10:33 AM, Patrick Dupre wrote: >>>>> Hello, >>>>> >>>>> Is there a way to handle the possible error of gsl_eigen_nonsymmv ? >>>>> >>>>> For example, when the matrix is not diagonalizable. >>>>> >>>>> Thanks >>>>> >>>>> =========================================================================== >>>>> Patrick DUPRÉ | | email: pdu...@gmx.com >>>>> Laboratoire interdisciplinaire Carnot de Bourgogne >>>>> 9 Avenue Alain Savary, BP 47870, 21078 DIJON Cedex FRANCE >>>>> Tel: +33 (0)380395988 >>>>> =========================================================================== >>>>> >>>>> >>>> >>