3
$\begingroup$

I'm trying to evaluate a system, that depends on two variables, in a specific set of values. I will write an example, but my system is more complicated.

H = {{x^2, y}, {y^2, x}};
{val, vect} = Eigensystem[H];

I select an eigenvector

b = vect[[1]];

Then I write new variables in terms of the eigenvector elements

A = b[[1]];
B = b[[2]];

Finally, a new matrix is built.

M = {{A, B}, {A*A, B}};

x and y must be evaluate for the following list of data:

x={1,2,3,4};
y={0,1,2,5};

The thing is that I need to find the matrix M for each pair of coordinates [x,y]:

{{1,0},{2,1},{3,2},{4,5}}

with the help of a loop, for example Do. This, because my system is more complicated and I can not do it manually (It will take me a lot of time). I was trying to use the loop Do with the iterator Thread, nonetheless I don´t know if this is possible .

I'm new using Mathematica. I really don't understand why this is happening. Some of you guys can help me? Thank you.

$\endgroup$
2
  • 1
    $\begingroup$ Programmatically, this is the same problem as the problem in another recent question of yours, mathematica.stackexchange.com/questions/215466/…. You could define a function that has a matrix value in the ways shown in the linked Q&A. $\endgroup$
    – Michael E2
    Feb 29, 2020 at 16:29
  • $\begingroup$ And never define a variable starting with an upper-case letter as it can conflict with Mathematica's internal names. $\endgroup$ Jul 24, 2021 at 19:20

3 Answers 3

1
$\begingroup$

There are lots of possible way to do this; which is preferable is likely to depend on your specific needs. One method is to form a Function and then MapThread that across your values. Below Evaluate is used to get the definition of M into the held Function body instead of a verbatim M.

Clear[x, y]

MapThread[{x, y} \[Function] Evaluate[M], {{1, 2, 3, 4}, {0, 1, 2, 5}}] // Quiet
{{{Indeterminate, 1}, {Indeterminate, 1}},
 {{1/2 (2 - 2 Sqrt[2]), 1}, {1/4 (-2 + 2 Sqrt[2])^2, 1}},
 {{1/8 (6 - 2 Sqrt[17]), 1}, {1/64 (-6 + 2 Sqrt[17])^2, 1}},
 {{1/50 (12 - 2 Sqrt[161]), 1}, {(-12 + 2 Sqrt[161])^2/2500, 1}}}

Another method is to make a Listable function to handle the threading directly, as follows:

fn = Function[{x, y}, Evaluate[M], Listable];

fn[{1, 2, 3, 4}, {0, 1, 2, 5}] // Quiet   (* same output *)
$\endgroup$
1
$\begingroup$

Another possibility

ClearAll[x, y];
H = {{x^2, y}, {y^2, x}};
v = First@Eigenvectors[H];
A = v[[1]]; B = v[[2]];
M = {{A, B}, {A*A, B}};
xCoord = {1, 2, 3, 4};
yCoord = {0, 1, 2, 5};
coord = Partition[Riffle[xCoord, yCoord], 2];
data = {{#[[1]], #[[2]]}, Limit[M, {x -> #[[1]], y -> #[[2]]}]} & /@ coord;
data = {#[[1]], MatrixForm[#[[2]]]} & /@ data;
Grid[Join[{{"(x,y)", "M matrix"}}, data], Frame -> All]

Mathematica graphics

If you want numerical, change the line above to

 data = {#[[1]], MatrixForm[N@#[[2]]]} & /@ data;

Mathematica graphics

$\endgroup$
0
1
$\begingroup$

Two things to note are (1) different eigenvector normalization would lead to different M-matrices and (2) when $(x,y)=(1,0)$ we have two eigenvectors for the repeated eigenvalue, so which eigenvector do we call "first"? We let Mathematica choose the normalization and the eigenvector order in the following code:

H = {{x^2, y}, {y^2, x}};
allM = Table[
   With[{v = First@Eigenvectors[
        H /. x -> First@val /. y -> Last@val]},
    {v, v*{First@v, 1}}],
   {val, Thread[{{1, 2, 3, 4}, {0, 1, 2, 5}}]}];

Column[MatrixForm /@ allM]

$\begin{array}{l} \left( \begin{array}{cc} 0 & 1 \\ 0 & 1 \\ \end{array} \right) \\ \left( \begin{array}{cc} 1+\sqrt{2} & 1 \\ \left(1+\sqrt{2}\right)^2 & 1 \\ \end{array} \right) \\ \left( \begin{array}{cc} \frac{1}{4} \left(3+\sqrt{17}\right) & 1 \\ \frac{1}{16} \left(3+\sqrt{17}\right)^2 & 1 \\ \end{array} \right) \\ \left( \begin{array}{cc} \frac{1}{25} \left(6+\sqrt{161}\right) & 1 \\ \frac{1}{625} \left(6+\sqrt{161}\right)^2 & 1 \\ \end{array} \right) \\ \end{array}$

The reason these results differ from other methods is that this method puts the numbers in first so Mathematica can use numeric sort.

When $(x,y)=(1,0)$ the H-matrix is the identity matrix, so any finite, non-zero vector ${A,B}$ is an eigenvector.

$\endgroup$

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.