it is well known that, in left(right) canonical form infinite MPS, the leading left(right) eigenvector (corresponding to eigenvalue 1) of the transfer matrix is a unit matrix \(\mathbb{1}\), and the leading right(left) eigenvector is \(\lambda^2 \mathbb{1} \).
However, when I trying to test this in my dmrg package, I found that I cannot get the consistent result, that is, the right(left) eigenvector is not \(\lambda^2 \mathbb{1} \). I have also checked this in TeNPy, returns the same result as in my package. The resulting eigenvector is a diagonal matrix with different values to \(\lambda^2\).
There is one thing may be worth to note: the sum of the elements in the eigenvector is not 1 (which means it does not satisfy the condition \(\sum_i {\lambda_i}^2 = 1\)), however the sum of the square of these elements is very close to 1.
Could anyone help me with this?
Thanks,
Qicheng
Below I post the tenpy code
Code: Select all
import numpy as np
from tenpy.algorithms import dmrg
from tenpy.models.tf_ising import TFIChain
from tenpy.networks.mps import MPS, TransferMatrix
def DMRG_tf_ising_infinite(g, chi, verbose=True):
print("infinite DMRG, transverse field Ising model")
print("g={g:.2f}".format(g=g))
model_params = dict(L=2, J=1., g=g, bc_MPS='infinite', conserve=None, verbose=verbose)
M = TFIChain(model_params)
product_state = ["up"] * M.lat.N_sites
psi = MPS.from_product_state(M.lat.mps_sites(), product_state, bc=M.lat.bc_MPS)
dmrg_params = {
'start_env': 10,
'mixer': False,
'trunc_params': {
'chi_max': chi,
'svd_min': None,
},
'max_E_err': 1.e-9,
'max_S_err': 1.e-6,
'update_env': 0,
'verbose': verbose,
}
eng = dmrg.EngineCombine(psi, M, dmrg_params)
E, psi = eng.run()
print("E = {E:.13f}".format(E=E))
print("finial bond dimensions: ", psi.chi)
return psi
psi = DMRG_tf_ising_infinite(g=1., chi=15)
T = TransferMatrix(psi, psi, charge_sector=0, form='A')
w, v = T.eigenvectors(1, which='LM')
v = v[0]
v = v.split_legs().to_ndarray()