Langkau ke kandungan utama

Bina model hingar

Versi pakej

Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
qiskit-aer~=0.17

Halaman ini menunjukkan cara menggunakan modul noise Qiskit Aer untuk membina model hingar bagi mensimulasikan litar kuantum dalam kehadiran ralat. Ini berguna untuk meniru pemproses kuantum yang berbising dan untuk mengkaji kesan hingar terhadap pelaksanaan algoritma kuantum.

# Added by doQumentation β€” required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import Kraus, SuperOp
from qiskit.visualization import plot_histogram
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_aer import AerSimulator

# Import from Qiskit Aer noise module
from qiskit_aer.noise import (
NoiseModel,
QuantumError,
ReadoutError,
depolarizing_error,
pauli_error,
thermal_relaxation_error,
)

Modul noise Qiskit Aer​

Modul noise Qiskit Aer mengandungi kelas Python untuk membina model hingar tersuai bagi simulasi. Terdapat tiga kelas utama:

  1. Kelas NoiseModel yang menyimpan model hingar untuk simulasi berbising.

  2. Kelas QuantumError yang menerangkan ralat Gate CPTP. Ralat ini boleh digunakan:

    • Selepas arahan gate atau reset
    • Sebelum arahan measure.
  3. Kelas ReadoutError yang menerangkan ralat bacaan klasikal.

Memulakan model hingar daripada Backend​

Anda boleh memulakan model hingar dengan parameter yang ditetapkan daripada data penentukuran terkini untuk Backend fizikal:

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.backend("ibm_fez")
noise_model = NoiseModel.from_backend(backend)

Ini akan menghasilkan model hingar yang lebih kurang menghampiri ralat yang akan ditemui semasa menggunakan Backend tersebut. Jika anda mahukan kawalan yang lebih terperinci ke atas parameter model hingar, anda perlu mencipta model hingar sendiri, seperti yang diterangkan dalam bahagian selebihnya pada halaman ini.

Ralat kuantum​

Daripada berurusan terus dengan objek QuantumError, terdapat banyak fungsi pembantu yang boleh menjana jenis ralat kuantum berparameter tertentu secara automatik. Fungsi-fungsi ini terkandung dalam modul noise dan merangkumi pelbagai jenis ralat biasa yang digunakan dalam penyelidikan pengkomputeran kuantum. Nama fungsi dan jenis ralat yang dikembalikannya adalah:

Fungsi ralat piawaiButiran
kraus_errorsaluran ralat CPTP n-Qubit am yang diberikan sebagai senarai matriks Kraus [K0,...][K_0, ...].
mixed_unitary_errorralat unitar bercampur n-Qubit yang diberikan sebagai senarai matriks unitar dan kebarangkalian [(U0,p0),...][(U_0, p_0),...].
coherent_unitary_errorralat unitar koheren n-Qubit yang diberikan sebagai satu matriks unitar UU.
pauli_errorsaluran ralat Pauli n-Qubit (unitar bercampur) yang diberikan sebagai senarai Pauli dan kebarangkalian [(P0,p0),...][(P_0, p_0),...]
depolarizing_errorsaluran ralat depolarisasi n-Qubit yang diparameterpakan oleh kebarangkalian depolarisasi pp.
reset_errorralat set semula satu Qubit yang diparameterpakan oleh kebarangkalian p0,p1p_0, p_1 untuk set semula ke keadaan ∣0⟩\vert0\rangle, ∣1⟩\vert1\rangle.
thermal_relaxation_errorsaluran kelonggaran terma satu Qubit yang diparameterpakan oleh pemalar masa kelonggaran T1T_1, T2T_2, masa gate tt, dan populasi terma keadaan teruja p1p_1.
phase_amplitude_damping_errorsaluran ralat redaman fasa dan amplitud gabungan teritlak satu Qubit yang diberikan oleh parameter redaman amplitud Ξ»\lambda, parameter redaman fasa Ξ³\gamma, dan populasi terma keadaan teruja p1p_1.
amplitude_damping_errorsaluran ralat redaman amplitud teritlak satu Qubit yang diberikan oleh parameter redaman amplitud Ξ»\lambda, dan populasi terma keadaan teruja p1p_1.
phase_damping_errorsaluran ralat redaman fasa satu Qubit yang diberikan oleh parameter redaman fasa Ξ³\gamma.

