Unbestimmtheit erkunden
Für dieses Qiskit-in-Classrooms-Modul benötigen Studierende eine funktionierende Python-Umgebung mit den folgenden installierten Paketen:
qiskitv2.1.0 oder neuerqiskit-ibm-runtimev0.40.1 oder neuerqiskit-aerv0.17.0 oder neuerqiskit.visualizationnumpypylatexenc
Zur Einrichtung und Installation der oben genannten Pakete siehe die Anleitung Qiskit installieren. Um Jobs auf echten Quantencomputern auszuführen, müssen Studierende ein Konto bei IBM Quantum® einrichten, indem sie den Schritten in der Anleitung IBM Cloud-Konto einrichten folgen.
Dieses Modul wurde getestet und verbrauchte 8 Minuten QPU-Zeit. Dies ist nur eine Schätzung. Dein tatsächlicher Verbrauch kann abweichen. Zwei zeitaufwendige Berechnungen sind als solche in den Header-Kommentaren gekennzeichnet und können auf Simulatoren ausgeführt werden, wenn den Studierenden die QPU-Zeit knapp wird. Ohne diese benötigt das Modul nur ~30 Sekunden QPU-Zeit.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
Sieh dir unten die Modulvorstellung von Dr. Katie McCormick an, oder klicke hier, um sie auf YouTube anzusehen.
Einführung
Du hast wahrscheinlich schon von der Unbestimmtheitsrelation gehört, auch außerhalb deiner Physikkurse. Eine gängige umgangssprachliche Umschreibung der Unbestimmtheit lautet: „Indem man etwas betrachtet, beeinflusst man es." Das ist sicherlich wahr. Aber eine physikalisch treffendere Beschreibung der Unbestimmtheit besagt, dass es bestimmte physikalische Observable gibt, die eine Inkompatibilität aufweisen, die verhindert, dass beide gleichzeitig mit beliebiger Genauigkeit bekannt sind. Viele Studierende begegnen erstmals dem Paar inkompatibler Variablen und , also der Position entlang einer Achse, die als -Achse bezeichnet wird, und dem linearen Impuls in diese Richtung. Für diese Variablen wird die Unbestimmtheitsrelation geschrieben als Hier wird als „Unbestimmtheit in " bezeichnet, was dieselbe Definition wie die Standardabweichung in der Statistik hat und definiert werden kann als ist auf die gleiche Weise definiert. Hier werden wir diese Unbestimmtheitsrelation nicht herleiten; wir werden darauf hinweisen, dass sie mit unserem Verständnis klassischer Wellen konsistent ist. Das heißt, eine Welle mit wirklich einer perfekten Frequenz und Wellenlänge würde ewig als perfekte Sinuswelle weiterlaufen. Quantenmechanisch würde dies einem perfekt bekannten Impuls nach der de-Broglie-Hypothese entsprechen: . Aber um zu wissen, sich ein wellenartiges Teilchen befindet, muss die Welle, die es beschreibt, im Raum schärfer lokalisiert werden, wie zum Beispiel eine sehr schmale Gauß-Funktion. Wir wissen, dass wir jede stetige Funktion, einschließlich solcher scharf lokalisierter Wellenfunktionen, als Fourier-Reihe von Sinusfunktionen mit verschiedenen Wellenlängen ausdrücken können. Aber je schärfer die Wellenfunktion lokalisiert wird (und die Position besser bekannt ist), desto mehr Terme benötigen wir in der Fourier-Reihe, was eine Mischung aus mehr Wellenlängen (und damit quantenmechanisch mehr Impulswerten) bedeutet.
Einfacher ausgedrückt: Ein Zustand mit einem wohldefinierten Impuls (eine perfekte Sinuswelle im Raum) hat eine sehr unbestimmte Position. Ein Zustand mit einer wohldefinierten Position (wie eine Dirac-Delta-Distribution) hat einen sehr unbestimmten Impuls.
Es gibt weitere Variablen, die eine solche Inkompatibilität aufweisen. Zum Beispiel kann der Spin eines Teilchens eine wohldefinierte Projektion entlang einer Achse haben, aber dann wissen wir nichts über die Projektion auf eine orthogonale Achse. Beispielsweise hat der Zustand (für ein Qubit oder Spin-1/2-Teilchen) eine bestimmte Projektion entlang der -Achse (von 1 im Kontext eines Qubits und von im Kontext eines Spin-1/2-Teilchens). Aber dieser Zustand kann als Überlagerung zweier Zustände geschrieben werden, die jeweils eine wohldefinierte Projektion auf die -Achse haben: oder äquivalent hat eine wohldefinierte Projektion auf , ebenso . Wenn wir also die Projektion eines Zustands entlang der -Achse festlegen, kennen wir die Projektion entlang der -Achse nicht. Und wenn wir die Projektion auf die -Achse festlegen, kennen wir die Projektion entlang nicht. Es gibt geringfügige Unterschiede, wenn man dies im Kontext von Spin und Qubits diskutiert. Aber allgemein gesprochen haben Eigenzustände der Pauli-Matrizen eine interessante Beziehung, die wir erkunden können. In dieser Lektion werden wir experimentell unsere Intuition für die Unbestimmtheit dieser inkompatiblen Variablen überprüfen und verifizieren, dass Unbestimmtheitsrelationen auf IBM®-Quantencomputern gelten.
Einfache Intuitionsüberprüfung
In diesem ersten Experiment und im gesamten Modul werden wir ein Framework für Quantencomputing namens „Qiskit Patterns" verwenden, das Arbeitsabläufe in die folgenden Schritte unterteilt:
- Schritt 1: Klassische Eingaben auf ein Quantenproblem abbilden
- Schritt 2: Problem für die Quantenausführung optimieren
- Schritt 3: Mit Qiskit Runtime Primitives ausführen
- Schritt 4: Nachbearbeitung und klassische Analyse
Wir werden diesen Schritten im Allgemeinen folgen, sie aber nicht immer explizit kennzeichnen.
Beginnen wir mit dem Laden einiger notwendiger Pakete, einschließlich der Runtime-Primitives. Wir werden auch den am wenigsten ausgelasteten verfügbaren Quantencomputer auswählen.
Unten findest du Code zum Speichern deiner Zugangsdaten bei der ersten Verwendung. Achte darauf, diese Informationen nach dem Speichern in deiner Umgebung aus dem Notebook zu löschen, damit deine Zugangsdaten nicht versehentlich weitergegeben werden, wenn du das Notebook teilst. Weitere Hinweise findest du unter IBM Cloud-Konto einrichten und Service in einer nicht vertrauenswürdigen Umgebung initialisieren.
from numpy import pi
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform',
# instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import (
Batch,
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
# Use the least busy backend
backend = service.least_busy(min_num_qubits=127)
print(backend.name)
ibm_sherbrooke
Falls ein Studierender die verfügbare Quantencomputing-Zeit während der Lektion aufbraucht, können die folgenden Zeilen auskommentiert und verwendet werden, um einen Simulator einzurichten, der das Rauschverhalten des oben ausgewählten Quantencomputers teilweise nachahmt.
# Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
from qiskit_aer.primitives import SamplerV2, EstimatorV2
from qiskit_aer.noise import NoiseModel
# Generate the noise model from the backend properties
noise_model = NoiseModel.from_backend(backend)
noisy_sampler = SamplerV2(options={"backend_options": {"noise_model": noise_model}})
noisy_estimator = EstimatorV2(options={"backend_options": {"noise_model": noise_model}})
Du erinnerst dich vielleicht, dass ein Eigenzustand eines Operators Z kein Eigenzustand eines anderen Operators X ist. Wir werden das jetzt experimentell beobachten, indem wir Messungen entlang der - und -Achsen durchführen. Für die Messung entlang verwenden wir einfach qc.measure(), da IBM-Quantencomputer so konstruiert sind, dass sie entlang messen. Aber um entlang zu messen, müssen wir das System rotieren, um die -Achse effektiv in die Orientierung zu bringen, entlang der wir messen. Dies wird mit einem Hadamard-Gate erreicht. Es gibt einen ähnlichen Schritt für Messungen entlang . Die notwendigen Schritte sind hier zur Übersicht zusammengefasst:
- Um entlang zu messen:
qc.measure() - Um entlang zu messen:
qc.h()dannqc.measure() - Um entlang zu messen:
qc.sdg(),qc.h(),qc.sdannqc.measure()
Schritt 1: Klassische Eingaben auf ein Quantenproblem abbilden
In diesem Fall besteht der Abbildungsschritt einfach darin, die oben beschriebenen Messungen und Rotationen in einem Quanten-Circuit auszudrücken:
# Step 1: Map
# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Add a first measurement
qc.measure(qr, cr[0])
qc.barrier()
# Change basis so that measurements made on quantum computer which normally tell us about z,
# now tell us about x.
qc.h(qr)
# Add a second measurement
qc.measure(qr, cr[1])
qc.draw("mpl")
Schritt 2: Problem für die Quantenausführung optimieren
Dieser Schritt nimmt die Operationen, die wir ausführen möchten, und drückt sie in der Funktionalität eines bestimmten Quantencomputers aus. Er bildet unser Problem auch auf das Layout des Quantencomputers ab.
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
Schritt 3: Mit Qiskit Runtime Primitives ausführen
Wir können den Sampler verwenden, um Statistiken über die Messungen zu sammeln. Wir werden das Sampler-Primitive so konstruieren, dass es auf einem echten Quantencomputer läuft, indem wir mode = backend verwenden. Es gibt andere Modi für andere Arbeitsabläufe, und wir werden unten einen verwenden. Der Sampler wird durch Aufruf seiner run()-Methode mit einer Liste von „PUBs" (Primitive Unified Blocs) verwendet. Jedes PUB enthält bis zu drei Werte, die zusammen eine Berechnungseinheit für den Estimator definieren: Circuits, Observablen, Parameter. Du kannst auch eine Liste von Circuits, eine Liste von Observablen und eine Liste von Parametern angeben. Weitere Informationen findest du in der Übersicht der PUBs.
Wir möchten auf einem echten Quantencomputer rechnen, damit wir ein echtes quantenphysikalisches Experiment durchführen. Wenn du dein Zeitkontingent auf echten Quantencomputern aufbrauchst, kannst du den Code unten für den Quantencomputer auskommentieren und den Code für die Ausführung auf einem Simulator einkommentieren.
# Step 3: Run the job on a real quantum computer
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()
counts = res[0].data.c.get_counts()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()
Schritt 4: Nachbearbeitung
Dies ist ein besonders einfacher Fall der Nachbearbeitung, bei dem wir die Zählungen einfach visualisieren.
Beachte, dass Qiskit Qubits, Messungen und andere Dinge ordnet, indem das niedrigst-nummerierte Element zuletzt/rechts aufgelistet wird, eine Konvention, die als „Little-Endian" bezeichnet wird. Das bedeutet, dass die Spalte unten mit der Bezeichnung „10" sich auf Zählungen bezieht, bei denen die erste Messung eine „0" ergab und die zweite Messung eine „1".
# Step 4: Post-process
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Wenn dir diese Konvention nicht zusagt, kannst du marginal_counts verwenden, um die Ergebnisse jeder Messung separat zu visualisieren:
from qiskit.result import marginal_counts
plot_histogram(
marginal_counts(counts, indices=[0]), title="Counts after first measurement"
)
plot_histogram(
marginal_counts(counts, indices=[1]), title="Counts after second measurement"
)
Standardmäßig werden Zustände in Qiskit im -Zustand initialisiert. Es ist daher keine Überraschung, dass fast alle ersten Messungen ergaben. Beachte jedoch, dass es bei der zweiten Messung (die Informationen über Projektionen des Zustands auf liefert) eine fast gleichmäßige Aufteilung gab. Es scheint, als würde dieser Zustand, der uns ein sehr vorhersagbares Ergebnis bei Messungen entlang liefert, eine sehr unvorhersagbare Menge an Ergebnissen für Messungen entlang ergeben. Untersuchen wir das genauer.
Was passiert, wenn wir die Messungen in umgekehrter Reihenfolge durchführen? Wir könnten damit beginnen, das Hadamard-Gate zu verwenden, um Statistiken über die Wahrscheinlichkeit zu erhalten, dass in gemessen wird. Dann werden wir für die zweite Messung mit einem zweiten Hadamard-Gate zur -Basis zurückkehren.
# Step 1:
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)
# Change basis to measure along x.
qc.h(qr)
qc.measure(qr, cr[0])
qc.barrier()
# Change our basis back to z and make a second measurement
qc.h(qr)
qc.measure(qr, cr[1])
qc.draw("mpl")
# Step 2: Transpile the circuit for running on a quantum computer
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()
counts = res[0].data.c.get_counts()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()
# Step 4: Post-process
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Hier scheinen wir noch weniger Vorhersagbarkeit zu haben! Zuvor wussten wir zumindest, was das Ergebnis der ersten Messung sein würde, jetzt haben wir eine ziemlich gleichmäßige Verteilung über alle möglichen Zustände. Es ist nicht schwer zu sehen, warum das passiert ist. Wir begannen in , was eine 50-50-Mischung aus und ist, gemäß Es sollte also klar sein, dass es eine gleiche Wahrscheinlichkeit gibt, den + oder - Zustand (auf 0 und 1 im Diagramm abgebildet) bei der ersten Messung zu erhalten. Die Messung entlang kollabiert den Zustand in entweder den Eigenzustand oder den Eigenzustand . Jeder dieser Zustände ist eine 50-50-Mischung aus und , gemäß Sobald sich das System also in einem Eigenzustand von befindet, werden Messungen entlang eindeutig sowohl als auch ergeben, und zwar mit ungefähr gleicher Wahrscheinlichkeit. Unser erstes Beispiel zeigte uns also, dass einige Zustände sehr vorhersagbare Ergebnisse für einige Messungen haben, aber unvorhersagbare Ergebnisse für andere Messungen. Das aktuelle Beispiel zeigt uns, dass es noch schlechter geht. Es gibt Zustände, die uns unvorhersagbare Ergebnisse für beide Messungen liefern können, selbst wenn wir nur die Reihenfolge der Messungen vertauschen. Untersuchen wir, wie bestimmt oder unbestimmt eine Größe für einen gegebenen Zustand ist.
Berechnung der Unbestimmtheit
Wir können dies mit der Unbestimmtheit oder Varianz quantifizieren. Die „Unbestimmtheit" wird oft als Quadratwurzel der „Varianz" einer Verteilung definiert. Das heißt, die Unbestimmtheit für eine Observable wird mit bezeichnet und ist gegeben durch
Für den Fall der Pauli-Matrizen, bei denen gilt, wird dies zu
Wenden wir dies auf ein konkretes Beispiel an. Beginnen wir mit dem Zustand und bestimmen wir die Unbestimmtheit der Observablen in diesem Zustand.
Überprüfe dein Verständnis
Berechne die Unbestimmtheit von im Zustand von Hand.
Answer
Im gegebenen Zustand ergibt dies:
Wir können einen beliebigen Anfangszustand mit qc.initialize() erstellen. Beachte, dass die Syntax für die imaginäre Einheit hier ist.
# Step 1: Map the problem into a quantum circuit
from qiskit.quantum_info import SparsePauliOp
import numpy as np
obs = SparsePauliOp("X")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the state
qc.initialize([1, 1j] / np.sqrt(2))
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
-0.02408454165642664
Gemäß unserer obigen Gleichung gilt: Bleiben wir bei demselben Zustand, finden aber jetzt den Erwartungswert von :
# Step 1: Map the problem into a quantum circuit
obs = SparsePauliOp("Z")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the state to |+>_y
qc.initialize([1, 1j] / np.sqrt(2))
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run(pubs)
res = job.result()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
0.04958271968581247
Wir könnten die gleiche Rechnung wie zuvor durchführen, würden aber sehen, dass die Varianz wieder sehr nahe bei 1,0 liegt. Wir könnten schlussfolgern, dass . Das ist in der Tat für den gewählten Zustand ungefähr korrekt. Aber können wir es besser machen? Oder schlechter?
Erinnere dich, dass es eine Unbestimmtheitsrelation zwischen der Position in einer Richtung, und dem Impuls in derselben Richtung, gibt. Für diese Variablen ist die bekannteste Form wahrscheinlich Wenn wir uns nur daran erinnern, könnten wir versucht sein zu denken, dass und ebenfalls eine solche fundamentale Untergrenze der Unbestimmtheit haben könnten. Vielleicht ist es unmöglich, dass das Produkt null erreicht? Probieren wir einen anderen Zustand und sehen, ob das gilt. Diesmal verwenden wir Schauen wir, was passiert. Beachte, dass der Estimator im folgenden Code zwei Sätze von Circuits und Observablen in derselben Job-Einreichung akzeptieren kann.
# Step 1: Map the problem into a quantum circuit
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Z")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Initialize the state
qc.initialize([1, 1] / np.sqrt(2))
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
with Batch(backend=backend) as batch:
estimator = Estimator(mode=batch)
pubs = [(qc_isa, obs1_isa), (qc_isa, obs2_isa)]
job = estimator.run(pubs)
res = job.result()
batch.close()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc,obs1],[qc,obs2]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print("The expectation value of the first observable is: ", res[0].data.evs)
print("The expectation value of the second observable is: ", res[1].data.evs)
The expectation value of the first observable is: 1.0011036174126302
The expectation value of the second observable is: 0.0029429797670141016
Der Erwartungswert von sollte nahe bei 1,0 liegen, aber 1,0 nicht überschreiten. Mache dir keine Sorgen, wenn er 1,0 um einen sehr kleinen Betrag überschreitet. Dies kann auf Faktoren wie Rauschen und/oder Auslesefehler zurückgeführt werden. Obwohl dies ein sehr wichtiges Thema ist, können wir es vorerst ignorieren.
Wir erhielten einen Erwartungswert von , der sehr nahe bei 1,0 liegt (was einer sehr niedrigen Varianz für entspricht). Dies macht das Produkt der beiden Varianzen recht klein:
Obwohl dies nicht genau null ist, wird dieser Wert im Vergleich zu den Eigenwerten der Pauli-Operatoren () klein. Nun, du erinnerst dich vielleicht, dass die Unbestimmtheitsrelation zwischen linearer Position und Impuls anders geschrieben werden konnte, nämlich explizit unter Verwendung der Kommutatorrelation zwischen den Operatoren und :
wobei
der Kommutator von und ist.
Dies ist die Form, die am einfachsten auf die Pauli-Operatoren erweitert werden kann. Allgemein gilt für zwei Operatoren und :
Und im Fall der Pauli-Matrizen und benötigen wir , um Folgendes zu berechnen:
Wir zeigen dies hier und überlassen ähnliche Berechnungen als Übung:
Das ist eine vollkommen akzeptable Antwort, aber mit einem weiteren Schritt sehen wir
Unsere Unbestimmtheitsrelation wird somit zu
Überprüfe dein Verständnis
Bestimme und . Verwende dies, um die Unbestimmtheitsrelationen zwischen & sowie & aufzuschreiben.
Answer
In Kombination mit der allgemeinen Unbestimmtheitsrelation erhalten wir
Konsistenz überprüfen
Bevor wir fortfahren, prüfen wir, ob dies mit unserem vorherigen Ergebnis konsistent war. Wir verwendeten den Zustand Und wir fanden, dass Jetzt wissen wir, dass dieses Produkt größer oder gleich sein sollte als
Also gilt in der Tat: Verwende die folgenden Fragen, um etwas Intuition für diese Ergebnisse aufzubauen:
Überprüfe dein Verständnis
Beantworte die folgenden Punkte zusammen als Gruppe:
(a) Welche Zustände würdest du erwarten, die eine Unbestimmtheit von null in haben?
(b) Welche Zustände würdest du erwarten, die eine Unbestimmtheit von null in haben?
(c) In welchen Zuständen würdest du einen Erwartungswert von null erhalten?
(d) Sind die Antworten auf die obigen Fragen konsistent mit dem Fall ?
(e) Schreibe Code, um dies explizit mit dem Estimator zu überprüfen.
Answer
(a) Wir würden erwarten, dass Eigenzustände des -Operators null Unbestimmtheit in ergeben. Tatsächlich ergibt sich mit :
(b) Wir würden erwarten, dass Eigenzustände des -Operators null Unbestimmtheit in ergeben. Tatsächlich ergibt sich mit :
(c) Wir erwarten für alle Zustände, die bei der Messung genauso oft eine positive wie eine negative Projektion auf die -Achse ergeben. Dazu gehören die Eigenzustände von und .
(d) Ja. Man würde einen sehr kleinen Wert für das Produkt der Unbestimmtheiten für Eigenzustände von oder erwarten: Dies kann gelten, weil wir für dieselben Zustände auch erwarten. Die Unbestimmtheitsrelation könnte also erfüllt sein.
(e) Code wie der folgende würde dies verifizieren:
obs1 = SparsePauliOp.from_list(
[("X", 1.000)]
)
obs2 = SparsePauliOp.from_list(
[("Y", 1.000)]
)
obs3 = SparsePauliOp.from_list(
[("Z", 1.000)]
)
qc = QuantumCircuit(1,1)
qc.ry(pi/2,0)
job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)
res=job.result()
Dabei gibt das Ergebnis alle Erwartungswerte zurück. Um alle Erwartungswerte abzurufen und Unbestimmtheiten zu berechnen, könnten wir verwenden:
xs=res[0].data.evs[0]
ys=abs(res[0].data.evs[1])
zs=res[0].data.evs[2]
import math
prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5
Beantworte die folgenden Punkte zusammen als Gruppe:
(a) Kannst du dir einen Zustand vorstellen, in dem du einen großen Erwartungswert hättest?
(b) Würdest du erwarten, dass derselbe Zustand eine große oder kleine Unbestimmtheit in hat?
(c) Würdest du erwarten, dass derselbe Zustand eine große oder kleine Unbestimmtheit in hat?
(d) Sind die Antworten auf die obigen Fragen konsistent mit dem Fall ?
(e) Schreibe Code, um dies explizit mit dem Estimator zu überprüfen.
Answer
(a) Wir erwarten für den Eigenzustand von : .
(b) Wir könnten erwarten, dass eine große Unbestimmtheit im Zustand hat, da die Messung von in diesem Zustand ein positives und negatives Ergebnis mit gleicher Häufigkeit/Wahrscheinlichkeit ergeben würde.
(c) Wir könnten erwarten, dass eine große Unbestimmtheit im Zustand hat, da die Messung von in diesem Zustand ein positives und negatives Ergebnis mit gleicher Häufigkeit/Wahrscheinlichkeit ergeben würde.
(d) Ja. Man würde einen großen Wert für das Produkt der Unbestimmtheiten für Eigenzustände von erwarten, und für im Besonderen. Wir würden für denselben Zustand auch erwarten. Sowohl als auch sind in diesem Zustand recht groß, und es ist plausibel, dass die Unbestimmtheitsrelation erneut erfüllt sein könnte.
(e) Code wie der folgende würde dies verifizieren:
obs1 = SparsePauliOp.from_list(
[("X", 1.000)]
)
obs2 = SparsePauliOp.from_list(
[("Y", 1.000)]
)
obs3 = SparsePauliOp.from_list(
[("Z", 1.000)]
)
qc = QuantumCircuit(1,1)
qc.rx(-pi/2,0)
job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)
res=job.result()
Dabei gibt das Ergebnis alle Erwartungswerte zurück. Um alle Erwartungswerte abzurufen und Unbestimmtheiten zu berechnen, könnten wir verwenden:
xs=res[0].data.evs[0]
ys=abs(res[0].data.evs[1])
zs=res[0].data.evs[2]
import math
prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5
Testen von Unbestimmtheitsrelationen
Der obige Test hat die Gültigkeit der Unbestimmtheitsrelation nur für eine einzige Wahl des Zustandsvektors demonstriert. Um uns davon zu überzeugen, dass dies generell mit dem Experiment übereinstimmt, sollten wir ähnliche Berechnungen mit dem Estimator für viele verschiedene Zustandsvektoren durchführen. Beginnen wir damit, unseren Zustandsvektor von der -Achse weg zu rotieren, indem wir ein RY-Gate verwenden, um verschiedene Anfangszustände mit einem Parameter zu erzeugen.
# The calculation below uses approximately 3-4 minutes of QPU time.
# Step 1: Map the problem into a quantum circuit
from qiskit.circuit import Parameter
import numpy as np
# Specify observables
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Y")
obs3 = SparsePauliOp("Z")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Rotate away from |0>
theta = Parameter("θ")
qc.ry(theta, 0)
params = np.linspace(0, 2, num=21)
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
obs3_isa = obs3.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
with Batch(backend=backend) as batch:
estimator = Estimator(mode=batch)
pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]
job = estimator.run(pubs, precision=0.01)
res = job.result()
batch.close()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])
# res=job.result()
# Step 4: Post-processing and classical analysis.
xs = res[0].data.evs[0]
ys = abs(res[0].data.evs[1])
zs = res[0].data.evs[2]
# Calculate uncertainties
delx = []
delz = []
prodxz = []
for i in range(len(xs)):
delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)
delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)
prodxz.append(delx[i] * delz[i])
# Here we can plot the results from this simulation.
import matplotlib.pyplot as plt
plt.plot(params, delx, label=r"$\Delta$ X")
plt.plot(params, ys, label=r"$\langle$ Y $\rangle$")
plt.plot(params, delz, label=r"$\Delta$ Z")
plt.plot(params, prodxz, label=r"$\Delta$X $\Delta$Z")
plt.xlabel(r"$\theta$")
plt.ylabel("Expectation/Uncertainty Values")
plt.legend()
plt.show()
Beachte, dass die rote Kurve immer größer ist als die orange Kurve Manchmal sinkt das Unbestimmtheitsprodukt und kommt der Grenze relativ nahe, und andere Male steigt es und ist weiter von der Grenze entfernt, aber es gehorcht immer der Unbestimmtheitsrelation.
Natürlich ist dies möglicherweise nicht der beste Test der Unbestimmtheitsrelation, da unsere Grenze immer sehr nahe bei null liegt. Verwenden wir einen Quantenzustand, der eine größere Projektion auf Eigenzustände von hat. Konkret werden wir weiterhin von der -Achse herunter um verschiedene Winkel rotieren, aber jetzt werden wir den resultierenden Zustand auch um die -Achse um einen Winkel drehen, vielleicht , und sehen, was passiert.
# The calculation below uses approximately 3-4 minutes of QPU time.
from qiskit.circuit import Parameter
import numpy as np
# Step 1: Map the problem to a quantum circuit
# Specify observables
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Y")
obs3 = SparsePauliOp("Z")
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)
# Rotate away from |0> along one plane, and then along a transverse direction.
theta = Parameter("θ")
qc.ry(theta, 0)
qc.rz(pi / 4, 0)
params = np.linspace(0, 2, num=21)
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
obs3_isa = obs3.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
with Batch(backend=backend) as batch:
estimator = Estimator(mode=batch)
pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]
job = estimator.run(pubs, precision=0.01)
res = job.result()
batch.close()
# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])
# res=job.result()
# Step 4: Post-processing and classical analysis.
xs = res[0].data.evs[0]
ys = abs(res[0].data.evs[1])
zs = res[0].data.evs[2]
# Calculate uncertainties
delx = []
delz = []
prodxz = []
for i in range(len(xs)):
delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)
delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)
prodxz.append(delx[i] * delz[i])
# Here we can plot the results from this simulation.
import matplotlib.pyplot as plt
plt.plot(params, delx, label=r"$\Delta$ X")
plt.plot(params, ys, label=r"$\langle$ Y $\rangle$")
plt.plot(params, delz, label=r"$\Delta$ Z")
plt.plot(params, prodxz, label=r"$\Delta$X $\Delta$Z")
plt.xlabel(r"$\theta$")
plt.ylabel("Expectation/Uncertainty Values")
plt.legend()
plt.show()
Jetzt sehen wir, dass die Grenze der Unbestimmtheit auf die Probe gestellt wird! Die rote Kurve kommt der orangen Kurve viel näher als zuvor. Tatsächlich würde die Unbestimmtheitsrelation ohne Rauschen an einem Punkt exakt gesättigt sein (). In Gegenwart von Rauschen und Auslesefehlern sollte es nicht überraschen, wenn ein Durchlauf gelegentlich sehr geringfügig größer als ergibt. Dies ist keine echte Verletzung der Unbestimmtheit; es ist lediglich ein Artefakt des Fehlers ungleich null.
Überprüfe dein Verständnis
Erkläre, wie du dies an die absolute Grenze treiben würdest, sodass so groß wie möglich wird.
Answer
Der Code enthält derzeit Zeilen, die den Standard-Anfangszustand von der -Achse herunter um einen parametrisierten Winkel rotieren und dann auch um die -Achse um einen Winkel , was den Zustandsvektor teilweise in Richtung der -Achse dreht.
qc.ry(theta,0)
qc.rz(pi/4,0)
Wir könnten die Rotation um von auf ändern und damit ganz in einen Eigenzustand von rotieren:
qc.ry(theta,0)
qc.rz(pi/2,0)
Keine weiteren Änderungen wären erforderlich.
Ändere den Code oder kopiere ihn und implementiere diese Überprüfung der Unbestimmtheitsrelation mit dem maximierten Erwartungswert von Y. Gilt die Unbestimmtheitsrelation?
Answer
Wir würden genau den Code aus dem obigen Beispiel verwenden, mit
qc.rz(pi/2,0)
anstelle von
qc.rz(pi/4,0).
Die resultierende Abbildung sollte wie die unten stehende aussehen, und ja, die Unbestimmtheitsrelation sollte weiterhin gelten.

