Skip to main content
IBM Quantum Platform

QUICK-PDE를 사용하여 비점성 유체의 유동을 모델링하십시오

참고

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

사용 예상 시간: Heron r2 프로세서에서 50분. (참고: 이는 추정치일 뿐입니다. 런타임은 다를 수 있습니다.)

이 함수의 실행 시간은 일반적으로 20분 이상 걸립니다, 따라서 이 튜토리얼을 두 개의 섹션으로 나눌 수 있습니다 를 읽고 작업을 실행하고, 두 번째 섹션은 몇 시간 후에 (작업이 완료될 때까지 충분한 시간을 주면서) 작업의 결과를 가지고 작업하는 두 번째 섹션으로 나눌 수 있습니다.


배경

이 튜토리얼은 ColibriTD's 의 H-DES(하이브리드 미분방정식 솔버)를 활용하여 156Q Heron R2 의 QPU에서 복잡한 다중 물리 문제를 해결하기 위해 QUICK-PDE 함수를 사용하는 방법을 기초 수준에서 설명합니다. 기본 알고리즘은 H-DES 논문 에서 설명되어 있습니다. 이 솔버는 비선형 방정식도 풀 수 있다는 점에 유의하십시오.

유체 동역학, 열 확산, 재료 변형 등을 포함한 다중 물리 문제는 편미분 방정식으로 어디서나 설명할 수 있습니다 미분 방정식(PDE)으로 설명할 수 있습니다.

이러한 문제는 다양한 산업과 연관성이 높으며 응용 수학의 응용 수학의 중요한 분야입니다. 그러나 비선형 다변량 결합 PDE를 기존 도구로 해결하는 것은 기하급수적으로 많은 리소스가 필요하기 때문에 기하급수적으로 많은 양의 리소스가 필요하기 때문입니다.

이 함수는 복잡성과 변수가 증가하는 방정식에 적합하며 변수가 증가하는 방정식에 적합하며, 한때 난해한 것으로 간주되었던 가능성을 여는 첫걸음입니다. PDE로 모델링한 문제를 완전히 설명하려면 다음과 같이 해야 합니다 초기 조건과 경계 조건을 알아야 합니다. 이는 강력하게 pDE의 해와 그 해를 찾는 경로를 변경할 수 있습니다.

이 튜토리얼에서는 방법을 알려드립니다:

  1. 초기 조건 함수의 매개변수를 정의합니다.
  2. 큐비트 수(미분 방정식의 함수를 인코딩하는 데 사용), 깊이, 샷 수를 조정합니다.
  3. QUICK-PDE를 실행하여 기본 미분 방정식을 풀어보세요.

요구사항

이 튜토리얼을 시작하기 전에 다음이 설치되어 있는지 확인하세요:

  • 키스킷 SDK v2.0 이상 (pip install qiskit)
  • 키스킷 함수 카탈로그 (pip install qiskit-ibm-catalog)
  • Matplotlib (pip install matplotlib)
  • QUICK-PDE 함수 호출. 식을 작성하여 접근 권한을 요청해 주세요.

설정

API 키를 사용하여 인증하고 다음과 같이 기능을 선택합니다:

import numpy as np
import matplotlib.pyplot as plt
from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(
    channel="ibm_quantum_platform",
    instance="INSTANCE_CRN",
    # For `token`, use the 44-character API_KEY you created
    # and saved from the IBM Quantum Platform Home dashboard
    token="YOUR_API_KEY",
)

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

1단계: 해결할 문제의 속성 설정

이 튜토리얼에서는 두 가지 관점에서 사용자 경험을 다룹니다 초기 조건에 의해 결정되는 물리적 문제와 양자 컴퓨터에서 유체 역학 예제를 푸는 데 필요한 구성 요소와 양자 컴퓨터에서 유체 역학 예제를 푸는 두 가지 관점에서 사용자 경험을 다룹니다.

전산 유체 역학(CFD)은 광범위한 응용 분야를 가지고 있으며 따라서 기본 PDE를 연구하고 해결하는 것이 중요합니다. PDE의 중요한 제품군 의 중요한 제품군은 유체의 움직임을 설명하는 비선형 편미분 방정식인 나비에-스토크스 방정식입니다 미분 방정식입니다. 과학적 문제와 공학적 응용 분야와 과학 문제 및 엔지니어링 응용 분야와 관련이 높습니다.

특정 조건에서 나비에-스토크스 방정식은 버거스 방정식으로 축소됩니다 방정식, 대류-확산 방정식, 발생하는 현상을 설명하는 방정식 유체 역학, 기체 역학, 비선형 음향학 등 다양한 분야에서 모델링하여 소산 시스템.

