Lewati ke konten utama

QUICK-PDE: Sebuah Qiskit Function oleh ColibriTD

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.

Input/outputโ€‹

Computational Fluid Dynamicsโ€‹

Persamaan Burgers' tanpa viskositas memodelkan aliran fluida non-viskos sebagai berikut:

โˆ‚uโˆ‚t+uโˆ‚uโˆ‚x=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.

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

  • tt berada antara 0 dan 0.95 dengan 30 titik sampel. xx berada antara 0 dan 0.95 dengan ukuran langkah 0.2375.

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โ€ฒโˆ’ฯƒ3Kโˆ’23ฯต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 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.

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 ukuran langkah 0.04.

Inputโ€‹

Untuk menjalankan Qiskit Function QUICK-PDE, kamu bisa menyesuaikan parameter berikut:

NamaTipeDeskripsiSpesifik kasus penggunaanContoh
use_caseLiteral["MD", "CFD"]Toggle untuk memilih sistem persamaan diferensial yang akan diselesaikanTidak"CFD"
parametersdict[str, Any]Parameter persamaan diferensial (lihat tabel berikutnya untuk detail lebih lanjut)Tidak{"a": 1.0, "b": 1.0}
nb_qubitsOptional[dict[str, dict[str, int]]]Jumlah qubit per fungsi dan per variabel. Nilai yang dioptimalkan dipilih oleh fungsi, tetapi jika kamu ingin mencoba kombinasi yang lebih baik, kamu bisa mengganti nilai defaultTidak{"u": {"x": 1, "t":3}}
depthOptional[dict[str, int]]Kedalaman ansatz per fungsi. Nilai yang dioptimalkan dipilih oleh fungsi, tetapi jika kamu ingin mencoba kombinasi yang lebih baik, kamu bisa mengganti nilai defaultTidak{"u": 4}
optimizerOptional[list[str]]Optimizer yang akan digunakan, baik "CMAES" dari cma python library atau salah satu dari optimizer scipyMD"SLSQP"
shotsOptional[list[int]]Jumlah shot yang digunakan untuk menjalankan setiap Circuit. Karena beberapa langkah optimasi diperlukan, panjang daftar harus sama dengan jumlah optimizer yang digunakan (4 untuk CFD). Default ke [50_000] * nb_optimizers untuk MD dan [5_00, 2_000, 5_000, 10_000] untuk CFDTidak[15_000, 30_000]
optimizer_optionsOptional[dict[str, Any]]Opsi yang akan diteruskan ke optimizer. Detail input ini bergantung pada optimizer yang digunakan; untuk spesifik, lihat dokumentasi optimizer yang digunakanMD{"maxiter": 50 }
initializationOptional[Literal["RANDOM", "PHYSICALLY_INFORMED"]]Apakah akan memulai dengan sudut acak atau sudut yang dipilih secara cerdas. Perhatikan bahwa sudut yang dipilih secara cerdas mungkin tidak berfungsi dalam 100% kasus. Default ke "PHYSICALLY_INFORMED".Tidak"RANDOM"
backend_nameOptional[str]Nama Backend yang akan digunakan.Tidak"ibm_torino"
modeOptional[Literal["job", "session", "batch"]]Mode eksekusi yang akan digunakan. Default ke "job".Tidak"job"

Parameter persamaan diferensial (parameter fisik dan kondisi batas) harus mengikuti format berikut:

Kasus penggunaanKunciTipe nilaiDeskripsiContoh
CFDafloatKoefisien nilai awal uu1.0
CFDbfloatOffset nilai awal uu1.0
MDtfloattegangan permukaan12.0
MDKfloatmodulus bulk100.0
MDninthukum pangkat4.0
MDbfloatgaya per satuan massa10.0
MDepsilon_0floatbatas tegangan proporsional0.1
MDsigma_0floatbatas regangan proporsional5.0

Outputโ€‹

Outputnya adalah dictionary berisi daftar titik sampel, serta nilai-nilai fungsi di setiap titik tersebut:

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

Bentuk array solusi bergantung pada sampel variabel:

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)

Pemetaan antara titik sampel variabel fungsi dan dimensi array solusi dilakukan dalam urutan alfanumerik nama variabel. Misalnya, jika variabelnya adalah "t" dan "x", sebuah baris dari solution["functions"]["u"] merepresentasikan nilai solusi untuk "t" yang tetap, dan sebuah kolom dari solution["functions"]["u"] merepresentasikan nilai solusi untuk "x" yang tetap.

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

Benchmarkโ€‹

Tabel berikut menyajikan statistik dari berbagai run fungsi kami.

ContohJumlah qubitInisialisasiErrorTotal waktu (menit)Penggunaan runtime (menit)
Persamaan Burgers' tanpa viskositas50PHYSICALLY_INFORMED10โˆ’210^{-2}6625
Uji tarik 1D Hypoelastic18RANDOM10โˆ’210^{-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:

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

quick = catalog.load("colibritd/quick-pde")

Contohโ€‹

Untuk memulai, coba salah satu contoh berikut:

Computational Fluid Dynamics (CFD)โ€‹

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", physical_parameters={"a": 1.0, "b": 0.0})

Periksa status workload Qiskit Function kamu atau ambil hasil sebagai berikut:

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 dari sel kode sebelumnya

Deformasi Materialโ€‹

Kasus penggunaan deformasi material memerlukan parameter fisik material dan gaya yang diterapkan, sebagai berikut:

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 dari sel kode sebelumnya

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="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'

Dapatkan dukunganโ€‹

Untuk dukungan, hubungi qiskit-function-support@colibritd.com.

Langkah selanjutnyaโ€‹

Rekomendasi
Source: IBM Quantum docs โ€” updated 27 Mar 2026
English version on doQumentation โ€” updated 7 Mei 2026
This translation based on the English version of 11 Mar 2026