Lewati ke konten utama

QUICK-PDE: Sebuah Qiskit Function oleh ColibriTD

Lihat referensi API

catatan

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 2n2^n di antaranya di mana nn 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.

Alur kerja fungsi QUICK-PDE

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:

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

uu 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: ax+bax + b. Solusi analitik adalah:

u(t,x)=ax+bat+1.u(t, x) = \frac{ax + b}{at + 1}.

Persamaan Euler tanpa tekanan (pressureless Euler equations) memodelkan aliran fluida inviscid yang dapat dikompresi dengan damping sebagai berikut:

gt+ugx+gux=0,\frac{\partial g}{\partial t} + u\frac{\partial g}{\partial x} + g\frac{\partial u}{\partial x} = 0,

ugt+gut+u2gx+2guux+μ(1+t)λgu=0,u\frac{\partial g}{\partial t} + g\frac{\partial u}{\partial t} + u^2\frac{\partial g}{\partial x} + 2gu\frac{\partial u}{\partial x} + \frac{\mu}{(1+t)^{\lambda}} g u = 0,

gg merepresentasikan medan densitas, uu medan kecepatan, dan μ\mu koefisien damping. Dalam formulasi kami, kami menetapkan λ=1\lambda = 1, sehingga tidak akan digunakan sebagai parameter berikutnya. Use-case ini memiliki kondisi batas temporal: g(0,x)=exg(0, x) = e^{-x} dan u(0,x)=xu(0, x) = x. Solusi analitisnya adalah:

g(t,x)=1μ(1+t)1μμexp ⁣((μ1)x(1+t)1μμ),g(t, x) = \frac{1-\mu}{(1+t)^{1-\mu} - \mu} \exp\!\left(\frac{(\mu-1)\, x}{(1+t)^{1-\mu} - \mu}\right),

u(t,x)=(1μ)x((1+t)1μμ)(1+t)μ.u(t, x) = \frac{(1-\mu)\, x}{\left((1+t)^{1-\mu} - \mu\right)(1+t)^{\mu}}.

Argumen untuk persamaan diferensial CFD berada pada grid tetap, sebagai berikut:

  • tt berada antara 0 dan 0.95 dengan 41 titik sampel. xx 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:

uσ3K23ϵ0(σσ03)n=0,u' - \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 merepresentasikan modulus bulk material yang direntangkan, nn eksponen dari hukum pangkat, bb gaya per satuan massa, ϵ0\epsilon_0 batas tegangan proporsional, σ0\sigma_0 batas regangan proporsional, uu fungsi tegangan, dan σ\sigma fungsi regangan. Solusi analitik adalah:

σ(x)=σ0bx,\sigma(x) = \sigma_0 - bx,

u(x)=3(3+n)/22bK(1+n)σ0n[3(1+n)/2b2σ0n(1+n)x223(1+n)/2bσ0n(1+n)σ0x12ϵ0Kσ01+nu(x) = -\frac{3^{-(3+n)/2}}{2bK(1+n)\,\sigma_0^{n}}\Biggl[3^{(1+n)/2}b^2\sigma_0^n(1+n)x^2 - 2\cdot 3^{(1+n)/2}b\sigma_0^n(1+n)\sigma_0 x - 12\epsilon_0 K\sigma_0^{1+n} 12bϵ0Kσ0nx(bx+σ0σ0)n+12ϵ0Kσ0n+1(bx+σ0σ0)n12ϵ0Kσ01+n],- 12b\epsilon_0 K\sigma_0^n x\left(\frac{-bx+\sigma_0}{\sigma_0}\right)^n + 12\epsilon_0 K\sigma_0^{n+1}\left(\frac{-bx+\sigma_0}{\sigma_0}\right)^n - 12\epsilon_0 K \sigma_0^{1+n}\Biggr],

di mana σ0=g(0)\sigma_0 = g(0) adalah kondisi batas pada strain di x=0x=0.

Batang yang dipertimbangkan memiliki panjang satuan. Kasus penggunaan ini memiliki kondisi batas untuk tegangan permukaan tt, atau jumlah kerja yang dibutuhkan untuk meregangkan batang.

Argumen untuk persamaan diferensial MD berada pada grid tetap, sebagai berikut:

  • xx berada antara 0 dan 1 dengan 30 titik sampel.

Benchmark

Tabel berikut menyajikan statistik dari berbagai run fungsi kami.

ExampleNumber of qubitsInitializationErrorTotal time (min)Runtime usage (min)
Inviscid Burgers' equation50PHYSICALLY_INFORMED10210^{-2}6625
Pressureless Euler's equations70PHYSICALLY_INFORMED10210^{-2}4834
Hypoelastic 1D tensile test18RANDOM10210^{-2}123100

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 u(0,x)=xu(0,x) = x, 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 g(0,x)=exg(0, x) = e^{-x} dan u(0,x)=xu(0, x) = x, untuk μ\mu tertentu (di sini, μ=0.1\mu = 0.1) dan λ=1\lambda = 1, 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

Rekomendasi