QUICK-PDE: פונקציית Qiskit מאת ColibriTD
פונקציות Qiskit הן תכונה ניסיונית הזמינה למשתמשי 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, וספציפית יותר מהם כאשר הוא מספר ה-Qubit המקודדים את הפונקציה שלך), שמופרמטרים על ידי זוויות של מעגל קוונטי משתנה (VQC). ה-ansatz מייצר מצב המקודד את הפונקציה, אשר מוערך על ידי אובזרבבלים שצירופיהם מאפשרים הערכת הפונקציה בכל הנקודות. לאחר מכן אתה יכול להעריך את פונקציית ההפסד שבה מקודדות המשוואות הדיפרנציאליות, ולכוונן את הזוויות בלולאה היברידית, כפי שמוצג בהמשך. פתרונות הניסיון מתקרבים בהדרגה לפתרונות האמיתיים עד שמגיעים לתוצאה משביעת רצון.
בנוסף ללולאה ההיברידית הזו, אתה יכול גם לשרשר מייעלים שונים. זה שימושי כאשר אתה רוצה שמייעל גלובלי ימצא קבוצה טובה של זוויות, ולאחר מכן מייעל מכוון יותר יעקוב אחרי גרדיאנט אל קבוצת הזוויות השכנות הטובה ביותר. במקרה של דינמיקת נוזלים חישובית (CFD), רצף האופטימיזציה ברירת המחדל מפיק את התוצאות הטובות ביותר - אך במקרה של עיוות חומרים (MD), בעוד שברירת המחדל מספקת תוצאות טובות, אתה יכול להגדיר אותה עוד יותר לצרכים ספציפיים לבעיה.
שים לב שעבור כל משתנה של הפונקציה, אנו מציינים את מספר ה-Qubit (איתו אתה יכול להתנסות). על ידי שכבוב 10 Circuit זהים והערכת 10 אובזרבבלים זהים על Qubit שונים לאורך Circuit גדול אחד, אתה יכול להפחית רעש בתוך תהליך האופטימיזציה של CMA, תוך הסתמכות על שיטת לומד הרעש, ולהפחית משמעותית את מספר ה-shots הנדרשים.
קלט/פלט
דינמיקת נוזלים חישובית
משוואת Burgers ללא צמיגות מדגמת זרימת נוזלים ללא צמיגות כדלקמן:
מייצגת את שדה מהירות הנוזל. לשימוש זה יש תנאי גבול זמני: אתה יכול לבחור את תנאי ההתחלה ולאחר מכן לאפשר למערכת להתרגע. נכון לעכשיו, תנאי ההתחלה המקובלים היחידים הם פונקציות לינאריות: .
הארגומנטים עבור משוואות הדיפרנציאל של CFD נמצאים על רשת קבועה, כדלקמן:
- נמצא בין 0 ל-0.95 עם 30 נקודות דגימה. נמצא בין 0 ל-0.95 עם גודל צעד של 0.2375.
עיוות חומרים
שימוש זה מתמקד בעיוות היפו-אלסטי עם מבחן המתיחה החד-ממדי, שבו מוט הקבוע במרחב נמשך בקצהו השני. אנו מתארים את הבעיה כדלקמן:
מייצג את מודול הנפח של החומר הנמתח, את המעריך של חוק הכוח, את הכוח ליחידת מסה, את גבול מתח הפרופורציה, את גבול עיוות הפרופורציה, את פונקציית המתח, ו- את פונקציית העיוות.
המוט הנחשב הוא באורך יחידה. לשימוש זה יש תנאי גבול למתח פני השטח , או כמות העבודה הנדרשת למתוח את המוט.
הארגומנטים עבור משוואות הדיפרנציאל של MD נמצאים על רשת קבועה, כדלקמן:
- נמצא בין 0 ל-1 עם גודל צעד של 0.04.
קלט
כדי להריץ את פונקציית ה-Qiskit QUICK-PDE, אתה יכול לכוונן את הפרמטרים הבאים:
| שם | סוג | תיאור | ספציפי לשימוש | דוגמה |
|---|---|---|---|---|
| use_case | Literal["MD", "CFD"] | מיתוג לבחירת מערכת המשוואות הדיפרנציאליות לפתרון | לא | "CFD" |
| parameters | dict[str, Any] | פרמטרים של המשוואה הדיפרנציאלית (ראה את הטבלה הבאה לפרטים נוספים) | לא | {"a": 1.0, "b": 1.0} |
| nb_qubits | Optional[dict[str, dict[str, int]]] | מספר ה-Qubit לפי פונקציה ולפי משתנה. הפונקציה בוחרת ערכים אופטימליים, אך אם ברצונך לנסות למצוא שילוב טוב יותר, אתה יכול לעקוף את ערכי ברירת המחדל | לא | {"u": {"x": 1, "t":3}} |
| depth | Optional[dict[str, int]] | עומק ה-ansatz לפי פונקציה. הפונקציה בוחרת ערכים אופטימליים, אך אם ברצונך לנסות למצוא שילוב טוב יותר, אתה יכול לעקוף את ערכי ברירת המחדל | לא | {"u": 4} |
| optimizer | Optional[list[str]] | מייעלים לשימוש, "CMAES" מספריית ה-python cma או אחד ממייעלי scipy | MD | "SLSQP" |
| shots | Optional[list[int]] | מספר ה-shots המשמשים להרצת כל Circuit. מכיוון שנדרשים מספר שלבי אופטימיזציה, אורך הרשימה חייב להיות שווה למספר המייעלים המשמשים (4 במקרה של CFD). ברירת המחדל היא [50_000] * nb_optimizers עבור MD ו-[5_00, 2_000, 5_000, 10_000] עבור CFD | לא | [15_000, 30_000] |
| optimizer_options | Optional[dict[str, Any]] | אפשרויות להעברה למייעל. פרטי קלט זה תלויים במייעל המשמש; לפרטים ספציפיים, עיין בתיעוד המייעל המשמש | MD | {"maxiter": 50 } |
| initialization | Optional[Literal["RANDOM", "PHYSICALLY_INFORMED"]] | האם להתחיל עם זוויות אקראיות או זוויות שנבחרו בחוכמה. שים לב שזוויות שנבחרו בחוכמה עשויות לא לעבוד ב-100% מהמקרים. ברירת המחדל היא "PHYSICALLY_INFORMED". | לא | "RANDOM" |
| backend_name | Optional[str] | שם ה-Backend לשימוש. | לא | "ibm_torino" |
| mode | Optional[Literal["job", "session", "batch"]] | מצב הביצוע לשימוש. ברירת המחדל היא "job". | לא | "job" |
פרמטרי המשוואה הדיפרנציאלית (פרמטרים פיזיקליים ותנאי גבול) צריכים לעקוב אחר הפורמט הנתון:
| שימוש | מפתח | סוג ערך | תיאור | דוגמה |
|---|---|---|---|---|
| CFD | a | float | מקדם של ערכי ההתחלה של | 1.0 |
| CFD | b | float | היסט של ערכי ההתחלה של | 1.0 |
| MD | t | float | מתח פני שטח | 12.0 |
| MD | K | float | מודול נפח | 100.0 |
| MD | n | int | חוק כוח | 4.0 |
| MD | b | float | כוח ליחידת מסה | 10.0 |
| MD | epsilon_0 | float | גבול מתח פרופורציה | 0.1 |
| MD | sigma_0 | float | גבול עיוות פרופורציה | 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