3
$\begingroup$

I have a matrix $H_{n\times n}$ . Now My job is to diagonalize it, we have $V1_{n\times n}$(set of eigenvectors of $H$). But my $H_{n\times n}$ is in terms of some parameters or variables(e.g. $t1$ and $t2$).I will fix one $t2 = 1$, will change $t1$. For example $t1$ goes from $0 \rightarrow10$. But I don't want to write all the values for $t1$ everytime. As we have Manipulate in Mathematica which does the job.

I have $H_{n\times n}(t1,t2)$ and then I am getting eigenvectors set (row wise) $V1_{n\times n}(t1=0\rightarrow10,t2=1)$, any value between $0$ and $10$ for $t1$. Then Matrix Plot of the $V=V1_{n\times n}(t1=t_{0},t2=1)*V1_{n\times n}(t1=t_{0},t2=1)$.

V1 = Eigenvectors[H /. {t1 -> 0.1, t2 -> 1}];
V = V1*V1;
MatrixPlot[V]

Is there a way so that I can use Manipulate for this Matrix plot for different set of $t1$ values. And I need not have to write this command for each values of $t1$.

Note: For a particular t1.V Plot For $t1 -> 10.0$, $t2 -> 1$. This is the Plot of V(n=20).

$\endgroup$
  • $\begingroup$ Anybody has any answer to this weird problem in Mathematica. $\endgroup$ – L.K. Sep 27 '16 at 14:17
3
+50
$\begingroup$

You say your H is dependent on two parameters, t1 and t2, and that you can fix one of them, say, t2. Hence H will be a function of t1, which I will denote with t in what follows (for illustrative purposes).

Having said that, let's define H[t] to be an explicit function of t. I'll take some random matrix for illustration:

n = 3;
H[t_] := RandomInteger[{0, 9}, {n, n}] + RandomChoice[{0, 1}, {n, n}] t;
MatrixForm@H[t]

enter image description here

and enclose Eigenvectors and MatrixPlot in a Module:

mp[t_] := Module[{V1, V},
  V1 = Chop@Eigenvectors[H[t]];
  V = V1*V1;
  MatrixPlot[V, PlotLegends -> Automatic]
  ]

which one can Manipulate straightforward:

Manipulate[mp[t], {t, 0, 10, 1.}]

enter image description here


One can of course make the matrix H be a function of two or more variables, e.g. H[t1,t2,...] (with an according change of mp into mp[t1,t2,...]), and add additional controls to Manipulate, which will just have more sliders, for each of the variables:

Ndim = 10;

H1[t1_] := {{0, t1}, {t1, 0}};
H2[t2_] := N@{{0, 0}, {t2, 0}};

H[t1_, t2_] := 
  ArrayFlatten@
   Table[H1[t1] KroneckerDelta[m, p1] + 
     H2[t2] KroneckerDelta[m + 1, p1] + 
     Transpose@H2[t2] KroneckerDelta[m - 1, p1], {m, 1, Ndim}, {p1, 1,
      Ndim}];

mp[t1_, t2_] := Module[{V1, V}, V1 = Chop@Eigenvectors[H[t1, t2]];
  V = V1*V1;
  MatrixPlot[V, PlotLegends -> Automatic]]

Manipulate[mp[t1, t2], {t1, 0, 10, 1.}, {t2, 0, 10, 1.}]
$\endgroup$
  • $\begingroup$ Thank you for the code. I ran it and got this. See this Code Output $\endgroup$ – L.K. Sep 30 '16 at 11:20
  • $\begingroup$ Go with: H1[t_] := {{0, t}, {t, 0}};, H[t_] := ArrayFlatten... and remember to change H1 into H1[t] in def of H[t]. Everything is a function but you didn't take that into account. $\endgroup$ – corey979 Sep 30 '16 at 11:28
  • $\begingroup$ V=V1*V1 not V1.V1. $\endgroup$ – L.K. Sep 30 '16 at 11:28
  • $\begingroup$ I ran the code, but this came: Set::write: Tag List in {{0,t},{t,0}}[t_] is Protected. and Set::write: Tag List in {{0,t,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{t,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,1,0,t,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,t,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,1,0,t,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,t,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,1,0,t,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,t,0,1,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,1,0,t,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,t,0,1,0,0,0,0,0,0,0,0,0}{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,t,0}}[t_] is Protected. $\endgroup$ – L.K. Sep 30 '16 at 11:31
  • 1
    $\begingroup$ Please do not remove N@ from the code, this causes the code to malfunction. $\endgroup$ – Feyre Oct 4 '16 at 11:07
4
$\begingroup$

corey979's answer is good, and I have used the code to create the matrix from his answer. You can also stay closer to your initial version (using replace rather than a function call):

n = 5;
h = RandomInteger[{0, 9}, {n, n}] + RandomChoice[{0, 1}, {n, n}] t;
Manipulate[v = Eigenvectors[h /. t -> tval]; MatrixPlot[v*v], {tval, 0, 10}]

For the exact form of H you define in the comment below, the code would be:

Ndim = 10; H1[t_] := {{0, t}, {t, 0}}; H2 = N@{{0, 0}, {1, 0}}; 
H[t_] := ArrayFlatten@
  Table[H1[t] KroneckerDelta[m, p1] + H2 KroneckerDelta[m + 1, p1] + 
    Transpose[H2] KroneckerDelta[m - 1, p1], {m, 1, Ndim}, {p1, 1, Ndim}];
Manipulate[v = Eigenvectors[H[t] /. t -> tval]; MatrixPlot[v*v], {tval, 0, 10}]
$\endgroup$
  • $\begingroup$ I want to plot v*v as a function of t. $\endgroup$ – L.K. Sep 30 '16 at 11:08
  • $\begingroup$ After running this I got Output $\endgroup$ – L.K. Sep 30 '16 at 11:25
  • $\begingroup$ L.K. The code in your output file is not the same as I proposed above. Remove the MatrixForm from H. $\endgroup$ – bill s Sep 30 '16 at 12:48
  • $\begingroup$ THis is the output I got New Output $\endgroup$ – L.K. Sep 30 '16 at 12:53
  • $\begingroup$ I removed the : from H definition, then also same output $\endgroup$ – L.K. Sep 30 '16 at 12:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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