introduction_cn.ipynb 11.9 KB
Notebook
Newer Older
Q
Quleaf 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 电力潮流计算\n",
    "*Copyright (c) 2023 Institute for Quantum Computing, Baidu Inc. All Rights Reserved.*\n",
    "## 背景介绍\n",
    "\n",
    "电力潮流计算是电力系统中一类重要的分析计算,其目的是在给定的运行条件下求取电力系统各个节点的电压及功率分布等信息。潮流计算几乎是所有电力系统分析的基础,同时也为电力系统的规划,扩建,和运行方式提供了支撑。一个简单的例子是,对于一个仍在规划中的电力系统,我们通过潮流计算可以检验所提出的电力系统规划方案能否满足各种运行方式的要求。因此电力潮流计算有着非常重要的实际意义。\n",
    "\n",
    "在潮流模型中,电力系统的各个部分由节点和连接节点的线表示。对于交流电而言,每个节点所需要考虑的参数一般有四个,分别是电压幅度(voltage magnitude),相位(phase angle),有功功率(active power)和无功功率(reactive power)。其中有功功率指的是电路实际将电能转化为其他形式能量的功率,而无功功率指的是能量在电源和负载之间不断来回跳动产生的功率。根据给定的初始条件,通过解节点电压方程,我们即可得到每个节点上未知的参数。从数学模型角度来看,潮流计算可以规约于解决一组非线性方程。具体地,对于一个拥有 $n$ 个节点的电力系统里的第 $i$ 个节点,我们有:\n",
    "\n",
    "$$\\begin{cases}\n",
    "P_i-U_i\\sum^n_{j=1}U_j(G_{ij}\\cos\\delta_{ij}+B_{ij}\\sin\\delta_{ij}) &= 0 \\\\\n",
    "Q_i-U_i\\sum^n_{j=1}U_j(G_{ij}\\sin\\delta_{ij}-B_{ij}\\cos\\delta_{ij}) &= 0 \n",
    "\\end{cases}$$\n",
    "其中 $P_i$ 表示第 $i$ 个节点的净注入有功功率,$Q_i$ 表示第 $i$ 个节点的净注入无功功率, $U_i$ 表示第 $i$ 个节点的电压。同时,这里 $G$ 表示导纳矩阵的实部, $B$ 表示导纳矩阵的虚部, $\\delta_{ij}$ 表示第 $i$ 个和第 $j$ 个节点的相位差。\n",
    "\n",
    "非线性方程的求解是一个困难的问题,因此我们常常使用一些数值方法去求取近似解。其中比较常用的一种方法是牛顿迭代法(Newton-Raphson method),它可以通过迭代次数的增加,而越来越接近方程的解。简单来说,牛顿迭代法就是从一个初始点出发,通过求解导数来找到合适的优化方向,不断更新我们的近似解,从而得到更加接近真实解的结果。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 量子解决方案\n",
    "\n",
    "我们已经知道牛顿迭代法是解决潮流计算的一种常用的经典算法,其解决潮流计算问题的复杂度主要来源于对于雅可比矩阵求逆的过程,这个过程的复杂度为$\\mathcal{O}(poly(n))$。在牛顿迭代法中,雅可比矩阵求逆的过程也可以被看作是求解线性方程组的过程。而在量子计算领域,已经有多个量子算法被提出用于解决线性方程组,如Harrow-Hassidim-Lloyd(HHL)算法,变分量子线性求解器(Variational Quantum Linear Solver, VQLS)。并且相比于经典算法,它们已经被证明在一定条件下在解决线性方程组问题上存在着指数加速的优势。在这里,我们可以使用变分量子线性求解器(VQLS)来替换经典牛顿迭代法中复杂度较高的雅可比矩阵求逆过程,从而实现潮流计算问题的量子加速 [1]。我们在量子应用模型库中同样提供了变分量子线性求解器的相关模型和教程,您可以阅读其教程来了解该算法的更多细节。接下来,我们将以一个5节点系统为例,展示基于牛顿迭代法和变分量子线性求解器的潮流计算量子解决方案。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用教程\n",
    "\n",
    "我们给出了一个设置好参数,可以直接进行电力潮流计算的配置文件。用户只需在`config.toml`里修改相应的参数,并在终端运行\n",
    "`python power_flow.py --config config.toml`,即可对给定数据进行潮流分析。\n",
    "### 输出结果\n",
    "电力潮流的计算结果将被记录到文件 `pf_result.txt` 中。同时我们的优化过程将被记录在日志文件`power_flow.log`中,用户可以看到随着循环数的增加,损失大小的变化。\n",
    "\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 在线演示\n",
    "这里,我们给出一个在线演示的版本,可以在线进行测试。首先定义配置文件的内容:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_toml = r\"\"\"\n",
    "# 模型的整体配置文件\n",
    "# 存储潮流计算初始数据文件的路径。\n",
    "data_dir = './ieee5cdf.txt'\n",
    "\n",
    "# 结束潮流计算的误差阈值, 默认为1e-3。\n",
    "threshold = 1e-3\n",
    "\n",
    "# 潮流计算中最小迭代次数。\n",
    "minIter = 3\n",
    "\n",
    "# 潮流计算中最大迭代次数。\n",
    "maxIter = 100\n",
    "\n",
    "# 参数化量子电路的层数。\n",
    "depth = 4\n",
    "\n",
    "# 量子电路优化迭代次数。\n",
    "iterations = 100\n",
    "\n",
    "# 优化器的学习率。\n",
    "LR = 0.1\n",
    "\n",
    "# 参数化量子电路优化中损失函数的阈值。默认为0。\n",
    "gamma = 0\n",
    "\"\"\""
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来是模型运行部分的代码:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 100/100 [01:19<00:00,  1.25it/s]\n",
      "100%|██████████| 100/100 [01:08<00:00,  1.46it/s]\n",
      "100%|██████████| 100/100 [00:57<00:00,  1.73it/s]\n",
      "100%|██████████| 100/100 [01:01<00:00,  1.63it/s]\n",
      "100%|██████████| 100/100 [00:57<00:00,  1.73it/s]\n",
      "100%|██████████| 100/100 [01:00<00:00,  1.65it/s]\n",
      "100%|██████████| 100/100 [01:10<00:00,  1.41it/s]\n",
      "100%|██████████| 100/100 [01:17<00:00,  1.29it/s]\n",
      "100%|██████████| 100/100 [01:20<00:00,  1.25it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "输出电力潮流计算结果:\n",
      "Power Flow:\n",
      "\n",
      "| Bus |    Bus     |    V     |  Angle   |      Injection      |      Generation     |        Load        |\n",
      "| No  |    Name    |    pu    |  Degree  |     MW   |   MVar   |     MW   |  Mvar    |     MW  |     MVar |\n",
      "|   1 |Bus 1     HV|    1.060 |    0.000 |  129.816 |   24.447 |  129.816 |   24.447 |   0.000 |    0.000 |\n",
      "|   2 |Bus 2     HV|    1.036 |   -0.046 |   20.000 |   20.000 |   40.000 |   30.000 |  20.000 |   10.000 |\n",
      "|   3 |Bus 3     HV|    1.009 |   -0.084 |  -45.000 |  -15.000 |    0.000 |   -0.000 |  45.000 |   15.000 |\n",
      "|   4 |Bus 4     HV|    1.007 |   -0.090 |  -40.000 |   -5.000 |   -0.000 |    0.000 |  40.000 |    5.000 |\n",
      "|   5 |Bus 5     HV|    1.002 |   -0.104 |  -60.000 |  -10.000 |    0.000 |   -0.000 |  60.000 |   10.000 |\n",
      "----------------------------------------------------------------------------------------------------------\n",
      "\n",
      "Network and losses:\n",
      "\n",
      "|  From |    To |     P     |     Q     |  From |    To |     P     |     Q     |       Branch Loss     |\n",
      "|   Bus |   Bus |     MW    |    MVar   |   Bus |   Bus |     MW    |    MVar   |     MW    |    MVar   |\n",
      "|     1 |     2 |     95.69 |     13.87 |     2 |     1 |    -81.06 |     -9.54 |     14.63 |      4.33 |\n",
      "|     1 |     3 |     46.48 |     10.58 |     3 |     1 |    -34.51 |     -6.77 |     11.97 |      3.81 |\n",
      "|     2 |     3 |     28.99 |      8.15 |     3 |     2 |    -20.24 |     -7.01 |      8.74 |      1.13 |\n",
      "|     2 |     4 |     32.23 |      8.06 |     4 |     2 |    -23.40 |     -6.65 |      8.83 |      1.42 |\n",
      "|     2 |     5 |     58.11 |     13.33 |     5 |     2 |    -50.69 |     -9.77 |      7.42 |      3.56 |\n",
      "|     3 |     4 |     20.94 |     -1.21 |     4 |     3 |    -16.84 |      1.32 |      4.10 |      0.11 |\n",
      "|     4 |     5 |     11.41 |      0.33 |     5 |     4 |     -1.28 |     -0.23 |     10.12 |      0.10 |\n",
      "----------------------------------------------------------------------------------------------------------\n",
      "\n",
      "Total active power losses: 65.82, Total reactive power losses: 14.45\n",
      "误差为: 1.9593560071140548e-05\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "import warnings\n",
    "\n",
    "warnings.filterwarnings('ignore')\n",
    "os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'python'\n",
    "\n",
    "import toml\n",
    "from paddle_quantum.data_analysis.power_flow import data_to_Grid\n",
    "\n",
    "config = toml.loads(test_toml)\n",
    "file_name = config.pop('data_dir')\n",
    "grid = data_to_Grid(file_name)\n",
    "grid.powerflow(**config)\n",
    "print(\"输出电力潮流计算结果:\")\n",
    "grid.printResults()\n",
    "Error = grid.tolerances[-1] \n",
    "print(f\"误差为: {Error}\")\n",
    "grid.saveResults()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里误差指的是求解方程后方程组的绝对误差的最大值。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 注意事项\n",
    "\n",
    "这里模型的输入数据需要使用IEEE的通用数据格式 [2]。\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 引用信息\n",
    "\n",
    "```tex\n",
    "@article{liu2022quantum,\n",
    "  title={Quantum Power Flows: From Theory to Practice},\n",
    "  author={Liu, Junyu and Zheng, Han and Hanada, Masanori and Setia, Kanav and Wu, Dan},\n",
    "  journal={arXiv preprint arXiv:2211.05728},\n",
    "  year={2022}\n",
    "}\n",
    "\n",
    "@article{pierce1973common,\n",
    "  title={Common format for exchange of solved load flow data},\n",
    "  author={Pierce, HE and others},\n",
    "  journal={IEEE Transactions on Power Apparatus and Systems},\n",
    "  volume={92},\n",
    "  number={6},\n",
    "  pages={1916--1925},\n",
    "  year={1973}\n",
    "}\n",
    "```\n",
    "\n",
    "## 参考文献\n",
    "[1] Liu, Junyu, et al. \"Quantum Power Flows: From Theory to Practice.\" arXiv preprint arXiv:2211.05728 (2022).\n",
    "\n",
    "[2] Pierce, H. E. \"Common format for exchange of solved load flow data.\" IEEE Transactions on Power Apparatus and Systems 92.6 (1973): 1916-1925."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "power_flow",
   "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.7.16"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "09b405f4ce7ff94b18a2e1d1d7346b8a2e6101e2bd963fee0349fb6bd6dc2572"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}