help-gsl
[Top][All Lists]

## Re: eigensystem

 From: Patrick Alken Subject: Re: eigensystem Date: Wed, 20 Jan 2021 07:45:59 -0700 User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0

```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: pdupre@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
>>>> 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: pdupre@gmx.com
>>>>>  Laboratoire interdisciplinaire Carnot de Bourgogne
>>>>>  9 Avenue Alain Savary, BP 47870, 21078 DIJON Cedex FRANCE
>>>>>  Tel: +33 (0)380395988
>>>>> ===========================================================================
>>>>>
>>>>>
>>>>
>>

```