1차원 버전의 방정식은 두 가지 변수에 따라 달라집니다: tR0t \in \mathbb{R}_{\geq 0} 시간적 차원을 모델링하는 변수, xRx \in \mathbb{R} 공간적 차원을 나타내는 변수입니다. 이 방정식의 일반적인 형태는 점성 버거 방정식이라고 하며 다음과 같습니다:

ut+uux=ν2ux2,\frac{\partial u}{\partial t} + u \frac{\partial u}{\partial x} = \nu \frac{\partial^2 u}{\partial x^2},

여기서u(x,t)u(x,t) 는 주어진 위치xx 및 시간tt 에서의 유체 속도장이며,ν\nu 는 유체의 점도이다. 점도는 유체의 중요한 성질로, 유체의 운동이나 변형에 대한 속도 의존적 저항을 나타내며, 따라서 유체의 역학적 특성을 규명하는 데 결정적인 역할을 한다. 유체의 점도가 0일 때( ν=0\nu = 0 ), 이 방정식은 보존 방정식이 되는데, 내부 저항이 부재하기 때문에 불연속성(충격파)이 발생할 수 있다. 이 경우, 이 방정식은 ‘비점성 버거스 방정식’이라고 불리며, 비선형 파동 방정식의 특수한 경우입니다.

엄밀히 말하면, 불변의 흐름은 자연에서는 발생하지 않지만, 모델링할 때 공기 역학적 흐름을 모델링할 때, 수송의 무한대 효과로 인해 문제를 설명하는 것이 유용할 수 있습니다. 놀랍게도 공기역학 이론의 70% 이상이 불변의 흐름을 다룹니다.

이 튜토리얼에서는 비점성 버거스 방정식을 CFD 예제로 사용하여, QUICK-PDE를 통해 IBM® QPU에서 다음과 같이 계산합니다:

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

이 문제의 초기 조건은 다음의 선형 함수로 설정됩니다. u(t=0,x)=ax+b, with a,bR,u(t=0,x) = ax + b,\text{ with }a,b\in\mathbb{R}, 여기서 aabb 는 해의 형태에 영향을 미치는 임의의 상수입니다. aabb 를 조정해 보면, 이들이 해결 과정과 해에 어떤 영향을 미치는지 확인할 수 있습니다. 이러한 초기 조건을 선택할 경우, 이 방정식은 다음과 같은 해석적 해를 가진다:

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

이는 충격파가 형성되지 않은 한 성립하며, 예를 들어 t<1/at < -1/a 에서 a<0a < 0 일 때와 같다.

job = quick.run(
    use_case="CFD_BURGER",
    physical_parameters={"a": 1.0, "b": 1.0},
)
print(job.result())

Output:

{'functions': {'u': array([[1.        , 0.96112378, 0.9230742 , 0.88616096, 0.85058445,
        0.81644741, 0.78376878, 0.75249908, 0.72253689, 0.69374562,
        0.66597013, 0.63905258, 0.61284684, 0.58723093, 0.56211691,
        0.53745752, 0.51324915, 0.48953036, 0.46637547, 0.44388257,
        0.4221554 , 0.40127848, 0.38128488, 0.36211604, 0.34357308,
        0.32525895, 0.30651089, 0.28632252, 0.26325504, 0.23533692],
       [1.2375    , 1.19267729, 1.14850734, 1.10544526, 1.06382155,
        1.02385326, 0.98565757, 0.94926734, 0.91464784, 0.88171402,
        0.85034771, 0.82041411, 0.79177677, 0.76431068, 0.73791248,
        0.71250742, 0.68805224, 0.66453346, 0.64196021, 0.62035121,
        0.59971506, 0.5800232 , 0.56117499, 0.54295419, 0.52497612,
        0.50662498, 0.48698059, 0.4647339 , 0.43809065, 0.40466247],
       [1.475     , 1.4242308 , 1.37394048, 1.32472956, 1.27705866,
        1.23125911, 1.18754636, 1.1460356 , 1.10675879, 1.06968242,
        1.03472529, 1.00177563, 0.9707067 , 0.94139043, 0.91370806,
        0.88755732, 0.86285533, 0.83953655, 0.81754494, 0.79681986,
        0.77727473, 0.75876792, 0.74106511, 0.72379234, 0.70637915,
        0.687991  , 0.66745028, 0.64314527, 0.61292625, 0.57398802],
       [1.7125    , 1.65578431, 1.59937362, 1.54401386, 1.49029576,
        1.43866495, 1.38943515, 1.34280386, 1.29886974, 1.25765082,
        1.21910288, 1.18313715, 1.14963664, 1.11847019, 1.08950364,
        1.06260722, 1.03765842, 1.01453964, 0.99312968, 0.97328851,
        0.95483439, 0.93751264, 0.92095522, 0.90463049, 0.88778219,
        0.86935702, 0.84791997, 0.82155665, 0.78776186, 0.74331358],
       [1.95      , 1.88733782, 1.82480676, 1.76329816, 1.70353287,
        1.6460708 , 1.59132394, 1.53957212, 1.49098069, 1.44561922,
        1.40348046, 1.36449867, 1.32856657, 1.29554994, 1.26529921,
        1.23765712, 1.21246152, 1.18954273, 1.16871442, 1.14975716,
        1.13239406, 1.11625736, 1.10084533, 1.08546864, 1.06918523,
        1.05072304, 1.02838966, 0.99996803, 0.96259746, 0.91263913]])}, 'samples': {'t': array([0.        , 0.03275862, 0.06551724, 0.09827586, 0.13103448,
       0.1637931 , 0.19655172, 0.22931034, 0.26206897, 0.29482759,
       0.32758621, 0.36034483, 0.39310345, 0.42586207, 0.45862069,
       0.49137931, 0.52413793, 0.55689655, 0.58965517, 0.62241379,
       0.65517241, 0.68793103, 0.72068966, 0.75344828, 0.7862069 ,
       0.81896552, 0.85172414, 0.88448276, 0.91724138, 0.95      ]), 'x': array([0.    , 0.2375, 0.475 , 0.7125, 0.95  ])}}

