Langkau ke kandungan utama
Projek ini dalam fasa beta. Jumpa pepijat? Buat isu GitHub. Ada soalan atau idea? Tanya dalam Discussions — kami suka dengar maklum balas anda!
Bagaimana kualiti terjemahan pada halaman ini?

QUICK-PDE: Fungsi Qiskit oleh ColibriTD

Lihat rujukan API

nota

Qiskit Functions adalah ciri eksperimental yang tersedia untuk pengguna Pelan Premium IBM Quantum®, Pelan Flex, dan Pelan On-Prem (melalui IBM Quantum Platform API). Ia dalam status keluaran pratonton dan boleh berubah.

Gambaran Keseluruhan​

Penyelesai Persamaan Pembezaan Separa (PDE) yang dibentangkan di sini adalah sebahagian daripada platform Quantum Innovative Computing Kit (QUICK) kami (QUICK-PDE), dan dipaketkan sebagai Fungsi Qiskit. Dengan fungsi QUICK-PDE, anda boleh menyelesaikan persamaan pembezaan separa khusus domain pada QPU IBM Quantum. Fungsi ini berdasarkan algoritma yang diterangkan dalam kertas penerangan H-DES ColibriTD. Algoritma ini mampu menyelesaikan masalah berbilang fizik yang kompleks, bermula dengan Dinamik Bendalir Pengiraan (CFD) dan Ubah Bentuk Bahan (MD), serta kes penggunaan lain yang akan hadir tidak lama lagi.

Untuk menangani persamaan pembezaan, penyelesaian cubaan dikodkan sebagai gabungan linear fungsi ortogon (biasanya polinomial Chebyshev, dan lebih khususnya 2n2^n daripadanya di mana nn ialah bilangan qubit yang mengekod fungsi anda), diparameter oleh sudut Litar Kuantum Boleh Ubah (VQC). Ansatz menjana keadaan yang mengekod fungsi, yang dinilai oleh boleh cerap yang gabungannya membolehkan penilaian fungsi pada semua titik. Anda kemudian boleh menilai fungsi kerugian di mana persamaan pembezaan dikodkan, dan melaraskan sudut dalam gelung hibrid, seperti yang ditunjukkan berikut. Penyelesaian cubaan semakin menghampiri penyelesaian sebenar sehingga anda mencapai hasil yang memuaskan.

Aliran kerja fungsi QUICK-PDE

Selain gelung hibrid ini, anda juga boleh menyambungkan pengoptimum yang berbeza secara bersiri. Ini berguna apabila anda mahu pengoptimum global mencari set sudut yang baik, kemudian pengoptimum yang lebih halus untuk mengikuti kecerunan ke set sudut jiran terbaik. Dalam kes dinamik bendalir pengiraan (CFD), urutan pengoptimuman lalai menghasilkan keputusan terbaik — tetapi dalam kes ubah bentuk bahan (MD), walaupun lalai memberikan keputusan yang baik, anda boleh mengkonfigurasinya lebih lanjut untuk manfaat khusus masalah.

Perhatikan bahawa bagi setiap pemboleh ubah fungsi, kami menentukan bilangan qubit (yang boleh anda ubah). Dengan menyusun 10 litar yang sama secara bertindan dan menilai 10 boleh cerap yang sama pada qubit berbeza sepanjang satu litar besar, anda boleh mengurangkan hingar dalam proses pengoptimuman CMA, bergantung pada kaedah pembelajaran hingar, dan mengurangkan bilangan tembakan yang diperlukan dengan ketara.

Dinamik Bendalir Pengiraan​

Persamaan Burgers' tak likat memodelkan bendalir tidak likat yang mengalir seperti berikut:

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

uu mewakili medan kelajuan bendalir. Kes penggunaan ini mempunyai syarat sempadan temporal: anda boleh memilih syarat awal dan kemudian membiarkan sistem berkembang. Buat masa ini, satu-satunya syarat awal yang diterima ialah fungsi linear: ax+bax + b. Penyelesaian analitik ialah:

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

Persamaan Euler tanpa tekanan memodelkan aliran bendalir tak likat mampat dengan pelembapan seperti berikut:

