Excited states of effective Hamiltonian
Posted: 31 Mar 2020, 11:14
I have an already converged infinite system (iMPS). Now I want to obtain the first 5 excited energies (states do not really matter) of the effective Hamiltonian of the converged system.
What I did so far is:
This works and gives me k energies. However it is very slow for large bond dimensions. The class LanczosGroundState supports orthogonal_to which should enable me to successively calculate the excited states. I have tried this code:
The ground state energy coincides with the one of the previous method but the excited energies are off. Furthermore the energies by this method are not sorted even though they should be sorted if the ground state is correctly found in each step.
Edit: Apparently my initial state is very close to the ground state and thus an extremely bad guess for the excited states. I should probably use a random initial states for the higher eigenstates.
Thank you for your help!
What I did so far is:
Code: Select all
def lanczos_arpack_spectrum(H, psi, k, lanczos_params={}):
"""
<Removed docs to increase readability>
"""
H_flat, psi_flat = FlatHermitianOperator.from_guess_with_pipe(H.matvec, psi, dtype=H.dtype)
tol = get_parameter(lanczos_params, 'P_tol', 1.e-14, "Lanczos")
N_min = get_parameter(lanczos_params, 'N_min', None, "Lanczos")
Es = speigsh(H_flat, k=k, which='SA', v0=psi_flat, tol=tol, ncv=N_min, return_eigenvectors=False)
return Es
Code: Select all
psi = engine.prepare_update() # engine is of type TwoSiteEngine
ortho = []
E0 = []
for i in range(k):
(E, psi1, _) = lanczos(engine.eff_H, psi, dmrg_params['lanczos_params'], orthogonal_to = [x.copy() for x in ortho])
E0.append(E)
ortho.append(psi1.copy())
Edit: Apparently my initial state is very close to the ground state and thus an extremely bad guess for the excited states. I should probably use a random initial states for the higher eigenstates.
Thank you for your help!