단계 2 (필요한 경우): 양자 하드웨어 실행을 위한 문제 최적화

기본적으로 솔버는 솔버가 시작될 주어진 큐비트 수와 깊이에 대한 초기 회로 파라미터인 물리 정보 파라미터를 사용합니다.

샷은 미세 조정이 중요하기 때문에 기본값이 있는 매개변수의 일부이기도 합니다.

해결하려는 구성에 따라 만족스러운 솔루션을 얻기 위한 알고리즘의 매개 변수를 조정해야 만족스러운 솔루션을 얻을 수 있습니다 에 따라 ttxx 변수당 더 많거나 더 적은 큐비트가 필요할 수 있으며, aabb. 다음은 함수당 큐비트 수를 조정합니다 변수당 큐비트 수, 함수당 깊이, 샷 수를 조정합니다.

백엔드 및 실행 모드를 지정하는 방법도 확인할 수 있습니다.

또한 물리적으로 정보에 기반한 매개변수가 최적화 프로세스를 잘못된 방향으로 이끌 수 있습니다 잘못된 방향으로 유도할 수 있습니다. 이 경우, 이 매개변수를 initialization 전략을 "RANDOM" 으로 설정하여 비활성화할 수 있습니다.

job_2 = quick.run(
    use_case="CFD_BURGER",
    physical_parameters={"a": 0.5, "b": 0.25},
    nb_qubits={"u": {"t": 2, "x": 1}},
    depth={"u": 3},
    shots=[500, 2500, 5000, 10000],
    initialization="RANDOM",
    backend="ibm_kingston",
    mode="session",
)
print(job_2.result())

Output:

{'functions': {'u': array([[0.25      , 0.24856543, 0.24687708, 0.2449444 , 0.24277686,
        0.24038389, 0.23777496, 0.23495952, 0.23194702, 0.22874691,
        0.22536866, 0.22182171, 0.21811551, 0.21425952, 0.2102632 ,
        0.20613599, 0.20188736, 0.19752675, 0.19306361, 0.18850741,
        0.18386759, 0.1791536 , 0.17437491, 0.16954096, 0.16466122,
        0.15974512, 0.15480213, 0.1498417 , 0.14487328, 0.13990632],
       [0.36875   , 0.36681313, 0.36457201, 0.36203594, 0.35921422,
        0.35611615, 0.35275103, 0.34912817, 0.34525687, 0.34114643,
        0.33680614, 0.33224532, 0.32747327, 0.32249928, 0.31733266,
        0.31198271, 0.30645873, 0.30077002, 0.29492589, 0.28893564,
        0.28280857, 0.27655397, 0.27018116, 0.26369944, 0.2571181 ,
        0.25044645, 0.24369378, 0.23686941, 0.22998264, 0.22304275],
       [0.4875    , 0.48506084, 0.48226695, 0.47912748, 0.47565158,
        0.47184841, 0.46772711, 0.46329683, 0.45856672, 0.45354594,
        0.44824363, 0.44266894, 0.43683103, 0.43073904, 0.42440212,
        0.41782942, 0.4110301 , 0.4040133 , 0.39678818, 0.38936388,
        0.38174955, 0.37395435, 0.36598742, 0.35785791, 0.34957498,
        0.34114777, 0.33258544, 0.32389713, 0.315092  , 0.30617919],
       [0.60625   , 0.60330854, 0.59996188, 0.59621902, 0.59208895,
        0.58758067, 0.58270318, 0.57746549, 0.57187658, 0.56594545,
        0.55968112, 0.55309256, 0.54618879, 0.53897879, 0.53147158,
        0.52367614, 0.51560147, 0.50725658, 0.49865046, 0.48979211,
        0.48069053, 0.47135472, 0.46179367, 0.45201638, 0.44203186,
        0.4318491 , 0.42147709, 0.41092485, 0.40020136, 0.38931562],
       [0.725     , 0.72155625, 0.71765682, 0.71331056, 0.70852631,
        0.70331293, 0.69767926, 0.69163414, 0.68518643, 0.67834497,
        0.6711186 , 0.66351618, 0.65554655, 0.64721855, 0.63854104,
        0.62952285, 0.62017284, 0.61049986, 0.60051274, 0.59022035,
        0.57963151, 0.56875509, 0.55759992, 0.54617486, 0.53448874,
        0.52255042, 0.51036875, 0.49795257, 0.48531072, 0.47245205]])}, 'samples': {'t': array([0.        , 0.03275862, 0.06551724, 0.09827586, 0.13103448,
       0.1637931 , 0.19655172, 0.22931034, 0.26206897, 0.29482759,
       0.32758621, 0.36034483, 0.39310345, 0.42586207, 0.45862069,
       0.49137931, 0.52413793, 0.55689655, 0.58965517, 0.62241379,
       0.65517241, 0.68793103, 0.72068966, 0.75344828, 0.7862069 ,
       0.81896552, 0.85172414, 0.88448276, 0.91724138, 0.95      ]), 'x': array([0.    , 0.2375, 0.475 , 0.7125, 0.95  ])}}

3단계: 알고리즘 성능 비교

당사의 솔루션(HDES)의 수렴 과정을 물리 기반 신경망( job_2 PINN) 알고리즘 및 솔버의 성능과 비교할 수 있습니다(관련 논문 GitHub 및 저장소 참조).

'의 job_2 출력(양자 기반 접근법) 예시에서, 고전적 솔버로 최적화되는 매개변수는 단 13개(회로 매개변수 12개와 스케일링 매개변수 1개)에 불과하다. 수렴 과정은 다음과 같습니다:

optimizers:
   CMA: {'ftarget': np.float64(0.1), 'verb_disp': 10, 'maxiter': 100}
   CMA: {'ftarget': np.float64(0.005), 'verb_disp': 10, 'maxiter': 20}
   CMA: {'ftarget': np.float64(0.0025), 'verb_disp': 10, 'maxiter': 30}
   CMA: {'ftarget': np.float64(0.0005), 'verb_disp': 10, 'maxiter': 10}

500 shots
================== CMA =================
option:  {'ftarget': np.float64(0.1), 'verb_disp': 10, 'maxiter': 100}
0/100, loss: 0.02456641

1000 shots
================== CMA =================
option:  {'ftarget': np.float64(0.005), 'verb_disp': 10, 'maxiter': 20}
0/20, loss: 0.03641833
1/20, loss: 0.02461719
2/20, loss: 0.0283689
3/20, loss: 0.009898383
4/20, loss: 0.04454522
5/20, loss: 0.007019971
6/20, loss: 0.00811147
7/20, loss: 0.01592619
8/20, loss: 0.00764708
9/20, loss: 0.01401516
10/20, loss: 0.01767467
11/20, loss: 0.01220387

5000 shots
================== CMA =================
option:  {'ftarget': np.float64(0.0025), 'verb_disp': 10, 'maxiter': 30}
0/30, loss: 0.01024792
1/30, loss: 0.004343748
2/30, loss: 0.01450951
3/30, loss: 0.008591284
4/30, loss: 0.00266414
5/30, loss: 0.007923613
6/30, loss: 0.02023853
7/30, loss: 0.01031438
8/30, loss: 0.009513116
9/30, loss: 0.008132266
10/30, loss: 0.005787766
11/30, loss: 0.00390582

10000 shots
================== CMA =================
option:  {'ftarget': np.float64(0.0005), 'verb_disp': 10, 'maxiter': 10}
0/10, loss: 0.002386168
1/10, loss: 0.004024823
2/10, loss: 0.001311999
3/10, loss: 0.003433991
4/10, loss: 0.002339664
5/10, loss: 0.002978438
6/10, loss: 0.005458391
7/10, loss: 0.002026701
8/10, loss: 0.00207467
9/10, loss: 0.001947627
final_loss: 0.00151994463476429

