├── FEM-代码0--勒让德-高斯积分.ipynb ├── FEM-代码1--初次尝试FEM编程,分析和编程流程,线性形函数.ipynb ├── FEM-代码2--2次形函数(拉格朗日插值).ipynb ├── FEM-代码3--形函数.ipynb ├── FEM-代码4--二维四边形单元的高斯-勒让德积分.ipynb ├── FEM-代码5.1--解二维泊松方程(Dirichlet边界条件).ipynb ├── FEM-代码5.2--解二维传热方程,Dirichlet+Neumman边界.ipynb ├── FEM-代码5.3--解二维传热方程,Dirichlet+Neumman+Robin边界.ipynb ├── FEM-代码6-有限差分法.ipynb ├── FEM-代码7-有限差分法-隐函数.ipynb ├── Python matplotlib 应用.ipynb └── python 处理矩阵数据.ipynb /FEM-代码4--二维四边形单元的高斯-勒让德积分.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "bb7cd5e9", 6 | "metadata": {}, 7 | "source": [ 8 | "# 2022年7月12日09:59:00" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "id": "09cc3900", 14 | "metadata": {}, 15 | "source": [ 16 | "## 1. 高斯-勒让德积分" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 7, 22 | "id": "7d28e366", 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "import numpy as np\n", 27 | "from numpy.polynomial.legendre import leggauss" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 8, 33 | "id": "c4fc787c", 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "# 需要继续积分域分别为x:[0-2];y:[0-2]\n", 38 | "# 因为这关系到dx转换到de之后的系数\n", 39 | "def f(x,y):\n", 40 | " return 3*y**2+2*x" 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "id": "52aa1ed0", 46 | "metadata": {}, 47 | "source": [ 48 | "假如要求的积分如下: \n", 49 | " \n", 50 | "$$I=\\int_{x_a}^{x_b}\\int_{y_a}^{y_b}f(x,y)dxdy$$" 51 | ] 52 | }, 53 | { 54 | "cell_type": "markdown", 55 | "id": "cde1c2b9", 56 | "metadata": {}, 57 | "source": [ 58 | "利用变换可得到: \n", 59 | " \n", 60 | "$x=\\frac{(x_b-x_a)\\xi+(x_b+x_a)}{2}$,其中$\\xi \\in [-1,1]$ \n", 61 | " \n", 62 | " \n", 63 | "$y=\\frac{(y_b-y_a)\\eta+(y_b+y_a)}{2}$,其中$\\eta \\in [-1,1]$ \n", 64 | " \n", 65 | " \n", 66 | "$dx=\\frac{x_b-x_a}{2}d \\xi$ \n", 67 | " \n", 68 | " \n", 69 | "$dy=\\frac{y_b-y_a}{2}d \\eta$ " 70 | ] 71 | }, 72 | { 73 | "cell_type": "markdown", 74 | "id": "5c1c496b", 75 | "metadata": {}, 76 | "source": [ 77 | "将上述变换公式带入原式可得:\n", 78 | "$$I=\\int_{-1}^1 \\int_{-1}^1 f(\\frac{(x_b-x_a)\\xi+(x_b+x_a)}{2},\\frac{(y_b-y_a)\\eta+(y_b+y_a)}{2})\\frac{x_b-x_a}{2}d \\xi \\frac{y_b-y_a}{2}d \\eta$$" 79 | ] 80 | }, 81 | { 82 | "cell_type": "markdown", 83 | "id": "863f1820", 84 | "metadata": {}, 85 | "source": [ 86 | "将常数移出来,可得:\n", 87 | "$$I=\\frac{x_b-x_a}{2}\\frac{y_b-y_a}{2}\\int_{-1}^1 \\int_{-1}^1 f(\\frac{(x_b-x_a)\\xi+(x_b+x_a)}{2},\\frac{(y_b-y_a)\\eta+(y_b+y_a)}{2})d \\xi d \\eta$$" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "id": "b1393ada", 93 | "metadata": {}, 94 | "source": [ 95 | "对于从-1到1之间的积分,可以使用高斯-勒让德积分公式求得,首先令:\n", 96 | "$F(\\xi,\\eta)=f(\\frac{(x_b-x_a)\\xi+(x_b+x_a)}{2},\\frac{(y_b-y_a)\\eta+(y_b+y_a)}{2})$,则:\n", 97 | "\n", 98 | "$$\\int_{-1}^1\\int_{-1}^1 F(\\xi,\\eta)d\\xi d\\eta=\\sum_{i=1}^n\\sum_{j=1}^n w_i w_j F(\\xi_i,\\eta_j)$$\n", 99 | " \n", 100 | "其中,$w_i$,$w_j$,$\\xi_i$,$\\eta_j$表示高斯-勒让德积分中的权重和采样坐标,可以通过查表获得" 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "id": "93bb8537", 106 | "metadata": {}, 107 | "source": [ 108 | "所以:\n", 109 | " \n", 110 | "$$I=\\frac{x_b-x_a}{2}\\frac{y_b-y_a}{2}\\sum_{i=1}^n\\sum_{j=1}^n w_i w_j F(\\xi_i,\\eta_j)$$" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 12, 116 | "id": "631cd2c5", 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "def leg_gau_2d(f,n,xa,xb,ya,yb):\n", 121 | " x,w=leggauss(n)\n", 122 | " # x=(xb-xa)xi/2+(xb+xa)/2\n", 123 | " # y=(yb-ya)eta/2+(yb+ya)/2\n", 124 | " # dx=(xb-xa)/2 dxi\n", 125 | " # dy=(yb-ya)/2 deta\n", 126 | " summ=0\n", 127 | " for i in range(len(x)):\n", 128 | " # i 代表x,用a表示\n", 129 | " a=(xb-xa)*x[i]/2+(xb+xa)/2\n", 130 | " for j in range(len(x)):\n", 131 | " # j 代表y,用b表示\n", 132 | " b=(yb-ya)*x[j]/2+(yb+ya)/2\n", 133 | " summ+=w[i]*w[j]*f(a,b)\n", 134 | " \n", 135 | " return (xb-xa)/2*(yb-ya)/2*summ" 136 | ] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "execution_count": 26, 141 | "id": "f1e80392", 142 | "metadata": {}, 143 | "outputs": [ 144 | { 145 | "data": { 146 | "text/plain": [ 147 | "24.0" 148 | ] 149 | }, 150 | "execution_count": 26, 151 | "metadata": {}, 152 | "output_type": "execute_result" 153 | } 154 | ], 155 | "source": [ 156 | "leg_gau_2d(f,2,0,2,0,2)" 157 | ] 158 | }, 159 | { 160 | "cell_type": "markdown", 161 | "id": "b82fa6f6", 162 | "metadata": {}, 163 | "source": [ 164 | "## 2. 使用sympy试一下" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 14, 170 | "id": "f192f43d", 171 | "metadata": {}, 172 | "outputs": [], 173 | "source": [ 174 | "import sympy as sp" 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "execution_count": 17, 180 | "id": "24fb299e", 181 | "metadata": {}, 182 | "outputs": [ 183 | { 184 | "data": { 185 | "text/plain": [ 186 | "(xs, ys)" 187 | ] 188 | }, 189 | "execution_count": 17, 190 | "metadata": {}, 191 | "output_type": "execute_result" 192 | } 193 | ], 194 | "source": [ 195 | "xs,ys=sp.symbols('xs ys')\n", 196 | "xs,ys" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 18, 202 | "id": "1598682b", 203 | "metadata": {}, 204 | "outputs": [ 205 | { 206 | "data": { 207 | "text/latex": [ 208 | "$\\displaystyle 2 xs + 3 ys^{2}$" 209 | ], 210 | "text/plain": [ 211 | "2*xs + 3*ys**2" 212 | ] 213 | }, 214 | "execution_count": 18, 215 | "metadata": {}, 216 | "output_type": "execute_result" 217 | } 218 | ], 219 | "source": [ 220 | "fs=3*ys**2+2*xs\n", 221 | "fs" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 22, 227 | "id": "c0aa48fc", 228 | "metadata": {}, 229 | "outputs": [], 230 | "source": [ 231 | "def int_sp(fs,xa,xb,ya,yb):\n", 232 | " return sp.integrate(fs,(xs,xa,xb),(ys,ya,yb))\n", 233 | " " 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": 40, 239 | "id": "663f2b09", 240 | "metadata": {}, 241 | "outputs": [ 242 | { 243 | "data": { 244 | "text/latex": [ 245 | "$\\displaystyle 24$" 246 | ], 247 | "text/plain": [ 248 | "24" 249 | ] 250 | }, 251 | "execution_count": 40, 252 | "metadata": {}, 253 | "output_type": "execute_result" 254 | } 255 | ], 256 | "source": [ 257 | "int_sp(fs,0,2,0,2)" 258 | ] 259 | }, 260 | { 261 | "cell_type": "markdown", 262 | "id": "fc7535ff", 263 | "metadata": {}, 264 | "source": [ 265 | "# 3. 两种方式做个比较" 266 | ] 267 | }, 268 | { 269 | "cell_type": "code", 270 | "execution_count": 39, 271 | "id": "0acd1606", 272 | "metadata": {}, 273 | "outputs": [ 274 | { 275 | "data": { 276 | "text/plain": [ 277 | "(2719.7592, 2719.75920000000)" 278 | ] 279 | }, 280 | "execution_count": 39, 281 | "metadata": {}, 282 | "output_type": "execute_result" 283 | } 284 | ], 285 | "source": [ 286 | "xa,xb=-2.8,5.9\n", 287 | "ya,yb=-2.8,6.4\n", 288 | "leg_gau_2d(f,2,xa,xb,ya,yb),int_sp(fs,xa,xb,ya,yb)" 289 | ] 290 | }, 291 | { 292 | "cell_type": "code", 293 | "execution_count": 41, 294 | "id": "dfa1d4b4", 295 | "metadata": {}, 296 | "outputs": [], 297 | "source": [ 298 | "import matplotlib.pyplot as plt\n", 299 | "plt.style.use(['science','grid','notebook'])" 300 | ] 301 | }, 302 | { 303 | "cell_type": "code", 304 | "execution_count": 52, 305 | "id": "d5109e82", 306 | "metadata": {}, 307 | "outputs": [ 308 | { 309 | "data": { 310 | "image/png": "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\n", 311 | "text/plain": [ 312 | "
" 313 | ] 314 | }, 315 | "metadata": { 316 | "needs_background": "light" 317 | }, 318 | "output_type": "display_data" 319 | } 320 | ], 321 | "source": [ 322 | "# 其中的数值是任意取得\n", 323 | "# 但是要保证xa" 300 | ] 301 | }, 302 | "metadata": { 303 | "needs_background": "light" 304 | }, 305 | "output_type": "display_data" 306 | } 307 | ], 308 | "source": [ 309 | "plt.figure(figsize=(5,4))\n", 310 | "plt.contourf(X,Y,Z)\n", 311 | "plt.colorbar()\n", 312 | "plt.axis('equal')\n", 313 | "plt.show()" 314 | ] 315 | }, 316 | { 317 | "cell_type": "markdown", 318 | "id": "393ae4b3", 319 | "metadata": {}, 320 | "source": [ 321 | "## 3.2 初始温度分布" 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": 6, 327 | "id": "245b5145", 328 | "metadata": {}, 329 | "outputs": [ 330 | { 331 | "data": { 332 | "image/png": "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\n", 333 | "text/plain": [ 334 | "
" 335 | ] 336 | }, 337 | "metadata": { 338 | "needs_background": "light" 339 | }, 340 | "output_type": "display_data" 341 | } 342 | ], 343 | "source": [ 344 | "fig,axes=plt.subplots(1,3,figsize=(15,4))\n", 345 | "ax0=axes[0]\n", 346 | "a0=ax0.contourf(X,Y,T)\n", 347 | "ax0.axis('equal')\n", 348 | "\n", 349 | "ax1=axes[1]\n", 350 | "a1=ax1.contourf(X,Y,TT[0])\n", 351 | "ax1.axis('equal')\n", 352 | "\n", 353 | "ax2=axes[2]\n", 354 | "a2=ax2.contourf(X,Y,TT[18]) # 随便挑的\n", 355 | "ax2.axis('equal')\n", 356 | "fig.colorbar(a0,ax=ax0)\n", 357 | "fig.colorbar(a1,ax=ax1)\n", 358 | "fig.colorbar(a2,ax=ax2)\n", 359 | "plt.show()" 360 | ] 361 | }, 362 | { 363 | "cell_type": "markdown", 364 | "id": "1345956c", 365 | "metadata": {}, 366 | "source": [ 367 | "## 4. 开始迭代 " 368 | ] 369 | }, 370 | { 371 | "cell_type": "code", 372 | "execution_count": 7, 373 | "id": "e5ab60a8", 374 | "metadata": {}, 375 | "outputs": [], 376 | "source": [ 377 | "# 因为for循环较多,且使用numpy数组,所以可以使用numba加速\n", 378 | "# 使用time函数展示一下numba加速的情况\n", 379 | "import time" 380 | ] 381 | }, 382 | { 383 | "cell_type": "code", 384 | "execution_count": 8, 385 | "id": "92da0a66", 386 | "metadata": {}, 387 | "outputs": [], 388 | "source": [ 389 | "# 不使用加速情况\n", 390 | "def solve(HT,Z):\n", 391 | " cT=HT[0].copy() # 当前时刻温度 current T\n", 392 | " cf=0\n", 393 | " for tt in range(1,times+1):\n", 394 | " # 下一个时刻温度 next T\n", 395 | " nT=cT.copy() # 这里copy的主要是环境温度,材料温度会进行迭代\n", 396 | " for i in range(1,n-1): # 因为当前节点要通过前后,左右的节点来获得\n", 397 | " for j in range(1,n-1): # 现在这种写法是因为x,y方向的设置是一样的\n", 398 | " if Z[i,j]: # 因为环境温度不变,只考虑材料即可\n", 399 | " nT[i,j]=cT[i,j]+s*(cT[i+1,j]+cT[i-1,j]+cT[i,j+1]+cT[i,j-1]-4*cT[i,j])\n", 400 | " \n", 401 | " cT=nT.copy() # 更新 \n", 402 | " if tt%f==0:\n", 403 | " cf+=1\n", 404 | " HT[cf]=cT.copy()\n", 405 | " \n", 406 | " return HT" 407 | ] 408 | }, 409 | { 410 | "cell_type": "code", 411 | "execution_count": null, 412 | "id": "aabef852", 413 | "metadata": {}, 414 | "outputs": [], 415 | "source": [ 416 | "# 计算所用时间\n", 417 | "start=time.time()\n", 418 | "res=solve(TT,Z)\n", 419 | "t1=time.time()-start" 420 | ] 421 | }, 422 | { 423 | "cell_type": "code", 424 | "execution_count": null, 425 | "id": "9be480a8", 426 | "metadata": {}, 427 | "outputs": [], 428 | "source": [] 429 | }, 430 | { 431 | "cell_type": "code", 432 | "execution_count": null, 433 | "id": "b176d55a", 434 | "metadata": {}, 435 | "outputs": [], 436 | "source": [ 437 | "# 展示结果\n", 438 | "my_cmap = plt.get_cmap('inferno_r')\n", 439 | "t_check=40 # 计算时,每隔10秒保存一次,所以检查的实际世界是 t_check*10\n", 440 | "pc=plt.contourf(X,Y,TT[t_check],100,cmap=my_cmap)\n", 441 | "cb=plt.colorbar(pc)\n", 442 | "cb.set_label('Temp [℃]',fontsize=15)\n", 443 | "plt.title('{:.2f} min'.format(t_check*10/60),fontsize=20)\n", 444 | "plt.xlabel('x [m]', fontsize=16)\n", 445 | "plt.ylabel('y [m]', fontsize=16)\n", 446 | "plt.show()\n", 447 | "(np.max(TT[t_check]),np.min(TT[t_check]))" 448 | ] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "execution_count": null, 453 | "id": "b7b32745", 454 | "metadata": {}, 455 | "outputs": [], 456 | "source": [ 457 | "import numba\n", 458 | "from numba import jit" 459 | ] 460 | }, 461 | { 462 | "cell_type": "code", 463 | "execution_count": null, 464 | "id": "7689cde6", 465 | "metadata": {}, 466 | "outputs": [], 467 | "source": [ 468 | "# 第一个f8[:,:,:]---- 函数返回值的数据类型,float,3维数组\n", 469 | "# 第二个f8[:,:,:]--- 函数第一个形参的数据类型,在括号内\n", 470 | "# 第三个bl[:,:]--- 函数第二个形参的数据类型,Boolean,2维数组\n", 471 | "@numba.jit(\"f8[:,:,:](f8[:,:,:], b1[:,:])\", nopython=True, nogil=True)\n", 472 | "def solve2(HT,Z):\n", 473 | " cT=HT[0].copy() # 当前时刻温度 current T\n", 474 | " cf=0\n", 475 | " for tt in range(1,times+1):\n", 476 | " # 下一个时刻温度 next T\n", 477 | " nT=cT.copy() # 这里copy的主要是环境温度,材料温度会进行迭代\n", 478 | " for i in range(1,n-1): # 因为当前节点要通过前后,左右的节点来获得\n", 479 | " for j in range(1,n-1): # 现在这种写法是因为x,y方向的设置是一样的\n", 480 | " if Z[i,j]: # 因为环境温度不变,只考虑材料即可\n", 481 | " nT[i,j]=cT[i,j]+s*(cT[i+1,j]+cT[i-1,j]+cT[i,j+1]+cT[i,j-1]-4*cT[i,j])\n", 482 | " \n", 483 | " cT=nT.copy() # 更新 \n", 484 | " if tt%f==0:\n", 485 | " cf+=1\n", 486 | " HT[cf]=cT\n", 487 | " \n", 488 | " return HT " 489 | ] 490 | }, 491 | { 492 | "cell_type": "code", 493 | "execution_count": null, 494 | "id": "c7360afa", 495 | "metadata": {}, 496 | "outputs": [], 497 | "source": [ 498 | "# 加速后 计算所用时间\n", 499 | "start=time.time()\n", 500 | "TT=solve2(TT,Z)\n", 501 | "t2=time.time()-start" 502 | ] 503 | }, 504 | { 505 | "cell_type": "code", 506 | "execution_count": null, 507 | "id": "7789bfa3", 508 | "metadata": {}, 509 | "outputs": [], 510 | "source": [ 511 | "# 加速倍数\n", 512 | "t1/t2" 513 | ] 514 | }, 515 | { 516 | "cell_type": "code", 517 | "execution_count": null, 518 | "id": "147a16e3", 519 | "metadata": {}, 520 | "outputs": [], 521 | "source": [ 522 | "my_cmap = plt.get_cmap('inferno_r')\n", 523 | "t_check=240\n", 524 | "pc=plt.contourf(X,Y,TT[t_check],100,cmap=my_cmap) # colorbar固定时,要把t_check置为0\n", 525 | "cb=plt.colorbar(pc,format='%.1f')\n", 526 | "cb.set_label('Temp [℃]', fontsize=15)\n", 527 | "# plt.contourf(X,Y,TT[t_check],100,cmap=my_cmap,vmin=T_am,vmax=T_Fe) # colorbar固定时使用\n", 528 | "plt.title('After {:.2f} min'.format(t_check*10/60),fontsize=20)\n", 529 | "plt.xlabel('x [m]', fontsize=16)\n", 530 | "plt.ylabel('y [m]', fontsize=16)\n", 531 | "plt.show()\n", 532 | "(np.max(TT[t_check]),np.min(TT[t_check]))" 533 | ] 534 | }, 535 | { 536 | "cell_type": "markdown", 537 | "id": "bd4fec29", 538 | "metadata": {}, 539 | "source": [ 540 | "# 4. 数据展示——动画" 541 | ] 542 | }, 543 | { 544 | "cell_type": "code", 545 | "execution_count": null, 546 | "id": "8a792741", 547 | "metadata": {}, 548 | "outputs": [], 549 | "source": [ 550 | "from matplotlib import animation" 551 | ] 552 | }, 553 | { 554 | "cell_type": "code", 555 | "execution_count": null, 556 | "id": "383b98ec", 557 | "metadata": { 558 | "scrolled": true 559 | }, 560 | "outputs": [], 561 | "source": [ 562 | "fig, ax = plt.subplots(figsize=(8,6))\n", 563 | "a = ax.contourf(X,Y,TT[40], 100, cmap=my_cmap,\n", 564 | " vmin=T_am, vmax = T_Fe)\n", 565 | "cbar = fig.colorbar(a)\n", 566 | "cbar.set_label('Temp [$^\\circ C$]', fontsize=15)\n", 567 | "ax.set_title('Time = {:.2f} min'.format(40*f/60), fontsize=20)\n", 568 | "ax.set_xlabel('$x$ [$m$]',fontsize=20)\n", 569 | "ax.set_ylabel('$y$ [$m$]',fontsize=20)" 570 | ] 571 | }, 572 | { 573 | "cell_type": "code", 574 | "execution_count": null, 575 | "id": "00776fb9", 576 | "metadata": {}, 577 | "outputs": [], 578 | "source": [ 579 | "# 这个运行时间较长,现有参数下约十几秒\n", 580 | "# 可以先把frames设定的小一些,如果效果满意再按实际设置\n", 581 | "my_cmap = plt.get_cmap('inferno_r')\n", 582 | "def init():\n", 583 | " a = ax.contourf(X,Y,TT[0], 100, cmap=my_cmap,\n", 584 | " vmin=T_am, vmax = T_Fe)\n", 585 | " cbar = fig.colorbar(a)\n", 586 | " cbar.set_label('Temp [$^\\circ C$]',fontsize=16)\n", 587 | "\n", 588 | "def animate(i):\n", 589 | " ax.clear()\n", 590 | " ax.contourf(X,Y,TT[i], 100, cmap=my_cmap,\n", 591 | " vmin=T_am, vmax = T_Fe)\n", 592 | " ax.set_title('Time = {:.2f} min'.format(f*i/60), fontsize=20)\n", 593 | " ax.tick_params(axis='both',labelsize=16)\n", 594 | " ax.set_xlabel('$x$ [$m$]',fontsize=20)\n", 595 | " ax.set_ylabel('$y$ [$m$]',fontsize=20)\n", 596 | " return fig,\n", 597 | "\n", 598 | "fig, ax = plt.subplots(figsize=(8,6),dpi=100)\n", 599 | "ani = animation.FuncAnimation(fig, animate, init_func=init,\n", 600 | " frames=range(1,storage+1), interval=100)\n", 601 | "ani.save('cool.gif',writer='pillow',fps=30)" 602 | ] 603 | }, 604 | { 605 | "cell_type": "code", 606 | "execution_count": null, 607 | "id": "cee11bca", 608 | "metadata": {}, 609 | "outputs": [], 610 | "source": [] 611 | }, 612 | { 613 | "cell_type": "code", 614 | "execution_count": null, 615 | "id": "6a500074", 616 | "metadata": {}, 617 | "outputs": [], 618 | "source": [] 619 | } 620 | ], 621 | "metadata": { 622 | "kernelspec": { 623 | "display_name": "Python 3 (ipykernel)", 624 | "language": "python", 625 | "name": "python3" 626 | }, 627 | "language_info": { 628 | "codemirror_mode": { 629 | "name": "ipython", 630 | "version": 3 631 | }, 632 | "file_extension": ".py", 633 | "mimetype": "text/x-python", 634 | "name": "python", 635 | "nbconvert_exporter": "python", 636 | "pygments_lexer": "ipython3", 637 | "version": "3.9.7" 638 | } 639 | }, 640 | "nbformat": 4, 641 | "nbformat_minor": 5 642 | } 643 | --------------------------------------------------------------------------------