QUICK-PDE: ColibriTD의 Qiskit Function
API 참조를 확인하세요
Qiskit Functions는 IBM Quantum® Premium Plan, Flex Plan, On-Prem(IBM Quantum Platform API 경유) Plan 사용자에게 제공되는 실험적 기능입니다. 현재 미리 보기 릴리스 상태이며 변경될 수 있습니다.
개요
여기에 소개된 편미분 방정식(PDE) 솔버는 당사의 Quantum Innovative Computing Kit(QUICK) 플랫폼(QUICK-PDE)의 일부이며, Qiskit Function으로 패키징되어 있습니다. QUICK-PDE 함수를 사용하면 IBM Quantum QPU에서 도메인 특화 편미분 방정식을 풀 수 있습니다. 이 함수는 ColibriTD의 H-DES 설명 논문에 기술된 알고리즘을 기반으로 합니다. 이 알고리즘은 전산 유체 역학(CFD)과 재료 변형(MD)을 시작으로, 곧 추가될 다른 사용 사례까지 복잡한 다중 물리 문제를 해결할 수 있습니다.
미분 방정식을 다루기 위해, 시험 해(trial solution)는 직교 함수의 선형 결합(일반적으로 체비쇼프 다항식, 더 구체적으로는 개이며 여기서 은 함수를 인코딩하는 Qubit의 수)으로 인코딩되고, Variable Quantum Circuit(VQC)의 각도로 매개변수화됩니다. Ansatz는 함수를 인코딩하는 상태를 생성하며, 이는 모든 점에서 함수를 평가할 수 있는 관측량(observable)의 조합으로 평가됩니다. 그런 다음 미분 방정식이 인코딩된 손실 함수를 평가하고, 하이브리드 루프에서 각도를 미세 조정할 수 있습니다(아래 그림 참조). 시험 해는 만족스러운 결과에 도달할 때까지 실제 해에 점점 더 가까워집니다.
이 하이브리드 루프 외에도, 여러 최적화기를 함께 연결할 수도 있습니다. 이는 전역 최적화기로 좋은 각도 집합을 찾은 다음, 더 세밀한 최적화기로 기울기(gradient)를 따라 최적의 인접 각도 집합을 찾고자 할 때 유용합니다. 전산 유체 역학(CFD)의 경우 기본 최적화 순서가 최상의 결과를 제공하지만, 재료 변형(MD)의 경우 기본값도 좋은 결과를 제공하면서 문제별 이점을 위해 추가로 구성할 수 있습니다.
함수의 각 변수에 대해 Qubit의 수를 지정한다는 점을 참고하세요(직접 조정해볼 수 있습니다). 동일한 Circuit 10개를 쌓고 하나의 큰 Circuit 전체에서 서로 다른 Qubit에 대해 동일한 관측량 10개를 평가함으로써, 노이즈 학습기 방법에 의존하는 CMA 최적화 프로세스 내에서 노이즈를 완화하고 필요한 샷 수를 크게 줄일 수 있습니다.
전산 유체 역학
**비점성 버거스 방정식(inviscid Burgers' equation)**은 다음과 같이 비점성 유체의 흐름을 모델링합니다:
는 유체 속도 필드를 나타냅니다. 이 사용 사례에는 시간적 경계 조건이 있습니다. 초기 조건을 선택한 후 시스템이 이완되도록 할 수 있습니다. 현재 허용되는 초기 조건은 선형 함수 뿐입니다. 분석 해는 다음과 같습니다:
**압력이 없는 오일러 방정식(pressureless Euler equations)**은 다음과 같이 감쇠가 있는 압축성 비점성 유체 흐름을 모델링합니다:
는 밀도장을, 는 속도장을, 는 감쇠 계수를 나타냅니다. 본 공식에서는 로 설정하므로 이후에는 매개변수로 사용되지 않습니다. 이 사용 사례에는 시간적 경계 조건이 있습니다: 및 . 해석적 해는 다음과 같습니다:
CFD 미분 방정식의 인수는 다음과 같이 고정된 격자에 있습니다:
- 는 0에서 0.95 사이이며 41개의 샘플 포인트를 가집니다. 는 0에서 0.95 사이이며 41개의 샘플 포인트를 가집니다.
재료 변형
이 사용 사례는 공간에 고정된 막대의 한쪽 끝을 당기는 1차원 인장 시험으로 저탄성 변형(hypoelastic deformation)에 초점을 맞춥니다. 문제를 다음과 같이 설명합니다:
는 늘어나는 재료의 체적 탄성률, 은 멱법칙(power law)의 지수, 는 단위 질량당 힘, 는 비례 응력 한계, 는 비례 변형률 한계, 는 응력 함수, 는 변형률 함수를 나타냅니다. 분석 해는 다음과 같습니다:
여기서 는 에서의 변형률에 대한 경계 조건입니다.
고려되는 막대는 단위 길이를 가집니다. 이 사용 사례에는 표면 응력 , 즉 막대를 늘리는 데 필요한 일의 양에 대한 경계 조건이 있습니다.
MD 미분 방정식의 인수는 다음과 같이 고정된 격자에 있습니다:
- 는 0에서 1 사이이며 30개의 샘플 포인트를 가집니다.
벤치마크
다음 표는 함수의 여러 실행에 대한 통계를 보여줍니다.
| 예제 | 큐비트 수 | 초기화 | 오차 | 총 시간(분) | 런타임 사용량(분) |
|---|---|---|---|---|---|
| Inviscid Burgers' equation | 50 | PHYSICALLY_INFORMED | 66 | 25 | |
| Pressureless Euler's equations | 70 | PHYSICALLY_INFORMED | 48 | 34 | |
| Hypoelastic 1D tensile test | 18 | RANDOM | 123 | 100 |
시작하기
QUICK-PDE 함수 액세스 요청 양식을 작성하세요. 그런 다음 로컬 환경에 계정을 저장한 경우, 다음과 같이 함수를 선택합니다:
# 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")
예시
시작하려면 다음 예시 중 하나를 시도해 보세요:
비점성 버거스 방정식 (CFD)
버거스 방정식의 경우, 초기 조건을 로 설정하면, 결과는 다음과 같습니다:
# 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}
)
Qiskit Function 워크로드의 상태를 확인하거나 다음과 같이 결과를 반환합니다:
# 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)
압력이 없는 오일러 방정식 (CFD)
오일러 방정식의 경우, 초기 조건을 및 로 설정하고, 주어진 (여기서는 ) 및 에 대해, 결과는 다음과 같습니다:
# 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)
재료 변형
재료 변형 사용 사례에는 재료의 물리 매개변수와 가해지는 힘이 필요합니다. 다음과 같이 지정합니다:
# 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()
다음은 특정 좌표 집합에서 함수 값을 가져오는 방법의 예시입니다:
# 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인 경우, job.error_message()를 사용하여 디버깅에 도움이 되는 오류 메시지를 가져옵니다. 다음과 같이 사용합니다:
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)
지원 받기
지원이 필요하시면 qiskit-function-support@colibritd.com으로 문의하세요.
다음 단계
- 양식을 작성하여 QUICK-PDE 함수 액세스를 요청하세요.
- 이 Qiskit Function의 API 참조를 방문하세요.
- 튜토리얼에서 QUICK-PDE를 사용하여 비점성 유체 흐름을 모델링해 보세요.
- Jaffali, H., et al. (2025). H-DES: a Quantum-Classical Hybrid Differential Equation Solver. arXiv preprint arXiv:2410.01130을 검토하세요.