1
$\begingroup$

My symbolic matrix $A$ reads

\begin{equation*} \left( \begin{array}{ccc} a \left(x^2+y^2+z^2\right) & b y z+i v x & -i v y \\ b y z-i v x & a \left(x^2+y^2+z^2\right) & b x y+i v z \\ i v y & b x y-i v z & a \left(x^2+y^2+z^2\right) \\ \end{array} \right), \end{equation*} where $a,b,v$ are nonnegative real numbers, and $x,y,z$ denote Cartesian coordinates.

$Assumptions = Element[{a, v, b}, Reals] && v >= 0 && b >= 0 && a >= 0;

A = ConstantArray[0, {3, 3}];
diagm = {a (x^2 + y^2 + z^2), a (x^2 + y^2 + z^2), 
  a (x^2 + y^2 + z^2)}; nondiagm = {I v x + b z y  , -I v y , 
  b x y + I v z};
A[[1, 1]] = diagm[[1]];
A[[2, 2]] = diagm[[2]];
A[[3, 3]] = diagm[[3]];
A[[1, 2]] = nondiagm[[1]];
A[[2, 1]] = Conjugate[A[[1, 2]]];
A[[1, 3]] = nondiagm[[2]];
A[[3, 1]] = Conjugate[A[[1, 3]]];
A[[2, 3]] = nondiagm[[3]];
A[[3, 2]] = Conjugate[A[[2, 3]]];
Af = ComplexExpand /@ A // Simplify;
Af // MatrixForm
evals = Eigenvalues[Af, Cubics -> True];

Using Eigensystem, I can calculate the eigenvalues and eigenvectors of my matrix. For a specific $a,b,v,x,y,z$, I notice that the eigenvalues are not sorted. I can try to sort this particular matrix using this and this threads

Aftmp = Af /. {z -> 2, x -> 2, y -> 2, v -> 1, b -> 0.5, a -> 0.2} // Simplify;
Transpose@SortBy[Transpose[Eigensystem[Aftmp]], N]

Now, my question is how can I apply this particular order of numerical eigensystems to my symbolic matrix? As I need to use an ordered eigensystem in the rest of my script for various matrices, a non-hardcoded approach is much appreciated.

$\endgroup$
2
  • $\begingroup$ If you assign $Assumptions twice, the second assignment overwrites the first one. It's a regular variable. $\endgroup$
    – Roman
    Oct 1, 2020 at 12:27
  • $\begingroup$ thanks. Will correct that. $\endgroup$
    – Shasa
    Oct 1, 2020 at 12:37

1 Answer 1

0
$\begingroup$

If I understand you correctly you believe that the eigenvalues will be sorted the same for any choice of parameters. This sounds highly dubious to me, but who knows.

I am not sure what you mean by "not hardcoded" as you specify that you want "this particular order". So I might have misunderstood you completely.

You can get the ordering of a list by the aptly named Ordering. For instance,

orig = {1, 5, 4};
Part[orig, Ordering[orig]]
(*{1,4,5}*)

For an Eigensystem you need to Map the ordering over both the eigenvalues and eigenvectors. One solution is (with your choice of parameters as the representative)

orderedEigensystem = 
  Module[{ord = 
     Ordering@
      Eigenvalues[
       Af /. {z -> 2, x -> 2, y -> 2, v -> 1, b -> 0.5, a -> 0.2}]},
   Map[Part[#, ord] &, Eigensystem[#]] &];
orderedEigensystem[Af]

which gives you the symbolic eigensystem which is ordered as the particular order you proposed.

$\endgroup$
1
  • $\begingroup$ Thank you. Your suggestion is helpful. You are right, for every value of parameters, the ordering is not the same but for a range of parameters that I am interested in, the particular suggested numerical values depict the correct ordering of eigenvalues. $\endgroup$
    – Shasa
    Oct 1, 2020 at 12:48

Your Answer

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

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