{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f7d9993f",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"QUICK-PDE - ColibriTD による Qiskit 関数\"\n",
        "description: \"QUICK-PDE機能は、 ColibriTD's H-DESアルゴリズムを用いて領域固有の偏微分方程式を解き、複雑なマルチフィジックス問題を解決できます。\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore CMAES, Hypoelastic, edgecolor, royalblue, rstride, cstride, colibritd, xlabel, ylabel, zlabel, Jaffali, Pressureless, Colorplot, viridis, fontsize, fontweight */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2f87f5f0",
      "metadata": {},
      "source": [
        "<span id=\"quick-pde-a-qiskit-function-by-colibritd\" />\n",
        "\n",
        "# QUICK-PDE: Qiskit関数（ ColibriTD 著）\n",
        "\n",
        "*[APIリファレンス](/docs/api/functions/colibritd-pde)を参照してください*\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9cd91354",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "01701579",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\">\n",
        "  Qiskitファンクションは、 IBM Quantum® Premium Plan、Flex Plan、およびオンプレム（ IBM Quantum Platform API経由）プランのユーザーが利用できる実験的な機能です。 これらはプレビューリリースであり、変更される可能性がある。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "<span id=\"overview\" />\n",
        "\n",
        "## 概要\n",
        "\n",
        "ここで紹介する偏微分方程式（PDE）ソルバーは、当社の量子革新的コンピューティングキット（QUICK）プラットフォーム（QUICK-PDE）の一部であり、Qiskit関数としてパッケージ化されています。 QUICK-PDE関数を使えば、IBM Quantum QPU上でドメイン固有の偏微分方程式を解くことができます。 この機能は[、 ColibriTD's](https://arxiv.org/abs/2410.01130) に記載されているH-DESの仕様書に記載されたアルゴリズムに基づいています。 このアルゴリズムは、計算流体力学（CFD）と材料変形（MD）を起点として、複雑なマルチフィジックス問題を解決でき、その他のユースケースも近日提供予定です。\n",
        "\n",
        "微分方程式に取り組むために、試行解は直交関数（典型的にはチェビシェフ多項式、より具体的には $2^n$、 $n$ は関数をエンコードする量子ビットの数）の線形結合としてエンコードされ、可変量子回路（VQC）の角度によってパラメータ化される。 アナザッツは関数を符号化した状態を生成し、その関数はすべての点で関数を評価できるような組み合わせの観測量によって評価される。 次に、微分方程式がエンコードされた損失関数を評価し、次のようにハイブリッドループで角度を微調整することができる。 試行解は徐々に実際の解に近づいていき、満足のいく結果に到達する。\n",
        "\n",
        "![QUICK-PDE機能のワークフロー](https://eu-de.quantum.cloud.ibm.com/docs/images/guides/colibritd-equation-solver/diagram.svg)\n",
        "\n",
        "このハイブリッド・ループに加えて、異なるオプティマイザーを連鎖させることもできる。 これは、大域的なオプティマイザーで最適な角度のセットを見つけ、さらに微調整されたオプティマイザーで、隣接する角度の最適なセットへの勾配をたどりたい場合に便利です。 数値流体力学（CFD）の場合、デフォルトの最適化シーケンスで最良の結果が得られますが、材料変形（MD）の場合は、デフォルトで良好な結果が得られる一方で、問題固有の利点を得るためにさらに設定することができます。\n",
        "\n",
        "この関数の各変数には、量子ビットの数を指定する（これは自由に弄ることができる）。 10個の同じ回路を積み重ね、1つの大きな回路を通して異なる量子ビットで10個の同じ観測値を評価することで、ノイズ学習法に頼ってCMA最適化プロセス内でノイズ・ミティゲートすることができ、必要なショット数を大幅に減らすことができます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "be28949c",
      "metadata": {},
      "source": [
        "<span id=\"computational-fluid-dynamics\" />\n",
        "\n",
        "### 計算流体力学\n",
        "\n",
        "**非粘性バーガーズ方程式は、** 流れる非粘性流体を次のようにモデル化する：\n",
        "\n",
        "$\\frac{\\partial u}{\\partial t} + u\\frac{\\partial u}{\\partial x} = 0,$\n",
        "\n",
        "$u$ 流体の速度場を表す。 このユースケースには時間的な境界条件があります。初期条件を選択した後、システムを緩和させることができます。 現在、許容される初期条件は線形関数のみです： $ax + b$。解析解は次のとおりです：\n",
        "\n",
        "$u(t, x) = \\frac{ax + b}{at + 1}.$\n",
        "\n",
        "**無圧のオイラー方程式は、** 減衰を伴う圧縮性非粘性流体の流れを次のようにモデル化する：\n",
        "\n",
        "$\\frac{\\partial g}{\\partial t} + u\\frac{\\partial g}{\\partial x} + g\\frac{\\partial u}{\\partial x} = 0,$\n",
        "\n",
        "$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,$\n",
        "\n",
        "$g$ は密度場、 $u$ は速度場、 $\\mu$ は減衰係数を表す。 本論文の定式化では、 $\\lambda = 1$ と設定しているため、以下ではこれをパラメータとして用いることはない。 このユースケースには、時間的な境界条件があります： $g(0, x) = e^{-x}$ および $u(0, x) = x$。解析解は次のとおりです：\n",
        "\n",
        "$g(t, x) = \\frac{1-\\mu}{(1+t)^{1-\\mu} - \\mu} \\exp\\!\\left(\\frac{(\\mu-1)\\, x}{(1+t)^{1-\\mu} - \\mu}\\right),$\n",
        "\n",
        "$u(t, x) = \\frac{(1-\\mu)\\, x}{\\left((1+t)^{1-\\mu} - \\mu\\right)(1+t)^{\\mu}}.$\n",
        "\n",
        "CFDの微分方程式の引数は、以下のように固定グリッド上にある：\n",
        "\n",
        "* $t$ は 0 から 0.95 までの範囲で、41個のサンプルポイントがあります。 $x$ は 0 から 0.95 までの範囲で、41個のサンプルポイントがあります。\n",
        "\n",
        "<span id=\"material-deformation\" />\n",
        "\n",
        "### 材料の変形\n",
        "\n",
        "このユースケースでは、空間に固定された棒材のもう一方の端を引っ張る**一次元引張試験**における、低弾性変形に焦点を当てています。 この問題を次のように説明する：\n",
        "\n",
        "$u' - \\frac{\\sigma}{3K} - \\frac{2}{\\sqrt{3}}\\epsilon_0\\left(\\frac{\\sigma'}{\\sigma_0\\sqrt{3}}\\right)^n = 0,$\n",
        "\n",
        "$\\sigma' - b = 0,$\n",
        "\n",
        "$K$ は、伸張される材料の体積弾性率を表し、 $n$ はべき則の指数、 $b$ は単位質量あたりの力、 $\\epsilon_0$ は比例応力限界、 $\\sigma_0$ は比例ひずみ限界、 $u$ は応力関数、 $\\sigma$ はひずみ関数を表す。 解析解は次のとおりです：\n",
        "\n",
        "$\\sigma(x) = \\sigma_0 - bx,$\n",
        "\n",
        "$u(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}$\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],$\n",
        "\n",
        "ここで、 $\\sigma_0 = g(0)$ は、 $x=0$ におけるひずみに関する境界条件である。\n",
        "\n",
        "考慮されている棒は単位長さである。 このユースケースには、表面応力（ $t$ ）、つまりバーを伸ばすのに必要な仕事量の境界条件がある。\n",
        "\n",
        "MDの微分方程式の議論は、以下のように固定グリッド上で行われる：\n",
        "\n",
        "* $x$ 0から1の間で、サンプル数は30です。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b34fe075",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## ベンチマーク\n",
        "\n",
        "以下の表は、我々の機能の様々な実行に関する統計である。\n",
        "\n",
        "| 例              | 量子ビット数 | 初期設定                  | エラー       | 合計時間 (分) | ランタイム使用量（分） |\n",
        "| -------------- | ------ | --------------------- | --------- | -------- | ----------- |\n",
        "| 非粘性Burgersの方程式 | 50     | `PHYSICALLY_INFORMED` | $10^{-2}$ | 66       | 25 GB       |\n",
        "| 無圧オイラー方程式      | 70     | `PHYSICALLY_INFORMED` | $10^{-2}$ | 48       | 34          |\n",
        "| 超弾性 1D 引張試験    | 18     | `RANDOM`              | $10^{-2}$ | 123      | 100         |\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "73390a19",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## 使用を開始する\n",
        "\n",
        "[QUICK-PDE 関数の利用申請を行うには](https://forms.cloud.microsoft/e/3Wi9cbjQPK)、フォームに必要事項をご記入ください。 次に、 [アカウントが](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client)すでにローカル環境に保存されていることを前提として、次のように関数を選択してください：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "95a715d2",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(\n",
        "    channel=\"ibm_cloud / ibm_quantum_platform\",\n",
        "    instance=\"USER_CRN / HGP\",\n",
        "    token=\"USER_API_KEY / IQP_API_TOKEN\",\n",
        ")\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(channel=\"ibm_quantum_platform\")\n",
        "\n",
        "# Verify that you have access to the function\n",
        "catalog.list()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "4ec04623",
      "metadata": {},
      "outputs": [],
      "source": [
        "quick = catalog.load(\"colibritd/quick-pde\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e8837f5f",
      "metadata": {},
      "source": [
        "<span id=\"examples\" />\n",
        "\n",
        "## 例\n",
        "\n",
        "手始めに、以下の例のひとつを試してみよう：\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "446ac943",
      "metadata": {},
      "source": [
        "<span id=\"inviscid-burgers-equation-cfd\" />\n",
        "\n",
        "### インビスィッド・バーガーズの方程式（CFD）\n",
        "\n",
        "バーガーズ方程式について、初期条件を $u(0,x) = x$ に設定した場合、結果は次の通りとなる：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "d56e1440",
      "metadata": {},
      "outputs": [],
      "source": [
        "# launch the simulation with initial conditions u(0,x) = a*x + b\n",
        "job = quick.run(\n",
        "    use_case=\"CFD_BURGER\", physical_parameters={\"a\": 1.0, \"b\": 0.0}\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "03998691",
      "metadata": {},
      "source": [
        "Qiskit Function [ワーク](/docs/guides/functions-get-started#check-job-status)ロードのステータスを確認したり、 [結果を](/docs/guides/functions-get-started#retrieve-results)返したりするには、次のように操作してください：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "856fe992",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Print the ID so you can use it later, if necessary\n",
        "print(job.job_id)\n",
        "print(job.status())\n",
        "solution = job.result()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c42aba9b",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "\n",
        "def plot_result_3d(result):\n",
        "    fig = plt.figure()\n",
        "    ax = fig.add_subplot(projection=\"3d\")\n",
        "\n",
        "    t, x = np.meshgrid(result[\"samples\"][\"t\"], result[\"samples\"][\"x\"])\n",
        "\n",
        "    ax.plot_surface(\n",
        "        t,\n",
        "        x,\n",
        "        result[\"functions\"][\"u\"],\n",
        "        edgecolor=\"royalblue\",\n",
        "        lw=0.25,\n",
        "        rstride=26,\n",
        "        cstride=26,\n",
        "        alpha=0.3,\n",
        "    )\n",
        "    ax.scatter(t, x, result[\"functions\"][\"u\"], marker=\".\")\n",
        "    ax.set(xlabel=\"t\", ylabel=\"x\", zlabel=\"u(t,x)\")\n",
        "\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "# Call\n",
        "plot_result_3d(solution)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4408d52e",
      "metadata": {},
      "source": [
        "<span id=\"pressureless-eulers-equation-cfd\" />\n",
        "\n",
        "### 無圧オイラー方程式（CFD）\n",
        "\n",
        "オイラー方程式について、初期条件を $g(0, x) = e^{-x}$ および $u(0, x) = x$ に設定し、 $\\mu$ （ここでは $\\mu = 0.1$ ）および $\\lambda = 1$ を指定した場合、結果は次の通りとなる：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "e0412513",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Launches the solving for an arbitrary mu\n",
        "job = quick.run(use_case=\"CFD_EULER\", physical_parameters={\"mu\": 0.1})\n",
        "\n",
        "solution = job.result()\n",
        "\n",
        "\n",
        "# Colorplot function\n",
        "def plot_result_2d(result):\n",
        "    fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n",
        "\n",
        "    configs = {\n",
        "        \"g\": {\"cmap\": \"viridis\", \"title\": \"g(t, x)\"},\n",
        "        \"u\": {\"cmap\": \"plasma\", \"title\": \"u(t, x)\"},\n",
        "    }\n",
        "\n",
        "    t = result[\"samples\"][\"t\"]\n",
        "    x = result[\"samples\"][\"x\"]\n",
        "\n",
        "    for ax, (field, cfg) in zip(axes, configs.items()):\n",
        "        v = result[\"functions\"][field]\n",
        "\n",
        "        im = ax.contourf(t, x, v, levels=50, cmap=cfg[\"cmap\"])\n",
        "        fig.colorbar(im, ax=ax, label=cfg[\"title\"])\n",
        "\n",
        "        ax.set_xlabel(\"t\")\n",
        "        ax.set_ylabel(\"x\")\n",
        "        ax.set_title(cfg[\"title\"], fontsize=13, fontweight=\"bold\")\n",
        "\n",
        "    plt.tight_layout()\n",
        "    plt.show()\n",
        "\n",
        "\n",
        "plot_result_2d(solution)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "dbbd4509",
      "metadata": {},
      "source": [
        "<span id=\"material-deformation\" />\n",
        "\n",
        "### 材料の変形\n",
        "\n",
        "材料変形のユースケースには、材料の物理パラメータと加えられる力が必要です：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "a568e325",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Select the properties of your material\n",
        "job = quick.run(\n",
        "    use_case=\"MD\",\n",
        "    physical_parameters={\n",
        "        \"t\": 12.0,\n",
        "        \"K\": 100.0,\n",
        "        \"n\": 4.0,\n",
        "        \"b\": 10.0,\n",
        "        \"epsilon_0\": 0.1,\n",
        "        \"sigma_0\": 5.0,\n",
        "    },\n",
        ")\n",
        "\n",
        "# Plot the result\n",
        "solution = job.result()\n",
        "\n",
        "_ = plt.figure()\n",
        "stress_plot = plt.subplot(211)\n",
        "plt.plot(solution[\"samples\"][\"x\"], solution[\"functions\"][\"u\"])\n",
        "strain_plot = plt.subplot(212)\n",
        "plt.plot(solution[\"samples\"][\"x\"], solution[\"functions\"][\"sigma\"])\n",
        "\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f1cfa869",
      "metadata": {},
      "source": [
        "以下は、特定の座標に対する関数の値を算出する方法の例です：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c5193114",
      "metadata": {},
      "outputs": [],
      "source": [
        "# u(t=0.2, x=0.7) == 2\n",
        "assert solution[\"samples\"][\"t\"][1] == 0.2\n",
        "assert solution[\"samples\"][\"x\"][2] == 0.7\n",
        "assert solution[\"functions\"][\"u\"][1, 2] == 2"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "04236c83",
      "metadata": {},
      "source": [
        "<span id=\"fetch-error-messages\" />\n",
        "\n",
        "## エラーメッセージを取得する\n",
        "\n",
        "ワークロードのステータスが `ERROR` の場合、 `job.error_message()` を使ってエラーメッセージを取得し、デバッグに役立てる：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "90c6de7c",
      "metadata": {},
      "outputs": [],
      "source": [
        "job = quick.run(use_case=\"MD\", physical_params={})\n",
        "\n",
        "print(job.error_message())\n",
        "\n",
        "\n",
        "# A wrapper can also be used for a more human readable version\n",
        "def pprint_error(job):\n",
        "    print(\"\".join(eval(job.error_message())[\"error\"]))\n",
        "\n",
        "\n",
        "print(\"___\")\n",
        "pprint_error(job)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e9ec2e67",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## サポートの利用\n",
        "\n",
        "サポートについては、までご連絡ください [qiskit-function-support@colibritd.com](mailto:qiskit-function-support@colibritd.com)。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a6a25c8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * [QUICK-PDE機能へのアクセスをリクエスト](https://forms.cloud.microsoft/e/3Wi9cbjQPK)するには、フォームにご記入ください。\n",
        "  * このQiskit関数の [APIリファレンス](/docs/api/functions/colibritd-pde)をご覧ください。\n",
        "  * [チュートリアルの](/docs/tutorials/colibritd-pde) QUICK-PDEを使って流れる非粘性流体をモデリングしてみてください。\n",
        "  * レビュー [ジャファリ, H., et al. (2025).  H-DES: 量子-古典ハイブリッド微分方程式ソルバー arXiv プレプリント arXiv:2410.01130](https://arxiv.org/abs/2410.01130).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}