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

QUICK-PDE: دالة Qiskit من ColibriTD

راجع مرجع API

ملاحظة

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

نظرة عامة​

حلّال المعادلات التفاضلية الجزئية (PDE) المقدَّم هنا جزء من منصة Quantum Innovative Computing Kit (QUICK) الخاصة بنا (QUICK-PDE)، وهو مغلَّف كدالة Qiskit. بواسطة دالة QUICK-PDE، يمكنك حل المعادلات التفاضلية الجزئية المتخصصة بمجالات محددة على وحدات معالجة الكم (QPUs) من IBM Quantum. تستند هذه الدالة إلى الخوارزمية الموصوفة في ورقة H-DES من ColibriTD. وتستطيع هذه الخوارزمية حل مسائل الفيزياء المتعددة المعقدة، بدءًا من ديناميكيات الموائع الحسابية (CFD) وتشوه المواد (MD)، مع حالات استخدام أخرى قيد التطوير.

للتعامل مع المعادلات التفاضلية، تُرمَّز الحلول التجريبية على شكل تركيبات خطية من الدوال المتعامدة (عادةً كثيرات حدود شيبيشيف، وتحديدًا 2n2^n منها، حيث nn هو عدد الـ qubits التي ترمّز دالتك)، ومُعامَلة بزوايا دائرة كمية متغيرة (VQC). ينتج الـ ansatz حالة ترمّز الدالة، ويُقيَّم عبر مرصودات تتيح مجموعاتها تقييم الدالة عند جميع النقاط. يمكنك بعد ذلك تقييم دالة الخسارة التي تُرمَّز فيها المعادلات التفاضلية، وضبط الزوايا في حلقة هجينة كما هو موضح أدناه. تقترب الحلول التجريبية تدريجيًا من الحلول الفعلية حتى تصل إلى نتيجة مُرضية.

مسار عمل دالة QUICK-PDE

إضافةً إلى هذه الحلقة الهجينة، يمكنك أيضًا تسلسل محسِّنات مختلفة. يفيد هذا عندما تريد محسِّنًا شاملًا للعثور على مجموعة جيدة من الزوايا، ثم محسِّنًا أدق لاتباع التدرج نحو أفضل مجموعة من الزوايا المجاورة. في حالة ديناميكيات الموائع الحسابية (CFD)، يُعطي تسلسل التحسين الافتراضي أفضل النتائج - أما في حالة تشوه المواد (MD)، فبينما يُعطي الافتراضي نتائج جيدة، يمكنك ضبطه أكثر للحصول على فوائد خاصة بالمسألة.

لاحظ أنه لكل متغير من متغيرات الدالة، نحدد عدد الـ qubits (يمكنك تجربتها). بتكديس 10 دوائر متطابقة وتقييم 10 مرصودات متطابقة على qubits مختلفة عبر دائرة كبيرة واحدة، يمكنك تخفيف الضوضاء ضمن عملية تحسين CMA معتمدًا على طريقة تعلم الضوضاء، وتقليل عدد القياسات المطلوبة بشكل ملحوظ.

ديناميكيات الموائع الحسابية​

معادلة Burgers' غير اللزجة تُنمذج الموائع غير اللزجة المتدفقة كما يلي:

∂u∂t+u∂u∂x=0,\frac{\partial u}{\partial t} + u\frac{\partial u}{\partial x} = 0,

يُمثّل uu حقل سرعة المائع. لهذه الحالة شرط حدي زمني: يمكنك اختيار الشرط الابتدائي ثم السماح للنظام بالاسترخاء. حاليًا، الشروط الابتدائية الوحيدة المقبولة هي الدوال الخطية: ax+bax + b. الحل التحليلي هو:

u(t,x)=ax+bat+1.u(t, x) = \frac{ax + b}{at + 1}.

معادلات أويلر عديمة الضغط تُنمذج تدفق مائع قابل للانضغاط غير لزج مع التخميد كما يلي:

∂g∂t+u∂g∂x+g∂u∂x=0,\frac{\partial g}{\partial t} + u\frac{\partial g}{\partial x} + g\frac{\partial u}{\partial x} = 0,

u∂g∂t+g∂u∂t+u2∂g∂x+2gu∂u∂x+μ(1+t)λgu=0,u\frac{\partial g}{\partial t} + g\frac{\partial u}{\partial t} + u^2\frac{\partial g}{\partial x} + 2gu\frac{\partial u}{\partial x} + \frac{\mu}{(1+t)^{\lambda}} g u = 0,

