주 콘텐츠로 건너뛰기

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)는 직교 함수의 선형 결합(일반적으로 체비쇼프 다항식, 더 구체적으로는 2n2^n개이며 여기서 nn은 함수를 인코딩하는 Qubit의 수)으로 인코딩되고, Variable Quantum Circuit(VQC)의 각도로 매개변수화됩니다. Ansatz는 함수를 인코딩하는 상태를 생성하며, 이는 모든 점에서 함수를 평가할 수 있는 관측량(observable)의 조합으로 평가됩니다. 그런 다음 미분 방정식이 인코딩된 손실 함수를 평가하고, 하이브리드 루프에서 각도를 미세 조정할 수 있습니다(아래 그림 참조). 시험 해는 만족스러운 결과에 도달할 때까지 실제 해에 점점 더 가까워집니다.

QUICK-PDE 함수의 워크플로우

이 하이브리드 루프 외에도, 여러 최적화기를 함께 연결할 수도 있습니다. 이는 전역 최적화기로 좋은 각도 집합을 찾은 다음, 더 세밀한 최적화기로 기울기(gradient)를 따라 최적의 인접 각도 집합을 찾고자 할 때 유용합니다. 전산 유체 역학(CFD)의 경우 기본 최적화 순서가 최상의 결과를 제공하지만, 재료 변형(MD)의 경우 기본값도 좋은 결과를 제공하면서 문제별 이점을 위해 추가로 구성할 수 있습니다.

함수의 각 변수에 대해 Qubit의 수를 지정한다는 점을 참고하세요(직접 조정해볼 수 있습니다). 동일한 Circuit 10개를 쌓고 하나의 큰 Circuit 전체에서 서로 다른 Qubit에 대해 동일한 관측량 10개를 평가함으로써, 노이즈 학습기 방법에 의존하는 CMA 최적화 프로세스 내에서 노이즈를 완화하고 필요한 샷 수를 크게 줄일 수 있습니다.

전산 유체 역학​

**비점성 버거스 방정식(inviscid Burgers' equation)**은 다음과 같이 비점성 유체의 흐름을 모델링합니다:

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

uu는 유체 속도 필드를 나타냅니다. 이 사용 사례에는 시간적 경계 조건이 있습니다. 초기 조건을 선택한 후 시스템이 이완되도록 할 수 있습니다. 현재 허용되는 초기 조건은 선형 함수 ax+bax + b뿐입니다. 분석 해는 다음과 같습니다:

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

**압력이 없는 오일러 방정식(pressureless Euler equations)**은 다음과 같이 감쇠가 있는 압축성 비점성 유체 흐름을 모델링합니다:

∂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는 밀도장을, uu는 속도장을, μ\mu는 감쇠 계수를 나타냅니다. 본 공식에서는 λ=1\lambda = 1로 설정하므로 이후에는 매개변수로 사용되지 않습니다. 이 사용 사례에는 시간적 경계 조건이 있습니다: g(0,x)=e−xg(0, x) = e^{-x} 및 u(0,x)=xu(0, x) = x. 해석적 해는 다음과 같습니다:

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

CFD 미분 방정식의 인수는 다음과 같이 고정된 격자에 있습니다:

  • tt는 0에서 0.95 사이이며 41개의 샘플 포인트를 가집니다. xx는 0에서 0.95 사이이며 41개의 샘플 포인트를 가집니다.

재료 변형​

이 사용 사례는 공간에 고정된 막대의 한쪽 끝을 당기는 1차원 인장 시험으로 저탄성 변형(hypoelastic deformation)에 초점을 맞춥니다. 문제를 다음과 같이 설명합니다:

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는 늘어나는 재료의 체적 탄성률, nn은 멱법칙(power law)의 지수, bb는 단위 질량당 힘, ϵ0\epsilon_0는 비례 응력 한계, σ0\sigma_0는 비례 변형률 한계, uu는 응력 함수, σ\sigma는 변형률 함수를 나타냅니다. 분석 해는 다음과 같습니다:

σ(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],

여기서 σ0=g(0)\sigma_0 = g(0)는 x=0x=0에서의 변형률에 대한 경계 조건입니다.

고려되는 막대는 단위 길이를 가집니다. 이 사용 사례에는 표면 응력 tt, 즉 막대를 늘리는 데 필요한 일의 양에 대한 경계 조건이 있습니다.

MD 미분 방정식의 인수는 다음과 같이 고정된 격자에 있습니다:

  • xx는 0에서 1 사이이며 30개의 샘플 포인트를 가집니다.

벤치마크​

다음 표는 함수의 여러 실행에 대한 통계를 보여줍니다.

예제큐비트 수초기화오차총 시간(분)런타임 사용량(분)
Inviscid Burgers' equation50PHYSICALLY_INFORMED10−210^{-2}6625
Pressureless Euler's equations70PHYSICALLY_INFORMED10−210^{-2}4834
Hypoelastic 1D tensile test18RANDOM10−210^{-2}123100

시작하기​

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

버거스 방정식의 경우, 초기 조건을 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_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)​

오일러 방정식의 경우, 초기 조건을 g(0,x)=e−xg(0, x) = e^{-x} 및 u(0,x)=xu(0, x) = x로 설정하고, 주어진 μ\mu(여기서는 μ=0.1\mu = 0.1) 및 λ=1\lambda = 1에 대해, 결과는 다음과 같습니다:

# 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으로 문의하세요.

다음 단계​

권장 사항