QUICK-PDE: Qiskit Function od ColibriTD
Viz referenci API
Qiskit Functions jsou experimentální funkce dostupné uživatelům IBM Quantum® Premium Plan, Flex Plan a On-Prem (prostřednictvím IBM Quantum Platform API) Plan. Jsou ve stavu náhledového vydání a mohou se změnit.
Přehled
Řešič parciálních diferenciálních rovnic (PDE) představený zde je součástí naší platformy Quantum Innovative Computing Kit (QUICK) (QUICK-PDE) a je zabalen jako Qiskit Function. S funkcí QUICK-PDE můžeš řešit doménově specifické parciální diferenciální rovnice na QPU IBM Quantum. Tato funkce je založena na algoritmu popsaném v dokumentu H-DES od ColibriTD. Tento algoritmus dokáže řešit složité multifyzikální problémy, počínaje výpočetní dynamikou tekutin (CFD) a deformací materiálů (MD), přičemž další případy použití přibývají.
Při řešení diferenciálních rovnic jsou zkušební řešení zakódována jako lineární kombinace ortogonálních funkcí (typicky Čebyševovy polynomy, konkrétně z nich, kde je počet qubitů kódujících tvou funkci), parametrizované úhly Variable Quantum Circuit (VQC). Ansatz generuje stav kódující funkci, který je vyhodnocován pozorovatelnými, jejichž kombinace umožňují vyhodnotit funkci ve všech bodech. Poté můžeš vyhodnotit ztrátovou funkci, do které jsou zakódovány diferenciální rovnice, a doladit úhly v hybridní smyčce, jak je znázorněno níže. Zkušební řešení se postupně přibližují skutečným řešením, dokud nedosáhneš uspokojivého výsledku.
Kromě této hybridní smyčky můžeš také řetězit různé optimalizátory dohromady. To je užitečné, když chceš, aby globální optimalizátor nalezl dobrou sadu úhlů, a poté jemnější optimalizátor sledoval gradient k nejlepší sadě sousedních úhlů. V případě výpočetní dynamiky tekutin (CFD) výchozí optimalizační sekvence přináší nejlepší výsledky – v případě deformace materiálů (MD) sice výchozí nastavení poskytuje dobré výsledky, ale můžeš ho dále konfigurovat pro výhody specifické pro daný problém.
Poznámka: pro každou proměnnou funkce specifikujeme počet qubitů (se kterým si můžeš hrát). Naskládáním 10 identických Circuit a vyhodnocením 10 identických pozorovatelných na různých qubitech v rámci jednoho velkého Circuit můžeš v rámci procesu optimalizace CMA provádět mitigaci šumu, přičemž se spoléháš na metodu noise learner, a výrazně snížit počet potřebných měření.
Výpočetní dynamika tekutin
Neviskózní Burgersova rovnice modeluje proudění neviskózních tekutin takto:
představuje pole rychlosti tekutiny. Tento případ použití má časovou okrajovou podmínku: můžeš vybrat počáteční podmínku a pak nechat systém relaxovat. V současnosti jsou přijímány pouze lineární funkce jako počáteční podmínky: . Analytické řešení je:
Beztlakové Eulerovy rovnice modelují stlačitelné neviskózní proudění tekutiny s tlumením následovně:
představuje pole hustoty, pole rychlosti a koeficient tlumení. V naší formulaci volíme , takže se dále nebude používat jako parametr. Tento případ použití má časové okrajové podmínky: a . Analytické řešení je:
Argumenty diferenciálních rovnic pro CFD jsou na pevné mřížce, jak následuje:
- je v rozsahu 0 až 0,95 s 41 vzorkovacími body. je v rozsahu 0 až 0,95 s 41 vzorkovacími body.
Deformace materiálů
Tento případ použití se zaměřuje na hypoelastickou deformaci při jednorozměrné zkoušce tahem, při níž je tyč pevně uchycena v prostoru a táhnuta na druhém konci. Popis problému je následující:
představuje objemový modul pružnosti roztahovaného materiálu, exponent mocninného zákona, sílu na jednotku hmotnosti, proporcionální mez napětí, proporcionální mez přetvoření, funkci napětí a funkci přetvoření. Analytické řešení je:
kde je okrajová podmínka pro přetvoření při .
Uvažovaná tyč má jednotkovou délku. Tento případ použití má okrajovou podmínku pro povrchové napětí , tedy množství práce potřebné k natažení tyče.
Argumenty diferenciálních rovnic pro MD jsou na pevné mřížce, jak následuje:
- je v rozsahu 0 až 1 s 30 vzorkovacími body.
Benchmarky
Následující tabulka uvádí statistiky různých spuštění naší funkce.
| Example | Number of qubits | Initialization | Error | Total time (min) | Runtime usage (min) |
|---|---|---|---|---|---|
| Inviscid Burgers' equation | 50 | PHYSICALLY_INFORMED | 66 | 25 | |
| Pressureless Euler's equations | 70 | PHYSICALLY_INFORMED | 48 | 34 | |
| Hypoelastic 1D tensile test | 18 | RANDOM | 123 | 100 |
Začínáme
Vyplň formulář pro vyžádání přístupu k funkci QUICK-PDE. Poté, za předpokladu, že sis již uložil svůj účet do lokálního prostředí, vyber funkci takto:
# 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")
Příklady
Pro začátek vyzkoušej jeden z následujících příkladů:
Neviskózní Burgersova rovnice (CFD)
U Burgersovy rovnice, pokud jsou počáteční podmínky nastaveny na , výsledky jsou následující:
# 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}
)
Zkontroluj stav úlohy své Qiskit Function nebo získej výsledky takto:
# 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)
Beztlaková Eulerova rovnice (CFD)
U Eulerovy rovnice, pokud jsou počáteční podmínky nastaveny na a , pro dané (zde ) a , výsledky jsou následující:
# 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)
Deformace materiálů
Případ použití deformace materiálů vyžaduje fyzikální parametry tvého materiálu a přiloženou sílu, jak následuje:
# 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()
Následuje příklad, jak získat hodnotu funkce pro konkrétní sadu souřadnic:
# 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
Načítání chybových zpráv
Pokud je stav tvé úlohy ERROR, použij job.error_message() k načtení chybové zprávy pro pomoc při ladění, jak následuje:
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)
Získat podporu
Pro podporu kontaktuj qiskit-function-support@colibritd.com.
Další kroky
- Vyplň formulář pro vyžádání přístupu k funkci QUICK-PDE.
- Navštiv referenci API pro tuto Qiskit Function.
- Vyzkoušej modelování proudění neviskózní tekutiny pomocí QUICK-PDE v tutoriálu.
- Prostuduj Jaffali, H., et al. (2025). H-DES: a Quantum-Classical Hybrid Differential Equation Solver. arXiv preprint arXiv:2410.01130.