Menggabungkan ralat kuantum​

Contoh QuantumError boleh digabungkan menggunakan komposisi, hasil darab tensor, dan pengembangan tensor (hasil darab tensor terterbalik) untuk menghasilkan QuantumError baharu seperti berikut:

  • Komposisi: E(ρ)=E2(E1(ρ))\cal{E}(\rho)=\cal{E_2}(\cal{E_1}(\rho)) sebagai error = error1.compose(error2)
  • Hasil darab tensor: E(ρ)=(E1βŠ—E2)(ρ)\cal{E}(\rho) =(\cal{E_1}\otimes\cal{E_2})(\rho) sebagai error = error1.tensor(error2)
  • Hasil darab kembang: E(ρ)=(E2βŠ—E1)(ρ)\cal{E}(\rho) =(\cal{E_2}\otimes\cal{E_1})(\rho) sebagai error = error1.expand(error2)

Contoh​

Untuk membina ralat balik bit satu Qubit sebanyak 5%:

# Construct a 1-qubit bit-flip and phase-flip errors
p_error = 0.05
bit_flip = pauli_error([("X", p_error), ("I", 1 - p_error)])
phase_flip = pauli_error([("Z", p_error), ("I", 1 - p_error)])
print(bit_flip)
print(phase_flip)
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.05, Circuit =
β”Œβ”€β”€β”€β”
q: ─ X β”œ
β””β”€β”€β”€β”˜
P(1) = 0.95, Circuit =
β”Œβ”€β”€β”€β”
q: ─ I β”œ
β””β”€β”€β”€β”˜
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.05, Circuit =
β”Œβ”€β”€β”€β”
q: ─ Z β”œ
β””β”€β”€β”€β”˜
P(1) = 0.95, Circuit =
β”Œβ”€β”€β”€β”
q: ─ I β”œ
β””β”€β”€β”€β”˜
# Compose two bit-flip and phase-flip errors
bitphase_flip = bit_flip.compose(phase_flip)
print(bitphase_flip)
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.0025000000000000005, Circuit =
β”Œβ”€β”€β”€β”β”Œβ”€β”€β”€β”
q: ─ X β”œβ”€ Z β”œ
β””β”€β”€β”€β”˜β””β”€β”€β”€β”˜
P(1) = 0.0475, Circuit =
β”Œβ”€β”€β”€β”β”Œβ”€β”€β”€β”
q: ─ X β”œβ”€ I β”œ
β””β”€β”€β”€β”˜β””β”€β”€β”€β”˜
P(2) = 0.0475, Circuit =
β”Œβ”€β”€β”€β”β”Œβ”€β”€β”€β”
q: ─ I β”œβ”€ Z β”œ
β””β”€β”€β”€β”˜β””β”€β”€β”€β”˜
P(3) = 0.9025, Circuit =
β”Œβ”€β”€β”€β”β”Œβ”€β”€β”€β”
q: ─ I β”œβ”€ I β”œ
β””β”€β”€β”€β”˜β””β”€β”€β”€β”˜
# Tensor product two bit-flip and phase-flip errors with
# bit-flip on qubit-0, phase-flip on qubit-1
error2 = phase_flip.tensor(bit_flip)
print(error2)
QuantumError on 2 qubits. Noise circuits:
P(0) = 0.0025000000000000005, Circuit =
β”Œβ”€β”€β”€β”
q_0: ─ X β”œ
β”œβ”€β”€β”€β”€
q_1: ─ Z β”œ
β””β”€β”€β”€β”˜
P(1) = 0.0475, Circuit =
β”Œβ”€β”€β”€β”
q_0: ─ I β”œ
β”œβ”€β”€β”€β”€
q_1: ─ Z β”œ
β””β”€β”€β”€β”˜
P(2) = 0.0475, Circuit =
β”Œβ”€β”€β”€β”
q_0: ─ X β”œ
β”œβ”€β”€β”€β”€
q_1: ─ I β”œ
β””β”€β”€β”€β”˜
P(3) = 0.9025, Circuit =
β”Œβ”€β”€β”€β”
q_0: ─ I β”œ
β”œβ”€β”€β”€β”€
q_1: ─ I β”œ
β””β”€β”€β”€β”˜