이는 28회 반복 후, 그리고 몇 가지 고전적 매개변수만 최적화해도 아래의 손실값에 0.0015 도달할 수 있음을 의미한다.

이제 우리는 논문에서 제안한 기본 구성의 PINN 솔루션과 기울기 기반 최적화기를 사용한 것을 비교할 수 있습니다. 최적화해야 할 13개 매개변수를 가진 우리의 회로에 상응하는 것은 신경망으로, 최소 20개의 뉴런으로 구성된 8개 이상의 층이 필요하며, 따라서 3021개의 매개변수를 최적화해야 한다. 그런 다음, 목표 손실이 단계 315에서 도달됩니다. 손실: 0.0014988397.

PINN 데이터와 HDES-Qiskit 함수를 비교한 그래프.

이제 공정한 비교를 위해 두 경우 모두 동일한 최적화기를 사용해야 합니다. 20개의 뉴런으로 구성된 12개의 레이어에 대해 발견한 최소 반복 횟수: 4701개 매개변수

(10_w,20)-aCMA-ES (mu_w=5.9,w_1=27%) in dimension 4701 (seed=351961)
Iterat #Fevals   function value  axis ratio  sigma  min&max std  t[m:s]
    1     20 5.398521572351456e-02 1.0e+00 9.98e-03  1e-02  1e-02 0:02.3
    2     40 5.444650724530220e-02 1.0e+00 9.97e-03  1e-02  1e-02 0:05.1
    3     60 4.447407275438309e-02 1.0e+00 9.95e-03  1e-02  1e-02 0:08.2
    4     80 2.068969979882240e-02 1.0e+00 9.94e-03  1e-02  1e-02 0:11.7
    6    120 1.028892211616039e-02 1.0e+00 9.91e-03  1e-02  1e-02 0:20.1
    7    140 5.140972323715687e-03 1.0e+00 9.90e-03  1e-02  1e-02 0:25.4
    9    180 3.811701666563749e-03 1.0e+00 9.87e-03  1e-02  1e-02 0:37.4
   10    200 3.189878538250923e-03 1.0e+00 9.85e-03  1e-02  1e-02 0:44.2
   12    240 2.547040116041899e-03 1.0e+00 9.83e-03  1e-02  1e-02 0:59.7
   14    280 2.166548743844032e-03 1.0e+00 9.80e-03  1e-02  1e-02 1:18.0
   15    300 1.783065614290535e-03 1.0e+00 9.79e-03  1e-02  1e-02 1:28.4
   16    320 2.045844215899706e-03 1.0e+00 9.78e-03  1e-02  1e-02 1:39.8
Stopping early: loss 0.001405 <= target 0.0015
CMA-ES finished. Best loss: 0.001404788694344461

의 데이터로 동일한 작업을 수행하고 PINN job_2 솔루션과의 비교를 그래프로 표시할 수 있습니다.

# check the loss function and compare between the two approaches
print(job_2.logs())

4단계: 결과 활용하기

이제 솔루션으로 무엇을 할 것인지 선택할 수 있습니다. 다음은 결과를 플로팅하는 방법을 설명합니다.

solution = job.result()

# Plot the solution of the second simulation job_2
_ = 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, marker=".")
ax.set(xlabel="t", ylabel="x", zlabel="u(t,x)")

plt.show()

Output:

Output of the previous code cell

두 번째 실행에 대한 초기 조건의 차이와 그 영향에 주목하세요 결과에 미치는 영향에 주목하세요:

solution_2 = job_2.result()

# Plot the solution of the second simulation job_2
_ = plt.figure()
ax = plt.axes(projection="3d")

# plot the solution using the 3d plotting capabilities of pyplot
t, x = np.meshgrid(solution_2["samples"]["t"], solution_2["samples"]["x"])
ax.plot_surface(
    t,
    x,
    solution_2["functions"]["u"],
    edgecolor="royalblue",
    lw=0.25,
    rstride=26,
    cstride=26,
    alpha=0.3,
)
ax.scatter(t, x, solution_2, marker=".")
ax.set(xlabel="t", ylabel="x", zlabel="u(t,x)")

plt.show()

Output:

Output of the previous code cell

튜토리얼 설문조사

잠시 시간을 내어 이 튜토리얼에 대한 피드백을 제공해 주세요. 여러분의 인사이트는 콘텐츠 제공과 사용자 경험을 개선하는 데 도움이 됩니다:

설문조사 링크

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