Unsicherheit erforschen
Für dieses Modul "Qiskit im Klassenzimmer" müssen die Schüler eine funktionierende Python Umgebung mit den folgenden Paketen installiert haben:
qiskitv2.1.0 oder neuerqiskit-ibm-runtimev0.40.1 oder neuerqiskit-aerv0.17.0 oder neuerqiskit.visualizationnumpypylatexenc
Um die oben genannten Pakete einzurichten und zu installieren, lesen Sie die Anleitung Qiskit installieren. Um Aufträge auf echten Quantencomputern ausführen zu können, müssen die Schüler ein Konto bei IBM Quantum® einrichten, indem sie die Schritte in der Anleitung zur Einrichtung Ihres IBM Cloud Kontos befolgen.
Dieses Modul wurde getestet und verbrauchte 8 Minuten QPU-Zeit. Dies ist nur eine Schätzung. Ihre tatsächliche Nutzung kann davon abweichen. Zwei zeitaufwändige Berechnungen sind in den Kopfzeilen als solche gekennzeichnet und können an Simulatoren durchgeführt werden, wenn die Schüler nur wenig Zeit für QPU haben. Wenn diese entfernt werden, benötigt das Modul nur etwa 30 Sekunden QPU-Zeit.
# 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'Schauen Sie sich den Modul-Walkthrough von Dr. Katie McCormick unten an, oder klicken Sie hier, um ihn auf YouTube zu sehen.
Einführung
Wahrscheinlich haben Sie schon einmal von der Unschärferelation gehört, auch außerhalb Ihres Physikunterrichts. Eine gängige umgangssprachliche Umschreibung für Unsicherheit lautet: "Indem man etwas betrachtet, beeinflusst man es" Das ist sicherlich richtig. Eine physikalischere Art, die Unsicherheit zu beschreiben, besteht darin, dass es bestimmte physikalische Beobachtungsgrößen gibt, die eine Inkompatibilität aufweisen, die verhindert, dass sie beide gleichzeitig mit beliebiger Genauigkeit bekannt sind. Viele Schüler stoßen zunächst auf die beiden unvereinbaren Variablen und , d. h. die Position entlang einer Achse, der -Achse, bzw. den linearen Impuls entlang dieser Richtung. Für diese Variablen wird die Unsicherheitsbeschränkung wie folgt geschrieben Hier wird als die "Unsicherheit in " bezeichnet, die dieselbe Definition wie die Standardabweichung in der Statistik hat und wie folgt definiert werden kann ist auf die gleiche Weise definiert. Wir werden diese Unschärferelation hier nicht herleiten, sondern nur darauf hinweisen, dass sie mit unserem Verständnis der klassischen Wellen übereinstimmt. Das heißt, eine Welle mit einer wirklich perfekten Frequenz und Wellenlänge würde als perfekte Sinuskurve ewig weiterlaufen. Quantenmechanisch würde dies einer perfekten Kenntnis des Impulses gemäß der de Broglie-Hypothese entsprechen: . Um jedoch zu wissen, wo sich ein wellenförmiges Teilchen befindet ( ), muss die Welle, die es beschreibt, eine schärfere Spitze im Raum bilden, z. B. eine sehr schmale Gaußsche Kurve. Wir wissen, dass wir jede kontinuierliche Funktion, einschließlich solcher spitzen Wellenfunktionen, als eine Fourier-Reihe von Sinusfunktionen mit unterschiedlichen Wellenlängen ausdrücken können. Da die Wellenfunktion aber immer stärker spitz zuläuft (und die Position besser bekannt ist), benötigen wir mehr Terme in der Fourier-Reihe, was eine Mischung aus mehr Wellenlängen (und damit quantenmechanisch gesehen mehr Impulswerten) bedeutet.
Einfacher ausgedrückt: Ein Zustand mit einem wohldefinierten Impuls (eine perfekte Sinuskurve im Raum) hat eine sehr unsichere Position. Ein Zustand mit einer genau definierten Position (wie eine Dirac-Delta-Verteilung) hat einen sehr unsicheren Impuls.
Es gibt andere Variablen, die eine solche Unvereinbarkeit aufweisen. Der Spin eines Teilchens kann zum Beispiel eine wohldefinierte Projektion entlang einer Achse haben, aber wir wissen nichts über die Projektion auf eine orthogonale Achse. Zum Beispiel hat der Zustand (für ein Qubit oder spin-1/2 Teilchen) eine eindeutige Projektion entlang der Achse (von 1 im Zusammenhang mit einem Qubit und von im Zusammenhang mit einem spin-1/2 Teilchen). Dieser Zustand kann jedoch als Überlagerung von zwei Zuständen beschrieben werden, von denen jeder eine wohldefinierte Projektion auf die Achse hat: oder äquivalent hat eine wohldefinierte Projektion auf , ebenso wie . Wenn wir also die Projektion eines Zustands entlang der Achse angeben, kennen wir die Projektion entlang der Achse nicht. Und wenn wir die Projektion auf die Achse angeben, kennen wir die Projektion entlang nicht. Es gibt geringfügige Unterschiede, wenn man dies im Zusammenhang mit dem Spin und den Qubits diskutiert. Aber im Allgemeinen haben die Eigenzustände der Pauli-Matrizen eine interessante Beziehung, die wir untersuchen können. In dieser Lektion werden wir unsere Intuition für die Unschärfe in diesen inkompatiblen Variablen experimentell überprüfen und nachweisen, dass die Unschärferelationen auf IBM® Quantencomputern gelten.
Einfache Überprüfung der Intuition
In diesem ersten Experiment und während des gesamten Moduls werden wir einen Rahmen für Quantencomputer verwenden, der als "Qiskit-Muster" bekannt ist und Arbeitsabläufe in die folgenden Schritte unterteilt:
- Schritt 1: Abbildung klassischer Eingaben auf ein Quantenproblem
- Schritt 2: Optimieren des Problems für die Quantenausführung
- Schritt 3: Ausführung mithilfe von „ IBM Quantum “-Primitiven
- Schritt 4: Nachbearbeitung und klassische Analyse
Im Allgemeinen werden wir diese Schritte befolgen, auch wenn wir sie nicht immer explizit kennzeichnen.
Beginnen wir mit dem Laden einiger notwendiger Pakete, einschließlich der Laufzeitprimitive. Wir werden auch den am wenigsten ausgelasteten Quantencomputer auswählen, der uns zur Verfügung steht.
Unten finden Sie einen Code, mit dem Sie Ihre Anmeldedaten bei der ersten Verwendung speichern können. Achten Sie darauf, diese Informationen aus dem Notebook zu löschen, nachdem Sie es in Ihrer Umgebung gespeichert haben, damit Ihre Anmeldedaten nicht versehentlich weitergegeben werden, wenn Sie das Notebook freigeben. Weitere Anleitungen finden Sie unter Einrichten Ihres IBM Cloud Kontos und Initialisieren des Dienstes in einer nicht vertrauenswürdigen Umgebung.
from numpy import pi
# Load IBM Quantum Compute 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)Output:
ibm_sherbrooke
Wenn ein Schüler seine verfügbare Zeit für Quantencomputer während des Unterrichts ausschöpft, können die folgenden Zeilen unkommentiert bleiben und dazu verwendet werden, 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}})Sie erinnern sich vielleicht, dass ein Eigenzustand eines Operators Z kein Eigenzustand eines anderen Operators X ist. Wir werden dies nun experimentell beobachten, indem wir Messungen entlang der Achsen und durchführen. Für die Messung entlang verwenden wir einfach qc.measure (), denn IBM Quantencomputer sind so aufgebaut, dass sie entlang messen. Aber um entlang zu messen, müssen wir das System drehen, um die Achse effektiv in die Richtung zu bewegen, entlang der wir messen. Dies wird mit einem Hadamard-Tor erreicht. Ein ähnlicher Schritt ist für Messungen entlang erforderlich. Der Einfachheit halber werden die erforderlichen Schritte hier zusammengefasst:
- Zum Messen entlang :
qc.measure() - Zum Messen entlang :
qc.h()dannqc.measure() - Messung entlang :
qc.sdg(),qc.h(),qc.sdannqc.measure()
Schritt 1: Klassische Eingaben einem Quantenproblem zuordnen
In diesem Fall besteht der Abbildungsschritt einfach darin, die oben beschriebenen Messungen und Drehungen in einer Quantenschaltung 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")Output:
Schritt 2: Optimierung des Problems für die Quantenausführung
In diesem Schritt werden die Operationen, die wir durchführen wollen, in Bezug auf die Funktionalität eines bestimmten Quantencomputers ausgedrückt. Außerdem wird unser Problem auf den Aufbau des Quantencomputers übertragen.
# 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: Ausführung mithilfe von „ IBM Quantum “-Primitiven
Wir können den Sampler nutzen, um statistische Daten zu den Messungen zu erfassen. Wir werden die Sampler-Primitive so erstellen, dass sie auf einem echten Quantencomputer läuft, und zwar mithilfe von mode = backend. Es gibt weitere Modi für andere Arbeitsabläufe, und wir werden im Folgenden einen davon verwenden. Der Sampler wird verwendet, indem seine Methode run() mit einer Liste von „pubs“ (Primitive Unified Blocs) aufgerufen wird. Jede Zeile enthält bis zu drei Werte, die zusammen eine Berechnungseinheit bilden, die der Schätzer ausführen muss: Schaltkreise, Observablen und Parameter. Sie können außerdem eine Liste der Schaltungen, eine Liste der Messgrößen und eine Liste der Parameter angeben. Weitere Informationen finden Sie in der Übersicht über PUBs.
Wir wollen auf einem echten Quantencomputer laufen, so dass wir ein echtes quantenphysikalisches Experiment durchführen. Wenn Sie die Ihnen zugewiesene Zeit auf echten Quantencomputern ausschöpfen, können Sie den nachstehenden Code für den Quantencomputer auskommentieren und den Code für die Ausführung auf einem Simulator auskommentieren.
# 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 von Post-Processing, bei dem wir einfach die Zählungen visualisieren.
Beachten Sie, dass Qiskit Qubits, Messungen und andere Dinge so anordnet, dass das Element mit der niedrigsten Nummer zuletzt / rechts steht, eine Konvention, die als "Little-Endian" bezeichnet wird. Das bedeutet, dass sich die Spalte mit der Bezeichnung "10" auf Zählungen bezieht, bei denen die erste Messung eine "0" und die zweite Messung eine "1" ergab.
# Step 4: Post-process
from qiskit.visualization import plot_histogram
plot_histogram(counts)Output:
Wenn Ihnen diese Konvention nicht zusagt, können Sie marginal_counts verwenden, um die Ergebnisse der einzelnen Messungen getrennt darzustellen:
from qiskit.result import marginal_counts
plot_histogram(
marginal_counts(counts, indices=[0]), title="Counts after first measurement"
)Output:
plot_histogram(
marginal_counts(counts, indices=[1]), title="Counts after second measurement"
)Output:
Standardmäßig werden die Zustände in Qiskit mit dem Zustand initialisiert. Es ist daher nicht überraschend, dass fast alle der ersten Messungen ergaben. Es ist jedoch zu beachten, dass die zweite Messung (diejenige, die Informationen über die Projektion des Zustands auf liefert) eine fast gleichmäßige Verteilung ergab. Es scheint, als ob dieser Zustand, der uns ein sehr vorhersehbares Ergebnis für Messungen entlang von liefert, uns eine sehr unvorhersehbare Reihe von Ergebnissen für Messungen entlang von liefert. Lassen Sie uns dies untersuchen.
Was passiert, wenn die Messungen in umgekehrter Reihenfolge durchgeführt werden? Wir könnten damit beginnen, das Hadamard-Gatter zu verwenden, um Statistiken über die Wahrscheinlichkeit zu erhalten, dass in gemessen wird. Für die zweite Messung wechseln wir dann wieder zur Basis und verwenden ein zweites Hadamard-Gatter.
# 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")Output:
# 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)Output:
Hier scheint es noch weniger Vorhersehbarkeit zu geben! Zuvor wussten wir zumindest, wie das Ergebnis der ersten Messung aussehen würde, jetzt haben wir eine ziemlich gleichmäßige Verteilung über alle möglichen Zustände. Es ist nicht allzu schwer zu verstehen, warum dies geschah. Wir haben mit begonnen, das eine 50-50-Mischung aus und ist Die Wahrscheinlichkeit, bei der ersten Messung den Zustand "+" oder "-" (im Diagramm auf 0 und 1 abgebildet) zu erhalten, sollte also gleich groß sein. Die Messung entlang lässt den Zustand entweder in einen Eigenzustand oder den Eigenzustand kollabieren. Jeder dieser Zustände ist eine 50-50-Mischung aus und , gemäß Sobald sich das System also in einem Eigenzustand von befindet, führen Messungen entlang von sowohl zu als auch zu , und zwar mit ungefähr gleicher Wahrscheinlichkeit. Unser erstes Beispiel hat uns also gezeigt, dass einige Staaten sehr vorhersehbare Ergebnisse bei einigen Messungen, aber unvorhersehbare Ergebnisse bei anderen Messungen haben werden. Das aktuelle Beispiel zeigt uns, dass es noch schlimmer kommen kann. Es gibt Zustände, die bei beiden Messungen zu unvorhersehbaren Ergebnissen führen können, selbst wenn wir nur die Reihenfolge der Messungen vertauschen. Untersuchen wir, wie sicher oder unsicher eine Größe für einen bestimmten Zustand ist.
Berechnung der Unsicherheit
Wir können dies mit Hilfe der Unsicherheit bzw. Varianz quantifizieren. Die "Unsicherheit" wird oft als die Quadratwurzel der "Varianz" einer Verteilung definiert. Das heißt, die Unsicherheit für eine beobachtbare Größe wird mit bezeichnet und ist gegeben durch
Für den Fall der Pauli-Matrizen, für die gilt, wird daraus
Wenden wir dies einmal auf ein konkretes Beispiel an. Beginnen wir mit dem Zustands und bestimmen wir die Unsicherheit der Observable in diesem Zustand.
Überprüfen Sie Ihr Verständnis
Berechnen Sie die Unsicherheit von im Zustand von Hand.
In dem gegebenen Zustand ergibt sich dies:
Mit qc.initialize() können wir einen beliebigen Ausgangszustand erzeugen. Beachten Sie, dass die Syntax für die imaginäre Einheit hier lautet.
# 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)Output:
-0.02408454165642664
Nach unserer obigen Gleichung, 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)Output:
0.04958271968581247
Wir könnten die gleichen Berechnungen anstellen wie zuvor, würden aber sehen, dass die Varianz wieder sehr nahe bei 1.0 liegt. Wir könnten daraus schließen, dass . Tatsächlich ist dies für den von uns gewählten Zustand ungefähr richtig. Aber können wir es besser machen? Oder schlimmer?
Erinnern wir uns daran, dass zwischen der Position in einer Richtung, , und dem Impuls in derselben Richtung, , ein Unschärferelation besteht. Für diese Größen ist die wohl bekannteste Form wahrscheinlich Wenn wir uns nur daran erinnern, könnten wir versucht sein zu glauben, dass auch und eine solche grundlegende Unschärfegrenze aufweisen könnten. Vielleicht ist es unmöglich, dass das Produkt den Wert Null erreicht? Probieren wir es mal mit einem anderen Bundesland aus und schauen wir, ob das auch dort zutrifft. Dieses Mal verwenden wir „ “. Mal sehen, was passiert. Beachten Sie, dass der Schätzer im folgenden Code zwei Sätze von Schaltkreisen und Beobachtungsgrößen 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)Output:
The expectation value of the first observable is: 1.0011036174126302
The expectation value of the second observable is: 0.0029429797670141016
Der Erwartungswert von sollte in der Nähe von 1.0 liegen, aber 1.0 nicht überschreiten. Machen Sie sich keine Sorgen, wenn die Zahl 1.0 nur geringfügig überschritten wird. Dies lässt sich auf Faktoren wie Rauschen und/oder Auslesefehler zurückführen. Obwohl dies ein sehr wichtiges Thema ist, können wir es vorerst ignorieren.
Wir haben einen Erwartungswert für erhalten, der sehr nahe an 1.0 liegt (was einer sehr geringen Varianz für entspricht). Dies macht das Produkt der beiden Varianzen recht niedrig:
Dies ist zwar nicht genau Null, aber dieser Wert wird im Vergleich zu den Eigenwerten der Pauli-Operatoren ( ) klein. Sie erinnern sich vielleicht daran, dass die Unschärferelation zwischen linearer Position und Impuls auch anders geschrieben werden könnte, nämlich explizit unter Verwendung der Kommutationsbeziehung zwischen den Operatoren und :
wo
ist der Kommutator von und .
Dies ist die Form, die sich am einfachsten auf die Pauli-Operatoren übertragen lässt. Im Allgemeinen gilt für zwei Betreiber und ,
Und im Fall der Pauli-Matrizen und benötigen wir , um zu berechnen
Wir zeigen dies hier und überlassen ähnliche Berechnungen dem Leser als Übung:
Dies ist eine durchaus akzeptable Antwort, aber mit einem weiteren Schritt sehen wir
Unsere Unschärferelation lautet also
Überprüfen Sie Ihr Verständnis
Bestimmen Sie und . Benutzen Sie dies, um die Unsicherheitsbeziehungen zwischen & und & aufzuschreiben.
In Verbindung mit der allgemeinen Unschärferelation ergibt sich
Konsistenz überprüfen
Bevor wir fortfahren, wollen wir überprüfen, ob dies mit unserer vorherigen Erkenntnis übereinstimmt. Wir haben die Zustands angewendet. Dabei haben wir festgestellt, dass gilt. Nun wissen wir, dass dieses Produkt größer oder gleich
Das stimmt,
Nutzen Sie die folgenden Fragen, um ein Gefühl für diese Erkenntnisse zu bekommen:
Überprüfen Sie Ihr Verständnis
Beantworten Sie die folgenden Fragen gemeinsam als Satz:
(a) Bei welchen Zuständen würden Sie erwarten, dass die Unsicherheit in gleich Null ist?
(b) Bei welchen Zuständen würden Sie erwarten, dass die Unsicherheit in gleich Null ist?
(c) In welchen Zuständen würden Sie einen Null-Erwartungswert erhalten ?
(d) Stimmen die Antworten auf die obigen Fragen mit dem Fall überein?
(e) Schreiben Sie einen Code, um dies mit Hilfe eines Schätzers explizit zu überprüfen.
(a) Man könnte erwarten, dass Eigenzustände des Operators „ “ in „ “ eine Unsicherheit von Null ergeben. Tatsächlich gilt unter Verwendung von „ “
(b) Man könnte erwarten, dass Eigenzustände des Operators „ “ zu einer Unsicherheit von Null in „ “ führen. Tatsächlich ergibt sich unter Verwendung von „ “ Folgendes: „ “
(c) Wir erwarten, für alle Zustände zu finden, die, wenn sie gemessen werden, genauso oft eine positive Projektion auf die Achse ergeben wie eine negative Projektion. Dazu gehören die Eigenzustände von und .
(d) Ja. Man würde für Eigenzustände von oder einen sehr kleinen Wert für das Produkt der Unsicherheiten erwarten: . Dies kann zutreffen, da wir für dieselben Zustände auch erwarten würden. Somit könnte der Unschärferelation erfüllt sein.
(e) Ein Code wie der folgende würde dies bestätigen:
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()Wobei die Ergebnisse alle Erwartungswerte zurückgeben. Um alle Erwartungswerte abzurufen und die Unsicherheiten zu berechnen, können wir Folgendes 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
Beantworten Sie die folgenden Fragen gemeinsam als Satz:
(a) Können Sie sich einen Zustand vorstellen, in dem Sie einen großen Erwartungswert haben ?
(b) Würden Sie erwarten, dass derselbe Zustand eine große oder kleine Unsicherheit in hat?
(c) Würden Sie erwarten, dass derselbe Zustand eine große oder kleine Unsicherheit in hat?
(d) Stimmen die Antworten auf die obigen Fragen mit dem Fall überein?
(e) Schreiben Sie einen Code, um dies mit Hilfe eines Schätzers explizit zu überprüfen.
(a) Wir erwarten, dass wir für den Eigenzustand von : finden.
(b) Es ist zu erwarten, dass „ “ in dem Zustand „ “ eine große Unsicherheit aufweist, da die Messung von „ “ in diesem Zustand mit gleicher Häufigkeit bzw. Wahrscheinlichkeit sowohl ein positives als auch ein negatives Ergebnis liefern würde.
(c) Es ist zu erwarten, dass „ “ eine große Unsicherheit im Zustand „ “ aufweist, da die Messung von „ “ in diesem Zustand mit gleicher Häufigkeit bzw. Wahrscheinlichkeit sowohl ein positives als auch ein negatives Ergebnis liefern würde.
(d) Ja. Man würde einen großen Wert für das Produkt der Unsicherheiten für Eigenzustände von und insbesondere für erwarten. Für denselben Zustand würden wir außerdem erwarten. Sowohl als auch sind in diesem Zustand also beide recht groß, und es ist plausibel, dass die Unschärferelation erneut erfüllt sein könnte.
(e) Ein Code wie der folgende würde dies bestätigen:
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()Wobei die Ergebnisse alle Erwartungswerte zurückgeben. Um alle Erwartungswerte abzurufen und die Unsicherheiten zu berechnen, können wir Folgendes 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
Prüfung von Unsicherheitsbeziehungen
Der obige Test hat nur die Gültigkeit der Unschärferelation für eine einzige Wahl des Zustandsvektors gezeigt. Um uns davon zu überzeugen, dass dies im Allgemeinen mit dem Experiment übereinstimmt, sollten wir ähnliche Berechnungen mit dem Schätzer für viele verschiedene Zustandsvektoren durchführen. Beginnen wir damit, unseren Zustandsvektor von der Achse wegzudrehen, indem wir ein `RY'-Gatter 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()Output:
Beachten Sie, dass die rote Kurve stets größer ist als die orangefarbene Kurve . Manchmal fällt das Unsicherheitsprodukt ab und liegt relativ nahe am Grenzwert, manchmal steigt es an und ist weiter vom Grenzwert entfernt, aber es hält sich stets an die Unschärferelation.
Natürlich ist dies vielleicht nicht der beste Test für die Unschärferelation, da unser Grenzwert immer sehr nahe bei Null liegt. Nehmen wir einen Quantenzustand, der eine größere Projektion auf die Eigenzustände von hat. Konkret werden wir immer noch um verschiedene Winkel von der Achse nach unten drehen, aber jetzt werden wir den resultierenden Zustand auch um einen bestimmten Winkel um 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()Output:
Nun sehen wir, dass die Grenze der Unsicherheit auf die Probe gestellt wird! Die rote Kurve liegt nun viel näher an der orangefarbenen Kurve als zuvor. Tatsächlich wäre der Unschärferelation ohne Rauschen an einem Punkt genau gesättigt ( ). Angesichts von Rauschen und Auslesefehlern sollte es nicht überraschen, wenn bei einem Durchlauf gelegentlich ein Wert von ermittelt wird, der geringfügig größer ist als . Dies stellt keine tatsächliche Verletzung der Unsicherheit dar, sondern ist lediglich ein Artefakt eines Fehlers ungleich Null.
Überprüfen Sie Ihr Verständnis
Erläutern Sie, wie Sie dies bis an die absoluten Grenzen ausreizen und „ “ so groß wie möglich gestalten würden.
Der Code enthält derzeit Zeilen, die den Standard-Ausgangszustand um einen parametrisierten Winkel von der Achse nach unten und anschließend um einen Winkel um die Achse drehen, wodurch der Zustandsvektor teilweise in Richtung der Achse gedreht wird.
qc.ry(theta,0)qc.rz(pi/4,0)Wir könnten die Rotation um von auf ändern und so bis zu einem Eigenzustand von rotieren:
qc.ry(theta,0)qc.rz(pi/2,0)Weitere Änderungen wären nicht erforderlich.
Ändern Sie den Code oder kopieren Sie ihn und implementieren Sie diese Überprüfung der Unschärferelation mit maximiertem Erwartungswert von Y. Gilt die Unschärferelation?
Wir würden genau den Code aus dem obigen Beispiel verwenden, mit
qc.rz(pi/2,0)eingebaut als Ersatz für
qc.rz(pi/4,0).Das Ergebnis sollte wie unten dargestellt aussehen, und ja, die Unschärferelation sollte immer noch gültig sein.

Ändern Sie den obigen Code, um ein ähnliches Bild zu erstellen und zu zeigen, dass sich das Produkt nach den Messungen auf dem Quantencomputer so verhält, wie es sollte. Wählen Sie eine beliebige Anzahl von Staaten aus, die Sie mögen.
Wir würden genau den Code aus dem obigen Beispiel verwenden, und im Gesicht könnten wir die gleichen Ergebnisse wie oben verwenden, nur unter Verwendung der Erwartungswerte, um verschiedene Unsicherheiten zu berechnen. Wir könnten zum Beispiel Folgendes 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 wir könnten die
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()
Aufgabe: Schreiben Sie einen Code, um viele Werte von abzufragen, genauso wie wir viele Werte von abgefragt haben, und erstellen Sie eine 3-D-Darstellung, die zeigt, dass die Unschärferelation nie verletzt wird. Wählen Sie beliebige Observablen aus, die Ihnen gefallen.
Fragen
Lehrkräfte können Versionen dieser Hefte mit Antwortschlüsseln und Hinweisen zur Einordnung in gängige Lehrpläne anfordern, indem sie diese kurze Umfrage zur Verwendung der Hefte ausfüllen.
Wichtige Konzepte:
- Es gibt Unschärferelationen zwischen vielen physikalischen Messgrößen, darunter Position und linearer Impuls sowie Komponenten des Spins.
- Die Pauli-Matrizen sind nicht kommutabel. Dies ist ein mathematischer Ausdruck der Tatsache, dass nicht alle Komponenten des Spins gleichzeitig bekannt/bestimmt werden können.
- In der Quanteninformatik werden die Pauli-Operatoren/-Matrizen intensiv genutzt, so dass es nützlich ist, die Unschärferelation für die Pauli-Operatoren sowie die eng verwandten Spin-Operatoren zu kennen.
- Eine allgemeine Formel für die Unschärfe von zwei Operatoren und lautet
- Ein Eigenzustand eines Operators führt zu einer Unsicherheit von Null bei der mit diesem Operator verbundenen physikalischen Observable. Selbst experimentell gilt: „ “.
- Ein Eigenzustand eines Operators führt zu einer größeren Unsicherheit für einen Operator , der nicht mit kommutiert.
- Experimentelle Ergebnisse mit einem echten Quantencomputer bestätigen die Intuition, die wir aus der Matrixdarstellung physikalischer Operatoren gewinnen.
Wahr/Falsch-Fragen:
- T/F Man kann gleichzeitig und messen, aber nicht .
- T/F Man kann gleichzeitig und messen, aber nicht .
- T/F Lineare Positions- und lineare Impulsoperatoren sind nicht kommutabel.
- T/F IBM Quantencomputer messen standardmäßig entlang , so dass eine Drehung durchgeführt werden muss, um entlang einer anderen Richtung zu messen.
- T/F Die folgende Schaltung misst tatsächlich und dann .
MC-Fragen:
-
Welche der folgenden Unschärferelationen wird in der folgenden Abbildung dargestellt?
- a.
- b.
- c.
- d. Keines der oben genannten.
-
Welches ist die Standardreihenfolge für die Durchführung einer Messung auf ?
- 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 Unsicherheit ?
- a.
- b. auch genannt
- c. auch genannt
- d. a und b sind unentschieden
- e. b und c sind unentschieden
- F. a, b und c sind unentschieden
Diskussionsfragen:
-
Steht dieses Konzept der Ungewissheit in irgendeiner Weise im Widerspruch zu der Vorstellung vom Spin als Vektorpfeil im kartesischen Raum? Wie sieht es mit der Bloch-Kugel aus?
-
Angenommen, Sie richten ein Messgerät in einer Richtung aus, die auf halbem Weg zwischen den Achsen und liegt. Was geschieht? Können Sie eine Messung in diese Richtung vornehmen? Wie verhält sich dies zur Unsicherheit auf und ?
-
Welche zusätzlichen Experimente würden Sie gerne durchführen, um sich von den hier erzielten Ergebnissen zu überzeugen?