Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
jiapeng-liu committed Dec 23, 2019
1 parent 4d41d91 commit 65073a5
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 81 deletions.
121 changes: 83 additions & 38 deletions tutorial/.ipynb_checkpoints/ex1_simple_ZARC_model-checkpoint.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -4,61 +4,87 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Gaussian Process Distribution of Relaxation Times. \n",
"### Reproduce Figure 7 in the main context\n",
"# Gaussian Process Distribution of Relaxation Times. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## In this tutorial we will reproduce Figure 7 of the article https://doi.org/10.1016/j.electacta.2019.135316\n",
"\n",
"GP-DRT is our newly developed approach that can be used to obtain both the mean and covariance of the DRT from the EIS data by assuming that the DRT is a Gaussian process (GP). The GP-DRP can predict the DRT and the imaginary part of the impedance at frequencies that were not previously measured.\n",
"\n",
"GP-DRT is our newly developed approach that is able to obtain both the DRT mean and covariance from the EIS data by assuming that the DRT is a Gaussian process (GP). It can also predict the DRT and the imaginary part of the impedance at frequencies not previously measured.\n",
"To obtain the DRT from the impedance we take that $\\gamma(\\xi)$ is a GP where $f$ is the frequency and $\\xi=\\log f$. Under the DRT model and considering that GPs are closed linear transformations, it follows that $Z^{\\rm DRT}_{\\rm im}\\left(\\xi\\right)$ is also a GP.\n",
"\n",
"The main process for DRT inferring from impedance is that both $\\gamma(\\xi)$ and $Z^{\\rm DRT}_{\\rm im}\\left(\\xi\\right)$ are GPs if we assume that $\\gamma(\\xi)$ is a GP considering that GP is closed for linear transformation. Hence,\n",
"More precisely we can write\n",
"\n",
"$\\begin{pmatrix}\n",
"$$\\begin{pmatrix}\n",
"\\gamma(\\xi) \\\\\n",
"Z^{\\rm DRT}_{\\rm im}\\left(\\xi\\right)\n",
"\\end{pmatrix}\\sim \\mathcal{GP}\\left(\\mathbf 0, \\begin{pmatrix}\n",
"k(\\xi, \\xi^\\prime) & \\mathcal L^{\\rm im}_{\\xi^\\prime} \\left(k(\\xi, \\xi^\\prime)\\right)\\\\\n",
"\\mathcal L^{\\rm im}_{\\xi} k(\\xi, \\xi^\\prime) & \\mathcal L^{\\rm im}_{\\xi^\\prime}\\left(\\mathcal L^{\\rm im}_{\\xi} \\left(k(\\xi, \\xi^\\prime)\\right)\\right)\n",
"\\end{pmatrix}\\right)$\n",
"\\end{pmatrix}\\right)$$\n",
"\n",
"where\n",
"\n",
"$\\mathcal L^{\\rm im}_\\xi \\left(\\cdot\\right) = -\\displaystyle \\int_{-\\infty}^\\infty \\frac{2\\pi \\displaystyle e^{\\xi-\\hat \\xi}}{1+\\left(2\\pi \\displaystyle e^{\\xi-\\hat \\xi}\\right)^2} \\left(\\cdot\\right) d \\hat \\xi$ \n",
"$$\\mathcal L^{\\rm im}_\\xi \\left(\\cdot\\right) = -\\displaystyle \\int_{-\\infty}^\\infty \\frac{2\\pi \\displaystyle e^{\\xi-\\hat \\xi}}{1+\\left(2\\pi \\displaystyle e^{\\xi-\\hat \\xi}\\right)^2} \\left(\\cdot\\right) d \\hat \\xi$$\n",
"\n",
"is a linear functional to transform DRT to the imaginary part of the impedance.\n",
"is a linear functional. The latter functional, transforms the DRT to the imaginary part of the impedance.\n",
"\n",
"For more than one observation, $\\left(\\mathbf Z^{\\rm exp}_{\\rm im}\\right)_n = Z^{\\rm exp}_{\\rm im}(\\xi_n)$ with $\\xi_n =\\log f_n$ and $n =1, 2, \\ldots N $, the corresponding multivariate Gaussian RV is written as \n",
"Assuming we have $N$ observations, we can set $\\left(\\mathbf Z^{\\rm exp}_{\\rm im}\\right)_n = Z^{\\rm exp}_{\\rm im}(\\xi_n)$ with $\\xi_n =\\log f_n$ and $n =1, 2, \\ldots N $. The corresponding multivariate Gaussian random variable can be written as \n",
"\n",
"$\\begin{pmatrix}\n",
"\\boldsymbol{\\mathbf{\\gamma}} \\\\\n",
"$$\\begin{pmatrix}\n",
"\\boldsymbol{\\gamma} \\\\\n",
"\\mathbf Z^{\\rm exp}_{\\rm im}\n",
"\\end{pmatrix}\\sim \\mathcal{N}\\left(\\mathbf 0, \\begin{pmatrix}\n",
"\\mathbf K & \\mathcal L_{\\rm im} \\mathbf K\\\\\n",
"\\mathcal L_{\\rm im}^\\sharp \\mathbf K & \\mathcal L^2_{\\rm im} \\mathbf K + \\sigma_n^2 \\mathbf I\n",
"\\end{pmatrix}\\right)$\n",
"\\end{pmatrix}\\right)$$\n",
"\n",
"where \n",
"\n",
"$\\begin{align}\n",
"$$\\begin{align}\n",
"(\\mathbf K)_{nm} &= k(\\xi_n, \\xi_m)\\\\\n",
"(\\mathcal L_{\\rm im} \\mathbf K)_{nm} &= \\left. \\mathcal L^{\\rm im}_{\\xi^\\prime} \\left(k(\\xi, \\xi^\\prime)\\right) \\right |_{\\xi_n, \\xi_m}\\\\\n",
"(\\mathcal L_{\\rm im}^\\sharp \\mathbf K)_{nm} &= \\left.\\mathcal L^{\\rm im}_{\\xi} \\left(k(\\xi, \\xi^\\prime)\\right) \\right|_{\\xi_n, \\xi_m}\\\\\n",
"(\\mathcal L^2_{\\rm im} \\mathbf K)_{nm} &= \\left.\\mathcal L^{\\rm im}_{\\xi^\\prime}\\left(\\mathcal L^{\\rm im}_{\\xi} \\left(k(\\xi, \\xi^\\prime)\\right)\\right) \\right|_{\\xi_n, \\xi_m}\n",
"\\end{align}$\n",
"\\end{align}$$\n",
"\n",
"and $\\mathcal L_{\\rm im} \\mathbf K^\\top = \\mathcal L_{\\rm im}^\\sharp \\mathbf K$.\n",
"\n",
"To obtain the DRT from impedance, the distribution of $\\mathbf{\\gamma}$ conditioned on $\\mathbf Z^{\\rm exp}_{\\rm im}$ can be written as\n",
"\n",
"$\\mathbf{\\gamma}|\\mathbf Z^{\\rm exp}_{\\rm im}\\sim \\mathcal N\\left( \\mathbf \\mu_{\\gamma|Z^{\\rm exp}_{\\rm im}}, \\mathbf\\Sigma_{\\gamma| Z^{\\rm exp}_{\\rm im}}\\right)$\n",
"$$\\boldsymbol{\\gamma}|\\mathbf Z^{\\rm exp}_{\\rm im}\\sim \\mathcal N\\left( \\mathbf \\mu_{\\gamma|Z^{\\rm exp}_{\\rm im}}, \\mathbf\\Sigma_{\\gamma| Z^{\\rm exp}_{\\rm im}}\\right)$$\n",
"\n",
"with\n",
"\n",
"$\\begin{align}\n",
"$$\\begin{align}\n",
"\\mathbf \\mu_{\\gamma|Z^{\\rm exp}_{\\rm im}} &= \\mathcal L_{\\rm im} \\mathbf K \\left(\\mathcal L^2_{\\rm im} \\mathbf K + \\sigma_n^2 \\mathbf I \\right)^{-1} \\mathbf Z^{\\rm exp}_{\\rm im} \\\\\n",
"\\mathbf \\Sigma_{\\gamma| Z^{\\rm exp}_{\\rm im}} &= \\mathbf K- \\mathcal L_{\\rm im} \\mathbf K \\left(\\mathcal L^2_{\\rm im} \\mathbf K + \\sigma_n^2 \\mathbf I \\right)^{-1}\\mathcal L_{\\rm im} \\mathbf K^\\top\n",
"\\end{align}$"
"\\end{align}$$\n",
"\n",
"The above formulas depend on 1) the kernel, $k(\\xi, \\xi^\\prime)$; 2) the noise level, $\\sigma_n$; and 3) the experimental data, $\\mathbf Z^{\\rm exp}_{\\rm im}$ (at the log-frequencies $\\mathbf \\xi$). \n",
"\n",
"To optimize these hyperparameters, we maximize the marginal likelihood, i.e. the probability, $p(\\mathbf Z^{\\rm exp}_{\\rm im}|\\mathbf \\xi, \\mathbf \\theta)$ of measuring the data, $\\mathbf Z^{\\rm exp}_{\\rm im}$. The maximizing $\\mathbf \\theta$ is the one that would have most likely resulted in the measured experimental data. We note that $\\mathbf Z^{\\rm exp}_{\\rm im}\\vert \\mathbf{\\theta}\\sim \\mathcal N\\left(0, \\mathcal L^2_{\\rm im} + \\sigma_n^2 \\mathbf I \\right)$. Therefore, we obtain the following marginal log-likelihood (MLL)\n",
"\n",
"$$\n",
"\\log p(\\mathbf Z^{\\rm exp}_{\\rm im}|\\mathbf \\xi, \\mathbf \\theta)= - \\frac{1}{2} {\\mathbf Z^{\\rm exp}_{\\rm im}}^\\top \\left(\\mathcal L^2_{\\rm im} + \\sigma_n^2 \\mathbf I \\right)^{-1} \\mathbf Z^{\\rm exp}_{\\rm im} -\\frac{1}{2} \\log \\left| \\mathcal L^2_{\\rm im} + \\sigma_n^2 \\mathbf I \\right| - \\frac{N}{2} \\log 2\\pi$$\n",
"\n",
"In practice, we minimize another function $L(\\mathbf \\theta)$ called negative (and shifted) MLL (NMLL):\n",
"\n",
"$$L(\\mathbf \\theta) = - \\log p(\\mathbf Z^{\\rm exp}_{\\rm im}|\\mathbf \\xi, \\mathbf \\theta) - \\frac{N}{2} \\log 2\\pi$$\n",
"\n",
"and the optimial hyperparameters $\\mathbf \\theta$ are obtained by solving the following problem with gradient based approaches\n",
"$$\\mathbf \\theta = \\arg\\min_{\\mathbf \\theta^\\prime}L(\\mathbf \\theta^\\prime)$$\n",
"\n",
"In the developed GP-DRT model we solve this minimization problem using the `optimize` approach provided by `scipy` package"
]
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -74,9 +100,20 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Define parameters for the synthetic impedance based on the ZARC model. \n",
"## 1) Define parameters of the ZARC circuit which will be used for the synthetic experiment generation\n",
"\n",
"The impedance of a ZARC can be written as\n",
"$$\n",
"Z^{\\rm exact}(f) = R_\\infty + \\displaystyle \\frac{1}{\\displaystyle \\frac{1}{R_{\\rm ct}}+C \\left(i 2\\pi f\\right)^\\phi}\n",
"$$\n",
"\n",
"where $\\displaystyle C = \\frac{\\tau_0^\\phi}{R_{\\rm ct}}$.\n",
"\n",
"The impedance has the format of $Z^{\\rm exact}(f) = R_\\infty + \\displaystyle \\frac{1}{\\displaystyle \\frac{1}{R_{\\rm ct}}+C \\left(i 2\\pi f\\right)^\\phi}$, where $\\displaystyle C = \\frac{\\tau_0^\\phi}{R_{\\rm ct}}$. And the analytical DRT is calculated as $\\gamma(\\log \\tau) = \\displaystyle \\frac{\\displaystyle R_{\\rm ct}}{\\displaystyle 2\\pi} \\displaystyle \\frac{\\displaystyle \\sin\\left((1-\\phi)\\pi\\right)}{\\displaystyle \\cosh(\\phi \\log(\\tau/\\tau_0))-\\cos(\\pi(1-\\phi))}$"
"The analytical DRT can be computed analytically as\n",
"\n",
"$$\n",
"\\gamma(\\log \\tau) = \\displaystyle \\frac{\\displaystyle R_{\\rm ct}}{\\displaystyle 2\\pi} \\displaystyle \\frac{\\displaystyle \\sin\\left((1-\\phi)\\pi\\right)}{\\displaystyle \\cosh(\\phi \\log(\\tau/\\tau_0))-\\cos(\\pi(1-\\phi))}\n",
"$$"
]
},
{
Expand All @@ -95,7 +132,7 @@
"freq_vec_star = np.logspace(-4., 4., num=81, endpoint=True)\n",
"xi_vec_star = np.log(freq_vec_star)\n",
"\n",
"# parameters for ZARC model, the impedance and analytical DRT are calculated as above equations\n",
"# parameters for ZARC model, the impedance and analytical DRT are calculated as the above equations\n",
"R_inf = 10\n",
"R_ct = 50\n",
"phi = 0.8\n",
Expand All @@ -110,7 +147,7 @@
"tau_plot = 1/freq_vec_plot\n",
"gamma_fct_plot = (R_ct)/(2.*pi)*sin((1.-phi)*pi)/(np.cosh(phi*np.log(tau_plot/tau_0))-cos((1.-phi)*pi)) # for plotting only\n",
"\n",
"# random and adding moise to the analytical computed impedance\n",
"# random and adding noise to the analytically computed impedance\n",
"rng = np.random.seed(214975)\n",
"sigma_n_exp = 1.\n",
"Z_exp = Z_exact + sigma_n_exp*(np.random.normal(0, 1, N_freqs)+1j*np.random.normal(0, 1, N_freqs))"
Expand All @@ -120,12 +157,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### show the synthetic impedance in Nyquist plot, as shown in Figure 7 (a)"
"### show the synthetic impedance in the Nyquist plot, as shown in Figure 7 (a)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 4,
"metadata": {},
"outputs": [
{
Expand All @@ -142,7 +179,7 @@
}
],
"source": [
"# Nyquist of impedance and label the frequency\n",
"# Nyquist plot of the impedance\n",
"plt.plot(np.real(Z_exact), -np.imag(Z_exact), linewidth=4, color=\"black\", label=\"exact\")\n",
"plt.plot(np.real(Z_exp), -np.imag(Z_exp), \"o\", markersize=10, color=\"red\", label=\"synth exp\")\n",
"plt.plot(np.real(Z_exp[20:60:10]), -np.imag(Z_exp[20:60:10]), 's', markersize=10, color=\"black\")\n",
Expand All @@ -159,6 +196,7 @@
"plt.gca().set_aspect('equal', adjustable='box')\n",
"plt.xlabel(r'$Z_{\\rm re}/\\Omega$', fontsize = 20)\n",
"plt.ylabel(r'$-Z_{\\rm im}/\\Omega$', fontsize = 20)\n",
"# label the frequency points\n",
"plt.annotate(r'$10^{-2}$', xy=(np.real(Z_exp[20]), -np.imag(Z_exp[20])), \n",
" xytext=(np.real(Z_exp[20])-2, 10-np.imag(Z_exp[20])), \n",
" arrowprops=dict(arrowstyle=\"-\",connectionstyle=\"arc\"))\n",
Expand All @@ -178,12 +216,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### running the GP-DRT model to get the optimal hyperparameters"
"## 2) running the GP-DRT model to get the optimal hyperparameters"
]
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 5,
"metadata": {},
"outputs": [
{
Expand All @@ -210,7 +248,7 @@
}
],
"source": [
"# intialize the parameter for global 3D optimization to maximize the marginal log-likelihood as shown in eq (31)\n",
"# initialize the parameter for global 3D optimization to maximize the marginal log-likelihood as shown in eq (31)\n",
"sigma_n = sigma_n_exp\n",
"sigma_f = 5.\n",
"ell = 1.\n",
Expand All @@ -233,7 +271,7 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -249,7 +287,7 @@
"# the matrix $\\mathcal L^2_{\\rm im} \\mathbf K + \\sigma_n^2 \\mathbf I$ whose inverse is needed\n",
"K_im_full = L2_im_K + Sigma\n",
"\n",
"# cholesky factorization, L is lower-triangular matrix\n",
"# Cholesky factorization, L is a lower-triangular matrix\n",
"L = np.linalg.cholesky(K_im_full)\n",
"\n",
"# solve for alpha\n",
Expand All @@ -273,12 +311,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### plot the DRT together with the analytical DRT"
"### plot the DRT together with the analytical DRT"
]
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 7,
"metadata": {},
"outputs": [
{
Expand Down Expand Up @@ -314,12 +352,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### calcualte the impedance"
"## 3) calculate the impedance"
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -330,11 +368,11 @@
"gamma_vec_star = np.empty_like(xi_vec_star)\n",
"Sigma_gamma_vec_star = np.empty_like(xi_vec_star)\n",
"\n",
"# calculate the imaginary part of impedance at each $\\xi$ point for plot\n",
"# calculate the imaginary part of impedance at each $\\xi$ point for the plot\n",
"for index, val in enumerate(xi_vec_star):\n",
" xi_star = np.array([val])\n",
"\n",
" # compute matrices shown in eq (18), k_star corresponds to new point\n",
" # compute matrices shown in eq (18), k_star corresponds to a new point\n",
" k_star = GP_DRT.matrix_K(xi_vec, xi_star, sigma_f, ell)\n",
" L_im_k_star = GP_DRT.matrix_L_im_K(xi_vec, xi_star, sigma_f, ell)\n",
" L2_im_k_star = GP_DRT.matrix_L2_im_K(xi_vec, xi_star, sigma_f, ell)\n",
Expand All @@ -355,12 +393,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### plot the imaginary part of impedance together with the exact one"
"## 4) plot the imaginary part of impedance together with the exact one"
]
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 9,
"metadata": {},
"outputs": [
{
Expand Down Expand Up @@ -391,6 +429,13 @@
"plt.ylabel(r'$-Z_{\\rm im}/\\Omega$', fontsize = 20)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
Expand Down
32 changes: 18 additions & 14 deletions tutorial/.ipynb_checkpoints/ex2_double_ZARC_model-checkpoint.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,9 @@
"metadata": {},
"source": [
"# Gaussian Process Distribution of Relaxation Times. \n",
"### Reproduce Figure 9 in the main context of the paper\n",
"## In this tutorial we will reproduce Figure 9 of the article https://doi.org/10.1016/j.electacta.2019.135316Reproduce\n",
"\n",
"This tutorial shows how the GP-DRT model can manage the overlapping timescales in the impedance. The impedance has been synthesized using two ZARC elements in series. \n",
"\n",
"The impedance has the format of $Z^{\\rm exact}(f) = 2R_\\infty + \\displaystyle \\frac{1}{\\displaystyle \\frac{1}{R_{\\rm ct}}+C_1 \\left(i 2\\pi f\\right)^{\\phi}} + \\displaystyle \\frac{1}{\\displaystyle\\frac{1}{R_{\\rm ct}}+C_2 \\left(i 2\\pi f\\right)^{\\phi}}$, where $\\displaystyle C_1 = \\frac{\\tau_1^\\phi}{R_{\\rm ct}}$ and $\\displaystyle C_2 = \\frac{\\tau_2^\\phi}{R_{\\rm ct}}$.\n",
"\n",
"In this tutorial, $\\tau_1=0.1$ and $\\tau_2=10$\n",
"\n",
"The analytical DRT is calculated as $\\gamma(\\log \\tau) = \\displaystyle \\frac{\\displaystyle R_{\\rm ct}}{\\displaystyle 2\\pi} \\sin\\left((1-\\phi)\\pi\\right) \\displaystyle \\left(\\frac{1 }{\\displaystyle \\cosh(\\phi \\log(\\tau/\\tau_1))-\\cos(\\pi(1-\\phi))} + \\displaystyle \\frac{1}{\\displaystyle \\cosh(\\phi \\log(\\tau/\\tau_2))-\\cos(\\pi(1-\\phi))}\\right)$"
"This tutorial shows how the GP-DRT model can manage the overlapping timescales in the impedance. The impedance has been synthesized using two ZARC elements in series. "
]
},
{
Expand All @@ -34,7 +28,17 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Define parameters for the synthetic impedance based on two ZARCs in series. "
"## 1) Define parameters of the ZARC circuit which will be used for the synthetic experiment generation\n",
"\n",
"The impedance has the format of \n",
"\n",
"$$Z^{\\rm exact}(f) = 2R_\\infty + \\displaystyle \\frac{1}{\\displaystyle \\frac{1}{R_{\\rm ct}}+C_1 \\left(i 2\\pi f\\right)^{\\phi}} + \\displaystyle \\frac{1}{\\displaystyle\\frac{1}{R_{\\rm ct}}+C_2 \\left(i 2\\pi f\\right)^{\\phi}}$, where $\\displaystyle C_1 = \\frac{\\tau_1^\\phi}{R_{\\rm ct}}$ and $\\displaystyle C_2 = \\frac{\\tau_2^\\phi}{R_{\\rm ct}}$$\n",
"\n",
"In this tutorial, $\\tau_1=0.1$ and $\\tau_2=10$\n",
"\n",
"The analytical DRT is calculated as \n",
"\n",
"$$\\gamma(\\log \\tau) = \\displaystyle \\frac{\\displaystyle R_{\\rm ct}}{\\displaystyle 2\\pi} \\sin\\left((1-\\phi)\\pi\\right) \\displaystyle \\left(\\frac{1 }{\\displaystyle \\cosh(\\phi \\log(\\tau/\\tau_1))-\\cos(\\pi(1-\\phi))} + \\displaystyle \\frac{1}{\\displaystyle \\cosh(\\phi \\log(\\tau/\\tau_2))-\\cos(\\pi(1-\\phi))}\\right)$$"
]
},
{
Expand Down Expand Up @@ -82,7 +86,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### show the synthetic impedance in the Nyquist plot, as shown in Figure 9 (a)"
"### show the synthetic impedance in the Nyquist plot, as shown in Figure 9 (a)"
]
},
{
Expand Down Expand Up @@ -149,7 +153,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### running the GP-DRT model to get the optimal hyperparameters"
"## 2) running the GP-DRT model to get the optimal hyperparameters"
]
},
{
Expand Down Expand Up @@ -250,7 +254,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### plot the DRT together with the analytical DRT"
"### plot the DRT together with the analytical DRT"
]
},
{
Expand Down Expand Up @@ -291,7 +295,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### calculate the impedance"
"## 3) calculate the impedance"
]
},
{
Expand Down Expand Up @@ -332,7 +336,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"#### plot the imaginary part of impedance together with the exact one"
"## 4) plot the imaginary part of impedance together with the exact one"
]
},
{
Expand Down
Loading

0 comments on commit 65073a5

Please sign in to comment.