Zum Hauptinhalt springen

QUICK-PDE: Eine Qiskit Function von ColibriTD

Siehe die API-Referenz

hinweis

Qiskit Functions sind eine experimentelle Funktion, die Benutzern des IBM Quantum® Premium Plans, Flex Plans und On-Prem (über IBM Quantum Platform API) Plans zur Verfügung steht. Sie befinden sich im Preview-Release-Status und können sich ändern.

Überblick

Der hier vorgestellte Solver für partielle Differentialgleichungen (PDE) ist Teil unserer Quantum Innovative Computing Kit (QUICK)-Plattform (QUICK-PDE) und wird als Qiskit Function bereitgestellt. Mit der QUICK-PDE-Funktion kannst du domänenspezifische partielle Differentialgleichungen auf IBM Quantum QPUs lösen. Diese Funktion basiert auf dem in ColibriTDs H-DES-Beschreibungspapier beschriebenen Algorithmus. Dieser Algorithmus kann komplexe Multiphysik-Probleme lösen, beginnend mit Computational Fluid Dynamics (CFD) und Materials Deformation (MD), wobei weitere Anwendungsfälle in Kürze folgen.

Um die Differentialgleichungen anzugehen, werden die Testlösungen als Linearkombinationen orthogonaler Funktionen (typischerweise Chebyshev-Polynome, und genauer 2n2^n davon, wobei nn die Anzahl der Qubits ist, die deine Funktion kodieren) kodiert, parametrisiert durch die Winkel einer Variable Quantum Circuit (VQC). Der Ansatz erzeugt einen Zustand, der die Funktion kodiert, die durch Observablen ausgewertet wird, deren Kombinationen die Auswertung der Funktion an allen Punkten ermöglichen. Du kannst dann die Verlustfunktion auswerten, in der die Differentialgleichungen kodiert sind, und die Winkel in einer hybriden Schleife feinabstimmen, wie im Folgenden gezeigt. Die Testlösungen kommen den tatsächlichen Lösungen schrittweise näher, bis du ein zufriedenstellendes Ergebnis erreichst.

Workflow der QUICK-PDE-Funktion

Zusätzlich zu dieser hybriden Schleife kannst du auch verschiedene Optimierer verketten. Dies ist nützlich, wenn du einen globalen Optimierer verwenden möchtest, um einen guten Satz von Winkeln zu finden, und dann einen feineren Optimierer, um einem Gradienten zum besten Satz benachbarter Winkel zu folgen. Im Fall der Computational Fluid Dynamics (CFD) liefert die Standard-Optimierungssequenz die besten Ergebnisse - aber im Fall der Material Deformation (MD) kannst du, während der Standard gute Ergebnisse liefert, ihn für problemspezifische Vorteile weiter konfigurieren.

Beachte, dass wir für jede Variable der Funktion die Anzahl der Qubits angeben (mit der du experimentieren kannst). Durch das Stapeln von 10 identischen Schaltungen und die Auswertung der 10 identischen Observablen auf verschiedenen Qubits durch eine große Schaltung kannst du innerhalb des CMA-Optimierungsprozesses Rauschminderung durchführen, wobei du auf die Noise-Learner-Methode vertraust und die Anzahl der benötigten Shots erheblich reduzierst.

Computational fluid dynamics

Die inviszide Burgers-Gleichung modelliert strömende nicht-viskose Flüssigkeiten wie folgt:

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

uu stellt das Fluidgeschwindigkeitsfeld dar. Dieser Anwendungsfall hat eine zeitliche Randbedingung: Du kannst die Anfangsbedingung auswählen und dann das System relaxieren lassen. Derzeit sind die einzigen akzeptierten Anfangsbedingungen lineare Funktionen: ax+bax + b.

Die Argumente für CFDs Differentialgleichungen befinden sich auf einem festen Gitter wie folgt:

  • tt liegt zwischen 0 und 0,95 mit 30 Abtastpunkten. xx liegt zwischen 0 und 0,95 mit einer Schrittweite von 0,2375.

Material deformation

Dieser Anwendungsfall konzentriert sich auf hypoelastische Verformung mit dem eindimensionalen Zugversuch, bei dem ein im Raum fixierter Stab an seinem anderen Ende gezogen wird. Wir beschreiben das Problem wie folgt:

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 stellt den Kompressionsmodul des gedehnten Materials dar, nn den Exponenten eines Potenzgesetzes, bb die Kraft pro Masseneinheit, ϵ0\epsilon_0 die Proportionalitätsspannungsgrenze, σ0\sigma_0 die Proportionalitätsdehnungsgrenze, uu die Spannungsfunktion und σ\sigma die Dehnungsfunktion.

Der betrachtete Stab hat eine Einheitslänge. Dieser Anwendungsfall hat eine Randbedingung für Oberflächenspannung tt, oder die Menge an Arbeit, die benötigt wird, um den Stab zu dehnen.

Die Argumente für MDs Differentialgleichungen befinden sich auf einem festen Gitter wie folgt:

  • xx liegt zwischen 0 und 1 mit einer Schrittweite von 0,04.

Benchmarks

Die folgende Tabelle zeigt Statistiken zu verschiedenen Ausführungen unserer Funktion.

BeispielAnzahl der QubitsInitialisierungFehlerGesamtzeit (min)Runtime-Nutzung (min)
Inviszide Burgers-Gleichung50PHYSICALLY_INFORMED10210^{-2}6625
Hypoelastischer 1D-Zugversuch18RANDOM10210^{-2}123100

Erste Schritte

Fülle das Formular aus, um Zugang zur QUICK-PDE-Funktion anzufordern. Anschließend, vorausgesetzt du hast bereits dein Konto gespeichert in deiner lokalen Umgebung, wähle die Funktion wie folgt aus:

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

Beispiele

Um loszulegen, probiere eines der folgenden Beispiele:

Computational Fluid Dynamics (CFD)

Wenn Anfangsbedingungen auf u(0,x)=xu(0,x) = x gesetzt sind, sind die Ergebnisse wie folgt:

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

Überprüfe den Status deiner Qiskit Function-Workload oder gib Ergebnisse wie folgt zurück:

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

Output of the previous code cell

Material deformation

Der Material Deformation-Anwendungsfall erfordert die physikalischen Parameter deines Materials und die angewandte Kraft wie folgt:

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

Output of the previous code cell

Das Folgende ist ein Beispiel dafür, wie du den Wert der Funktion für einen bestimmten Satz von Koordinaten erhältst:

# 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

Fehlermeldungen abrufen

Wenn der Status deiner Workload ERROR ist, verwende job.error_message(), um die Fehlermeldung zum Debuggen abzurufen, wie folgt:

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'

Support erhalten

Für Support kontaktiere qiskit-function-support@colibritd.com.

Nächste Schritte

Empfehlungen