I'm currently trying out some things with qutip in the field of optimal control (state-to-state transfer) and have some trouble to reproduce my results from the optimization process with sesolve.
My code for the optimization is:
# define the main hamiltonian of our system
H_0 = Qobj(w[0:dimension]*np.identity(dimension))
# define the drive-hamiltonian
H_d = Qobj(matrix)
# define the control-list for later optimization
H_c = [H_d]
# define the initial state of our system
psi_0 = basis(dimension,0)
# define the target state of our system
psi_target = basis(dimension,1)
# define the projector onto the inital state (|psi_0><psi_0|)
proj0 = ket2dm(psi_0)
# define the projector onto the target state (|psi_target><psi_target|)
proj1 = ket2dm(psi_target)
.
.
.
result = cpo.optimize_pulse_unitary(H_0, H_c, psi_0, psi_target, n_ts, evo_time,
fid_err_targ=fid_err_targ, min_grad=min_grad,
max_iter=max_iter, max_wall_time=max_wall_time,
init_pulse_type=p_type,
log_level=log_level, gen_stats=True)
Where I get a final fidelity error of 2.0313561943652303e-10.
I wanted to verify this result by taking the optimized pulse and plugging it into the qutip.sesolve function but doing so gives me fidelity errors which are not compatible with the result from the optimization.
My code for the sesolve function is:
# define an evenly spaced list with the number of intervals being equal to the the time steps of our control pulse
tlist = np.linspace(0, evo_time, n_ts)
# define the optimized pulse
optim_pulse = result.final_amps[:, 0]
# define our "Hamiltonian"
H = [H_0, [H_d, optim_pulse]]
# define the e_ops list
e_ops = [proj0, proj1]
# define the intial state
init_state = psi_0
options = Options()
options.store_states = True
# compute the time-evolution of the given Hamiltonian (including the drive term) from an inital state to a final state
evolved_State = qutip.sesolve(
H=H,
psi0=init_state,
tlist=tlist,
e_ops=e_ops,
options=options)
Which produces a fidelity error of 0.0011998990068043947.
I wondered if I'm doing something wrong with the application of the sesolve function or if its something else which produces this difference?
Using other inital pulses I even sometimes get final populations of the target state lower then the inital state while the optimization result says it converged in the fidelity error.
Would be awesome if anyone could share some input on this idea, thank you!