QUICK-PDE: Sebuah Qiskit Function oleh ColibriTD
Lihat referensi API
Qiskit Functions adalah fitur eksperimental yang tersedia untuk pengguna IBM Quantum® Premium Plan, Flex Plan, dan On-Prem (via IBM Quantum Platform API) Plan. Fitur ini berstatus rilis pratinjau dan dapat berubah sewaktu-waktu.
Ikhtisar
Solver Persamaan Diferensial Parsial (PDE) yang disajikan di sini merupakan bagian dari platform Quantum Innovative Computing Kit (QUICK) kami (QUICK-PDE), dan dikemas sebagai Qiskit Function. Dengan fungsi QUICK-PDE, kamu bisa menyelesaikan persamaan diferensial parsial khusus domain di IBM Quantum QPU. Fungsi ini didasarkan pada algoritma yang dijelaskan dalam makalah deskripsi H-DES dari ColibriTD. Algoritma ini mampu memecahkan masalah multi-fisika yang kompleks, dimulai dari Computational Fluid Dynamics (CFD) dan Material Deformation (MD), serta kasus penggunaan lainnya yang segera hadir.
Untuk menangani persamaan diferensial, solusi percobaan dikodekan sebagai kombinasi linier dari fungsi ortogonal (biasanya polinomial Chebyshev, lebih tepatnya di antaranya di mana adalah jumlah qubit yang mengkodekan fungsimu), diparametrikan oleh sudut-sudut dari Variable Quantum Circuit (VQC). Ansatz menghasilkan state yang mengkodekan fungsi, yang dievaluasi oleh observabel yang kombinasinya memungkinkan evaluasi fungsi di semua titik. Kamu kemudian bisa mengevaluasi fungsi loss di mana persamaan diferensial dikodekan, dan menyetel ulang sudut-sudut dalam loop hybrid, seperti yang ditunjukkan berikut ini. Solusi percobaan secara bertahap semakin mendekati solusi sebenarnya hingga kamu mendapatkan hasil yang memuaskan.
Selain loop hybrid ini, kamu juga bisa menggabungkan beberapa optimizer secara berantai. Ini berguna ketika kamu ingin optimizer global menemukan sekumpulan sudut yang bagus, lalu optimizer yang lebih halus mengikuti gradien menuju sekumpulan sudut tetangga terbaik. Dalam kasus computational fluid dynamics (CFD), urutan optimasi default menghasilkan hasil terbaik — tetapi dalam kasus material deformation (MD), meskipun default memberikan hasil yang baik, kamu bisa mengonfigurasinya lebih lanjut untuk manfaat spesifik masalah.
Perhatikan bahwa untuk setiap variabel fungsi, kita menentukan jumlah qubit (yang bisa kamu ubah-ubah). Dengan menumpuk 10 sirkuit identik dan mengevaluasi 10 observabel identik pada qubit berbeda sepanjang satu sirkuit besar, kamu bisa melakukan mitigasi noise dalam proses optimasi CMA, mengandalkan metode noise learner, dan secara signifikan mengurangi jumlah shot yang dibutuhkan.
Computational Fluid Dynamics
Persamaan Burgers' tanpa viskositas memodelkan aliran fluida non-viskos sebagai berikut:
merepresentasikan medan kecepatan fluida. Kasus penggunaan ini memiliki kondisi batas temporal: kamu bisa memilih kondisi awal lalu membiarkan sistem berelaksasi. Saat ini, satu-satunya kondisi awal yang diterima adalah fungsi linear: . Solusi analitik adalah:
Persamaan Euler tanpa tekanan (pressureless Euler equations) memodelkan aliran fluida inviscid yang dapat dikompresi dengan damping sebagai berikut:
merepresentasikan medan densitas, medan kecepatan, dan koefisien damping. Dalam formulasi kami, kami menetapkan , sehingga tidak akan digunakan sebagai parameter berikutnya. Use-case ini memiliki kondisi batas temporal: dan . Solusi analitisnya adalah:
Argumen untuk persamaan diferensial CFD berada pada grid tetap, sebagai berikut:
- berada antara 0 dan 0.95 dengan 41 titik sampel. berada antara 0 dan 0.95 dengan 41 titik sampel.
Deformasi Material
Kasus penggunaan ini berfokus pada deformasi hypoelastic dengan uji tarik satu dimensi, di mana sebuah batang yang terpasang di ruang ditarik di ujung lainnya. Kami mendeskripsikan masalahnya sebagai berikut:
merepresentasikan modulus bulk material yang direntangkan, eksponen dari hukum pangkat, gaya per satuan massa, batas tegangan proporsional, batas regangan proporsional, fungsi tegangan, dan fungsi regangan. Solusi analitik adalah:
di mana adalah kondisi batas pada strain di .
Batang yang dipertimbangkan memiliki panjang satuan. Kasus penggunaan ini memiliki kondisi batas untuk tegangan permukaan , atau jumlah kerja yang dibutuhkan untuk meregangkan batang.
Argumen untuk persamaan diferensial MD berada pada grid tetap, sebagai berikut:
- berada antara 0 dan 1 dengan 30 titik sampel.
Benchmark
Tabel berikut menyajikan statistik dari berbagai run fungsi kami.
| Example | Number of qubits | Initialization | Error | Total time (min) | Runtime usage (min) |
|---|---|---|---|---|---|
| Inviscid Burgers' equation | 50 | PHYSICALLY_INFORMED | 66 | 25 | |
| Pressureless Euler's equations | 70 | PHYSICALLY_INFORMED | 48 | 34 | |
| Hypoelastic 1D tensile test | 18 | RANDOM | 123 | 100 |
Mulai
Isi formulir untuk meminta akses ke fungsi QUICK-PDE. Kemudian, dengan asumsi kamu sudah menyimpan akunmu ke lingkungan lokal, pilih fungsinya sebagai berikut:
# 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")
Contoh
Untuk memulai, coba salah satu contoh berikut:
Persamaan Burgers' tanpa viskositas (CFD)
Untuk persamaan Burgers', ketika kondisi awal ditetapkan ke , hasilnya adalah sebagai berikut:
# 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}
)
Periksa status workload Qiskit Function kamu atau ambil hasil sebagai berikut:
# 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)
Persamaan Euler tanpa tekanan (CFD)
Untuk persamaan Euler, ketika kondisi awal ditetapkan ke dan , untuk tertentu (di sini, ) dan , hasilnya adalah sebagai berikut:
# 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)
Deformasi Material
Kasus penggunaan deformasi material memerlukan parameter fisik material dan gaya yang diterapkan, sebagai berikut:
# 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()
Berikut adalah contoh cara mendapatkan nilai fungsi untuk sekumpulan koordinat tertentu:
# 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
Ambil pesan error
Jika status workload kamu adalah ERROR, gunakan job.error_message() untuk mengambil pesan error guna membantu debugging, sebagai berikut:
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)
Dapatkan dukungan
Untuk dukungan, hubungi qiskit-function-support@colibritd.com.
Langkah selanjutnya
- Isi formulir untuk meminta akses ke fungsi QUICK-PDE.
- Kunjungi referensi API untuk Qiskit Function ini.
- Coba memodelkan aliran fluida non-viskos menggunakan QUICK-PDE dalam tutorial.
- Tinjau Jaffali, H., et al. (2025). H-DES: a Quantum-Classical Hybrid Differential Equation Solver. arXiv preprint arXiv:2410.01130.