The original text of this page was posted on the forum programming/2007-August/007959 by JohnRandall.

A number of ways for calculating eigenvalues in J have been proposed. It is interesting to compare those methods..

```NB. LAPACK

ev=:[: clean_jlapack_ 1 >@{ dgeev_jlapack_

NB. Iterative QR algorithm

rheval=:+/ .*&>/@|.@(128!:0)  NB. Roger Hui
rh=: (<0 1) |: rheval^:_

mseval=:(>&(1&{) +/ .* >&(0&{))&(128!:0)  NB. M. Shimura
ms=: (<0 1) |: mseval^:_

char=: 3 : 0
X=.I=.=@i.n=.#y[p=.1
for_k. >:i.n do.
X=.y +/ . * X
p=.p,pk=.-k%~+/(<0 1)|:X
X=.X+pk*I
end.
|.p
)
lf=:>@{:@p.@char```

The LAPACK method is a direct method, but does preconditioning.

The QR method is iterative, and so is able to get past small instabilities.

Methods which find the characteristic polynomial, like the LF method, work well on small examples, but because of the instability of finding polynomial roots, may go wrong with large examples.

```   dm=:*=@i.@# NB. diagonal matrix

(-:ev@dm) >:i.20
1
(-:rh@dm) >:i.20
1
(-:ms@dm) >:i.20
1
(-:lf@dm) >:i.20
0```