Menukar ke dan daripada operator QuantumChannel​

Kita juga boleh menukar antara objek QuantumError dalam Qiskit Aer dan objek QuantumChannel dalam Qiskit.

# Convert to Kraus operator
bit_flip_kraus = Kraus(bit_flip)
print(bit_flip_kraus)
Kraus([[[-9.74679434e-01+0.j,  0.00000000e+00+0.j],
[ 0.00000000e+00+0.j, -9.74679434e-01+0.j]],

[[ 0.00000000e+00+0.j, 2.23606798e-01+0.j],
[ 2.23606798e-01+0.j, -4.96506831e-17+0.j]]],
input_dims=(2,), output_dims=(2,))
# Convert to Superoperator
phase_flip_sop = SuperOp(phase_flip)
print(phase_flip_sop)
SuperOp([[1. +0.j, 0. +0.j, 0. +0.j, 0. +0.j],
[0. +0.j, 0.9+0.j, 0. +0.j, 0. +0.j],
[0. +0.j, 0. +0.j, 0.9+0.j, 0. +0.j],
[0. +0.j, 0. +0.j, 0. +0.j, 1. +0.j]],
input_dims=(2,), output_dims=(2,))
# Convert back to a quantum error
print(QuantumError(bit_flip_kraus))

# Check conversion is equivalent to original error
QuantumError(bit_flip_kraus) == bit_flip
QuantumError on 1 qubits. Noise circuits:
P(0) = 1.0, Circuit =
β”Œβ”€β”€β”€β”€β”€β”€β”€β”
q: ─ kraus β”œ
β””β”€β”€β”€β”€β”€β”€β”€β”˜
True

Ralat bacaan​

Ralat bacaan klasikal ditentukan oleh senarai vektor kebarangkalian tugasan P(A∣B)P(A|B):

  • AA ialah nilai bit klasikal yang direkod
  • BB ialah nilai bit sebenar yang dikembalikan daripada pengukuran

Contohnya, untuk satu Qubit: P(A∣B)=[P(A∣0),P(A∣1)] P(A|B) = [P(A|0), P(A|1)].

# Measurement misassignment probabilities
p0given1 = 0.1
p1given0 = 0.05

ReadoutError([[1 - p1given0, p1given0], [p0given1, 1 - p0given1]])
ReadoutError([[0.95 0.05]
[0.1 0.9 ]])

Ralat bacaan juga boleh digabungkan menggunakan compose, tensor dan expand, sama seperti ralat kuantum.

Tambah ralat pada model hingar​

Apabila menambah ralat kuantum pada model hingar, kita perlu menentukan jenis arahan yang ia bertindak ke atasnya dan Qubit mana yang hendak digunakan. Terdapat dua kes ralat kuantum:

  1. Ralat kuantum semua Qubit
  2. Ralat kuantum Qubit tertentu

1. Ralat kuantum semua Qubit​

Ini menerapkan ralat yang sama pada setiap kemunculan sesuatu arahan, tanpa mengira Qubit mana yang ia bertindak ke atasnya.

Ia ditambah sebagai noise_model.add_all_qubit_quantum_error(error, instructions):

# Create an empty noise model
noise_model = NoiseModel()

