Meneroka ketidakpastian
Untuk modul Qiskit in Classrooms ini, pelajar perlu mempunyai persekitaran Python yang berfungsi dengan pakej-pakej berikut dipasang:
qiskitv2.1.0 atau lebih baharuqiskit-ibm-runtimev0.40.1 atau lebih baharuqiskit-aerv0.17.0 atau lebih baharuqiskit.visualizationnumpypylatexenc
Untuk menyediakan dan memasang pakej-pakej di atas, lihat panduan Pasang Qiskit. Untuk menjalankan kerja pada komputer kuantum sebenar, pelajar perlu menyediakan akaun dengan IBM Quantum® dengan mengikuti langkah-langkah dalam panduan Sediakan akaun IBM Cloud anda.
Modul ini telah diuji dan menggunakan 8 minit masa QPU. Ini adalah anggaran sahaja. Penggunaan sebenar anda mungkin berbeza. Dua pengiraan yang memakan masa ditandakan sedemikian dalam ulasan pengepala dan boleh dijalankan pada simulator jika pelajar kekurangan masa QPU. Tanpa kedua-duanya, modul ini hanya memerlukan ~30 saat masa 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, atau klik di sini untuk menontonnya di YouTube.
Pengenalan
Kamu mungkin pernah mendengar tentang prinsip ketidakpastian, bahkan di luar kursus fizik kamu. Penyataan semula yang biasa untuk ketidakpastian ialah "Dengan melihat sesuatu, kamu mempengaruhinya." Itu memang benar. Tetapi cara yang lebih fizikal untuk menerangkan ketidakpastian ialah terdapat pemboleh ubah fizikal tertentu yang mempunyai ketakserasian yang menghalang kedua-duanya daripada diketahui secara serentak dengan ketepatan sewenang-wenangnya. Ramai pelajar pertama kali menemui pasangan pemboleh ubah tidak serasi dan , yang bermaksud kedudukan sepanjang satu paksi yang dipanggil paksi-, dan momentum linear sepanjang arah tersebut, masing-masing. Untuk pemboleh ubah tersebut, kekangan ke atas ketidakpastian ditulis sebagai Di sini, dipanggil "ketidakpastian dalam ", yang mempunyai definisi yang sama seperti sisihan piawai dalam statistik, dan boleh ditakrifkan sebagai ditakrifkan dengan cara yang sama. Di sini, kita tidak akan menerbitkan hubungan ketidakpastian ini; kita akan menunjukkan bahawa ia konsisten dengan pemahaman kita tentang gelombang klasik. Iaitu, satu gelombang dengan frekuensi dan panjang gelombang yang benar-benar sempurna akan berterusan selama-lamanya sebagai sinusoid yang sempurna. Secara mekanik kuantum, ini akan sepadan dengan mengetahui momentum dengan sempurna menurut hipotesis de Broglie: . Tetapi untuk mengetahui zarah seperti gelombang itu berada, gelombang yang menerangkannya mesti menjadi lebih puncak tajam dalam ruang, seperti Gaussian yang sangat sempit, contohnya. Kita tahu bahawa kita boleh meluahkan sebarang fungsi selanjar, termasuk fungsi gelombang berpuncak tajam sedemikian, sebagai siri Fourier fungsi sinusoidal dengan panjang gelombang yang berbeza. Tetapi apabila fungsi gelombang menjadi lebih puncak tajam (dan kedudukan lebih diketahui), kita akan memerlukan lebih banyak sebutan dalam siri Fourier, yang bermaksud gabungan lebih banyak panjang gelombang (dan dengan itu, secara mekanik kuantum, lebih banyak nilai momentum).
Dinyatakan dengan lebih ringkas: keadaan dengan momentum yang terdefinisi dengan baik (sinusoid yang sempurna dalam ruang) mempunyai kedudukan yang sangat tidak pasti. Keadaan dengan kedudukan yang terdefinisi dengan baik (seperti taburan delta Dirac) mempunyai momentum yang sangat tidak pasti.
Terdapat pemboleh ubah lain yang menunjukkan ketakserasian sedemikian. Contohnya, putaran zarah mungkin mempunyai unjuran yang terdefinisi dengan baik sepanjang satu paksi, tetapi kemudian kita tidak tahu apa-apa tentang unjuran pada paksi ortogon. Sebagai contoh, keadaan (untuk Qubit atau zarah spin-1/2) mempunyai unjuran yang pasti sepanjang paksi (iaitu 1 dalam konteks Qubit, dan dalam konteks zarah spin-1/2). Tetapi keadaan ini boleh ditulis sebagai superposisi dua keadaan yang masing-masing mempunyai unjuran yang terdefinisi dengan baik pada paksi : atau secara setara mempunyai unjuran yang terdefinisi dengan baik pada , begitu juga . Jadi jika kita menentukan unjuran suatu keadaan sepanjang paksi , kita tidak mengetahui unjuran sepanjang paksi . Dan jika kita menentukan unjuran pada paksi , kita tidak mengetahui unjuran sepanjang . Terdapat perbezaan kecil apabila membincangkan ini dalam konteks putaran dan dalam Qubit. Tetapi secara umumnya, keadaan eigen bagi matriks Pauli mempunyai hubungan menarik yang boleh kita terokai. Sepanjang pelajaran ini, kita akan menguji secara eksperimen intuisi kita untuk ketidakpastian dalam pemboleh ubah tidak serasi ini, dan mengesahkan bahawa hubungan ketidakpastian berlaku pada komputer kuantum IBM®.
Semakan mudah intuisi
Dalam eksperimen pertama ini dan sepanjang modul, kita akan menggunakan rangka kerja pengkomputeran kuantum yang dikenali sebagai "corak Qiskit", yang memecahkan aliran kerja kepada langkah-langkah berikut:
- Langkah 1: Petakan input klasik kepada masalah kuantum
- Langkah 2: Optimumkan masalah untuk pelaksanaan kuantum
- Langkah 3: Laksanakan menggunakan Primitif Qiskit Runtime
- Langkah 4: Pascapemprosesan dan analisis klasik
Kita akan mengikuti langkah-langkah ini secara amnya, walaupun kita mungkin tidak selalu melabelnya secara eksplisit.
Mari kita mulakan dengan memuatkan beberapa pakej yang diperlukan termasuk primitif Runtime. Kita juga akan memilih komputer kuantum yang paling kurang sibuk yang tersedia untuk kita.
Terdapat kod di bawah untuk menyimpan kelayakan kamu pada penggunaan pertama. Pastikan untuk memadamkan maklumat ini daripada buku nota selepas menyimpannya ke persekitaran kamu, supaya kelayakan kamu tidak terdedah secara tidak sengaja apabila berkongsi buku nota. Lihat Sediakan akaun IBM Cloud anda dan Mulakan perkhidmatan dalam persekitaran tidak dipercayai untuk panduan 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 pelajar kehabisan masa pengkomputeran kuantum yang tersedia semasa pelajaran, baris di bawah boleh dinyahulasan dan digunakan untuk menyediakan simulator yang sebahagiannya meniru tingkah laku hingar 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 bahawa keadaan eigen bagi satu operator, Z, bukanlah keadaan eigen bagi operator lain X. Kita akan memerhatikannya sekarang, secara eksperimen dengan membuat pengukuran sepanjang paksi dan . Untuk pengukuran sepanjang , kita hanya menggunakan qc.measure(), kerana komputer kuantum IBM distrukturkan untuk mengukur sepanjang . Tetapi untuk mengukur sepanjang , kita mesti memutar sistem untuk memindahkan paksi ke orientasi yang kita ukur. Ini dilakukan dengan Gate Hadamard. Terdapat langkah yang serupa diperlukan untuk pengukuran sepanjang . Langkah-langkah yang diperlukan dikumpulkan di sini untuk kemudahan:
- Untuk mengukur sepanjang :
qc.measure() - Untuk mengukur sepanjang :
qc.h()kemudianqc.measure() - Untuk mengukur sepanjang :
qc.sdg(),qc.h(),qc.skemudianqc.measure()
Langkah 1: Petakan input klasik kepada masalah kuantum
Dalam kes ini, langkah pemetaan hanyalah menyatakan pengukuran dan putaran yang diterangkan 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: Optimumkan masalah untuk pelaksanaan kuantum
Langkah ini mengambil operasi yang ingin kita lakukan dan menyatakannya dari segi fungsi komputer kuantum tertentu. Ia juga memetakan masalah kita ke atas susun atur 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: Laksanakan menggunakan primitif Qiskit Runtime
Kita boleh menggunakan Sampler untuk mengumpul statistik pengukuran. Kita akan membina primitif Sampler untuk dijalankan pada komputer kuantum sebenar menggunakan mode = backend. Terdapat mod lain untuk aliran kerja lain, dan kita akan menggunakannya di bawah. Sampler akan digunakan dengan memanggil kaedah run() dengan senarai "PUB" (Primitive Unified Blocs). Setiap PUB mengandungi sehingga tiga nilai yang, bersama-sama, mentakrifkan unit pengiraan kerja untuk estimator lengkapkan: Circuit, boleh cerap, parameter. Kamu juga boleh menyediakan senarai Circuit, senarai boleh cerap, dan senarai parameter. Untuk maklumat lanjut, baca Gambaran keseluruhan PUB.
Kita ingin menjalankan pada komputer kuantum sebenar, supaya kita melakukan eksperimen fizik kuantum yang sebenar. Jika kamu kehabisan masa yang diperuntukkan pada komputer kuantum sebenar, kamu boleh mengulasan kod di bawah untuk komputer kuantum, dan menyahulasan kod untuk menjalankan pada 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: Pascapemprosesan
Ini adalah kes pascapemprosesan yang sangat mudah, di mana kita hanya memvisualisasikan kiraan.
Perhatikan bahawa Qiskit menyusun Qubit, pengukuran, dan perkara lain dengan menyenaraikan item bernombor terendah terakhir / di sebelah kanan, satu konvensyen yang disebut sebagai "little-endian". Ini bermakna lajur di bawah yang berlabel "10" merujuk kepada kiraan 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 konvensyen ini tidak menarik minat kamu, kamu boleh menggunakan marginal_counts untuk memvisualisasikan hasil setiap pengukuran secara berasingan:
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 lalai, keadaan dalam Qiskit dimulakan kepada keadaan . Jadi tidak hairanlah hampir semua pengukuran pertama menghasilkan . Walau bagaimanapun, perhatikan bahawa terdapat hampir pembahagian sama rata dalam pengukuran kedua (yang memberi maklumat tentang unjuran keadaan pada ). Nampaknya keadaan yang memberi kita hasil pengukuran yang sangat dapat diramal sepanjang memberi kita set hasil yang sangat tidak dapat diramal untuk pengukuran sepanjang . Mari kita terokai ini.
Apa yang berlaku jika kita membuat pengukuran dalam urutan yang bertentangan? Kita boleh mulakan dengan menggunakan Gate Hadamard untuk mendapatkan statistik mengenai kebarangkalian diukur dalam . Kemudian untuk pengukuran kedua, kita akan bertukar kembali ke asas menggunakan Gate Hadamard 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, kita seolah-olah mempunyai kurang kebolehramalan! Sebelum ini, sekurang-kurangnya kita mengetahui apakah hasilnya untuk pengukuran pertama, kini kita mempunyai taburan yang agak sekata merentasi semua keadaan yang mungkin. Tidak terlalu sukar untuk melihat mengapa ini berlaku. Kita bermula dalam , yang merupakan campuran 50-50 antara dan , menurut Jadi jelas terdapat kebarangkalian yang sama untuk memperoleh keadaan + atau - (dipetakan kepada 0 dan 1 dalam carta) untuk pengukuran pertama. Pengukuran sepanjang meruntuhkan keadaan ke dalam keadaan eigen atau keadaan eigen . Setiap satu daripada keadaan tersebut merupakan campuran 50-50 antara dan , menurut Jadi apabila sistem berada dalam keadaan eigen , jelas bahawa pengukuran sepanjang akan menghasilkan kedua-dua dan , dan akan berbuat demikian dengan kebarangkalian yang lebih kurang sama. Jadi contoh pertama kita menunjukkan bahawa ada keadaan yang mempunyai hasil yang sangat dapat diramal untuk sesetengah pengukuran, tetapi hasil yang tidak dapat diramal untuk pengukuran lain. Contoh semasa menunjukkan kita boleh lebih teruk daripada itu. Terdapat keadaan yang boleh memberi kita hasil yang tidak dapat diramal untuk kedua-dua pengukuran, walaupun jika kita hanya menukar turutan pengukuran. Mari kita selidiki betapa pasti atau tidak pastinya suatu kuantiti bagi keadaan tertentu.
Mengira ketidakpastian
Kita boleh mengukur ini menggunakan ketidakpastian, atau varians. "Ketidakpastian" sering ditakrifkan sebagai punca kuasa dua "varians" suatu taburan. Iaitu, ketidakpastian untuk beberapa boleh cerap dinotasikan sebagai dan diberikan oleh
Untuk kes matriks Pauli, yang mana , ini menjadi
Mari kita terapkan ini pada contoh konkrit. Mari kita mulakan dengan keadaan dan mari kita tentukan ketidakpastian boleh cerap dalam keadaan tersebut.
Uji kefahaman kamu
Baca soalan di bawah, fikirkan jawapan kamu, kemudian klik segi tiga untuk mendedahkan penyelesaian.
Kira ketidakpastian dalam keadaan , secara tangan.
Jawapan:
Dalam keadaan yang diberikan, ini menghasilkan:
Kita boleh mencipta keadaan awal yang sewenang-wenang menggunakan qc.initialize(). Perhatikan bahawa sintaks untuk unit khayalan di sini ialah .
# 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
Menurut persamaan kita di atas, Mari kita kekal dengan keadaan yang sama, tetapi cari nilai jangkaan , sekarang:
# 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 boleh melakukan matematik yang sama seperti sebelum ini, tetapi kita akan melihat bahawa varians kembali sangat hampir dengan 1.0. Kita boleh menyimpulkan bahawa . Memang ini kira-kira betul untuk keadaan yang kita pilih. Tetapi bolehkah kita lakukan lebih baik? Atau lebih teruk?
Ingat bahawa terdapat hubungan ketidakpastian antara kedudukan sepanjang satu arah, dan momentum sepanjang arah yang sama, Untuk pemboleh ubah tersebut, bentuk yang paling biasa adalah mungkin Jika ini sahaja yang kita ingat, kita mungkin tergoda untuk berfikir bahawa dan juga boleh mempunyai had asas sedemikian pada ketidakpastian. Mungkin adalah mustahil untuk hasil darab mencapai sifar? Mari kita cuba keadaan lain dan lihat sama ada ini berlaku. Kali ini, kita akan menggunakan Mari lihat apa yang berlaku. Perhatikan bahawa dalam kod di bawah, estimator boleh menerima dua set Circuit dan boleh cerap dalam penghantaran kerja 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 jangkaan sepatutnya hampir dengan 1.0, tetapi tidak seharusnya melebihi 1.0. Jangan risau jika ia melebihi 1.0 dengan jumlah yang sangat kecil. Ini boleh dikaitkan dengan faktor seperti hingar dan/atau ralat pembacaan. Walaupun ini adalah topik yang sangat penting, kita boleh mengabaikannya buat masa ini.
Kita mendapat nilai jangkaan yang sangat hampir dengan 1.0 (sepadan dengan varians yang sangat rendah untuk ). Ini menjadikan hasil darab kedua-dua varians agak rendah:
Walaupun ini bukan tepat sifar, nilai ini semakin kecil berbanding dengan nilai eigen operator Pauli (). Nah, kamu mungkin ingat bahawa hubungan ketidakpastian antara kedudukan linear dan momentum boleh ditulis secara berbeza, secara eksplisit menggunakan hubungan penukaran antara operator dan :
di mana
ialah penukaran bagi dan .
Inilah bentuk yang paling mudah dilanjutkan kepada operator Pauli. Secara umumnya, untuk dua operator dan ,
Dan dalam kes matriks Pauli dan , kita memerlukan untuk mengira
Kita tunjukkan ini di sini, dan tinggalkan pengiraan yang serupa kepada pembaca sebagai latihan:
Ini adalah jawapan yang boleh diterima sepenuhnya, tetapi dengan satu langkah lagi, kita melihat
Hubungan ketidakpastian kita dengan itu menjadi
Uji kefahaman kamu
Baca soalan di bawah, fikirkan jawapan kamu, kemudian klik segi tiga untuk mendedahkan penyelesaian.
Tentukan dan . Gunakan ini untuk menulis hubungan ketidakpastian antara & , dan & .
Jawapan:
Menggabungkan dengan hubungan ketidakpastian umum, kita mendapat
Sahkan konsistensi
Sebelum meneruskan, mari kita semak bahawa ini konsisten dengan penemuan kita sebelumnya. Kita menggunakan keadaan Dan kita mendapati bahawa Kini kita tahu hasil darab ini seharusnya lebih besar atau sama dengan
Jadi memang, Gunakan soalan di bawah untuk membina intuisi tentang penemuan-penemuan ini:
Uji kefahaman kamu
Baca soalan-soalan di bawah, fikirkan jawapan kamu, kemudian klik segi tiga untuk mendedahkan penyelesaian.
Jawab item-item berikut bersama-sama sebagai satu set:
(a) Keadaan apakah yang kamu jangkakan mempunyai ketidakpastian sifar dalam ?
(b) Keadaan apakah yang kamu jangkakan mempunyai ketidakpastian sifar dalam ?
(c) Dalam keadaan apakah kamu akan mendapat nilai jangkaan sifar ?
(d) Adakah jawapan kepada soalan-soalan di atas konsisten dengan kes ?
(e) Tulis kod untuk menyemak ini secara eksplisit menggunakan estimator.
Jawapan:
(a) Kita mungkin mengharapkan keadaan eigen operator menghasilkan ketidakpastian sifar dalam . Memang, menggunakan kita mendapat
(b) Kita mungkin mengharapkan keadaan eigen operator menghasilkan ketidakpastian sifar dalam . Memang, menggunakan kita mendapat
(c) Kita jangkakan mendapat untuk sebarang keadaan yang, apabila diukur, menghasilkan unjuran positif pada paksi sama kerap dengan unjuran negatif. Ini termasuk keadaan eigen bagi dan .
(d) Ya. Seseorang jangka nilai yang sangat kecil untuk hasil darab ketidakpastian bagi keadaan eigen atau : Ini boleh berlaku kerana kita juga jangkakan untuk keadaan-keadaan yang sama. Jadi hubungan ketidakpastian boleh dipenuhi.
(e) Kod seperti berikut akan mengesahkan 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 jangkaan. Untuk mendapatkan semua nilai jangkaan dan mengira ketidakpastian, kita boleh 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-sama sebagai satu set:
(a) Bolehkah kamu fikirkan satu keadaan di mana kamu akan mempunyai nilai jangkaan yang besar ?
(b) Adakah kamu jangkakan keadaan yang sama mempunyai ketidakpastian besar atau kecil dalam ?
(c) Adakah kamu jangkakan keadaan yang sama mempunyai ketidakpastian besar atau kecil dalam ?
(d) Adakah jawapan kepada soalan-soalan di atas konsisten dengan kes ?
(e) Tulis kod untuk menyemak ini secara eksplisit menggunakan estimator.
Jawapan:
(a) Kita jangkakan mendapat untuk keadaan eigen : .
(b) Kita mungkin jangkakan mempunyai ketidakpastian besar dalam keadaan kerana mengukur dalam keadaan itu akan menghasilkan keputusan positif dan negatif dengan frekuensi/kebarangkalian yang sama.
(c) Kita mungkin jangkakan mempunyai ketidakpastian besar dalam keadaan kerana mengukur dalam keadaan itu akan menghasilkan keputusan positif dan negatif dengan frekuensi/kebarangkalian yang sama.
(d) Ya. Seseorang jangka nilai yang besar untuk hasil darab ketidakpastian bagi keadaan eigen dan untuk khususnya. Kita juga jangkakan untuk keadaan yang sama. Jadi kedua-dua dan adalah agak besar dalam keadaan ini, dan adalah munasabah bahawa hubungan ketidakpastian boleh dipenuhi sekali lagi.
(e) Kod seperti berikut akan mengesahkan 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 jangkaan. Untuk mendapatkan semua nilai jangkaan dan mengira ketidakpastian, kita boleh 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 hubungan ketakpastian
Ujian di atas hanya menunjukkan kesahihan hubungan ketakpastian untuk satu pilihan vektor keadaan . Supaya kita lebih yakin bahawa ini secara amnya konsisten dengan eksperimen, kita perlu menjalankan pengiraan serupa menggunakan Estimator untuk pelbagai pilihan vektor keadaan. Mari kita mulakan dengan memutar vektor keadaan kita menjauhi paksi , menggunakan Gate RY untuk menghasilkan keadaan awal yang berbeza 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 bahawa lengkung merah sentiasa lebih besar daripada lengkung oren Kadang-kadang hasil darab ketakpastian menurun dan agak hampir dengan had, dan kadang-kadang ia naik dan lebih jauh dari had, tetapi ia sentiasa mematuhi hubungan ketakpastian.
Sudah tentu, ini mungkin bukan ujian terbaik bagi hubungan ketakpastian, memandangkan had kita sentiasa sangat hampir dengan sifar. Mari kita gunakan keadaan kuantum yang mempunyai unjuran lebih besar pada eigenkeadaan . Khususnya, kita masih akan memutar menjauhi paksi pada sudut yang berbeza-beza, tetapi kini kita juga akan memutar keadaan tersebut mengelilingi pada sudut tertentu, mungkin , dan lihat apa yang berlaku.
# 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()
Kini kita dapat lihat bahawa had ketakpastian sedang diuji dengan lebih ketat! Lengkung merah kini jauh lebih hampir dengan lengkung oren berbanding sebelum ini. Bahkan, tanpa kehadiran hingar, hubungan ketakpastian akan tepat-tepat tepu () pada satu titik. Dengan kehadiran hingar dan ralat pembacaan, tidak menghairankan jika sesuatu larian sesekali menghasilkan yang sedikit lebih besar daripada Ini bukan pelanggaran sebenar terhadap ketakpastian; ia hanyalah kesan sampingan daripada ralat yang tidak sifar.
Semak kefahaman anda
Baca soalan-soalan di bawah, fikirkan jawapan anda, kemudian klik segi tiga untuk mendedahkan penyelesaiannya.
Terangkan bagaimana anda akan mendorong ini ke had mutlak, menjadikan sebesar mungkin?
Jawapan:
Kod ini kini mempunyai baris-baris yang memutar keadaan awal lalai , turun dari paksi pada sudut berparameter dan kemudian juga mengelilingi paksi pada sudut yang memutar vektor keadaan sebahagian jalan ke arah paksi .
qc.ry(theta,0)
qc.rz(pi/4,0)
Kita boleh menukar putaran sekitar dari kepada , memutar sepenuhnya ke eigenkeadaan :
qc.ry(theta,0)
qc.rz(pi/2,0)
Tiada perubahan lain yang diperlukan.
Ubah kod atau salin kod tersebut dan laksanakan pemeriksaan hubungan ketakpastian dengan nilai jangkaan Y yang dimaksimumkan. Adakah hubungan ketakpastian masih berlaku?
Jawapan:
Kita akan menggunakan kod dari contoh di atas, dengan
qc.rz(pi/2,0)
digantikan untuk menggantikan
qc.rz(pi/4,0).
Rajah yang terhasil seharusnya kelihatan seperti yang di bawah, dan ya, prinsip ketakpastian masih harus sah.

