Sari la conținutul principal

QUICK-PDE: O Funcție Qiskit de la ColibriTD

Consultă referința API

notă

Funcțiile Qiskit sunt o caracteristică experimentală disponibilă utilizatorilor planurilor IBM Quantum® Premium, Flex și On-Prem (prin IBM Quantum Platform API). Acestea se află în stare de previzualizare și pot suferi modificări.

Prezentare generală

Rezolvatorul de Ecuații cu Derivate Parțiale (PDE) prezentat aici face parte din platforma noastră Quantum Innovative Computing Kit (QUICK) (QUICK-PDE) și este ambalat ca o Funcție Qiskit. Cu funcția QUICK-PDE, poți rezolva ecuații cu derivate parțiale specifice unui domeniu pe QPU-urile IBM Quantum. Această funcție se bazează pe algoritmul descris în lucrarea de prezentare H-DES a ColibriTD Acest algoritm poate rezolva probleme complexe de multi-fizică, începând cu Dinamica Computațională a Fluidelor (CFD) și Deformarea Materialelor (MD), urmând să fie adăugate și alte cazuri de utilizare în curând.

Pentru a aborda ecuațiile diferențiale, soluțiile de test sunt codificate ca combinații liniare de funcții ortogonale (de obicei polinoame Chebyshev, și mai specific 2n2^n dintre ele, unde nn este numărul de qubiți care codifică funcția ta), parametrizate prin unghiurile unui Circuit Cuantic Variabil (VQC). Ansatz-ul generează o stare care codifică funcția, evaluată prin observabile ale căror combinații permit evaluarea funcției în toate punctele. Poți apoi evalua funcția de pierdere în care sunt codificate ecuațiile diferențiale și ajusta fin unghiurile într-un ciclu hibrid, după cum este prezentat în continuare. Soluțiile de test se apropie treptat de soluțiile reale până când obții un rezultat satisfăcător.

Fluxul de lucru al funcției QUICK-PDE

Pe lângă acest ciclu hibrid, poți de asemenea înlănțui diferiți optimizatori. Acest lucru este util atunci când dorești ca un optimizator global să găsească un set bun de unghiuri, iar apoi un optimizator mai fin să urmeze un gradient către cel mai bun set de unghiuri vecine. În cazul dinamicii computaționale a fluidelor (CFD), secvența de optimizare implicită produce cele mai bune rezultate — dar în cazul deformării materialelor (MD), deși valorile implicite oferă rezultate bune, le poți configura mai detaliat pentru beneficii specifice problemei.

Reține că, pentru fiecare variabilă a funcției, specificăm numărul de qubiți (cu care poți experimenta). Prin stivuirea a 10 circuite identice și evaluarea celor 10 observabile identice pe qubiți diferiți de-a lungul unui circuit mare, poți aplica atenuarea zgomotului în cadrul procesului de optimizare CMA, bazându-te pe metoda de învățare a zgomotului, și reduce semnificativ numărul de shot-uri necesare.

Dinamica computațională a fluidelor

Ecuația Burgers fără vâscozitate modelează curgerea fluidelor nevâscoase după cum urmează:

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

uu reprezintă câmpul vitezei fluidului. Acest caz de utilizare are o condiție la limită temporală: poți selecta condiția inițială și apoi permite sistemului să se relaxeze. În prezent, singurele condiții inițiale acceptate sunt funcțiile liniare: ax+bax + b.

Argumentele pentru ecuațiile diferențiale ale CFD se află pe o grilă fixă, după cum urmează:

  • tt este între 0 și 0.95 cu 30 de puncte de eșantionare. xx este între 0 și 0.95 cu un pas de 0.2375.

Deformarea Materialelor

Acest caz de utilizare se concentrează pe deformarea hipoelastică cu testul de tracțiune unidimensional, în care o bară fixată în spațiu este trasă la celălalt capăt. Descriem problema după cum urmează:

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 reprezintă modulul de compresibilitate al materialului întins, nn exponentul unei legi de putere, bb forța pe unitate de masă, ϵ0\epsilon_0 limita de stres proporțional, σ0\sigma_0 limita de deformare proporțională, uu funcția de stres și σ\sigma funcția de deformare.

Bara considerată are lungime unitară. Acest caz de utilizare are o condiție la limită pentru stresul de suprafață tt, adică cantitatea de lucru necesară pentru a întinde bara.

Argumentele pentru ecuațiile diferențiale ale MD se află pe o grilă fixă, după cum urmează:

  • xx este între 0 și 1 cu un pas de 0.04.

Benchmark-uri

Tabelul următor prezintă statistici pentru diverse rulări ale funcției noastre.

ExempluNumăr de qubițiInițializareEroareTimp total (min)Utilizare runtime (min)
Ecuația Burgers fără vâscozitate50PHYSICALLY_INFORMED10210^{-2}6625
Test de tracțiune hipoelastic 1D18RANDOM10210^{-2}123100

Primii pași

Completează formularul pentru a solicita acces la funcția QUICK-PDE. Apoi, presupunând că ți-ai salvat deja contul în mediul local, selectează funcția după cum urmează:

# 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")

Exemple

Pentru a începe, încearcă unul dintre următoarele exemple:

Dinamica Computațională a Fluidelor (CFD)

Când condițiile inițiale sunt setate la u(0,x)=xu(0,x) = x, rezultatele sunt după cum urmează:

# 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})

Verifică statusul sarcinii de lucru a Funcției Qiskit sau returnează rezultatele după cum urmează:

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()

Ieșirea celulei de cod anterioare

Deformarea Materialelor

Cazul de utilizare al deformării materialelor necesită parametrii fizici ai materialului tău și forța aplicată, după cum urmează:

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()

Ieșirea celulei de cod anterioare

Urmează un exemplu despre cum să obții valoarea funcției pentru un set specific de coordonate:

# 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

Obține mesaje de eroare

Dacă statusul sarcinii tale de lucru este ERROR, folosește job.error_message() pentru a obține mesajul de eroare care te ajută la depanare, după cum urmează:

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'

Obține suport

Pentru suport, contactează qiskit-function-support@colibritd.com.

Pașii următori

Recomandări