QUICK-PDE: Eine Qiskit-Funktion von ColibriTD
Siehe API-Referenz
Qiskit-Funktionen sind eine experimentelle Funktion, die den Nutzern des IBM Quantum® Premium Plans, des Flex Plans und des On-Prem-Plans (über IBM Quantum Platform API) zur Verfügung steht. Sie befinden sich im Status einer Vorabversion und können sich noch ändern.
Übersicht
Der hier vorgestellte Solver für partielle Differentialgleichungen (PDE) ist Teil unserer Quantum Innovative Computing Kit (QUICK)-Plattform (QUICK-PDE) und als Qiskit-Funktion verfügbar. Mit der QUICK-PDE-Funktion können Sie domänenspezifische partielle Differentialgleichungen auf IBM Quantum QPUs lösen. Diese Funktion basiert auf dem Algorithmus, der in der Beschreibung von H-DES unter ColibriTD's beschrieben ist. Dieser Algorithmus kann komplexe multiphysikalische Probleme lösen, angefangen bei der numerischen Strömungsmechanik (CFD) und Materialverformung (MD) bis hin zu weiteren Anwendungsfällen, die in Kürze folgen werden.
Um die Differentialgleichungen zu lösen, werden die Versuchslösungen als Linearkombinationen orthogonaler Funktionen kodiert (typischerweise Tschebyscheff-Polynome, genauer gesagt , wobei die Anzahl der Qubits ist, die Ihre Funktion kodieren), die durch die Winkel eines variablen Quantenkreises (VQC) parametrisiert sind. Der Ansatz erzeugt einen Zustand, der die Funktion kodiert, die durch Beobachtungswerte ausgewertet wird, deren Kombinationen es ermöglichen, die Funktion in allen Punkten auszuwerten. Sie können dann die Verlustfunktion, in der die Differentialgleichungen kodiert sind, auswerten und die Winkel in einer hybriden Schleife fein abstimmen, wie im Folgenden gezeigt. Die Probelösungen nähern sich schrittweise den tatsächlichen Lösungen an, bis Sie ein zufriedenstellendes Ergebnis erzielen.
Zusätzlich zu dieser hybriden Schleife können Sie auch verschiedene Optimierer miteinander verketten. Dies ist nützlich, wenn Sie eine globale Optimierung wünschen, um einen guten Satz von Winkeln zu finden, und dann eine feiner abgestimmte Optimierung, um einem Gradienten zum besten Satz von benachbarten Winkeln zu folgen. Im Falle der numerischen Strömungsmechanik (CFD) liefert die Standardoptimierungssequenz die besten Ergebnisse. Im Falle der Materialverformung (MD) liefert die Standardsequenz zwar gute Ergebnisse, aber Sie können sie weiter konfigurieren, um problemspezifische Vorteile zu erzielen.
Beachten Sie, dass wir für jede Variable der Funktion die Anzahl der Qubits angeben (mit denen Sie spielen können). Durch das Stapeln von 10 identischen Schaltkreisen und die Auswertung der 10 identischen Observablen auf verschiedenen Qubits in einem großen Schaltkreis kann man im Rahmen des CMA-Optimierungsprozesses mit Hilfe der Noise-Learner-Methode das Rauschen reduzieren und die Anzahl der benötigten Schüsse erheblich verringern.
Numerische Strömungsmechanik
Die nichtviskose Burgers-Gleichung modelliert die Strömung nichtviskoser Fluide wie folgt:
stellt das Strömungsgeschwindigkeitsfeld dar. Dieser Anwendungsfall weist eine zeitliche Randbedingung auf: Sie können die Anfangsbedingung festlegen und das System anschließend sich selbst überlassen. Derzeit sind als Anfangsbedingungen ausschließlich lineare Funktionen zulässig: . Die analytische Lösung lautet:
Die drucklosen Euler-Gleichungen modellieren die Strömung eines kompressiblen, inviskosen Fluids mit Dämpfung wie folgt:
steht für das Dichtefeld, für das Geschwindigkeitsfeld und für einen Dämpfungskoeffizienten. In unserer Formulierung setzen wir an, sodass dieser im Folgenden nicht als Parameter verwendet wird. Dieser Anwendungsfall weist zeitliche Randbedingungen auf: und . Die analytische Lösung lautet:
Die Argumente für die CFD-Differentialgleichungen sind auf einem festen Gitter wie folgt:
- liegt zwischen 0 und 0.95 mit 41 Messpunkten. liegt zwischen 0 und 0.95 mit 41 Messpunkten.
Materialverformung
Dieser Anwendungsfall konzentriert sich auf die hypoelastische Verformung im Rahmen eines eindimensionalen Zugversuchs, bei dem ein im Raum festgelegter Stab an seinem anderen Ende gezogen wird. Wir beschreiben das Problem wie folgt:
steht für den Volumenmodul des gedehnten Materials, für den Exponenten eines Potenzgesetzes, für die Kraft pro Masseneinheit, für die Grenze der proportionalen Spannung, für die Grenze der proportionalen Dehnung, für die Spannungsfunktion und für die Dehnungsfunktion. Die analytische Lösung lautet:
wobei die Randbedingung für die Dehnung am Punkt ist.
Der betrachtete Stab ist von einheitlicher Länge. Für diesen Anwendungsfall gibt es eine Randbedingung für die Oberflächenspannung , d. h. den Arbeitsaufwand, der erforderlich ist, um den Stab zu dehnen.
Die Argumente für die Differentialgleichungen von MD sind auf einem festen Gitter wie folgt:
- liegt zwischen 0 und 1 und umfasst 30 Messpunkte.
Benchmarks
Die folgende Tabelle enthält Statistiken zu verschiedenen Durchläufen unserer Funktion.
Beispiel | Anzahl der Qubits | Initialisierung | Fehler | Gesamtzeit (Min.) | Laufzeitverbrauch (min) |
|---|---|---|---|---|---|
| Unviskose Burgers'sche Gleichung | 50 | PHYSICALLY_INFORMED | 66 | 25 GB | |
| Drucklose Euler-Gleichungen | 70 | PHYSICALLY_INFORMED | 48 | 34 | |
| Hypoelastischer 1D Zugversuch | 18. | RANDOM | 123 | 100 |
Erste Schritte
Füllen Sie das Formular aus, um Zugriff auf die QUICK-PDE-Funktion zu beantragen. Angenommen, Sie haben Ihr Konto bereits in Ihrer lokalen Umgebung gespeichert, wählen Sie die Funktion wie folgt aus:
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")Beispiele
Probieren Sie für den Anfang eines der folgenden Beispiele aus:
Die Gleichung von Inviscid Burgers (CFD)
Für die Burgers-Gleichung ergeben sich bei folgenden Anfangsbedingungen: folgende Ergebnisse:
# 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}
)Überprüfen Sie den Status Ihrer Qiskit-Funktions-Workload oder rufen Sie die Ergebnisse wie folgt ab:
# 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)Drucklose Euler-Gleichung (CFD)
Für die Eulergleichung ergeben sich bei den Anfangsbedingungen und sowie für die gegebenen Werte (hier: ) und folgende Ergebnisse:
# 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)Materialverformung
Für den Anwendungsfall "Materialverformung" werden die physikalischen Parameter Ihres Materials und die angewandte Kraft wie folgt benötigt:
# 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()Im Folgenden finden Sie ein Beispiel dafür, wie Sie den Funktionswert für einen bestimmten Koordinatensatz ermitteln können:
# 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] == 2Fehlermeldungen abrufen
Wenn Ihr Workload-Status ERROR lautet, verwenden Sie job.error_message() , um die Fehlermeldung zur Fehlersuche abzurufen, wie folgt:
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)Unterstützung anfordern
Für Support wenden Sie sich bitte an [email protected].
Nächste Schritte
- Füllen Sie das Formular aus, um Zugriff auf die QUICK-PDE-Funktion zu beantragen.
- Rufen Sie die API-Referenz für diese Qiskit-Funktion auf.
- Versuchen Sie die Modellierung einer fließenden, nicht viskosen Flüssigkeit mit QUICK-PDE im Tutorial.
- Rezension Jaffali, H., et al. (2025). H-DES: Ein quanten-klassischer Hybrid-Differentialgleichungslöser. arXiv Vorabdruck arXiv:2410.01130.