Passe den obigen Code an, um ein ähnliches Bild zu erstellen, das zeigt, dass das Produkt aus Messungen auf dem Quantencomputer sich wie erwartet verhält. Wähle beliebige Zustände.
Answer
Wir würden genau den Code aus dem obigen Beispiel verwenden und könnten tatsächlich dieselben Ergebnisse wie oben nutzen, nur mit den Erwartungswerten zur Berechnung anderer Unbestimmtheiten. Zum Beispiel könnten wir verwenden:
xs=res[0].data.evs[0]
ys=res[0].data.evs[1]
zs=abs(res[0].data.evs[2])
import math
delx = []
dely = []
prodxy=[]
for i in range(len(xs)):
delx.append((1-xs[i]*xs[i])**0.5)
dely.append((1-ys[i]*ys[i])**0.5)
prodxy.append(((1-xs[i]*xs[i])**0.5)*(1-ys[i]*ys[i])**0.5)
und plotten:
import matplotlib.pyplot as plt
plt.plot(params, delx, label=r'$\Delta$ X')
plt.plot(params, dely, label=r'$\langle$ Y $\rangle$')
plt.plot(params, zs, label=r'$\Delta$ Z')
plt.plot(params, prodxy, label=r'$\Delta$X $\Delta$Z')
plt.xlabel(r'$\theta$')
plt.ylabel('Expectation/Uncertainty Values')
plt.legend()
plt.show()
Herausforderung: Schreibe Code, der viele Werte von durchläuft, so wie wir viele Werte von durchlaufen haben, und erstelle einen 3-D-Plot, der zeigt, dass die Unbestimmtheitsrelation niemals verletzt wird. Wähle beliebige Observable.
Fragen
Lehrende können Versionen dieser Notebooks mit Lösungsschlüsseln und Hinweisen zur Einordnung in gängige Lehrpläne anfordern, indem sie diese kurze Umfrage zur Nutzung der Notebooks ausfüllen.
Zentrale Konzepte:
- Es gibt Unbestimmtheitsrelationen zwischen vielen Paaren physikalischer Observabler, einschließlich Position & linearem Impuls und Spinkomponenten.
- Die Pauli-Matrizen kommutieren nicht. Dies ist eine mathematische Widerspiegelung der Tatsache, dass nicht alle Spinkomponenten gleichzeitig bekannt/bestimmt sein können.
- Quantencomputing nutzt die Pauli-Operatoren/Matrizen intensiv, daher ist es nützlich, die Unbestimmtheitsrelation für Pauli-Operatoren sowie die eng verwandten Spin-Operatoren zu kennen.
- Eine allgemeine Formel für die Unbestimmtheit zweier Operatoren und lautet
- Ein Eigenzustand eines Operators ergibt null Unbestimmtheit in der physikalischen Observablen, die mit diesem Operator verbunden ist. Auch experimentell gilt
- Ein Eigenzustand eines Operators ergibt eine größere Unbestimmtheit für einen Operator , der nicht mit kommutiert.
- Experimentelle Ergebnisse mit einem echten Quantencomputer bestätigen die Intuition, die wir aus Matrixdarstellungen physikalischer Operatoren gewinnen.
Wahr/Falsch-Fragen:
- W/F Man kann und gleichzeitig messen, aber nicht .
- W/F Man kann und gleichzeitig messen, aber nicht .
- W/F Lineare Position und linearer Impuls-Operator kommutieren nicht.
- W/F IBM-Quantencomputer messen standardmäßig entlang , daher muss eine Rotation durchgeführt werden, um entlang einer anderen Richtung zu messen.
- W/F Der Circuit unten misst effektiv und dann .
Multiple-Choice-Fragen:
-
Das folgende Diagramm demonstriert welche der folgenden Unbestimmtheitsrelationen?
- a.
- b.
- c.
- d. Keine der oben genannten