∂g∂t+u∂g∂x+g∂u∂x=0,\frac{\partial g}{\partial t} + u\frac{\partial g}{\partial x} + g\frac{\partial u}{\partial x} = 0,

u∂g∂t+g∂u∂t+u2∂g∂x+2gu∂u∂x+μ(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 mewakili medan ketumpatan, uu medan halaju dan μ\mu pekali pelembapan. Dalam formulasi kami, kami menetapkan λ=1\lambda = 1, jadi ia tidak akan digunakan sebagai parameter berikutnya. Kes penggunaan ini mempunyai syarat sempadan temporal: g(0,x)=e−xg(0, x) = e^{-x} dan u(0,x)=xu(0, x) = x. Penyelesaian analitik ialah:

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}}.

Hujah untuk persamaan pembezaan CFD berada pada grid tetap, seperti berikut:

  • tt berada antara 0 dan 0.95 dengan 41 titik sampel. xx berada antara 0 dan 0.95 dengan 41 titik sampel.

Ubah Bentuk Bahan​

Kes penggunaan ini memberi tumpuan pada ubah bentuk hipoelastik dengan ujian tegangan satu dimensi, di mana sebatang rod yang satu hujungnya dipegang tetap ditarik pada hujung yang satu lagi. Kami menerangkan masalah seperti berikut:

u′−σ3K−23ϵ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 mewakili modulus pukal bahan yang diregangkan, nn eksponen hukum kuasa, bb daya per unit jisim, ϵ0\epsilon_0 had tegasan berkadar, σ0\sigma_0 had terikan berkadar, uu fungsi tegasan, dan σ\sigma fungsi terikan. Penyelesaian analitik ialah:

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

u(x)=−3−(3+n)/22bK(1+n) σ0n[3(1+n)/2b2σ0n(1+n)x2−2⋅3(1+n)/2bσ0n(1+n)σ0x−12ϵ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)n−12ϵ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) ialah syarat sempadan pada terikan di x=0x=0.

Rod yang dipertimbangkan mempunyai panjang seunit. Kes penggunaan ini mempunyai syarat sempadan untuk tegasan permukaan tt, atau jumlah kerja yang diperlukan untuk meregangkan rod.

Hujah untuk persamaan pembezaan MD berada pada grid tetap, seperti berikut:

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

Penanda Aras​

Jadual berikut memaparkan statistik daripada pelbagai larian fungsi kami.

ContohBilangan qubitPemulaanRalatJumlah masa (min)Penggunaan masa jalan (min)
Persamaan Burgers' tak likat50PHYSICALLY_INFORMED10−210^{-2}6625
Persamaan Euler tanpa tekanan70PHYSICALLY_INFORMED10−210^{-2}4834
Ujian tegangan 1D hipoelastik18RANDOM10−210^{-2}123100

Mulakan​

Isi borang untuk meminta akses kepada fungsi QUICK-PDE. Kemudian, dengan mengandaikan anda sudah menyimpan akaun anda ke persekitaran tempatan anda, pilih fungsi seperti berikut:

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"matplotlib": "matplotlib", "numpy": "numpy", "qiskit_ibm_catalog": "qiskit-ibm-catalog"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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 bermula, cuba salah satu contoh berikut:

Persamaan Burgers' tak likat (CFD)​

Untuk persamaan Burgers', apabila syarat awal ditetapkan kepada u(0,x)=xu(0,x) = x, hasilnya adalah seperti 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}
)

Semak status atau dapatkan semula keputusan beban kerja Fungsi Qiskit anda seperti 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, apabila syarat awal ditetapkan kepada g(0,x)=e−xg(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 seperti 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)

Ubah Bentuk Bahan​

Kes penggunaan ubah bentuk bahan memerlukan parameter fizikal bahan anda dan daya yang dikenakan, seperti 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 ialah contoh cara mendapatkan nilai fungsi untuk set 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

Dapatkan Mesej Ralat​

Jika status beban kerja anda ialah ERROR, gunakan job.error_message() untuk mendapatkan mesej ralat bagi membantu nyahpepijat, seperti 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 Sokongan​

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

Langkah Seterusnya​

Cadangan