דלג לתוכן הראשי
פרויקט זה בשלב בטא. מצאת באג? פתח issue ב-GitHub. יש שאלה או רעיון? שאל ב-Discussions — נשמח לשמוע ממך!
מה איכות התרגום בדף זה?

QUICK-PDE: פונקציית Qiskit מאת ColibriTD

ראה את ה-API reference

הערה

Qiskit Functions הן תכונה ניסיונית הזמינה למשתמשי IBM Quantum® Premium Plan, Flex Plan ו-On-Prem (דרך IBM Quantum Platform API) Plan. הן נמצאות בסטטוס גרסת תצוגה מקדימה וכפופות לשינויים.

סקירה כללית​

פותר המשוואות הדיפרנציאליות החלקיות (PDE) המוצג כאן הוא חלק מפלטפורמת Quantum Innovative Computing Kit (QUICK) שלנו (QUICK-PDE), ומאורז כפונקציית Qiskit. עם פונקציית QUICK-PDE, אתה יכול לפתור משוואות דיפרנציאליות חלקיות ספציפיות לתחום על QPU של IBM Quantum. פונקציה זו מבוססת על האלגוריתם המתואר במאמר תיאור H-DES של ColibriTD. אלגוריתם זה יכול לפתור בעיות מולטי-פיזיקליות מורכבות, החל מדינמיקת נוזלים חישובית (CFD) ועיוות חומרים (MD), ועוד שימושים נוספים בקרוב.

כדי להתמודד עם המשוואות הדיפרנציאליות, פתרונות הניסיון מקודדים כצירופים לינאריים של פונקציות אורתוגונליות (בדרך כלל פולינומי Chebyshev, וספציפית יותר 2n2^n מהם כאשר nn הוא מספר ה-Qubit המקודדים את הפונקציה שלך), שמופרמטרים על ידי זוויות של מעגל קוונטי משתנה (VQC). ה-ansatz מייצר מצב המקודד את הפונקציה, אשר מוערך על ידי אובזרבלים שצירופיהם מאפשרים הערכת הפונקציה בכל הנקודות. לאחר מכן אתה יכול להעריך את פונקציית ההפסד שבה מקודדות המשוואות הדיפרנציאליות, ולכוונן את הזוויות בלולאה היברידית, כפי שמוצג בהמשך. פתרונות הניסיון מתקרבים בהדרגה לפתרונות האמיתיים עד שמגיעים לתוצאה משביעת רצון.

תרשים זרימה של פונקציית QUICK-PDE

בנוסף ללולאה ההיברידית הזו, אתה יכול גם לשרשר מייעלים שונים. זה שימושי כאשר אתה רוצה שמייעל גלובלי ימצא קבוצה טובה של זוויות, ולאחר מכן מייעל מכוון יותר יעקוב אחרי גרדיאנט אל קבוצת הזוויות השכנות הטובה ביותר. במקרה של דינמיקת נוזלים חישובית (CFD), רצף האופטימיזציה ברירת המחדל מפיק את התוצאות הטובות ביותר - אך במקרה של עיוות חומרים (MD), בעוד שברירת המחדל מספקת תוצאות טובות, אתה יכול להגדיר אותה עוד יותר לצרכים ספציפיים לבעיה.

שים לב שעבור כל משתנה של הפונקציה, אנחנו מציינים את מספר ה-Qubit (איתו אתה יכול להתנסות). על ידי שכבוב 10 Circuit זהים והערכת 10 אובזרבלים זהים על qubit שונים לאורך Circuit גדול אחד, אתה יכול להפחית רעש בתוך תהליך האופטימיזציה של CMA, תוך הסתמכות על שיטת לומד הרעש, ולהפחית משמעותית את מספר ה-shots הנדרשים.

דינמיקת נוזלים חישובית​

משוואת 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 נקודות דגימה.

עיוות חומרים​

שימוש זה מתמקד בעיוות היפו-אלסטי עם מבחן המתיחה החד-ממדי, שבו מוט הקבוע במרחב נמשך בקצהו השני. אנחנו מתארים את הבעיה כדלקמן:

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 נקודות דגימה.

מדדים​

הטבלה הבאה מציגה סטטיסטיקות על ריצות שונות של הפונקציה שלנו.

דוגמהמספר qubit-יםאתחולשגיאהזמן כולל (דק')שימוש בסביבת הריצה (דק')
משוואת Burgers ללא צמיגות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.

השלבים הבאים​

המלצות