ข้ามไปยังเนื้อหาหลัก

QUICK-PDE: ฟังก์ชัน Qiskit โดย ColibriTD

ดู API reference

หมายเหตุ

Qiskit Functions เป็นฟีเจอร์ทดลองที่พร้อมใช้สำหรับผู้ใช้แผน IBM Quantum® Premium Plan, Flex Plan และ On-Prem (ผ่าน IBM Quantum Platform API) Plan อยู่ในสถานะ preview release และอาจมีการเปลี่ยนแปลง

ภาพรวม

ตัวแก้สมการอนุพันธ์ย่อย (PDE) ที่นำเสนอนี้เป็นส่วนหนึ่งของแพลตฟอร์ม Quantum Innovative Computing Kit (QUICK) ของเรา (QUICK-PDE) และบรรจุเป็น Qiskit Function ด้วย QUICK-PDE คุณแก้สมการอนุพันธ์ย่อยเฉพาะโดเมนบน IBM Quantum QPUs ได้ ฟังก์ชันนี้อิงจากอัลกอริทึมที่อธิบายไว้ใน บทความอธิบาย H-DES ของ ColibriTD อัลกอริทึมนี้แก้ปัญหา multi-physics ที่ซับซ้อนได้ เริ่มต้นด้วย Computational Fluid Dynamics (CFD) และ Materials Deformation (MD) และกรณีการใช้งานอื่น ๆ กำลังจะตามมา

เพื่อจัดการกับสมการอนุพันธ์ โซลูชันทดลองถูก encode เป็นผลรวมเชิงเส้นของฟังก์ชันตั้งฉาก (โดยทั่วไปคือพหุนาม Chebyshev และโดยเฉพาะ 2n2^n ของพวกมัน โดยที่ nn คือจำนวน qubits ที่ encode ฟังก์ชันของคุณ) ซึ่งถูกกำหนดพารามิเตอร์ด้วยมุมของ Variable Quantum Circuit (VQC) ansatz สร้าง state ที่ encode ฟังก์ชัน ซึ่งถูกประเมินโดย observable ที่การผสมผสานช่วยให้ประเมินฟังก์ชันที่ทุกจุดได้ จากนั้นประเมิน loss function ที่สมการอนุพันธ์ถูก encode ไว้ และปรับแต่งมุมในการวนซ้ำแบบ hybrid ดังที่แสดงต่อไปนี้ โซลูชันทดลองค่อย ๆ เข้าใกล้โซลูชันจริงจนกว่าจะได้ผลลัพธ์ที่น่าพอใจ

Workflow ของฟังก์ชัน QUICK-PDE

นอกจาก hybrid loop นี้ คุณยังต่อ optimizer หลายตัวเข้าด้วยกันได้ ซึ่งมีประโยชน์เมื่อต้องการ optimizer แบบ global เพื่อหาชุดมุมที่ดี แล้วตามด้วย optimizer ที่ละเอียดกว่าเพื่อไล่ตาม gradient ไปยังชุดมุมที่ดีที่สุดในบริเวณใกล้เคียง ในกรณีของ computational fluid dynamics (CFD) ลำดับการ optimize เริ่มต้นให้ผลลัพธ์ที่ดีที่สุด — แต่ในกรณีของ material deformation (MD) แม้ค่าเริ่มต้นจะให้ผลดี คุณก็กำหนดค่าเพิ่มเติมเพื่อประโยชน์เฉพาะปัญหาได้

หมายเหตุ สำหรับตัวแปรแต่ละตัวของฟังก์ชัน เราระบุจำนวน qubits (ซึ่งคุณปรับเปลี่ยนได้) โดยการซ้อน 10 Circuit เหมือนกันและประเมิน 10 observable เหมือนกันบน qubits ที่ต่างกันตลอด Circuit ใหญ่หนึ่ง Circuit คุณลด noise ภายในกระบวนการ CMA optimization ได้ โดยอาศัยวิธี noise learner และลดจำนวน shots ที่ต้องการอย่างมีนัยสำคัญ

Computational fluid dynamics

สมการ Burgers' แบบ inviscid สร้างแบบจำลองของไหลไม่มีความหนืดที่ไหลดังนี้:

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

