انتقل إلى المحتوى الرئيسي
هذا المشروع في مرحلة تجريبية. وجدت خطأ؟ افتح مشكلة على GitHub. لديك سؤال أو فكرة؟ اسأل في Discussions — نحب سماع ملاحظاتك!
كيف جودة الترجمة في هذه الصفحة؟

Dynamics Simulator - دالة Qiskit Function من Q-CTRL Fire Opal

راجع مرجع API.

ملاحظة

Qiskit Functions ميزة تجريبية متاحة فقط لمستخدمي خطط IBM Quantum® Premium Plan وFlex Plan وOn-Prem (عبر IBM Quantum Platform API). وهي في حالة إصدار معاينة وقابلة للتغيير.

نظرة عامة​

إن Q-CTRL Dynamics Simulator هي Qiskit Function من نوع Application لمحاكاة التطور الزمني لنماذج الأجسام المتعددة الكمومية المدعومة على عتاد IBM Quantum. وبدلاً من بناء الدارات الكمومية بنفسك، تحدد النموذج الفيزيائي والحالة الابتدائية ومعاملات التطور الزمني والقيم المرصودة المراد قياسها.

تبني الدالة الدارات الديناميكية المطلوبة وتنفذها، وتطبّق سير عمل Fire Opal للتحسين المراعي للعتاد وكبت الأخطاء. والنتيجة هي أثر زمني لقيم التوقع للقيم المرصودة التي طلبتها. ولأن الدالة تطبّق كبت الأخطاء تلقائياً، يمكنك تشغيل دارات بأعماق قياسية وما زلت ترى إشارات ذات معنى. يقدم Dynamics Simulator دقة حل تضاهي أدوات الحوسبة الكلاسيكية الحديثة الرائدة الحالية، ويحقق ميزة ملموسة في السرعة.

حققت الاختبارات الواقعية توافقاً ضمن 1% من جذر متوسط مربع الخطأ (RMSE) عند المقارنة بأعلى محاكاة شبكات التنسور (tensor-network) الكلاسيكية دقةً. وقد أكدت الاختبارات المستقلة من المجتمع البحثي أن الحاسوب الكمومي يظل دقيقاً حتى بعد العروض الأولية لـ Q-CTRL.

Two plots of classical tensor-network simulations at bond dimensions χ from 64 to 4096. The left plot shows the RMSE against time t, which stays near 0.01 until it rises sharply, later for larger bond dimensions. The right plot shows the simulation time in minutes against time t on a logarithmic scale, which increases with bond dimension.

المعايير المرجعية​

يحدد عدد المواقع عدد الكيوبتات المطلوبة، بينما يتحكم عدد خطوات Trotter في عمق دارات التطور الزمني. يستخدم كل موقع في الشبكة كيوبتين لتمثيل إشغال الاتجاه العلوي (spin-up) والاتجاه السفلي (spin-down).

تم إثبات سير العمل هذا لسلاسل من 60 موقعاً (120 كيوبت) مع 30 خطوة Trotter، ولسلاسل من 31 موقعاً (62 كيوبت) مع 90 خطوة Trotter. يعرض الجدول أدناه موارد الدارة وأوقات تنفيذ QPU من التجارب المبلّغ عنها، والتي أُجريت على جهاز IBM® Heron r3 (ibm_boston) مع 20,000 shot لكل دارة.

حجم النظامخطوات Trotterعمق البوابات ثنائية الكيوبتعدد البوابات ثنائية الكيوبتوقت QPUوقت QPU مع REM + DR
10 مواقع (20 كيوبت)301521,4572m 46s4m 25s
10 مواقع (20 كيوبت)603022,8975m 36s8m 42s
10 مواقع (20 كيوبت)904524,3378m 46s13m 26s
31 موقعاً (62 كيوبت)301524,6492m 46s4m 25s
31 موقعاً (62 كيوبت)603029,2395m 36s8m 42s
31 موقعاً (62 كيوبت)9045213,8298m 46s13m 26s
60 موقعاً (120 كيوبت)301529,0572m 46s4m 25s