Ubah suai kod di atas untuk membuat gambar yang serupa, menunjukkan bahawa dari pengukuran pada komputer kuantum, hasil darab berkelakuan sebagaimana mestinya. Pilih mana-mana set keadaan yang anda suka.
Jawapan:
Kita akan menggunakan kod dari contoh di atas, dan sebenarnya kita boleh menggunakan keputusan yang sama dari atas, hanya menggunakan nilai jangkaan untuk mengira ketakpastian yang berbeza. Sebagai contoh, kita boleh 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 boleh plot
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()
Cabaran: Tulis kod untuk mengimbas pelbagai nilai , sama seperti kita mengimbas pelbagai nilai , dan buat plot 3-D yang menunjukkan bahawa hubungan ketakpastian tidak pernah dilanggar. Pilih mana-mana pemerhati yang anda suka.
Soalan
Pengajar boleh meminta versi buku nota ini dengan kunci jawapan dan panduan penempatan dalam kurikulum biasa dengan mengisi tinjauan ringkas ini tentang cara buku nota digunakan.
Konsep utama:
- Terdapat hubungan ketakpastian antara banyak set pemboleh ukur fizikal, termasuk kedudukan & momentum linear, dan komponen spin.
- Matriks Pauli tidak bertukar tertib. Ini adalah cerminan matematik daripada hakikat bahawa tidak semua komponen spin boleh diketahui/ditentukan secara serentak.
- Pengkomputeran kuantum banyak menggunakan pengendali/matriks Pauli, jadi adalah berguna untuk mengetahui hubungan ketakpastian bagi pengendali Pauli, serta pengendali spin yang berkait rapat dengannya.
- Formula umum untuk ketakpastian dua pengendali dan ialah
- Keadaan eigen bagi sesuatu pengendali menghasilkan ketakpastian sifar dalam pemboleh ukur fizikal yang berkaitan dengan pengendali tersebut. Walaupun secara eksperimen,
- Keadaan eigen bagi sesuatu pengendali akan menghasilkan ketakpastian yang lebih besar bagi pengendali yang tidak bertukar tertib dengan .
- Keputusan eksperimen menggunakan komputer kuantum sebenar mengesahkan intuisi yang kita perolehi daripada perwakilan matriks pengendali fizikal.
Soalan B/S:
- B/S Seseorang boleh mengukur dan secara serentak, tetapi bukan .
- B/S Seseorang boleh mengukur dan secara serentak, tetapi bukan .
- B/S Pengendali kedudukan linear dan momentum linear tidak bertukar tertib.
- B/S Komputer kuantum IBM mengukur sepanjang secara lalai, jadi putaran mesti dilakukan untuk mengukur sepanjang arah lain.
- B/S Litar di bawah secara berkesan mengukur kemudian .
Soalan Aneka Pilihan:
-
Rajah di bawah menunjukkan hubungan ketakpastian yang mana antara berikut?
- a.
- b.
- c.
- d. Tiada yang di atas

