צמצום שגיאת הטרוטר בדינמיקת המילטוניאן באמצעות נוסחאות רב-מכפלה
במחברת זו תלמד/י כיצד להשתמש ב-נוסחת רב-מכפלה (MPF) כדי להשיג שגיאת טרוטר נמוכה יותר באובזרבל שלנו בהשוואה לשגיאה שמייצר המעגל העמוק ביותר של טרוטר שנריץ בפועל. תעשה/י זאת על ידי עבודה לפי השלבים של תבנית Qiskit:
- שלב 1: מיפוי לבעיה קוונטית
- אתחול ההמילטוניאן של הבעיה שלנו
- שימוש ב-MPF ליצירת מעגלי האבולוציה בזמן בשיטת טרוטר
- שלב 2: אופטימיזציה של הבעיה
- כאן נבצע Transpile למעגלים שלנו עבור GenericBackendV2
- שלב 3: ביצוע ניסויים
- שימוש ב-StatevectorEstimator לשם הפשטות במחברת זו
- שלב 4: שחזור תוצאות
- חישוב ערך הציפייה של ה-MPF
שלב 1: מיפוי לבעיה קוונטית
1א: הגדרת ההמילטוניאן שלנו
אנחנו משתמשים במודל איזינג על שרשרת של 10 אתרים:
כאשר הוא עוצמת הצימוד בין שני אתרים ו- הוא השדה המגנטי החיצוני. החבילה qiskit_addon_utils מספקת פונקציות שימושיות לשימוש חוזר למטרות שונות.
המודול qiskit_addon_utils.problem_generators מספק פונקציות ליצירת המילטוניאנים מסוג היזנברג על גרף קישוריות נתון. גרף זה יכול להיות rustworkx.PyGraph או CouplingMap, מה שמקל על השימוש בו בתהליכי עבודה ממוקדי Qiskit.
בהמשך, ניצור שרשרת פשוטה של 10 Qubit באמצעות המתודה CouplingMap.from_line.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-addon-mpf qiskit-addon-utils rustworkx scipy
from qiskit.transpiler import CouplingMap
# Generate some coupling map to use for this example
coupling_map = CouplingMap.from_line(10, bidirectional=False)
from rustworkx.visualization import graphviz_draw
graphviz_draw(coupling_map.graph, method="circo")
לאחר מכן, אנחנו יוצרים את SparsePauliOp על הקישוריות הנתונה עם הקבועים הרצויים.
from qiskit_addon_utils.problem_generators import generate_xyz_hamiltonian
# Get a qubit operator describing the Ising field model
hamiltonian = generate_xyz_hamiltonian(
coupling_map,
coupling_constants=(0.0, 0.0, 1.0),
ext_magnetic_field=(0.4, 0.0, 0.0),
)
print(hamiltonian)
SparsePauliOp(['IIIIIIIZZI', 'IIIIIZZIII', 'IIIZZIIIII', 'IZZIIIIIII', 'IIIIIIIIZZ', 'IIIIIIZZII', 'IIIIZZIIII', 'IIZZIIIIII', 'ZZIIIIIIII', 'IIIIIIIIIX', 'IIIIIIIIXI', 'IIIIIIIXII', 'IIIIIIXIII', 'IIIIIXIIII', 'IIIIXIIIII', 'IIIXIIIIII', 'IIXIIIIIII', 'IXIIIIIIII', 'XIIIIIIIII'],
coeffs=[1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j, 1. +0.j,
1. +0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j, 0.4+0.j,
0.4+0.j, 0.4+0.j, 0.4+0.j])
האובזרבל שנמדוד הוא המגנטיזציה הכוללת, אותה ניתן לבנות בפשטות כמוצג להלן:
from qiskit.quantum_info import SparsePauliOp
L = coupling_map.size()
observable = SparsePauliOp.from_sparse_list([("Z", [i], 1 / L / 2) for i in range(L)], num_qubits=L)
print(observable)
SparsePauliOp(['IIIIIIIIIZ', 'IIIIIIIIZI', 'IIIIIIIZII', 'IIIIIIZIII', 'IIIIIZIIII', 'IIIIZIIIII', 'IIIZIIIIII', 'IIZIIIIIII', 'IZIIIIIIII', 'ZIIIIIIIII'],
coeffs=[0.05+0.j, 0.05+0.j, 0.05+0.j, 0.05+0.j, 0.05+0.j, 0.05+0.j, 0.05+0.j,
0.05+0.j, 0.05+0.j, 0.05+0.j])