عند ثبات عدد خطوات Trotter، يبقى عمق الدارة المبلّغ عنه ووقت QPU كما هما عبر أحجام الأنظمة المختبرة، بينما يزداد عدد البوابات ثنائية الكيوبت. تؤدي زيادة عدد الخطوات إلى دارات أعمق وتتطلب وقت QPU أكثر.

هنا، وقت QPU هو زمن تنفيذ العتاد التراكمي لدارات المحاكاة الرئيسية. ويشمل العمود الأخير أيضاً وقت QPU الخاص بتوصيف الضوضاء المستخدم في تخفيف أخطاء القراءة (REM) واستعادة الاضمحلال (DR). يستخدم هذا الدليل مثالاً صغيراً أحادي البعد لنموذج Fermi-Hubbard لعرض سير العمل الكامل من تعريف النموذج إلى رسم الديناميكيات المقاسة.

وصف الدالة​

تصف الديناميكيات الكمومية كيف يتغير نظام كمومي مع الزمن. تساعدك دراسة هذا التطور على فهم كيفية حركة الجسيمات، وكيفية نشوء الارتباطات، وكيفية استجابة النظام لتغيّر في حالته أو في هاميلتونيانه.

يصف نموذج Fermi-Hubbard فرميونات تتنقل بين مواقع الشبكة وتتفاعل عندما تشغل الموقع نفسه. يجعل التنافس بين القفز والتفاعلات منه نموذجاً مفيداً لدراسة الإلكترونات شديدة الارتباط. ويمكن لتطوره الزمني أن يكشف كيف ينتشر السبين والشحنة، وكيف يسترخي نظام منظّم في البداية.

النموذج​

يدعم Dynamics Simulator سلسلة Fermi-Hubbard أحادية البعد بحدود مفتوحة. لسلسلة من LL موقعاً، يُعرَّف الهاميلتوني كما يلي:

H=−∑i=0L−2∑σ∈{↑,↓}th,i(ciσ†ci+1,σ+ci+1,σ†ciσ)+∑i=0L−1Uini↑ni↓−∑i=0L−1∑σ∈{↑,↓}μiniσ.H = -\sum_{i=0}^{L-2}\sum_{\sigma\in\{\uparrow,\downarrow\}} t_{h,i} \left( c^\dagger_{i\sigma}c_{i+1,\sigma} + c^\dagger_{i+1,\sigma}c_{i\sigma} \right) +\sum_{i=0}^{L-1}U_i n_{i\uparrow}n_{i\downarrow} -\sum_{i=0}^{L-1}\sum_{\sigma\in\{\uparrow,\downarrow\}} \mu_i n_{i\sigma}.

هنا، يقوم ciσ†c^\dagger_{i\sigma} وciσc_{i\sigma} بإنشاء وإفناء فرميون ذي سبين σ\sigma عند الموقع ii. ويقيس مؤثر العدد niσ=ciσ†ciσn_{i\sigma}=c^\dagger_{i\sigma}c_{i\sigma} إشغال مدار السبين ذاك.

تحدد مدخلات النموذج المعاملات التالية:

  • hopping_amplitude: th,it_{h,i}، وهو يتحكم في القفز بين الموقعين المتجاورين ii وi+1i+1.

  • on_site_interaction: UiU_i، التفاعل بين الفرميونات ذات السبين العلوي والسفلي التي تشغل الموقع نفسه.

  • chemical_potential: μi\mu_i، الجهد الكيميائي المحلي، وهو يدخل في الهاميلتوني بإشارة سالبة.

مرّر قيمة عددية (scalar) لاستخدام المعامل نفسه على امتداد السلسلة، أو قائمة لتحديد معاملات لكل رابط أو موقع على حدة.

في وحدات حيث ℏ=1\hbar=1، تتطور الحالة الابتدائية كما يلي:

