انتقل إلى المحتوى الرئيسي

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

ملاحظة

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

نظرة عامة

حلّال المعادلات التفاضلية الجزئية (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' اللاعكوسة تُنمذج الموائع غير اللزجة المتدفقة كما يلي:

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

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

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

  • tt بين 0 و 0.95 بـ 30 نقطة عينة. xx بين 0 و 0.95 بخطوة حجمها 0.2375.

تشوه المواد

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

uσ3K23ϵ0(σσ03)n=0u' - \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 دالة الانفعال.

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

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

  • xx بين 0 و 1 بخطوة حجمها 0.04.

المدخلات

لتشغيل دالة QUICK-PDE Qiskit، يمكنك ضبط المعاملات التالية:

الاسمالنوعالوصفخاص بحالة الاستخداممثال
use_caseLiteral["MD", "CFD"]للتبديل بين أنظمة المعادلات التفاضلية المراد حلهالا"CFD"
parametersdict[str, Any]معاملات المعادلة التفاضلية (انظر الجدول التالي لمزيد من التفاصيل)لا{"a": 1.0, "b": 1.0}
nb_qubitsOptional[dict[str, dict[str, int]]]عدد الـ Qubits لكل دالة ولكل متغير. تختار الدالة قيمًا محسَّنة افتراضيًا، لكن إن أردت تجربة تركيبة أفضل يمكنك تجاوز القيم الافتراضيةلا{"u": {"x": 1, "t":3}}
depthOptional[dict[str, int]]عمق الـ ansatz لكل دالة. تختار الدالة قيمًا محسَّنة افتراضيًا، لكن إن أردت تجربة تركيبة أفضل يمكنك تجاوز القيم الافتراضيةلا{"u": 4}
optimizerOptional[list[str]]المحسِّنات المستخدَمة، إما "CMAES" من مكتبة cma بايثون أو أحد محسِّنات scipyMD"SLSQP"
shotsOptional[list[int]]عدد القياسات لتشغيل كل دائرة. نظرًا لضرورة عدة خطوات تحسين، يجب أن يساوي طول القائمة عدد المحسِّنات المستخدمة (4 في حالة CFD). الافتراضي [50_000] * nb_optimizers لـ MD و[5_00, 2_000, 5_000, 10_000] لـ CFDلا[15_000, 30_000]
optimizer_optionsOptional[dict[str, Any]]خيارات تُمرَّر إلى المحسِّن. تفاصيل هذا المدخل تعتمد على المحسِّن المستخدم؛ للتفاصيل، راجع توثيق المحسِّن المستخدمMD{"maxiter": 50 }
initializationOptional[Literal["RANDOM", "PHYSICALLY_INFORMED"]]هل تبدأ بزوايا عشوائية أم بزوايا مختارة بذكاء. انتبه أن الزوايا المختارة بذكاء قد لا تعمل في 100% من الحالات. الافتراضي "PHYSICALLY_INFORMED".لا"RANDOM"
backend_nameOptional[str]اسم الـ Backend المستخدَم.لا"ibm_torino"
modeOptional[Literal["job", "session", "batch"]]وضع التنفيذ المستخدَم. الافتراضي "job".لا"job"

يجب أن تتبع معاملات المعادلة التفاضلية (المعاملات الفيزيائية والشرط الحدودي) الصيغة التالية:

حالة الاستخدامالمفتاحنوع القيمةالوصفمثال
CFDafloatمعامل القيم الابتدائية لـ uu1.0
CFDbfloatإزاحة القيم الابتدائية لـ uu1.0
MDtfloatإجهاد السطح12.0
MDKfloatمعامل الانتفاخ100.0
MDnintقانون القوى4.0
MDbfloatالقوة لكل وحدة كتلة10.0
MDepsilon_0floatحد الإجهاد التناسبي0.1
MDsigma_0floatحد الانفعال التناسبي5.0

المخرجات

المخرج عبارة عن قاموس يحتوي على قائمة نقاط العينات وقيم الدوال عند كل نقطة من هذه النقاط:

# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit-ibm-catalog
from numpy import array
solution = {
"functions": {
"u": array(
[
[0.01, 0.1, 1],
[0.02, 0.2, 2],
[0.03, 0.3, 3],
[0.04, 0.4, 4],
]
),
},
"samples": {
"t": array([0.1, 0.2, 0.3, 0.4]),
"x": array([0.5, 0.6, 0.7]),
},
}

شكل مصفوفة الحل يعتمد على عينات المتغيرات:

assert len(solution["functions"]["u"].shape) == len(solution["samples"])
for col_size, samples in zip(
solution["functions"]["u"].shape, solution["samples"].values()
):
assert col_size == len(samples)

يتم الربط بين نقاط عينة متغيرات الدالة وأبعاد مصفوفة الحل وفق الترتيب الأبجدي الرقمي لأسماء المتغيرات. مثلًا، إذا كانت المتغيرات "t" و"x"، يمثّل صف واحد من solution["functions"]["u"] قيم الحل لقيمة ثابتة من "t"، ويمثّل عمود واحد من solution["functions"]["u"] قيم الحل لقيمة ثابتة من "x".

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

# 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

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

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

المثالعدد الـ Qubitsالتهيئةالخطأالوقت الإجمالي (دقيقة)استخدام وقت التشغيل (دقيقة)
معادلة Burgers' اللاعكوسة50PHYSICALLY_INFORMED10210^{-2}6625
اختبار الشد أحادي البعد المرن الهاز18RANDOM10210^{-2}123100

ابدأ الآن

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

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

quick = catalog.load("colibritd/quick-pde")

أمثلة

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

ديناميكيات الموائع الحسابية (CFD)

عند ضبط الشروط الابتدائية على 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", physical_parameters={"a": 1.0, "b": 0.0})

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

print(job.status())
solution = job.result()
'QUEUED'
import numpy as np
import matplotlib.pyplot as plt

_ = plt.figure()
ax = plt.axes(projection="3d")

# plot the solution using the 3d plotting capabilities of pyplot
t, x = np.meshgrid(solution["samples"]["t"], solution["samples"]["x"])
ax.plot_surface(
t,
x,
solution["functions"]["u"],
edgecolor="royalblue",
lw=0.25,
rstride=26,
cstride=26,
alpha=0.3,
)
ax.scatter(t, x, solution["functions"]["u"], marker=".")
ax.set(xlabel="t", ylabel="x", zlabel="u(t,x)")

plt.show()

ناتج خلية الكود السابقة

تشوه المواد

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

import matplotlib.pyplot as plt

# 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()

ناتج خلية الكود السابقة

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

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

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

print(job.error_message())

# or write a wrapper around it for a more human readable version
def pprint_error(job):
print("".join(eval(job.error_message())["error"]))

print("___")
pprint_error(job)
{"error": ["qiskit.exceptions.QiskitError: 'Unknown argument \"physical_params\", did you make a typo? -- https://docs.quantum.ibm.com/errors#1804'\n"]}
___
qiskit.exceptions.QiskitError: 'Unknown argument "physical_params", did you make a typo? -- https://docs.quantum.ibm.com/errors#1804'

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

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

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