Zum Hauptinhalt springen

QUICK-PDE: Eine Qiskit Function von ColibriTD

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.

Eingabe/Ausgabe

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.

Eingabe

Um die QUICK-PDE Qiskit Function auszuführen, kannst du die folgenden Parameter anpassen:

NameTypBeschreibungAnwendungsfallspezifischBeispiel
use_caseLiteral["MD", "CFD"]Umschalter zur Auswahl des zu lösenden Systems von DifferentialgleichungenNein"CFD"
parametersdict[str, Any]Parameter der Differentialgleichung (weitere Details siehe nächste Tabelle)Nein{"a": 1.0, "b": 1.0}
nb_qubitsOptional[dict[str, dict[str, int]]]Anzahl der Qubits pro Funktion und pro Variable. Optimierte Werte werden von der Funktion ausgewählt, aber wenn du versuchen möchtest, eine bessere Kombination zu finden, kannst du die Standardwerte überschreibenNein{"u": {"x": 1, "t":3}}
depthOptional[dict[str, int]]Tiefe des Ansatzes pro Funktion. Optimierte Werte werden von der Funktion ausgewählt, aber wenn du versuchen möchtest, eine bessere Kombination zu finden, kannst du die Standardwerte überschreibenNein{"u": 4}
optimizerOptional[list[str]]Zu verwendende Optimierer, entweder "CMAES" aus der cma Python-Bibliothek oder einer der scipy-OptimiererMD"SLSQP"
shotsOptional[list[int]]Anzahl der Shots zur Ausführung jeder Schaltung. Da mehrere Optimierungsschritte erforderlich sind, muss die Länge der Liste gleich der Anzahl der verwendeten Optimierer sein (4 im Fall von CFD). Standard ist [50_000] * nb_optimizers für MD und [5_00, 2_000, 5_000, 10_000] für CFDNein[15_000, 30_000]
optimizer_optionsOptional[dict[str, Any]]Optionen zur Übergabe an den Optimierer. Die Details dieser Eingabe hängen vom verwendeten Optimierer ab; für Einzelheiten siehe die Dokumentation des verwendeten OptimierersMD{"maxiter": 50 }
initializationOptional[Literal["RANDOM", "PHYSICALLY_INFORMED"]]Ob mit zufälligen Winkeln oder intelligent gewählten Winkeln begonnen werden soll. Beachte, dass intelligent gewählte Winkel möglicherweise nicht in 100% der Fälle funktionieren. Standard ist "PHYSICALLY_INFORMED".Nein"RANDOM"
backend_nameOptional[str]Der zu verwendende Backend-Name.Nein"ibm_torino"
modeOptional[Literal["job", "session", "batch"]]Der zu verwendende Ausführungsmodus. Standard ist "job".Nein"job"

Die Parameter der Differentialgleichung (physikalische Parameter und Randbedingung) sollten dem angegebenen Format folgen:

AnwendungsfallSchlüsselWertetypBeschreibungBeispiel
CFDafloatKoeffizient der Anfangswerte von uu1.0
CFDbfloatVersatz der Anfangswerte von uu1.0
MDtfloatOberflächenspannung12.0
MDKfloatKompressionsmodul100.0
MDnintPotenzgesetz4.0
MDbfloatKraft pro Masseneinheit10.0
MDepsilon_0floatProportionalitätsspannungsgrenze0.1
MDsigma_0floatProportionalitätsdehnungsgrenze5.0

Ausgabe

Die Ausgabe ist ein Wörterbuch mit der Liste der Abtastpunkte sowie den Werten der Funktionen an jedem dieser Punkte:

# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit-ibm-catalog
from numpy import array
solution = {
"functions": {
"u": array(
[
[0.01, 0.1, 1],
[0.02, 0.2, 2],
[0.03, 0.3, 3],
[0.04, 0.4, 4],
]
),
},
"samples": {
"t": array([0.1, 0.2, 0.3, 0.4]),
"x": array([0.5, 0.6, 0.7]),
},
}

Die Form eines Lösungsarrays hängt von den Abtastpunkten der Variablen ab:

assert len(solution["functions"]["u"].shape) == len(solution["samples"])
for col_size, samples in zip(
solution["functions"]["u"].shape, solution["samples"].values()
):
assert col_size == len(samples)

Die Zuordnung zwischen den Abtastpunkten der Funktionsvariablen und der Dimension des Lösungsarrays erfolgt in alphanumerischer Reihenfolge des Variablennamens. Wenn die Variablen beispielsweise "t" und "x" sind, repräsentiert eine Zeile von solution["functions"]["u"] die Werte der Lösung für ein festes "t", und eine Spalte von solution["functions"]["u"] repräsentiert die Werte der Lösung für ein festes "x".

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

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:

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

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