∣ψ(t)⟩=e−iHt∣ψ(0)⟩.|\psi(t)\rangle=e^{-iHt}|\psi(0)\rangle.

تقدّر الدالة قيم التوقع للقيم المرصودة التي تحددها عند أزمنة محاكاة متعاقبة.

سير العمل​

يتكون سير عمل الدالة من الخطوات التالية:

  1. التركيب الخوارزمي: تستخدم الدالة الهاميلتوني وإعدادات زمن المحاكاة لبناء تسلسل Trotter-Suzuki محسّن، مما يقلل عمق الدارة مع مراعاة دقة المحاكاة.

  2. التعيين المراعي للعتاد: تعيّن الدالة الدارات وتوجّهها باستخدام اتصالية الكيوبتات وخصائص الأخطاء لـ Backend المحدد من IBM Quantum.

  3. كبت الأخطاء على الطبقة الفيزيائية: يدمج Fire Opal الفصل الديناميكي (dynamical decoupling) وتصحيحات على مستوى النبضات لكبت الضوضاء الناتجة عن البيئة والتداخل (crosstalk) أثناء التنفيذ على العتاد.

تدير الدالة هذه المراحل تلقائياً وتُرجع قيم التوقع للقيم المرصودة المطلوبة عبر الزمن.

تحدد المشكلة الفيزيائية وإعدادات المحاكاة عبر مدخلات الدالة. تدعم الواجهة الحالية التطور الزمني بطريقة Trotter، حيث يحدد time_step مدة كل خطوة ويحدد step_count عدد الخطوات.

لمزيد من التفاصيل، راجع نظرة عامة على Fire Opal dynamics simulator ومرجع API لـ simulate_dynamics.

ابدأ​

اعثر على معلومات الوصول لهذه Qiskit Function في Qiskit Functions Catalog.

يوضح هذا الدليل كيفية تحميل Dynamics Simulator ومحاكاة سلسلة Fermi-Hubbard من أربعة مواقع. يفترض الكود التالي أنك حفظت بالفعل مفتاح API الخاص بـ IBM Quantum Platform وCRN الخاص بالنسخة (instance) في بيئتك المحلية.

لإعداد الحساب وتعليمات تثبيت العميل، راجع البدء مع Qiskit Functions.

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"matplotlib": "matplotlib", "numpy": "numpy", "qctrlvisualizer": "qctrlvisualizer", "qiskit_ibm_catalog": "qiskit-ibm-catalog"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
# Access the Q-CTRL Dynamics Simulator Qiskit Function.
sim_qf = catalog.load("q-ctrl/dynamics-simulator")
# Check the list of backends you have access to
catalog.backends()
[<IBMBackend('ibm_boston')>,
<IBMBackend('ibm_fez')>,
<IBMBackend('ibm_kingston')>,
<IBMBackend('ibm_marrakesh')>,
<IBMBackend('ibm_miami')>,
<IBMBackend('ibm_phoenix')>,
<IBMBackend('ibm_pittsburgh')>]
# Select the backend you want to use
backend = catalog.backend("ibm_phoenix")

مثال: محاكاة سلسلة Fermi-Hubbard من أربعة مواقع​

لنفترض سلسلة Fermi-Hubbard أحادية البعد من أربعة مواقع بسعة قفز th=1t_h=1، ودون تفاعل في الموقع نفسه، وبجهد كيميائي صفري. يبدأ فرميون واحد بسبين علوي عند الموقع 0 ويتطور على امتداد السلسلة.

تُبقي هذه المسألة الصغيرة التركيز على سير عمل Dynamics Simulator:

  1. عرّف النموذج والمحاكاة.

  2. عرّف الحالة الابتدائية والقيم المرصودة.

  3. أرسل مهمة Qiskit Function.

  4. استرجع قيم التوقع.

  5. ارسم الديناميكيات.

1. عرّف المسألة​

site_count = 4

model = {
"hopping_amplitude": 1.0,
"on_site_interaction": 0.0,
"chemical_potential": 0.0,
}

simulation = {
"time_step": 0.2,
"step_count": 8,
}