# Add depolarizing error to all single qubit u1, u2, u3 gates
error = depolarizing_error(0.05, 1)
noise_model.add_all_qubit_quantum_error(error, ["u1", "u2", "u3"])

# Print noise model info
print(noise_model)
NoiseModel:
Basis gates: ['cx', 'id', 'rz', 'sx', 'u1', 'u2', 'u3']
Instructions with noise: ['u3', 'u2', 'u1']
All-qubits errors: ['u1', 'u2', 'u3']

2. Ralat kuantum Qubit tertentu​

Ini menerapkan ralat pada setiap kemunculan arahan yang bertindak ke atas senarai Qubit yang ditetapkan. Perlu diambil perhatian bahawa susunan Qubit adalah penting: sebagai contoh, ralat yang digunakan pada Qubit [0, 1] untuk gate dua Qubit adalah berbeza dengan ralat pada Qubit [1, 0].

Ia ditambah sebagai noise_model.add_quantum_error(error, instructions, qubits):

# Create an empty noise model
noise_model = NoiseModel()

# Add depolarizing error to all single qubit u1, u2, u3 gates on qubit 0 only
error = depolarizing_error(0.05, 1)
noise_model.add_quantum_error(error, ["u1", "u2", "u3"], [0])

# Print noise model info
print(noise_model)
NoiseModel:
Basis gates: ['cx', 'id', 'rz', 'sx', 'u1', 'u2', 'u3']
Instructions with noise: ['u3', 'u2', 'u1']
Qubits with noise: [0]
Specific qubit errors: [('u1', (0,)), ('u2', (0,)), ('u3', (0,))]

Nota mengenai ralat kuantum Qubit bukan setempat​

NoiseModel tidak menyokong penambahan ralat kuantum Qubit bukan setempat. Ralat-ralat ini perlu dikendalikan di luar NoiseModel. Ini bermakna anda perlu menulis laluan Transpiler anda sendiri (TransformationPass) dan menjalankan laluan tersebut sejurus sebelum menjalankan simulator jika anda perlu memasukkan ralat kuantum ke dalam Circuit anda mengikut syarat-syarat anda sendiri.

Laksanakan simulasi berbising dengan model hingar​

Arahan AerSimulator(noise_model=noise_model) mengembalikan simulator yang dikonfigurasikan mengikut model hingar yang diberikan. Selain menetapkan model hingar simulator, ia juga mengatasi gate asas simulator, mengikut gate dalam model hingar.

Contoh model hingar​

Sekarang kita akan lihat beberapa contoh model hingar. Untuk demonstrasi ini, kita gunakan litar ujian mudah yang menjana keadaan GHZ n-Qubit:

# System Specification
n_qubits = 4
circ = QuantumCircuit(n_qubits)

# Test Circuit
circ.h(0)
for qubit in range(n_qubits - 1):
circ.cx(qubit, qubit + 1)
circ.measure_all()
print(circ)
β”Œβ”€β”€β”€β”                β–‘ β”Œβ”€β”
q_0: ─ H β”œβ”€β”€β– β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–‘β”€β”€Mβ”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€
β””β”€β”€β”€β”˜β”Œβ”€β”΄β”€β” β–‘ β””β•₯β”˜β”Œβ”€β”
q_1: ────── X β”œβ”€β”€β– β”€β”€β”€β”€β”€β”€β”€β”€β–‘β”€β”€β•«β”€β”€Mβ”œβ”€β”€β”€β”€β”€β”€
β””β”€β”€β”€β”˜β”Œβ”€β”΄β”€β” β–‘ β•‘ β””β•₯β”˜β”Œβ”€β”
q_2: ─────────── X β”œβ”€β”€β– β”€β”€β”€β–‘β”€β”€β•«β”€β”€β•«β”€β”€Mβ”œβ”€β”€β”€
β””β”€β”€β”€β”˜β”Œβ”€β”΄β”€β” β–‘ β•‘ β•‘ β””β•₯β”˜β”Œβ”€β”
q_3: ──────────────── X β”œβ”€β–‘β”€β”€β•«β”€β”€β•«β”€β”€β•«β”€β”€Mβ”œ
β””β”€β”€β”€β”˜ β–‘ β•‘ β•‘ β•‘ β””β•₯β”˜
meas: 4/════════════════════════╩══╩══╩══╩═
0 1 2 3