-
Yang manakah antara berikut merupakan urutan standard untuk melakukan pengukuran sepanjang ?
- a. Hanya
qc.measure() - b.
qc.h()kemudianqc.measure() - c.
qc.h(),qc.h()kemudianqc.measure() - d.
qc.h(),qc.s,qc.h()kemudianqc.measure() - e.
qc.sdg(),qc.h(),qc.skemudianqc.measure() - f.
qc.sdg(),qc.h(),qc.s,qc.h()kemudianqc.measure()
- a. Hanya
-
Yang manakah antara keadaan berikut menghasilkan nilai jangkaan terbesar ?
- a.
- b.
- c. juga dikenali sebagai
- d. juga dikenali sebagai
- e. juga dikenali sebagai
- f. juga dikenali sebagai
-
Yang manakah antara keadaan berikut menghasilkan ketakpastian terbesar ?
- a.
- b. juga dikenali sebagai
- c. juga dikenali sebagai
- d. a dan b seri
- e. b dan c seri
- f. a, b, dan c seri
Soalan Perbincangan:
-
Adakah konsep ketakpastian ini bercanggah dengan tanggapan spin sebagai anak panah vektor dalam ruang Cartesian? Bagaimana pula pada sfera Bloch?
-
Andaikan kamu mengarahkan alat pengukuran ke arah yang berada di pertengahan antara paksi dan . Apa yang berlaku? Bolehkah kamu membuat pengukuran ke arah ini? Bagaimana ini berkaitan dengan ketakpastian dalam dan ?
-
Apakah eksperimen tambahan yang ingin kamu lakukan untuk meyakinkan diri kamu tentang keputusan yang diperolehi di sini?