gg يمثل حقل الكثافة، uu حقل السرعة، وμ\mu معامل التخميد. في صياغتنا، نضع λ=1\lambda = 1، لذا لن يُستخدم كمعامل فيما يلي. تحتوي حالة الاستخدام هذه على شروط حدية زمنية: g(0,x)=e−xg(0, x) = e^{-x} وu(0,x)=xu(0, x) = x. الحل التحليلي هو:

g(t,x)=1−μ(1+t)1−μ−μexp⁡ ⁣((μ−1) x(1+t)1−μ−μ),g(t, x) = \frac{1-\mu}{(1+t)^{1-\mu} - \mu} \exp\!\left(\frac{(\mu-1)\, x}{(1+t)^{1-\mu} - \mu}\right),

u(t,x)=(1−μ) x((1+t)1−μ−μ)(1+t)μ.u(t, x) = \frac{(1-\mu)\, x}{\left((1+t)^{1-\mu} - \mu\right)(1+t)^{\mu}}.

وسيطات المعادلات التفاضلية لـ CFD تقع على شبكة ثابتة كما يلي:

  • tt يقع بين 0 و0.95 بـ 41 نقطة عينة. xx يقع بين 0 و0.95 بـ 41 نقطة عينة.

تشوه المواد​

تركّز هذه الحالة على التشوه ناقص المرونة (hypoelastic) في اختبار الشد أحادي البعد، حيث يُثبَّت قضيب في الفضاء ويُسحب من طرفه الآخر. نصف المسألة كما يلي:

u′−σ3K−23ϵ0(σ′σ03)n=0,u' - \frac{\sigma}{3K} - \frac{2}{\sqrt{3}}\epsilon_0\left(\frac{\sigma'}{\sigma_0\sqrt{3}}\right)^n = 0,

σ′−b=0,\sigma' - b = 0,

KK يمثّل معامل الحجم للمادة المشدودة، nn الأُس في قانون القوى، bb القوة لكل وحدة كتلة، ϵ0\epsilon_0 حد الإجهاد التناسبي، σ0\sigma_0 حد الانفعال التناسبي، uu دالة الإجهاد، وσ\sigma دالة الانفعال. الحل التحليلي هو:

σ(x)=σ0−bx,\sigma(x) = \sigma_0 - bx,

u(x)=−3−(3+n)/22bK(1+n) σ0n[3(1+n)/2b2σ0n(1+n)x2−2⋅3(1+n)/2bσ0n(1+n)σ0x−12ϵ0Kσ01+nu(x) = -\frac{3^{-(3+n)/2}}{2bK(1+n)\,\sigma_0^{n}}\Biggl[3^{(1+n)/2}b^2\sigma_0^n(1+n)x^2 - 2\cdot 3^{(1+n)/2}b\sigma_0^n(1+n)\sigma_0 x - 12\epsilon_0 K\sigma_0^{1+n} −12bϵ0Kσ0nx(−bx+σ0σ0)n+12ϵ0Kσ0n+1(−bx+σ0σ0)n−12ϵ0Kσ01+n],- 12b\epsilon_0 K\sigma_0^n x\left(\frac{-bx+\sigma_0}{\sigma_0}\right)^n + 12\epsilon_0 K\sigma_0^{n+1}\left(\frac{-bx+\sigma_0}{\sigma_0}\right)^n - 12\epsilon_0 K \sigma_0^{1+n}\Biggr],

حيث σ0=g(0)\sigma_0 = g(0) هو الشرط الحدي على الانفعال عند x=0x=0.

طول القضيب المدروس يساوي الوحدة. لهذه الحالة شرط حدي لإجهاد السطح tt، أي مقدار الشغل اللازم لشد القضيب.

وسيطات المعادلات التفاضلية لـ MD تقع على شبكة ثابتة كما يلي:

  • xx يقع بين 0 و1 بـ 30 نقطة عينة.

المعايير القياسية​

يعرض الجدول التالي إحصائيات حول تشغيلات مختلفة لدالتنا.

المثالعدد الـ qubitsالتهيئةالخطأالوقت الإجمالي (دقيقة)استخدام وقت التشغيل (دقيقة)
معادلة بيرغرز غير اللزجة50PHYSICALLY_INFORMED10−210^{-2}6625
معادلات أويلر عديمة الضغط70PHYSICALLY_INFORMED10−210^{-2}4834
اختبار الشد أحادي البعد ناقص المرونة18RANDOM10−210^{-2}123100

ابدأ الآن​

أكمل النموذج لطلب الوصول إلى دالة QUICK-PDE. ثم، بافتراض أنك حفظت حسابك في بيئتك المحلية، اختر الدالة كما يلي:

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

