Menjelajahi ketidakpastian
Untuk modul Qiskit in Classrooms ini, siswa harus memiliki lingkungan Python yang berfungsi dengan paket-paket berikut terinstal:
qiskitv2.1.0 atau lebih baruqiskit-ibm-runtimev0.40.1 atau lebih baruqiskit-aerv0.17.0 atau lebih baruqiskit.visualizationnumpypylatexenc
Untuk mengatur dan menginstal paket-paket di atas, lihat panduan Install Qiskit. Untuk menjalankan job di komputer kuantum nyata, siswa perlu membuat akun di IBM Quantum® dengan mengikuti langkah-langkah di panduan Set up your IBM Cloud account.
Modul ini telah diuji dan menggunakan 8 menit waktu QPU. Ini hanya perkiraan. Penggunaan aktual kamu mungkin berbeda. Dua perhitungan yang memakan waktu ditandai demikian dalam komentar header dan bisa dijalankan di simulator jika siswa kekurangan waktu QPU. Dengan penghilangan keduanya, modul hanya memerlukan sekitar ~30 detik waktu QPU.
# 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'
Tonton panduan modul oleh Dr. Katie McCormick di bawah ini, atau klik di sini untuk menontonnya di YouTube.
Pendahuluan
Kamu mungkin pernah mendengar tentang prinsip ketidakpastian, bahkan di luar pelajaran fisika. Pernyataan sehari-hari yang umum dari ketidakpastian adalah "Dengan melihat sesuatu, kamu mempengaruhinya." Itu memang benar. Tapi cara yang lebih fisikal untuk menggambarkan ketidakpastian adalah bahwa ada besaran fisik tertentu yang memiliki ketidaksesuaian yang mencegah keduanya diketahui secara bersamaan dengan akurasi sembarang. Banyak siswa pertama kali menemui pasangan variabel yang tidak kompatibel dan , yang berarti posisi sepanjang satu sumbu yang disebut sumbu-, dan momentum linier sepanjang arah tersebut, masing-masing. Untuk variabel-variabel tersebut, batasan ketidakpastian ditulis Di sini, disebut "ketidakpastian dalam ", yang memiliki definisi yang sama dengan deviasi standar dalam statistik, dan dapat didefinisikan sebagai didefinisikan dengan cara yang sama. Di sini, kita tidak akan menurunkan hubungan ketidakpastian ini; kita akan menunjukkan bahwa hal ini konsisten dengan pemahaman kita tentang gelombang klasik. Artinya, gelombang dengan benar-benar satu frekuensi sempurna dan panjang gelombang akan terus berlanjut selamanya sebagai sinusoid sempurna. Secara mekanika kuantum, ini akan berhubungan dengan mengetahui momentum secara sempurna sesuai hipotesis de Broglie: . Tapi untuk mengetahui partikel seperti gelombang itu berada, gelombang yang menggambarkannya harus menjadi lebih tajam dalam ruang, seperti Gaussian yang sangat sempit, misalnya. Kita tahu bahwa kita bisa mengungkapkan fungsi kontinu apa pun, termasuk fungsi gelombang yang berpuncak tajam seperti itu, sebagai deret Fourier dari fungsi sinusoidal dengan panjang gelombang yang berbeda. Namun saat fungsi gelombang menjadi lebih berpuncak tajam (dan posisi lebih diketahui), kita akan membutuhkan lebih banyak suku dalam deret Fourier, yang berarti campuran lebih banyak panjang gelombang (dan dengan demikian, secara mekanika kuantum, lebih banyak nilai momentum).
Lebih sederhana: sebuah keadaan dengan momentum yang terdefinisi dengan baik (sinusoid sempurna dalam ruang) memiliki posisi yang sangat tidak pasti. Sebuah keadaan dengan posisi yang terdefinisi dengan baik (seperti distribusi delta Dirac) memiliki momentum yang sangat tidak pasti.
Ada variabel lain yang menunjukkan ketidaksesuaian seperti itu. Misalnya, spin partikel mungkin memiliki proyeksi yang terdefinisi dengan baik sepanjang satu sumbu, tetapi kemudian kita tidak tahu apa-apa tentang proyeksi pada sumbu yang tegak lurus. Misalnya keadaan (untuk qubit atau partikel spin-1/2) memiliki proyeksi pasti sepanjang sumbu (bernilai 1 dalam konteks qubit, dan dalam konteks partikel spin-1/2). Tetapi keadaan ini dapat ditulis sebagai superposisi dari dua keadaan yang masing-masing memiliki proyeksi terdefinisi dengan baik pada sumbu : atau ekuivalennya memiliki proyeksi terdefinisi dengan baik pada , begitu pula . Jadi jika kita menentukan proyeksi sebuah keadaan sepanjang sumbu , kita tidak tahu proyeksi sepanjang sumbu . Dan jika kita menentukan proyeksi pada sumbu , kita tidak tahu proyeksi sepanjang . Ada perbedaan kecil saat membahas ini dalam konteks spin dan dalam qubit. Tapi secara umum, eigenstate dari matriks Pauli memiliki hubungan yang menarik yang dapat kita jelajahi. Sepanjang pelajaran ini, kita akan memeriksa secara eksperimental intuisi kita tentang ketidakpastian dalam variabel-variabel yang tidak kompatibel ini, dan memverifikasi bahwa hubungan ketidakpastian berlaku pada komputer kuantum IBM®.
Pemeriksaan sederhana intuisi
Dalam eksperimen pertama ini dan sepanjang modul, kita akan menggunakan kerangka kerja untuk komputasi kuantum yang dikenal sebagai "Qiskit patterns", yang memecah alur kerja menjadi langkah-langkah berikut:
- Langkah 1: Petakan input klasik ke masalah kuantum
- Langkah 2: Optimalkan masalah untuk eksekusi kuantum
- Langkah 3: Jalankan menggunakan Qiskit Runtime Primitives
- Langkah 4: Post-processing dan analisis klasik
Kita umumnya akan mengikuti langkah-langkah ini, meski kita mungkin tidak selalu secara eksplisit memberi labelnya.
Mari mulai dengan memuat beberapa paket yang diperlukan termasuk Runtime primitives. Kita juga akan memilih komputer kuantum yang paling tidak sibuk yang tersedia untuk kita.
Ada kode di bawah ini untuk menyimpan kredensial kamu pada penggunaan pertama. Pastikan untuk menghapus informasi ini dari notebook setelah menyimpannya ke lingkunganmu, agar kredensialmu tidak dibagikan secara tidak sengaja saat kamu berbagi notebook. Lihat Set up your IBM Cloud account dan Initialize the service in an untrusted environment untuk panduan lebih lanjut.
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
Jika seorang siswa menghabiskan waktu komputasi kuantum yang tersedia selama pelajaran, baris-baris di bawah ini bisa di-uncomment dan digunakan untuk menyiapkan simulator yang sebagian meniru perilaku noise dari komputer kuantum yang dipilih di atas.
# 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}})
Kamu mungkin ingat bahwa eigenstate dari satu operator, Z, bukan eigenstate dari operator lain X. Kita akan mengamati hal itu sekarang, secara eksperimental dengan melakukan pengukuran sepanjang sumbu dan . Untuk pengukuran sepanjang , kita cukup menggunakan qc.measure(), karena komputer kuantum IBM dirancang untuk mengukur sepanjang . Tapi untuk mengukur sepanjang , kita harus merotasi sistem untuk secara efektif memindahkan sumbu ke orientasi yang kita ukur. Ini dilakukan dengan Hadamard Gate. Ada langkah serupa yang diperlukan untuk pengukuran sepanjang . Langkah-langkah yang diperlukan dikumpulkan di sini untuk kemudahan:
- Untuk mengukur sepanjang :
qc.measure() - Untuk mengukur sepanjang :
qc.h()laluqc.measure() - Untuk mengukur sepanjang :
qc.sdg(),qc.h(),qc.slaluqc.measure()
Langkah 1: Petakan input klasik ke masalah kuantum
Dalam hal ini, langkah pemetaan hanyalah mengungkapkan pengukuran dan rotasi yang dijelaskan di atas dalam Circuit kuantum:
# 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")
Langkah 2: Optimalkan masalah untuk eksekusi kuantum
Langkah ini mengambil operasi yang ingin kita lakukan dan mengungkapkannya dalam hal fungsionalitas komputer kuantum tertentu. Ini juga memetakan masalah kita ke tata letak komputer kuantum.
# 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)
Langkah 3: Jalankan menggunakan Qiskit Runtime primitives
Kita bisa menggunakan Sampler untuk mengumpulkan statistik pengukuran. Kita akan membuat primitif Sampler untuk dijalankan di komputer kuantum nyata menggunakan mode = backend. Ada mode lain untuk alur kerja lain, dan kita akan menggunakan salah satunya di bawah ini. Sampler akan digunakan dengan memanggil metode run() dengan daftar "PUB" (Primitive Unified Blocs). Setiap PUB berisi hingga tiga nilai yang, bersama-sama, mendefinisikan unit komputasi pekerjaan bagi Estimator untuk diselesaikan: Circuit, observables, parameter. Kamu juga bisa memberikan daftar Circuit, daftar observables, dan daftar parameter. Untuk informasi lebih lanjut, baca Overview of PUBs.
Kita ingin menjalankan di komputer kuantum nyata, agar kita menjalankan eksperimen fisika kuantum yang sesungguhnya. Jika kamu menghabiskan waktu yang dijatahkan di komputer kuantum nyata, kamu bisa mengomentari kode di bawah ini untuk komputer kuantum, dan uncomment kode untuk menjalankan di simulator.
# 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()
Langkah 4: Post-processing
Ini adalah kasus post-processing yang sangat sederhana, di mana kita hanya memvisualisasikan counts.
Perlu dicatat bahwa Qiskit mengurutkan qubit, pengukuran, dan hal-hal lain dengan mencantumkan item bernomor terendah terakhir / di sebelah kanan, sebuah konvensi yang disebut sebagai "little-endian". Ini berarti kolom di bawah yang berlabel "10" mengacu pada counts di mana pengukuran pertama menghasilkan "0", dan pengukuran kedua menghasilkan "1".
# Step 4: Post-process
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Jika konvensi ini tidak cocok untukmu, kamu bisa menggunakan marginal_counts untuk memvisualisasikan hasil setiap pengukuran secara terpisah:
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"
)
Secara default, keadaan dalam Qiskit diinisialisasi ke keadaan . Jadi tidak mengejutkan bahwa hampir semua pengukuran pertama menghasilkan . Namun perhatikan bahwa ada hampir pembagian yang merata pada pengukuran kedua (yang memberi informasi tentang proyeksi keadaan pada ). Sepertinya keadaan yang memberi kita hasil pengukuran yang sangat dapat diprediksi sepanjang memberi kita hasil yang sangat tidak dapat diprediksi untuk pengukuran sepanjang . Mari kita jelajahi ini.
Apa yang terjadi jika kita melakukan pengukuran dalam urutan yang berlawanan? Kita bisa mulai dengan menggunakan Hadamard Gate untuk mendapatkan statistik tentang probabilitas diukur dalam . Kemudian untuk pengukuran kedua, kita akan kembali ke basis menggunakan Hadamard Gate kedua.
# 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)
Di sini, sepertinya kita memiliki ketidakprediktabilan yang lebih rendah! Sebelumnya, kita setidaknya tahu hasil apa yang akan terjadi dari pengukuran pertama, sekarang kita memiliki distribusi yang cukup merata di semua kemungkinan keadaan. Tidak terlalu sulit untuk melihat mengapa ini terjadi. Kita mulai dari , yang merupakan campuran 50-50 dari dan , sesuai dengan Jadi jelas harus ada probabilitas yang sama untuk mendapatkan keadaan + atau - (dipetakan ke 0 dan 1 dalam grafik) untuk pengukuran pertama. Pengukuran sepanjang meruntuhkan keadaan menjadi baik eigenstate atau eigenstate . Setiap keadaan itu adalah campuran 50-50 dari dan , sesuai dengan Jadi begitu sistem berada dalam eigenstate , jelas pengukuran sepanjang akan menghasilkan dan , dan melakukannya dengan probabilitas yang kurang lebih sama. Jadi contoh pertama kita menunjukkan bahwa beberapa keadaan akan memiliki hasil yang sangat dapat diprediksi untuk beberapa pengukuran, tetapi hasil yang tidak dapat diprediksi untuk pengukuran lain. Contoh saat ini menunjukkan bahwa kita bisa lebih buruk dari itu. Ada keadaan yang dapat memberi kita hasil yang tidak dapat diprediksi untuk kedua pengukuran, bahkan jika yang kita lakukan hanyalah menukar urutan pengukuran. Mari kita selidiki seberapa pasti atau tidak pasti suatu besaran untuk keadaan tertentu.
Menghitung ketidakpastian
Kita bisa mengkuantifikasi ini menggunakan ketidakpastian, atau varians. "Ketidakpastian" sering didefinisikan sebagai akar kuadrat dari "varians" suatu distribusi. Artinya, ketidakpastian untuk beberapa observabel dilambangkan dan diberikan oleh
Untuk kasus matriks Pauli, di mana , ini menjadi
Mari kita terapkan ini ke contoh konkret. Mari mulai dengan keadaan dan kita tentukan ketidakpastian dari observabel dalam keadaan tersebut.
Periksa pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk mengungkap solusinya.
Hitung ketidakpastian dalam keadaan , secara manual.
Jawaban:
Dalam keadaan yang diberikan, ini menghasilkan:
Kita bisa membuat keadaan awal sembarang menggunakan qc.initialize(). Perlu dicatat bahwa sintaks untuk unit imajiner di sini adalah .
# 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
Sesuai persamaan kita di atas, Mari tetap dengan keadaan yang sama, tapi sekarang cari nilai ekspektasi :
# 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
Kita bisa melakukan matematika yang sama seperti sebelumnya, tapi kita akan melihat bahwa variansnya lagi-lagi sangat mendekati 1.0. Kita bisa menyimpulkan bahwa . Memang ini kira-kira benar untuk keadaan yang kita pilih. Tapi bisakah kita melakukan lebih baik? Atau lebih buruk?
Ingat bahwa ada hubungan ketidakpastian antara posisi sepanjang satu arah, dan momentum sepanjang arah yang sama, Untuk variabel-variabel tersebut, tapi bentuk yang paling familiar mungkin adalah Jika ini semua yang kita ingat, kita mungkin tergoda untuk berpikir bahwa dan juga bisa memiliki batas fundamental pada ketidakpastian. Mungkin tidak mungkin bagi produk untuk mencapai nol? Mari coba keadaan lain dan lihat apakah ini berlaku. Kali ini, kita akan menggunakan Mari lihat apa yang terjadi. Perhatikan bahwa dalam kode di bawah ini, Estimator dapat menerima dua set Circuit dan observables dalam pengiriman job yang sama.
# 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
Nilai ekspektasi seharusnya mendekati 1.0, tapi tidak boleh melebihi 1.0. Jangan khawatir jika melebihi 1.0 dengan jumlah yang sangat kecil. Ini bisa dikaitkan dengan faktor seperti noise dan/atau kesalahan readout. Meskipun ini adalah topik yang sangat penting, kita bisa mengabaikannya untuk saat ini.
Kita mendapatkan nilai ekspektasi yang sangat mendekati 1.0 (sesuai dengan varians yang sangat rendah untuk ). Ini membuat produk dari dua varians cukup rendah:
Meskipun ini tidak persis nol, nilai ini semakin kecil dibandingkan dengan eigenvalue operator Pauli (). Nah, kamu mungkin ingat bahwa hubungan ketidakpastian antara posisi linier dan momentum bisa ditulis secara berbeda, secara eksplisit menggunakan hubungan komutasi antara operator dan :
di mana
adalah komutator dari dan .
Ini adalah bentuk yang paling mudah diperluas ke operator Pauli. Secara umum, untuk dua operator dan ,
Dan dalam kasus matriks Pauli dan , kita memerlukan untuk menghitung
Kita tunjukkan ini di sini, dan sisakan perhitungan serupa kepada pembaca sebagai latihan:
Ini adalah jawaban yang sangat bisa diterima, tapi dengan satu langkah lagi, kita lihat
Hubungan ketidakpastian kita dengan demikian menjadi
Periksa pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk mengungkap solusinya.
Tentukan dan . Gunakan ini untuk menuliskan hubungan ketidakpastian antara & , dan & .
Jawaban:
Dikombinasikan dengan hubungan ketidakpastian umum, kita punya
Verifikasi konsistensi
Sebelum melanjutkan, mari kita periksa bahwa ini konsisten dengan temuan sebelumnya. Kita menggunakan keadaan Dan kita menemukan bahwa Sekarang kita tahu produk ini harus lebih besar dari atau sama dengan
Jadi memang, Gunakan pertanyaan di bawah ini untuk membangun intuisi tentang temuan-temuan ini:
Periksa pemahamanmu
Baca pertanyaan di bawah, pikirkan jawabanmu, lalu klik segitiga untuk mengungkap solusinya.
Jawab item-item berikut bersama sebagai satu set:
(a) Keadaan apa yang kamu harapkan memiliki ketidakpastian nol dalam ?
(b) Keadaan apa yang kamu harapkan memiliki ketidakpastian nol dalam ?
(c) Dalam keadaan apa kamu akan mendapatkan nilai ekspektasi nol ?
(d) Apakah jawaban atas pertanyaan-pertanyaan di atas konsisten dengan kasus ?
(e) Tulis kode untuk secara eksplisit memverifikasi ini menggunakan Estimator.
Jawaban:
(a) Kita mungkin mengharapkan eigenstate dari operator menghasilkan ketidakpastian nol dalam . Memang, menggunakan kita punya
(b) Kita mungkin mengharapkan eigenstate dari operator menghasilkan ketidakpastian nol dalam . Memang, menggunakan kita punya
(c) Kita mengharapkan untuk keadaan apa pun yang, saat diukur, menghasilkan proyeksi positif pada sumbu sesering proyeksi negatif. Ini termasuk eigenstate dari dan .
(d) Ya. Seseorang akan mengharapkan nilai yang sangat kecil untuk produk ketidakpastian untuk eigenstate dari atau : Ini bisa berlaku karena kita juga akan mengharapkan untuk keadaan yang sama. Jadi hubungan ketidakpastian bisa terpenuhi.
(e) Kode seperti berikut akan memverifikasi ini:
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()
Di mana hasilnya mengembalikan semua nilai ekspektasi. Untuk mengambil semua nilai ekspektasi dan menghitung ketidakpastian, kita bisa menggunakan:
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
Jawab item-item berikut bersama sebagai satu set:
(a) Bisakah kamu memikirkan keadaan di mana kamu akan memiliki nilai ekspektasi yang besar ?
(b) Apakah kamu mengharapkan keadaan yang sama memiliki ketidakpastian besar atau kecil dalam ?
(c) Apakah kamu mengharapkan keadaan yang sama memiliki ketidakpastian besar atau kecil dalam ?
(d) Apakah jawaban atas pertanyaan-pertanyaan di atas konsisten dengan kasus ?
(e) Tulis kode untuk secara eksplisit memverifikasi ini menggunakan Estimator.
Jawaban:
(a) Kita mengharapkan untuk eigenstate dari : .
(b) Kita mungkin mengharapkan memiliki ketidakpastian besar dalam keadaan karena mengukur dalam keadaan itu akan menghasilkan hasil positif dan negatif dengan frekuensi/probabilitas yang sama.
(c) Kita mungkin mengharapkan memiliki ketidakpastian besar dalam keadaan karena mengukur dalam keadaan itu akan menghasilkan hasil positif dan negatif dengan frekuensi/probabilitas yang sama.
(d) Ya. Seseorang akan mengharapkan nilai yang besar untuk produk ketidakpastian untuk eigenstate dari dan untuk khususnya. Kita juga akan mengharapkan untuk keadaan yang sama. Jadi baik maupun keduanya cukup besar dalam keadaan ini, dan masuk akal bahwa hubungan ketidakpastian bisa lagi terpenuhi.
(e) Kode seperti berikut akan memverifikasi ini:
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()
Di mana hasilnya mengembalikan semua nilai ekspektasi. Untuk mengambil semua nilai ekspektasi dan menghitung ketidakpastian, kita bisa menggunakan:
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
Menguji relasi ketidakpastian
Pengujian di atas hanya menunjukkan validitas relasi ketidakpastian untuk satu pilihan vektor keadaan . Agar kita lebih yakin bahwa ini secara umum konsisten dengan eksperimen, kita perlu melakukan perhitungan serupa menggunakan estimator untuk banyak pilihan vektor keadaan. Mari mulai dengan memutar vektor keadaan kita menjauhi sumbu , menggunakan Gate RY untuk menghasilkan berbagai keadaan awal menggunakan parameter .
# 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()
Perhatikan bahwa kurva merah selalu lebih besar dari kurva oranye Kadang-kadang hasil kali ketidakpastian turun dan cukup dekat dengan batas, dan kadang-kadang naik dan lebih jauh dari batas, tapi selalu mematuhi relasi ketidakpastian.
Tentu saja, ini mungkin bukan pengujian terbaik untuk relasi ketidakpastian, karena batas kita selalu sangat dekat dengan nol. Mari gunakan keadaan kuantum yang memiliki proyeksi lebih besar pada eigenstate dari . Secara khusus, kita masih akan memutar menjauhi sumbu dengan berbagai sudut, tapi sekarang kita juga akan memutar keadaan yang dihasilkan itu mengelilingi sumbu dengan sudut tertentu, misalnya , dan lihat apa yang terjadi.
# 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()
Sekarang kita lihat bahwa batas ketidakpastian benar-benar diuji! Kurva merah jauh lebih dekat ke kurva oranye dibanding sebelumnya. Sebenarnya, tanpa adanya noise, relasi ketidakpastian akan tepat terpenuhi () di satu titik. Dengan adanya noise dan kesalahan readout, tidak mengejutkan jika suatu percobaan sesekali menghasilkan yang sedikit lebih besar dari Ini bukan pelanggaran ketidakpastian yang sesungguhnya; ini hanya artefak dari error yang tidak nol.
Cek pemahamanmu
Baca pertanyaan di bawah ini, pikirkan jawabannya, lalu klik segitiga untuk mengungkap solusinya.
Jelaskan bagaimana kamu akan mendorong ini ke batas mutlak, membuat sebesar mungkin?
Jawaban:
Kode saat ini memiliki baris yang memutar keadaan awal default , menjauhi sumbu dengan sudut terparameter dan kemudian juga mengelilingi sumbu dengan sudut yang memutar vektor keadaan sebagian menuju sumbu .
qc.ry(theta,0)
qc.rz(pi/4,0)
Kita bisa mengubah rotasi terhadap dari menjadi , memutar sepenuhnya ke eigenstate dari :
qc.ry(theta,0)
qc.rz(pi/2,0)
Tidak ada perubahan lain yang diperlukan.
Ubah kode atau salin dan implementasikan pengecekan relasi ketidakpastian tersebut dengan nilai ekspektasi Y yang dimaksimalkan. Apakah relasi ketidakpastian tetap berlaku?
Jawaban:
Kita akan menggunakan persis kode dari contoh di atas, dengan
qc.rz(pi/2,0)
ditukar untuk menggantikan
qc.rz(pi/4,0).
Gambar yang dihasilkan seharusnya terlihat seperti di bawah ini, dan ya, prinsip ketidakpastian seharusnya masih berlaku.