Simulasi ideal​

# Ideal simulator and execution
sim_ideal = AerSimulator()
result_ideal = sim_ideal.run(circ).result()
plot_histogram(result_ideal.get_counts(0))

Output of the previous code cell

Contoh hingar 1: Model hingar ralat bit-flip asas​

Mari kita tengok satu contoh model hingar mainan mudah yang lazim dalam penyelidikan teori maklumat kuantum:

  • Apabila menerapkan Gate satu-Qubit, balikkan keadaan Qubit dengan kebarangkalian p_gate1.
  • Apabila menerapkan Gate dua-Qubit, kenakan ralat satu-Qubit pada setiap Qubit.
  • Apabila menetapkan semula Qubit, tetapkan semula ke 1 bukannya 0 dengan kebarangkalian p_reset.
  • Apabila mengukur Qubit, balikkan keadaan Qubit dengan kebarangkalian p_meas.
# Example error probabilities
p_reset = 0.03
p_meas = 0.1
p_gate1 = 0.05

# QuantumError objects
error_reset = pauli_error([("X", p_reset), ("I", 1 - p_reset)])
error_meas = pauli_error([("X", p_meas), ("I", 1 - p_meas)])
error_gate1 = pauli_error([("X", p_gate1), ("I", 1 - p_gate1)])
error_gate2 = error_gate1.tensor(error_gate1)

# Add errors to noise model
noise_bit_flip = NoiseModel()
noise_bit_flip.add_all_qubit_quantum_error(error_reset, "reset")
noise_bit_flip.add_all_qubit_quantum_error(error_meas, "measure")
noise_bit_flip.add_all_qubit_quantum_error(error_gate1, ["u1", "u2", "u3"])
noise_bit_flip.add_all_qubit_quantum_error(error_gate2, ["cx"])

print(noise_bit_flip)
NoiseModel:
Basis gates: ['cx', 'id', 'rz', 'sx', 'u1', 'u2', 'u3']
Instructions with noise: ['u3', 'u2', 'measure', 'cx', 'reset', 'u1']
All-qubits errors: ['reset', 'measure', 'u1', 'u2', 'u3', 'cx']

Jalankan simulasi beringar​

# Create noisy simulator backend
sim_noise = AerSimulator(noise_model=noise_bit_flip)

# Transpile circuit for noisy basis gates
passmanager = generate_preset_pass_manager(
optimization_level=3, backend=sim_noise
)
circ_tnoise = passmanager.run(circ)

# Run and get counts
result_bit_flip = sim_noise.run(circ_tnoise).result()
counts_bit_flip = result_bit_flip.get_counts(0)

# Plot noisy output
plot_histogram(counts_bit_flip)

Output of the previous code cell

Contoh 2: Kelonggaran terma T1/T2​

Sekarang mari kita pertimbangkan model ralat yang lebih realistik berdasarkan kelonggaran terma dengan persekitaran Qubit:

  • Setiap Qubit diparameterkan dengan pemalar masa kelonggaran terma T1T_1 dan pemalar masa dephasing T2T_2.
  • Perlu diingat bahawa kita mesti ada T2≀2T1T_2 \le 2 T_1.
  • Kadar ralat pada arahan ditentukan oleh masa Gate dan nilai T1T_1, T2T_2 Qubit.
# T1 and T2 values for qubits 0-3
T1s = np.random.normal(
50e3, 10e3, 4
) # Sampled from normal distribution mean 50 microsec
T2s = np.random.normal(
70e3, 10e3, 4
) # Sampled from normal distribution mean 50 microsec

