import pennylane as qml
def k_dependent_hamiltonian(k_vector, params):
kx, ky, kz = k_vector
gamma1 = params[0]
gamma2 = params[1]
gamma3 = params[2]
P = params[3]
H0 = gamma1 * qml.PauliZ(0) + gamma2 * (qml.PauliZ(1) + qml.PauliZ(2))
Hk = (
kx**2 * (gamma1 - 2 * gamma2 / 3) * qml.PauliZ(0)
+ ky**2 * (gamma1 + gamma2 / 3) * qml.PauliZ(1)
+ kz**2 * (gamma1 + gamma2 / 3) * qml.PauliZ(2)
)
Hso = -P / (2 * m0) * (
kx * qml.PauliX(0) + ky * qml.PauliY(1) + kz * qml.PauliY(2)
)
return qml.Hamiltonian(H0 + Hk + Hso)
import pennylane as qml
import numpy as np
import matplotlib.pyplot as plt
k_path = np.array([[0, 0, 0], [0.5, 0, 0], [0.5, 0.5, 0], [0, 0.5, 0]])
lk_params = [6.98, 2.06, 2.93]
kane_params = [10.5]
def k_dependent_hamiltonian(k_vector,params):
kx, ky, kz = k_vector
gamma1 = params[0]
gamma2 = params[1]
gamma3 = params[2]
P = params[3]
H0 = gamma1 * qml.PauliZ(0) + gamma2 * (qml.PauliZ(1) + qml.PauliZ(2))
Hk = (
kx**2 * (gamma1 - 2 * gamma2 / 3) * qml.PauliZ(0)
+ ky**2 * (gamma1 + gamma2 / 3) * qml.PauliZ(1)
+ kz**2 * (gamma1 + gamma2 / 3) * qml.PauliZ(2)
)
Hso = -P / (2 * m0) * (
kx * qml.PauliX(0) + ky * qml.PauliY(1) + kz * qml.PauliY(2)
)
return qml.Hamiltonian(H0 + Hk + Hso)
def ansatz(params, wires):
qml.RY(params[0], wires=0)
qml.RX(params[1], wires=0)
@qml.qnode(device)
def cost_function(params, k_vector):
energy = qml.expval(k_dependent_hamiltonian(k_vector), params)
return energy**2
def ssvqe(k_path, hamiltonian, ansatz, num_qubits, opt_name='Adam', stepsize=0.1, iterations=100):
device = qml.device('default.qubit', wires=num_qubits)
energies = []
for k_vector in k_path:
opt = qml.qml.optimize(opt_name, stepsize=stepsize)
params = np.random.uniform(0, np.pi, size=2)
for _ in range(iterations):
params, _ = opt.step(lambda p: cost_function(p, k_vector), params)
energy = qml.expval(hamiltonian(k_vector), params)
energies.append(energy)
return energies
num_qubits = 2
band_energies = ssvqe(k_path, k_dependent_hamiltonian, ansatz, num_qubits)
plt.plot(k_path[:, 0], band_energies, label='SSVQE (Sample)')
plt.xlabel('k_x')
plt.ylabel('Energy (eV)')
plt.title('Sample GaAs Band Structure')
plt.legend()
plt.show()
I hope this code will make my question clear. I got this code from google.