Modifikasi kode di atas untuk membuat gambar serupa, yang menunjukkan bahwa dari pengukuran di komputer kuantum hasil kali berperilaku sebagaimana mestinya. Pilih sekumpulan keadaan yang kamu suka.
Jawaban:
Kita akan menggunakan persis kode dari contoh di atas, dan bahkan kita bisa menggunakan hasil yang sama dari atas, hanya menggunakan nilai ekspektasi untuk menghitung ketidakpastian yang berbeda. Misalnya, kita bisa menggunakan
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)
dan kita bisa memplot
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()
Tantangan: Tulis kode untuk memindai banyak nilai , seperti halnya kita memindai banyak nilai , dan buat plot 3-D yang menunjukkan bahwa relasi ketidakpastian tidak pernah dilanggar. Pilih observable apa saja yang kamu suka.
Pertanyaan
Instruktur dapat meminta versi notebook ini dengan kunci jawaban dan panduan penempatan dalam kurikulum umum dengan mengisi survei singkat ini tentang bagaimana notebook digunakan.
Konsep-konsep kritis:
- Ada relasi ketidakpastian antara banyak pasang observabel fisik, termasuk posisi & momentum linear, dan komponen spin.
- Matriks Pauli tidak komutatif. Ini adalah cerminan matematis dari fakta bahwa tidak semua komponen spin dapat diketahui/ditentukan secara bersamaan.
- Komputasi kuantum banyak menggunakan operator/matriks Pauli, sehingga berguna untuk mengetahui relasi ketidakpastian untuk operator Pauli, serta operator spin yang berkaitan erat.
- Rumus umum untuk ketidakpastian dua operator dan adalah
- Eigenstate dari suatu operator menghasilkan ketidakpastian nol pada observabel fisik yang terkait dengan operator tersebut. Bahkan secara eksperimental,
- Eigenstate dari suatu operator akan menghasilkan ketidakpastian yang lebih besar untuk operator yang tidak komutatif dengan .
- Hasil eksperimen menggunakan komputer kuantum nyata mengkonfirmasi intuisi yang kita peroleh dari representasi matriks operator fisik.
Pertanyaan B/S:
- B/S Seseorang bisa mengukur dan secara bersamaan, tapi tidak .
- B/S Seseorang bisa mengukur dan secara bersamaan, tapi tidak .
- B/S Operator posisi linear dan momentum linear tidak komutatif.
- B/S Komputer kuantum IBM mengukur sepanjang secara default, sehingga rotasi harus dilakukan untuk mengukur sepanjang arah lain.
- B/S Circuit di bawah ini secara efektif mengukur lalu .
Pertanyaan Pilihan Ganda:
-
Diagram di bawah ini menunjukkan relasi ketidakpastian yang mana dari berikut ini?
- a.
- b.
- c.
- d. Tidak ada di atas

