some changes to the spin chain stuff

This commit is contained in:
Daniel Knüttel 2020-02-25 10:26:05 +01:00
parent a0afd2aeb1
commit eb8eddc959

View File

@ -7,14 +7,14 @@ from hamiltonian import H
from scipy.linalg import expm from scipy.linalg import expm
nqbits = 4 nqbits = 2
g = 0.5 g = 0.20
N = 400 N = 50
t_stop = 9 t_stop = 9
delta_t = 0.05 delta_t = 0.05
qbits = list(range(nqbits)) qbits = list(range(nqbits))
n_sample = 200 n_sample = 400
measure = 0b10 measure = 0b10
@ -28,27 +28,32 @@ for t in np.arange(0, t_stop, delta_t):
for _ in range(N): for _ in range(N):
state = T_time_slice(qbits, t, g, N) * state state = T_time_slice(qbits, t, g, N) * state
result = sample(state, measure, n_sample) #result = sample(state, measure, n_sample)
results_qc.append(result[0] / n_sample) #results_qc.append(result[0] / n_sample)
amplitude = np.sqrt(np.sum(np.abs(state._qm_state[[False if (i & measure) else True for i in range(2**nqbits)]])**2))
results_qc.append(amplitude)
# Simulation using matrices # Simulation using matrices
np_zero_state = np.zeros(2**nqbits) np_zero_state = np.zeros(2**nqbits)
np_zero_state[0] = 1 np_zero_state[0] = 1
T = expm(-1j * t * H(nqbits, g)) itH = np.matrix(-1j * t * H(nqbits, g))
#for Tv in T: T = expm(itH)
# print(np.sum(np.abs(Tv)))
# assert np.isclose(np.sum(np.abs(Tv)), 1)
np_state = T.dot(np_zero_state) np_state = T.dot(np_zero_state)
amplitude = np.sum(np.abs(np_state[[False if (i & measure) else True for i in range(2**nqbits)]])) amplitude = np.sqrt(np.sum(np.abs(np_state[[False if (i & measure) else True for i in range(2**nqbits)]])**2))
results_np.append(amplitude) results_np.append(amplitude)
print(f"simulating... {int(t/t_stop*100)} % ", end="\r") print(f"simulating... {int(t/t_stop*100)} % ", end="\r")
print() print()
print("done.") print("done.")
h0, = plt.plot(np.arange(0, t_stop, delta_t), results_qc, label=f"Quantum computing {n_sample} samples") errors_trotter = np.arange(0, t_stop, delta_t)**2 / N**2
h0 = plt.errorbar(np.arange(0, t_stop, delta_t), results_qc, yerr=errors_trotter, label=f"Quantum computing ({n_sample} samples, {N} trotterization steps)")
h1, = plt.plot(np.arange(0, t_stop, delta_t), results_np, label="Classical simulation using explicit transfer matrix") h1, = plt.plot(np.arange(0, t_stop, delta_t), results_np, label="Classical simulation using explicit transfer matrix")
plt.xlabel("t") plt.xlabel("t")
plt.ylabel(r"$|0\rangle$ probability amplitude for second spin") plt.ylabel(r"$|0\rangle$ probability amplitude for second spin")