## Excited states of effective Hamiltonian

How do I use this algorithm? What does that parameter do?
aeberharter
Posts: 2
Joined: 04 Nov 2019, 13:36

### Excited states of effective Hamiltonian

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:

Code: Select all

def lanczos_arpack_spectrum(H, psi, k, lanczos_params={}):
"""
"""
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

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:

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())

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.