# Truncate random T2s <= T1s
T2s = np.array([min(T2s[j], 2 * T1s[j]) for j in range(4)])

# Instruction times (in nanoseconds)
time_u1 = 0 # virtual gate
time_u2 = 50 # (single X90 pulse)
time_u3 = 100 # (two X90 pulses)
time_cx = 300
time_reset = 1000 # 1 microsecond
time_measure = 1000 # 1 microsecond

# QuantumError objects
errors_reset = [
thermal_relaxation_error(t1, t2, time_reset) for t1, t2 in zip(T1s, T2s)
]
errors_measure = [
thermal_relaxation_error(t1, t2, time_measure) for t1, t2 in zip(T1s, T2s)
]
errors_u1 = [
thermal_relaxation_error(t1, t2, time_u1) for t1, t2 in zip(T1s, T2s)
]
errors_u2 = [
thermal_relaxation_error(t1, t2, time_u2) for t1, t2 in zip(T1s, T2s)
]
errors_u3 = [
thermal_relaxation_error(t1, t2, time_u3) for t1, t2 in zip(T1s, T2s)
]
errors_cx = [
[
thermal_relaxation_error(t1a, t2a, time_cx).expand(
thermal_relaxation_error(t1b, t2b, time_cx)
)
for t1a, t2a in zip(T1s, T2s)
]
for t1b, t2b in zip(T1s, T2s)
]

# Add errors to noise model
noise_thermal = NoiseModel()
for j in range(4):
noise_thermal.add_quantum_error(errors_reset[j], "reset", [j])
noise_thermal.add_quantum_error(errors_measure[j], "measure", [j])
noise_thermal.add_quantum_error(errors_u1[j], "u1", [j])
noise_thermal.add_quantum_error(errors_u2[j], "u2", [j])
noise_thermal.add_quantum_error(errors_u3[j], "u3", [j])
for k in range(4):
noise_thermal.add_quantum_error(errors_cx[j][k], "cx", [j, k])

print(noise_thermal)
NoiseModel:
Basis gates: ['cx', 'id', 'rz', 'sx', 'u2', 'u3']
Instructions with noise: ['u3', 'u2', 'measure', 'cx', 'reset']
Qubits with noise: [0, 1, 2, 3]
Specific qubit errors: [('reset', (0,)), ('reset', (1,)), ('reset', (2,)), ('reset', (3,)), ('measure', (0,)), ('measure', (1,)), ('measure', (2,)), ('measure', (3,)), ('u2', (0,)), ('u2', (1,)), ('u2', (2,)), ('u2', (3,)), ('u3', (0,)), ('u3', (1,)), ('u3', (2,)), ('u3', (3,)), ('cx', (0, 0)), ('cx', (0, 1)), ('cx', (0, 2)), ('cx', (0, 3)), ('cx', (1, 0)), ('cx', (1, 1)), ('cx', (1, 2)), ('cx', (1, 3)), ('cx', (2, 0)), ('cx', (2, 1)), ('cx', (2, 2)), ('cx', (2, 3)), ('cx', (3, 0)), ('cx', (3, 1)), ('cx', (3, 2)), ('cx', (3, 3))]

Jalankan simulasi beringar​

# Run the noisy simulation
sim_thermal = AerSimulator(noise_model=noise_thermal)

# Transpile circuit for noisy basis gates
passmanager = generate_preset_pass_manager(
optimization_level=3, backend=sim_thermal
)
circ_tthermal = passmanager.run(circ)

# Run and get counts
result_thermal = sim_thermal.run(circ_tthermal).result()
counts_thermal = result_thermal.get_counts(0)

# Plot noisy output
plot_histogram(counts_thermal)

Output of the previous code cell

Langkah seterusnya​

Cadangan
Source: IBM Quantum docs β€” updated 27 Apr 2026
English version on doQumentation β€” updated 7 Mei 2026
This translation based on the English version of 11 Mac 2026