initial_state = "eeeu"

observables = [
{
"operators": [[["Nup", site]]],
"coefficients": [1.0],
}
for site in range(site_count)
]

shot_count = 2048

تقيس قائمة الأوبزرفابل إشغال السبين العلوي

⟨ni↑⟩\langle n_{i\uparrow} \rangle

عند كل موقع. تُعاد الأوبزرفابل بنفس الترتيب الذي قُدِّمت به.

2. شغّل محاكاة الديناميكيات​

أرسل المسألة عبر Qiskit Function. يتولى Qiskit Functions Catalog مصادقة IBM Quantum، لذلك لا تحتاج إلى تمرير بيانات اعتماد Fire Opal أو مزوّد العتاد بشكل منفصل إلى sim_qf.run().

job = sim_qf.run(
model=model,
simulation=simulation,
observables=observables,
initial_state=initial_state,
shots=shot_count,
backend_name=backend.name,
)
print(job.job_id, job.status())
68202fad-6919-425d-8fd2-c1c649cd15b1 DONE

الكائن المُعاد هو مهمة Qiskit Function. يمكنك الاحتفاظ بمعرّف المهمة لاسترجاع حمل العمل أو فحصه لاحقًا.

3. استرجع النتيجة​

result = job.result()

print("Result keys:", sorted(result.keys()))
print("Warnings:", result.get("warnings", []))
Result keys: ['metadata', 'observable_expectation_values', 'observables', 'warnings']
Warnings: []

حوّل القيم المتوقعة للأوبزرفابل إلى مصفوفة NumPy. كل صف يقابل أوبزرفابل واحدًا، وكل عمود يقابل زمن محاكاة مسجّلًا، بدءًا من t=0t=0. في هذا المثال، تحتوي الصفوف الأربعة على إشغال السبين العلوي للمواقع من 0 إلى 3.

import numpy as np

expectation_values = np.asarray(
result["observable_expectation_values"],
dtype=float,
)

print("Expectation-value array shape:", expectation_values.shape)
Expectation-value array shape: (4, 9)

4. صوّر الديناميكيات​

تحتوي الحالة الابتدائية على فرميون واحد بسبين علوي ولا فرميونات بسبين سفلي. لذلك يبقى تطورها داخل الفضاء الجزئي أحادي الجسيم، الذي تقابل حالاته الأساسية الأربع شغل الفرميون للمواقع 0 و1 و2 و3.

في هذا الفضاء الجزئي، يربط الهاميلتوني المواقع المتجاورة بسعة قفز −th-t_h. بالنسبة للمعاملات المستخدمة هنا،

H1p=−th(0100101001010010).H_{\mathrm{1p}} = -t_h \begin{pmatrix} 0 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix}.

اعمل على قطرنة هذه المصفوفة باستخدام NumPy وطوّر الحالة الابتدائية عند نفس الأزمنة التي أعادها Dynamics Simulator. يعطي مربع مقدار سعة كل حالة إشغال السبين العلوي للموقع المقابل.

يعطي هذا الحساب تطورًا دقيقًا للهاميلتوني. قد تشمل الفروقات بين تقديرات العتاد وهذا المرجع خطوة Trotter المحدودة، وإحصاءات القياس، وأخطاء العتاد المتبقية.

times = np.arange(expectation_values.shape[1]) * simulation["time_step"]

# This reference is specific to a single spin-up fermion.
if (
len(initial_state) != site_count
or initial_state.count("u") != 1
or initial_state.count("e") != site_count - 1
):
raise ValueError(
"This reference requires one spin-up fermion and otherwise empty sites."
)

# Build the Hamiltonian in the single-particle subspace.
hamiltonian = -model["hopping_amplitude"] * (
np.eye(site_count, k=1) + np.eye(site_count, k=-1)
)
hamiltonian -= model["chemical_potential"] * np.eye(site_count)

