def variance_experiment(n_shots):
“”"Run an experiment to determine the variance in an expectation
value computed with a given number of shots.
Args:
n_shots (int): The number of shots
Returns:
float: The variance in expectation value we obtain running the
circuit 100 times with n_shots shots each.
"""
# To obtain a variance, we run the circuit multiple times at each shot value.
n_trials = 100
##################
# YOUR CODE HERE #
##################
# CREATE A DEVICE WITH GIVEN NUMBER OF SHOTS
dev = qml.device("default.qubit", wires=1, shots=n_shots)
@qml.qnode(dev)
# DECORATE THE CIRCUIT BELOW TO CREATE A QNODE
def circuit():
qml.Hadamard(wires=0)
return qml.expval(qml.PauliZ(wires=0))
# RUN THE QNODE N_TRIALS TIMES AND RETURN THE VARIANCE OF THE RESULTS
vals=[]
for _ in range(0,n_trials):
vals.append(circuit())
return np.var(vals)
def variance_scaling(n_shots):
“”"Once you have determined how the variance in expectation value scales
with the number of shots, complete this function to programmatically
represent the relationship.
Args:
n_shots (int): The number of shots
Returns:
float: The variance in expectation value we expect to see when we run
an experiment with n_shots shots.
"""
##################
# YOUR CODE HERE #
##################
dev = qml.device("default.qubit", wires=1, shots=n_shots)
@qml.qnode(dev)
# ESTIMATE THE VARIANCE BASED ON SHOT NUMBER
def circuit():
qml.Hadamard(wires=0)
return qml.expval(qml.PauliZ(0))
avals=[]
for _ in range(0,n_shots):
avals.append(circuit())
return np.var(avals)
Various numbers of shots; you can change this
shot_vals = [10, 20, 40, 100, 200, 400, 1000, 2000, 4000]
Used to plot your results
results_experiment = [variance_experiment(shots) for shots in shot_vals]
results_scaling = [variance_scaling(shots) for shots in shot_vals]
plot = plotter(shot_vals, results_experiment, results_scaling)