help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Help...


From: lash
Subject: Re: Help...
Date: Mon, 21 Dec 1998 09:29:59 -0600 (CST)

> 
> Dear Guys,
> 
> I am in a great need for eigenvalue package in my Ph.D. studies. I've
> used matlab for this package ([V,D]=eig(a)) and it works, but I am
> interested in 32 digits precision whereas matlab has 16 only. Hence I
> decided to write my own routine. I got some programs (zgeev, qzhes, etc.)
> in fortran but they are all unreliable. Octave uses them too and here's an
> example that it doesn't work: (I am interested in general complex 4x4 and
> 8x8 matrices, full eigenvalues & eigenvectors):
> 
> a =
> 
>  Column 1:
> 
>   0.660674095153809 + 0.304533690214157i
>   0.218023106455803 + 0.675618231296539i
>   0.258169531822205 + 0.914756238460541i
>   0.301558434963226 + 0.222921922802925i
> 
>  Column 2:
> 
>   0.283803135156631 + 0.052084900438786i
>   0.474917590618134 + 0.666901826858521i
>   0.590481042861938 + 0.390818536281586i
>   0.554883301258087 + 0.487036257982254i
> 
>  Column 3:
> 
>   0.548641562461853 + 0.745089948177338i
>   0.714440703392029 + 0.638778746128082i
>   0.148456916213036 + 0.686463475227356i
>   0.106128662824631 + 0.144878074526787i
> 
>  Column 4:
> 
>   0.144677996635437 + 0.371638923883438i
>   0.906892597675323 + 0.958721995353699i
>   0.942158818244934 + 0.547215640544891i
>   0.406394332647324 + 0.574961066246033i
> 
> octave:66> eig(a)
> error: zgeev failed to converge
> error: evaluating index expression near line 66, column 1
> octave:66> 
> 
> 
> 
> Since matlab works for any matrix I suspect the routines I have and which
> octave uses are fine but need some driver of balancing the matrix. Can
> any of you guys kindly help me? I would be of course interested in source
> in C, but even fortran routines are fine. Maybe it just needs a call to
> some balancing routine before zgeev, otherwise no convergence for the
> eigenvectors. I have this problem already for many months but didn't find
> yet ansewr :( I could make a lot of progress in the Ph.D. instead of
> calling the slow matlab interface I wrote and/or go to the high precision.
> 
> If you find an answer please return to me at address@hidden
> - Thanks! Oren.
> 

Which version of Octave, and on what platform?  I just tried your example
on Octave 2.0.13 on a Sun Ultra 1 under solaris, and I get the results:

octave:11> version
ans = 2.0.13
octave:12> a
a =

 Column 1:

  0.660674095153809 + 0.304533690214157i
  0.218023106455803 + 0.675618231296539i
  0.258169531822205 + 0.914756238460541i
  0.301558434963226 + 0.222921922802925i

 Column 2:

  0.283803135156631 + 0.052084900438786i
  0.474917590618134 + 0.666901826858521i
  0.590481042861938 + 0.390818536281586i
  0.554883301258087 + 0.487036257982254i

 Column 3:

  0.548641562461853 + 0.745089948177338i
  0.714440703392029 + 0.638778746128082i
  0.148456916213036 + 0.686463475227356i
  0.106128662824631 + 0.144878074526787i

 Column 4:

  0.144677996635437 + 0.371638923883438i
  0.906892597675323 + 0.958721995353699i
  0.942158818244934 + 0.547215640544891i
  0.406394332647324 + 0.574961066246033i

octave:13> eig(a)
ans =

   1.806166293907551 + 2.030664098006237i
  -0.136299627666124 - 0.401122045040072i
   0.169073650200598 + 0.273930811396951i
  -0.148497381809724 + 0.329387194182949i

octave:14> [v,d]=eig(a)
v =

 Column 1:

   0.375114592535907 - 0.068746998143506i
   0.655757003642081 + 0.000000000000000i
   0.546031202268586 + 0.003354453649958i
   0.353494938156497 - 0.037757745891452i

 Column 2:

  -0.209700339740800 + 0.503409326295536i
   0.572606616085979 + 0.000000000000000i
   0.143043661588861 - 0.460961450832140i
  -0.375967021752729 + 0.020696164045430i

 Column 3:

   0.648813510859040 + 0.000000000000000i
  -0.271997939078370 + 0.215281719781302i
  -0.240438864070340 + 0.374995359785745i
  -0.053748923044789 - 0.507336787989142i

 Column 4:

  -0.071558944673890 + 0.353911410227957i
  -0.389480689912547 + 0.086669056222871i
  -0.407382573405088 - 0.399879298863578i
   0.620125215785105 + 0.000000000000000i

d =

 Column 1:

   1.806166293907551 + 2.030664098006237i
   0.000000000000000 + 0.000000000000000i
   0.000000000000000 + 0.000000000000000i
   0.000000000000000 + 0.000000000000000i

 Column 2:

   0.000000000000000 + 0.000000000000000i
  -0.136299627666124 - 0.401122045040072i
   0.000000000000000 + 0.000000000000000i
   0.000000000000000 + 0.000000000000000i

 Column 3:

   0.000000000000000 + 0.000000000000000i
   0.000000000000000 + 0.000000000000000i
   0.169073650200598 + 0.273930811396951i
   0.000000000000000 + 0.000000000000000i

 Column 4:

   0.000000000000000 + 0.000000000000000i
   0.000000000000000 + 0.000000000000000i
   0.000000000000000 + 0.000000000000000i
  -0.148497381809724 + 0.329387194182949i


I also don't think that having the fortran or C code to these routines
will (directly) help you get better precision.  Their precision is
mainly due to the precision of the floating point representation of the
machine.  You might take a look at some of the arbitrary precision
arithmetic packages that exist.  I don't know if any of them have
eigenvalues or especially complex eigenvalues, but its worth a shot.

The only one that I can remember off the top of my head is called
"pari".

Good Luck,


Bill Lash
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]