Перейти до основного вмісту

QUICK-PDE: функція Qiskit від ColibriTD

Дивись довідник API

примітка

Функції 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. Ця функція базується на алгоритмі, описаному в статті ColibriTD про H-DES. Цей алгоритм може розв'язувати складні мультифізичні задачі, починаючи з обчислювальної гідродинаміки (CFD) та деформації матеріалів (MD), і незабаром з'являться нові варіанти використання.

Щоб впоратися з диференціальними рівняннями, пробні розв'язки кодуються як лінійні комбінації ортогональних функцій (зазвичай поліноми Чебишева, і конкретніше 2n2^n таких, де nn — кількість кубітів, що кодують твою функцію), параметризовані кутами Змінного Квантового Ланцюга (VQC). Анзац генерує стан, що кодує функцію, яку обчислюють спостережувані величини, комбінації яких дозволяють обчислити функцію у всіх точках. Потім ти можеш обчислити функцію втрат, у якій закодовано диференціальні рівняння, та налаштувати кути в гібридному циклі, як показано нижче. Пробні розв'язки поступово наближаються до фактичних розв'язків, доки не буде досягнуто задовільного результату.

Робочий процес функції QUICK-PDE

На додаток до цього гібридного циклу, ти також можеш поєднувати різні оптимізатори в ланцюжок. Це корисно, коли потрібно, щоб глобальний оптимізатор знайшов хороший набір кутів, а потім точніший оптимізатор пішов за градієнтом до найкращого набору сусідніх кутів. У випадку обчислювальної гідродинаміки (CFD) стандартна послідовність оптимізації дає найкращі результати — але у випадку деформації матеріалів (MD), хоча стандартні налаштування і дають хороші результати, ти можеш налаштувати її додатково для переваг, специфічних для конкретної задачі.

Зауваж, що для кожної змінної функції ми вказуємо кількість кубітів (з якою ти можеш експериментувати). Стекуючи 10 ідентичних схем та обчислюючи 10 ідентичних спостережуваних на різних кубітах в одній великій схемі, ти можеш знижувати шуми в процесі CMA-оптимізації, спираючись на метод навчання шумів, та значно зменшити потрібну кількість знімків (shots).

Обчислювальна гідродинаміка

Невʼязке рівняння Бюргерса моделює потік невʼязкої рідини таким чином:

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.

Бенчмарки

У наступній таблиці представлено статистику різних запусків нашої функції.

ПрикладКількість кубітівІніціалізаціяПохибкаЗагальний час (хв)Використання середовища виконання (хв)
Невʼязке рівняння Бюргерса50PHYSICALLY_INFORMED10210^{-2}6625
Гіпопружне одновимірне розтягнення18RANDOM10210^{-2}123100

Початок роботи

Заповни форму для запиту доступу до функції QUICK-PDE. Потім, якщо ти вже зберіг свій обліковий запис у локальному середовищі, вибери функцію таким чином:

# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit-ibm-catalog
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()

Вихідні дані попередньої комірки коду

Нижче наведено приклад того, як отримати значення функції для конкретного набору координат:

# 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="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.

Наступні кроки

Рекомендації