-
Welche der folgenden Sequenzen ist die Standardabfolge, um eine Messung entlang durchzuführen?
- a. Nur
qc.measure() - b.
qc.h()dannqc.measure() - c.
qc.h(),qc.h()dannqc.measure() - d.
qc.h(),qc.s,qc.h()dannqc.measure() - e.
qc.sdg(),qc.h(),qc.sdannqc.measure() - f.
qc.sdg(),qc.h(),qc.s,qc.h()dannqc.measure()
- a. Nur
-
Welcher der folgenden Zustände ergibt den größten Erwartungswert ?
- a.
- b.
- c. auch genannt
- d. auch genannt
- e. auch genannt
- f. auch genannt
-
Welcher der folgenden Zustände ergibt die größte Unbestimmtheit ?
- a.
- b. auch genannt
- c. auch genannt
- d. a und b sind gleichauf
- e. b und c sind gleichauf
- f. a, b und c sind gleichauf
Diskussionsfragen:
-
Steht dieses Konzept der Unbestimmtheit in irgendeiner Weise im Widerspruch zur Vorstellung von Spin als Vektorpfeil im kartesischen Raum? Wie sieht es auf der Bloch-Kugel aus?
-
Angenommen, du richtest ein Messgerät in einer Richtung aus, die genau zwischen der - und der -Achse liegt. Was passiert? Kannst du eine Messung in dieser Richtung durchführen? Wie hängt das mit der Unbestimmtheit in und zusammen?
-
Welche zusätzlichen Experimente würdest du gerne durchführen, um dich von den hier gewonnenen Ergebnissen zu überzeugen?