-
Mana urutan standar untuk melakukan pengukuran sepanjang ?
- a. Hanya
qc.measure() - b.
qc.h()laluqc.measure() - c.
qc.h(),qc.h()laluqc.measure() - d.
qc.h(),qc.s,qc.h()laluqc.measure() - e.
qc.sdg(),qc.h(),qc.slaluqc.measure() - f.
qc.sdg(),qc.h(),qc.s,qc.h()laluqc.measure()
- a. Hanya
-
Keadaan mana dari berikut ini yang menghasilkan nilai ekspektasi terbesar ?
- a.
- b.
- c. disebut juga
- d. disebut juga
- e. disebut juga
- f. disebut juga
-
Keadaan mana dari berikut ini yang menghasilkan ketidakpastian terbesar ?
- a.
- b. disebut juga
- c. disebut juga
- d. a dan b seri
- e. b dan c seri
- f. a, b, dan c seri
Pertanyaan Diskusi:
-
Apakah konsep ketidakpastian ini bertentangan dengan gagasan spin sebagai panah vektor dalam ruang Cartesian? Bagaimana dengan di bola Bloch?
-
Misalkan kamu mengarahkan perangkat pengukuran sepanjang arah setengah jalan antara sumbu dan . Apa yang terjadi? Bisakah kamu melakukan pengukuran sepanjang arah ini? Bagaimana ini berkaitan dengan ketidakpastian dalam dan ?
-
Eksperimen tambahan apa yang ingin kamu lakukan untuk meyakinkan dirimu sendiri tentang hasil yang diperoleh di sini?