uu แทนฟิลด์ความเร็วของของไหล กรณีการใช้งานนี้มีเงื่อนไขขอบเขตทางเวลา: คุณเลือกเงื่อนไขเริ่มต้นและปล่อยให้ระบบผ่อนคลาย ปัจจุบันเงื่อนไขเริ่มต้นที่ยอมรับได้มีเพียงฟังก์ชันเชิงเส้น: ax+bax + b

อาร์กิวเมนต์สำหรับสมการอนุพันธ์ของ CFD อยู่บน grid คงที่ ดังนี้:

  • tt อยู่ระหว่าง 0 ถึง 0.95 พร้อม 30 จุดตัวอย่าง xx อยู่ระหว่าง 0 ถึง 0.95 พร้อม step size 0.2375

Material Deformation

กรณีการใช้งานนี้เน้นที่การเสียรูปแบบ hypoelastic ด้วยการทดสอบแรงดึงแบบ 1 มิติ ซึ่งแท่งที่ตรึงอยู่ในพื้นที่ถูกดึงที่ปลายอีกด้าน เราอธิบายปัญหาดังนี้:

uσ3K23ϵ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 แทน bulk modulus ของวัสดุที่ถูกยืด nn ตัวชี้กำลังของ power law bb แรงต่อมวลหน่วย ϵ0\epsilon_0 ขีดจำกัด proportional stress σ0\sigma_0 ขีดจำกัด proportional strain uu ฟังก์ชัน stress และ σ\sigma ฟังก์ชัน strain

แท่งที่พิจารณามีความยาวหนึ่งหน่วย กรณีการใช้งานนี้มีเงื่อนไขขอบเขตสำหรับ surface stress tt หรือปริมาณงานที่ต้องการเพื่อยืดแท่ง

อาร์กิวเมนต์สำหรับสมการอนุพันธ์ของ MD อยู่บน grid คงที่ ดังนี้:

  • xx อยู่ระหว่าง 0 ถึง 1 พร้อม step size 0.04

Benchmarks

ตารางต่อไปนี้แสดงสถิติจากการรันฟังก์ชันของเราในหลายครั้ง

ตัวอย่างจำนวน qubitsInitializationErrorเวลารวม (นาที)Runtime usage (นาที)
สมการ Burgers' แบบ inviscid50PHYSICALLY_INFORMED10210^{-2}6625
Hypoelastic 1D tensile test18RANDOM10210^{-2}123100

เริ่มต้นใช้งาน

กรอก แบบฟอร์มเพื่อขอเข้าถึงฟังก์ชัน QUICK-PDE จากนั้น สมมติว่า บันทึกบัญชีของคุณแล้ว ไว้ใน local environment ให้เลือกฟังก์ชันดังนี้:

# 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_quantum_platform")

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

ตัวอย่าง

ในการเริ่มต้น ลองทำหนึ่งในตัวอย่างต่อไปนี้:

Computational Fluid Dynamics (CFD)

เมื่อเงื่อนไขเริ่มต้นตั้งเป็น u(0,x)=xu(0,x) = x ผลลัพธ์มีดังนี้:

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

ตรวจสอบ status ของ Qiskit Function workload หรือดึง ผลลัพธ์ ดังนี้:

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()

ผลลัพธ์ของ code cell ก่อนหน้า

Material Deformation

กรณีการใช้งาน material deformation ต้องการพารามิเตอร์ทางกายภาพของวัสดุและแรงที่ใช้ ดังนี้:

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()

ผลลัพธ์ของ code cell ก่อนหน้า

ต่อไปนี้เป็นตัวอย่างวิธีรับค่าของฟังก์ชันสำหรับชุดพิกัดเฉพาะ:

# 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

ดึงข้อความ error

ถ้าสถานะ workload เป็น ERROR ให้ใช้ job.error_message() เพื่อดึงข้อความ error มาช่วย debug ดังนี้:

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'

รับการสนับสนุน

สำหรับการสนับสนุน ติดต่อ qiskit-function-support@colibritd.com

ขั้นตอนถัดไป

คำแนะนำ