MathGroup Archive 2000

[Date Index] [Thread Index] [Author Index]

Search the Archive

Jordan Canonical Form

  • To: mathgroup at smc.vnet.net
  • Subject: [mg26343] Jordan Canonical Form
  • From: "Matt Herman" <Henayni at hotmail.com>
  • Date: Tue, 12 Dec 2000 02:54:53 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

Hi,

I wrote to the mathgroup earlier, detailing an error in 
JordanDecomposition.
I have written the following function to compute the JCF.

JordanForm[M_, opt_, opt2_] :=

Module[{m = M, q = Dimensions[M][[1]], rootlist, list, list2, list3, 
list4, s, r, g, h, i, list5, func, z, a},

If[opt == 0, func = Identity, func = N]; Attributes[CirclePlus] 
= {Orderless, Flat};

g := list2[[t]]; h := list3[[t]]; i := list4[[t]]; rootlist = 
Eigenvalues[M]; list = Union[rootlist]; r = Length[list];

list2 = Table[Count[rootlist, list[[t]]], {t, 1, r}];

list3 = Table[ Dimensions[ NullSpace[ MatrixPower[func[m - 
list[[t]]*IdentityMatrix[q]], k]]][[1]], {t, 1, r}, {k, 1, g}];

list4 = Table[2 h[[g - k]] - (h[[g]] + h[[g - k - 1]]), {t, 1, r}, {k, 
0, g - 2}];

Table[If[Length[h] > 1, list4[[t]] = Flatten[{i, h[[1]] - Plus @@ i}], 
list4[[t]] = Flatten[{i, h[[1]]}]], {t, 1, r}];

list5 = List @@ Plus @@ Table[ list4[[n]].Reverse[ Table[j[list[[n]], 
t], {t, 1, Length[list4[[n]]]}]], {n, 1, r}];

If[opt2 == 0, list5, Return[z = list5[[1]]; a = 1;

While[a < Length[list5], a++; z = CirclePlus[z, list5[[a]]]]; z]]]

*

Options for JordanForm:

opt -- if 0, use integer arithmetic; if 1, use numerical approximations.

opt2 -- if 0, output list of jordan matrices; if 1, output list in 
direct sum notation

*

---------

The above implementation is not the most efficient, but it'll do. As I 
said before, we define j(c,n) to be the nxn matrix with c's on the 
diagonal and ones on the subdiagonal below the c's. If you output list5, 
you get {d11 j(c1,n11),...,d1k j(c1,n1k),...,dst j(cs,nst)}, a list of 
all the j's. The d_i's symbolize that there are d_i jordan blocks of the 
certain form. The JCF is the matrix, with those "jordan blocks" on the 
diagonal, and 0's everywhere else. The question is, how do you make this 
matrix from the given list. The stuff from 
LinearAlgebra`MatrixManipulation doesn't seem to work.

Thanks,

Matt




  • Prev by Date: Announcement/ Call for Applications
  • Next by Date: Re: Re: Big trouble with Mathematica Code parsing -- Rant.
  • Previous by thread: Announcement/ Call for Applications
  • Next by thread: Bifurcation Diagrams in Mathematica