Skip to main content
IBM Quantum Platform

QUICK-PDE: ColibriTD 의 Qiskit 함수

API 참조 보기

Note

키스킷 기능은 IBM 퀀텀® 프리미엄 요금제, Flex 요금제 및 온프레미스( IBM 퀀텀 플랫폼 API를 통해) 요금제 사용자에게 제공되는 실험적 기능입니다. 프리뷰 릴리스 상태이며 변경될 수 있습니다.


개요

본 문서에서 소개하는 편미분방정식(PDE) 솔버는 당사의 양자 혁신 컴퓨팅 키트(QUICK) 플랫폼(QUICK-PDE)의 일부이며, Qiskit 함수로 패키징되어 있습니다. QUICK-PDE 기능을 사용하면 IBM Quantum QPU에서 도메인별 편미분 방정식을 해결할 수 있습니다. 이 함수는 ColibriTD's 에 설명된 H-DES 설명 문서의 알고리즘을 기반으로 합니다. 이 알고리즘은 계산 유체 역학(CFD)과 재료 변형(MD)을 시작으로 복잡한 다중 물리 문제를 해결할 수 있으며, 다른 사용 사례도 곧 제공될 예정입니다.

미분 방정식을 해결하기 위해 시험 해는 직교 함수(일반적으로 체비셰프 다항식, 더 구체적으로 2n2^n, 여기서 nn 은 함수를 인코딩하는 큐비트 수)의 선형 조합으로 인코딩되며, 가변 양자 회로(VQC)의 각도로 파라미터화됩니다. Ansatz는 함수를 인코딩하는 상태를 생성하며, 이 상태는 모든 지점에서 함수를 평가할 수 있는 조합이 가능한 관찰 가능 항목에 의해 평가됩니다. 그런 다음 다음과 같이 미분 방정식이 인코딩된 손실 함수를 평가하고 하이브리드 루프에서 각도를 미세 조정할 수 있습니다. 평가판 솔루션은 만족스러운 결과에 도달할 때까지 실제 솔루션에 점차 가까워집니다.

QUICK-PDE 기능의 워크플로우

이 하이브리드 루프 외에도 서로 다른 최적화 도구를 연결할 수도 있습니다. 이 기능은 글로벌 옵티마이저가 좋은 각도 집합을 찾은 다음, 보다 미세 조정된 옵티마이저가 그라데이션을 따라 최적의 인접 각도 집합을 찾도록 하려는 경우에 유용합니다. 전산 유체 역학(CFD)의 경우 기본 최적화 시퀀스가 최상의 결과를 생성하지만, 재료 변형(MD)의 경우 기본값이 좋은 결과를 제공하지만 문제별 이점을 위해 추가로 구성할 수 있습니다.

함수의 각 변수에 대해 큐비트 수를 지정합니다(여러분이 가지고 놀 수 있음). 10개의 동일한 회로를 쌓고 하나의 큰 회로에서 서로 다른 큐비트에 대해 10개의 동일한 관측값을 평가하면 노이즈 학습자 방법에 의존하여 CMA 최적화 프로세스 내에서 노이즈를 완화하고 필요한 샷 수를 크게 줄일 수 있습니다.

전산 유체 역학

비점성 버거스 방정식은 비점성 유체의 흐름을 다음과 같이 모델링합니다:

ut+uux=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}.

무압 오일러 방정식은 감쇠를 동반한 압축성 비점성 유체 흐름을 다음과 같이 모델링합니다:

gt+ugx+gux=0,\frac{\partial g}{\partial t} + u\frac{\partial g}{\partial x} + g\frac{\partial u}{\partial x} = 0,

ugt+gut+u2gx+2guux+μ(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)=exg(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차원 인장 시험을 통한 저탄성 변형에 초점을 맞추고 있으며, 이 시험에서는 공간에 고정된 막대의 반대쪽 끝을 당기는 방식으로 진행됩니다. 이 문제를 다음과 같이 설명합니다:

uσ3K23ϵ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 는 지수 법칙의 지수, bb 는 단위 질량당 힘을, ϵ0\epsilon_0 는 비례 응력 한계, σ0\sigma_0 는 비례 변형률 한계, uu 는 응력 함수, σ\sigma 는 변형률 함수를 나타낸다. 분석적 해는 다음과 같습니다:

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

u(x)=3(3+n)/22bK(1+n)σ0n[3(1+n)/2b2σ0n(1+n)x223(1+n)/2bσ0n(1+n)σ0x12ϵ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)n12ϵ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개입니다.

벤치마크

다음 표에는 다양한 함수 실행에 대한 통계가 나와 있습니다.

큐비트 수
초기화
오류
총 시간(분)
런타임 사용량(분)
인비시드 버거의 방정식50PHYSICALLY_INFORMED10210^{-2}6625
무압 오일러 방정식70PHYSICALLY_INFORMED10210^{-2}4834
저탄성 1D 인장 테스트18RANDOM10210^{-2}123100

시작하기

QUICK-PDE 함수 사용 권한을 요청하려면 양식을 작성해 주십시오. 그런 다음, 계정을 이미 로컬 환경에 저장해 두었다고 가정하고 다음과 같이 함수를 선택하십시오:

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 함수 워크로드의 상태를 확인하거나 결과를 반환하세요:

# 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)=exg(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)

지원 받기

지원이 필요하시면 연락하십시오 [email protected].


다음 단계

권장사항
이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.