Hi,
I am trying to write the iDMRG algorithm in Matlab. But I have some problems calculating the local spin expectation and spin-spin correlation. I’m writing to ask where I made a mistake and how I could revise it.
It’s spin 1/2 XXZ Heisenberg chain that I am currently working on. The Hamiltonian is
H=\sum_{<ij>} \vec{S_i} \vec{S_j}
I calculated \langle S_{z, i} \rangle for each site i and spin-spin correlation matrix \langle S_{z, i} S_{z, j} \rangle.
This is how I do the calculation:
Firstly, in each DMRG step when I expand the block, I keep in track S_{z,i} operator of each site in the block, and transform them correspondingly.
For the added new site, the S_{z,i} operator is simply
kron(complex(eye(length(H))), Sz0);
where Sz0 is the Pauli z matrix, H is the Hamiltonian of the block to be expanded.
For the sites already in the block, their S_{z,i} operator is transformed as
kron(Sz(i).Sz, complex(eye(dim)));
where Sz(i).Sz is the S_{z, i} operator already kept with the block to be expanded. And dim=2 since it’s a spin 1/2 system.
Secondly, in the final step of iDMRG, I get the ground state 1D vector $$ by
[Psi, E0] = eigs(SH, 1, 'SA');
where SH is the superblock Hamiltonian.
And with the stored S_{z, i} operators of the superblock, and the ground state 1D vector Psi of super Hamiltonian, I calculate \langle S_{z, i} \rangle and \langle S_{z, i} S_{z, j} \rangle in this way:
Szi_exp = Psi' * Szi * Psi;
SziSzj_exp = Psi' * Szi * Szj * Psi;
My final results are shown as follow:
The spin expectation result doesn’t look quite wrong. But the spin-spin correlation result is clearly wrong.
Moreover, when I add a large z-direction magnetic field term to the Hamiltonian, i.e. \sum_i h {S}_{i, z}, the expectation and correlation result is:
The expectation result in h=0 case looks alright, but in large h case, the central peak is surly problematic. I don’t think it’s a coding issue, since I reverse the magnetic field direction into -z, and peak reversed.
The spin-spin correlation results are clearly wrong.
I really want to figure out what is wrong with my code. If that is too much to ask, I really hope to know if there is some important aspect missing. I’d also love to get some suggestions on your thoughts in calculating expectation and correlation values with Matlab.
Thanks.