Přeskočit na hlavní obsah

QUICK-PDE: Qiskit Function od ColibriTD

Viz referenci API

poznámka

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ě 2n2^n z nich, kde nn 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.

Pracovní postup funkce QUICK-PDE

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š provádět potlačení šumu v rámci procesu optimalizace CMA, spoléhajíce 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:

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

uu 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: ax+bax + b. Analytické řešení je:

u(t,x)=ax+bat+1.u(t, x) = \frac{ax + b}{at + 1}.

Bezpressurové Eulerovy rovnice modelují stlačitelné neviskózní proudění tekutiny s tlumením následovně:

∂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 představuje pole hustoty, uu pole rychlosti a μ\mu koeficient tlumení. V naší formulaci volíme λ=1\lambda = 1, takže se dále nebude používat jako parametr. Tento případ použití má časové okrajové podmínky: g(0,x)=e−xg(0, x) = e^{-x} a u(0,x)=xu(0, x) = x. Analytické řešení je:

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}}.

Argumenty diferenciálních rovnic pro CFD jsou na pevné mřížce, jak následuje:

  • tt je v rozsahu 0 až 0,95 s 41 vzorkovacími body. xx 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 s jednorozměrným zkouškou tahem, při níž je tyč pevně uchycena v prostoru a táhnuta na druhém konci. Popis problému je následující:

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 představuje objemový modul pružnosti roztahovaného materiálu, nn exponent mocninného zákona, bb sílu na jednotku hmotnosti, ϵ0\epsilon_0 proporcionální mez napětí, σ0\sigma_0 proporcionální mez přetvoření, uu funkci napětí a σ\sigma funkci přetvoření. Analytické řešení je:

σ(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],

kde σ0=g(0)\sigma_0 = g(0) je okrajová podmínka pro napětí při x=0x=0.

Uvažovaná tyč má jednotkovou délku. Tento případ použití má okrajovou podmínku pro povrchové napětí tt, 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:

  • xx 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.

ExampleNumber of qubitsInitializationErrorTotal time (min)Runtime usage (min)
Inviscid Burgers' equation50PHYSICALLY_INFORMED10−210^{-2}6625
Pressureless Euler's equations70PHYSICALLY_INFORMED10−210^{-2}4834
Hypoelastic 1D tensile test18RANDOM10−210^{-2}123100

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 — required packages for this notebook
!pip install -q matplotlib numpy qiskit-ibm-catalog
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 u(0,x)=xu(0,x) = x, 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)

Bezpressurová Eulerova rovnice (CFD)​

U Eulerovy rovnice, pokud jsou počáteční podmínky nastaveny na g(0,x)=e−xg(0, x) = e^{-x} a u(0,x)=xu(0, x) = x, pro dané μ\mu (zde μ=0.1\mu = 0.1) a λ=1\lambda = 1, 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​

Doporučení