I have a matrix whose eigenvalues have to be plotted. I am using two techniques but they are not the same. Please guide me on this.

Here is first command or code used for plotting the eigenvalues(two in my case)

a := 1;
SM[j1_, j2_, k_] := {{0, -(j1 + j2*Exp[I*k*a])}, {-(j1 + (j2*Exp[-I*k*a])), 
eigenen[j1_, j2_, k_] := Module[{EV1}, EV1 = Eigenvalues[SM[j1, j2, k]];
  Plot[EV1, {k, -\[Pi]/a, \[Pi]/a}, PlotLegends -> "Expressions"]]
Manipulate[eigenen[j1, j2, k], {j1, 0.1, 1}, {j2, 0.1, 1}]

Result is (j1>j2, you can take j1=0.3, j2=0.1) enter image description here

Second used code

PowerExpand[FullSimplify[Eigenvalues[ {{0, -(j1 + j2*Exp[I*ka])},{-(j1 + j2*Exp[-I*ka]), 0}} ]]]

Out:= {-Sqrt[j1^2 + j2^2 + 2 j1 j2 Cos[ka]], Sqrt[j1^2 + j2^2 + 2 j1 j2 Cos[ka]]}
Manipulate[Plot[{Sqrt[(j1^2 + j2^2 + 2 j1 j2 Cos[k*a])], -Sqrt[(j1^2 + j2^2 + 2 j1 j2 Cos[k*a])]}, {k, -\[Pi]/a, \[Pi]/a}, 
  PlotLegends -> "Expressions"], {j1, 0.1, 1}, {j2, 0.1, 1}]

For this result is (j1>j2, you can take j1=0.3, j2=0.1) enter image description here

I have no idea about the difference but I will be using first code more often as I later have to deal with large matrices(40$\times$ 40), where I can't simply write the eigenvalues. Is there any effective or similar code where this problem can be resolved?

My queries(to summarise):
(i) Reason(s) for the difference in the plots.
(ii) Anyway the first code can be resolved to give similar results as Ist one(those are expected ones), not as the Ist ones.


1 Answer 1


Here is your problem in more evident way:

a = 1;
SM[j1_, j2_, k_] = {{0, -(j1 + j2*Exp[I*k *a])}, {-(j1 + j2*Exp[-I*k* a]), 0}};

Eigenvalues[SM[0.1, 0.1, -Pi/a + 0.1]]
(*{-0.00999583, 0.00999583}*)

Eigenvalues[SM[j1, j2, k]] /. {j1 -> 0.1, j2 -> 0.1, k -> -Pi/a + 0.1}
(*{0.00999583 - 1.99493*10^-16 I, -0.00999583 + 1.99493*10^-16 I}*)

If you ignore the imaginary part from the second expression, the values are in opposite order. You either evaluate eigenvalue algorithm on numeric matrix at each point or evaluate the generic symbolic version once and make substitution. Eigenvalues can make some inner decisions in what order to return the values, so the second approach should be more general and therefore correct.

  • $\begingroup$ Thanks for your details and answer obviously. Moreover, I have huge matrix depending on these parameters, will it still be valid? But most important thing I will be using manipulate, it was just to show you one occurrence at j1=0.3 and j2=0.1, there are set of values{j1,j2}. Can I implement that in above code somehow? That will resolve my problem. $\endgroup$
    – L.K.
    Commented Jan 25, 2017 at 16:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.