# The rightmost character of initial_state corresponds to site 0.
initial_amplitudes = np.zeros(site_count, dtype=complex)
initial_site = initial_state[::-1].index("u")
initial_amplitudes[initial_site] = 1.0

# Evolve the initial state in the Hamiltonian eigenbasis.
energies, eigenvectors = np.linalg.eigh(hamiltonian)
initial_coefficients = eigenvectors.conj().T @ initial_amplitudes

phases = np.exp(-1j * np.outer(energies, times))
states = eigenvectors @ (initial_coefficients[:, None] * phases)

ideal_expectation_values = np.abs(states) ** 2

ارسم لوحة واحدة لكل موقع. تُظهر المنحنيات المتصلة المرجع الدقيق عند الأزمنة المسجّلة، وتُظهر العلامات تقديرات العتاد التي أعادها Dynamics Simulator.

import matplotlib.pyplot as plt
import qctrlvisualizer as qv
from qctrlvisualizer import QCTRL_STYLE_COLORS as colors

plt.style.use(qv.get_qctrl_style())

fig, ax = plt.subplots(figsize=(10, 6))

for site in range(len(expectation_values)):
site_color = colors[site % len(colors)]

ax.plot(
times,
ideal_expectation_values[site],
color=site_color,
linewidth=2,
label=f"Site {site}: exact reference",
)

ax.plot(
times,
expectation_values[site],
color=site_color,
linestyle="--",
linewidth=1.5,
marker="o",
markersize=5,
label=f"Site {site}: hardware estimate",
)

ax.set_xlim(times[0], times[-1])
ax.set_ylim(-0.05, 1.05)

ax.set_xlabel(r"Time (units of $\hbar/t_h$)")
ax.set_ylabel(r"$\langle n_{i\uparrow} \rangle$")
ax.set_title("Spin-up occupation dynamics")

ax.legend(
ncol=2,
fontsize=10,
loc="best",
)

fig.tight_layout()
plt.show()

Output of the previous code cell

عند t=0t=0، يكون إشغال السبين العلوي الدقيق 1 عند الموقع 0 و0 عند المواقع الأخرى. مع تطور النظام، ينشر القفز احتمال الجسيم على امتداد السلسلة. يزداد إشغال الموقع 1 أولًا، ثم يزداد إشغال الموقعين 2 و3. بالنسبة للمعاملات في هذا المثال، آخر زمن مسجّل هو t=1.6t=1.6. والإشغالات الدقيقة للمواقع من 0 إلى 3 هي تقريبًا 0.026 و0.370 و0.392 و0.211 على التوالي.

تحقق الإشغالات الدقيقة المعادلة التالية في كل زمن، مما يعكس انحفاظ عدد الجسيمات:

∑i=03⟨ni↑(t)⟩=1\sum_{i=0}^{3}\langle n_{i\uparrow}(t)\rangle=1

يمكن أن يرتفع إشغال المواقع الفردية وينخفض مع تطور الجسيم عبر السلسلة المحدودة.

جلب رسائل الخطأ​

إذا دخل حمل العمل في الحالة ERROR، فاستدعِ job.result() لاسترجاع رسالة الخطأ. يمكنك أيضًا فحص سجلات الدالة إن كانت متاحة.

print(job.status())

if job.status() == "ERROR":
print(job.result())
print(job.logs())
DONE

من مشكلات التحقق من المدخلات الشائعة: نموذج أو طريقة محاكاة غير مدعومة، أو سلسلة حالة ابتدائية طويلة جدًا، أو عدم تطابق حدود الأوبزرفابل ومعاملاتها، أو أوبزرفابل يشير إلى موقع خارج سلسلة الحالة الابتدائية.

الحصول على الدعم​

للأسئلة حول Dynamics Simulator أو سلوك Fire Opal، راجع وثائق Q-CTRL أو تواصل مع Q-CTRL.

للأسئلة حول مصادقة Qiskit Functions أو إدارة المهام أو الوصول إلى IBM Quantum Platform، راجع وثائق Qiskit Functions.

الخطوات التالية​

التوصيات