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

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

หมายเหตุ

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 ที่ต้องการอย่างมีนัยสำคัญ

Input/output

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

Input

เพื่อรัน QUICK-PDE Qiskit Function คุณปรับพารามิเตอร์ต่อไปนี้ได้:

ชื่อประเภทคำอธิบายเฉพาะ Use-caseตัวอย่าง
use_caseLiteral["MD", "CFD"]สลับเพื่อเลือกระบบสมการอนุพันธ์ที่ต้องการแก้ไม่"CFD"
parametersdict[str, Any]พารามิเตอร์ของสมการอนุพันธ์ (ดูตารางถัดไปสำหรับรายละเอียด)ไม่{"a": 1.0, "b": 1.0}
nb_qubitsOptional[dict[str, dict[str, int]]]จำนวน qubits ต่อฟังก์ชันและต่อตัวแปร ค่าที่ optimize แล้วถูกเลือกโดยฟังก์ชัน แต่ถ้าต้องการลองหาการผสมที่ดีกว่า สามารถแทนที่ค่าเริ่มต้นได้ไม่{"u": {"x": 1, "t":3}}
depthOptional[dict[str, int]]ความลึกของ ansatz ต่อฟังก์ชัน ค่าที่ optimize แล้วถูกเลือกโดยฟังก์ชัน แต่ถ้าต้องการลองหาการผสมที่ดีกว่า สามารถแทนที่ค่าเริ่มต้นได้ไม่{"u": 4}
optimizerOptional[list[str]]Optimizers ที่ใช้ ได้แก่ "CMAES" จาก cma python library หรือหนึ่งใน optimizers ของ scipyMD"SLSQP"
shotsOptional[list[int]]จำนวน shots ที่ใช้รัน Circuit แต่ละ Circuit เนื่องจากต้องการขั้นตอนการ optimize หลายขั้น ความยาวของรายการต้องเท่ากับจำนวน optimizer ที่ใช้ (4 สำหรับ CFD) ค่าเริ่มต้นคือ [50_000] * nb_optimizers สำหรับ MD และ [5_00, 2_000, 5_000, 10_000] สำหรับ CFDไม่[15_000, 30_000]
optimizer_optionsOptional[dict[str, Any]]ตัวเลือกที่ส่งให้ optimizer รายละเอียดของ input นี้ขึ้นอยู่กับ optimizer ที่ใช้ สำหรับรายละเอียด ดูเอกสารของ optimizer ที่ใช้MD{"maxiter": 50 }
initializationOptional[Literal["RANDOM", "PHYSICALLY_INFORMED"]]เลือกว่าจะเริ่มต้นด้วยมุมสุ่มหรือมุมที่เลือกอย่างชาญฉลาด โปรดทราบว่ามุมที่เลือกอย่างชาญฉลาดอาจไม่ทำงานในทุกกรณี ค่าเริ่มต้นคือ "PHYSICALLY_INFORMED"ไม่"RANDOM"
backend_nameOptional[str]ชื่อ Backend ที่ต้องการใช้ไม่"ibm_torino"
modeOptional[Literal["job", "session", "batch"]]โหมดการ execute ที่ใช้ ค่าเริ่มต้นคือ "job"ไม่"job"

พารามิเตอร์ของสมการอนุพันธ์ (พารามิเตอร์ทางกายภาพและเงื่อนไขขอบเขต) ควรเป็นไปตามรูปแบบที่กำหนด:

Use caseKeyประเภทค่าคำอธิบายตัวอย่าง
CFDafloatCoefficient ของค่าเริ่มต้นของ uu1.0
CFDbfloatOffset ของค่าเริ่มต้นของ uu1.0
MDtfloatsurface stress12.0
MDKfloatbulk modulus100.0
MDnintpower law4.0
MDbfloatforce per unit mass10.0
MDepsilon_0floatproportional stress limit0.1
MDsigma_0floatproportional strain limit5.0

Output

Output คือ dictionary ที่มีรายการจุดตัวอย่างพร้อมค่าของฟังก์ชันที่แต่ละจุดเหล่านี้:

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

รูปร่างของ solution array ขึ้นอยู่กับตัวอย่างของตัวแปร:

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)

การ mapping ระหว่างจุดตัวอย่างของตัวแปรฟังก์ชันกับมิติของ solution array ทำโดยเรียงลำดับตัวอักษรและตัวเลขของชื่อตัวแปร ตัวอย่างเช่น ถ้าตัวแปรคือ "t" และ "x" แถวของ solution["functions"]["u"] แทนค่าของโซลูชันสำหรับ "t" คงที่ และคอลัมน์ของ solution["functions"]["u"] แทนค่าของโซลูชันสำหรับ "x" คงที่

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

# 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

Benchmarks

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

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

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

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

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 ก่อนหน้า

ดึงข้อความ 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

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

คำแนะนำ
Source: IBM Quantum docs — updated 27 มี.ค. 2569
English version on doQumentation — updated 7 พ.ค. 2569
This translation based on the English version of 11 มี.ค. 2569