_needed = {"matplotlib": "matplotlib", "numpy": "numpy", "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_cloud / ibm_quantum_platform",
instance="USER_CRN / HGP",
token="USER_API_KEY / IQP_API_TOKEN",
)

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

# Verify that you have access to the function
catalog.list()
quick = catalog.load("colibritd/quick-pde")

أمثلة​

للبدء، جرّب أحد الأمثلة التالية:

معادلة Burgers' غير اللزجة (CFD)​

بالنسبة لمعادلة Burgers'، عند ضبط الشروط الابتدائية على u(0,x)=xu(0,x) = x، تكون النتائج كما يلي:

# launch the simulation with initial conditions u(0,x) = a*x + b
job = quick.run(
use_case="CFD_BURGER", physical_parameters={"a": 1.0, "b": 0.0}
)

تحقق من حالة عبء عمل دالة Qiskit أو استرجع النتائج كما يلي:

# Print the ID so you can use it later, if necessary
print(job.job_id)
print(job.status())
solution = job.result()
import numpy as np
import matplotlib.pyplot as plt

def plot_result_3d(result):
fig = plt.figure()
ax = fig.add_subplot(projection="3d")

t, x = np.meshgrid(result["samples"]["t"], result["samples"]["x"])

ax.plot_surface(
t,
x,
result["functions"]["u"],
edgecolor="royalblue",
lw=0.25,
rstride=26,
cstride=26,
alpha=0.3,
)
ax.scatter(t, x, result["functions"]["u"], marker=".")
ax.set(xlabel="t", ylabel="x", zlabel="u(t,x)")

plt.show()

# Call
plot_result_3d(solution)

معادلة أويلر عديمة الضغط (CFD)​

بالنسبة لمعادلة أويلر، عند ضبط الشروط الابتدائية على g(0,x)=e−xg(0, x) = e^{-x} وu(0,x)=xu(0, x) = x، من أجل μ\mu معطى (هنا، μ=0.1\mu = 0.1) وλ=1\lambda = 1، تكون النتائج كما يلي:

# Launches the solving for an arbitrary mu
job = quick.run(use_case="CFD_EULER", physical_parameters={"mu": 0.1})

solution = job.result()

# Colorplot function
def plot_result_2d(result):
fig, axes = plt.subplots(1, 2, figsize=(14, 5))

configs = {
"g": {"cmap": "viridis", "title": "g(t, x)"},
"u": {"cmap": "plasma", "title": "u(t, x)"},
}

t = result["samples"]["t"]
x = result["samples"]["x"]

for ax, (field, cfg) in zip(axes, configs.items()):
v = result["functions"][field]

im = ax.contourf(t, x, v, levels=50, cmap=cfg["cmap"])
fig.colorbar(im, ax=ax, label=cfg["title"])

ax.set_xlabel("t")
ax.set_ylabel("x")
ax.set_title(cfg["title"], fontsize=13, fontweight="bold")

plt.tight_layout()
plt.show()

plot_result_2d(solution)

تشوه المواد​

تتطلب حالة تشوه المواد المعاملات الفيزيائية للمادة والقوة المطبّقة، كما يلي:

# Select the properties of your material
job = quick.run(
use_case="MD",
physical_parameters={
"t": 12.0,
"K": 100.0,
"n": 4.0,
"b": 10.0,
"epsilon_0": 0.1,
"sigma_0": 5.0,
},
)

# Plot the result
solution = job.result()

_ = plt.figure()
stress_plot = plt.subplot(211)
plt.plot(solution["samples"]["x"], solution["functions"]["u"])
strain_plot = plt.subplot(212)
plt.plot(solution["samples"]["x"], solution["functions"]["sigma"])

plt.show()

المثال التالي يوضح كيفية الحصول على قيمة الدالة عند مجموعة محددة من الإحداثيات:

# u(t=0.2, x=0.7) == 2
assert solution["samples"]["t"][1] == 0.2
assert solution["samples"]["x"][2] == 0.7
assert solution["functions"]["u"][1, 2] == 2

استرجاع رسائل الخطأ​

إذا كانت حالة عبء عملك ERROR، استخدم job.error_message() لاسترجاع رسالة الخطأ للمساعدة في تصحيح الأخطاء، كما يلي:

job = quick.run(use_case="MD", physical_params={})

print(job.error_message())

# A wrapper can also be used for a more human readable version
def pprint_error(job):
print("".join(eval(job.error_message())["error"]))

print("___")
pprint_error(job)

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

للدعم، تواصل عبر qiskit-function-support@colibritd.com.

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

توصيات