diff --git a/README.md b/README.md index c23bee8..0145468 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,8 @@ The frequency range is from 1E-4 Hz to 1E4 Hz with 10 ppd. * **ex5_inductance_plus_ZARC.ipynb**: this notebook adds an inductance to the model used in ex1_single_ZARC.ipynb +* **ex6_exception_handling.ipynb**: in this notebook, we show how to resolve the error raised by `np.linalg.cholesky()` + # Citation ``` diff --git a/tutorials/.ipynb_checkpoints/ex6_exception_handling-checkpoint.ipynb b/tutorials/.ipynb_checkpoints/ex6_exception_handling-checkpoint.ipynb new file mode 100644 index 0000000..d2a890f --- /dev/null +++ b/tutorials/.ipynb_checkpoints/ex6_exception_handling-checkpoint.ipynb @@ -0,0 +1,430 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gaussian Process Distribution of Relaxation Times" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## In this tutorial, we will try to handle the exception that may be encountered while doing the Cholesky decomposition for $\\mathbf K_{\\rm im}^{\\rm full}$ https://doi.org/10.1016/j.electacta.2019.135316" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This tutorial is based on that `ex1_simple_ZARC.ipynb` and we will handle the exception during in the `np.linalg.cholesky(K_im_full)`." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from math import sin, cos, pi\n", + "import GP_DRT\n", + "from scipy.optimize import minimize\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1) Define parameters of the ZARC circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# define the frequency range\n", + "N_freqs = 81\n", + "freq_vec = np.logspace(-4., 4., num=N_freqs, endpoint=True)\n", + "xi_vec = np.log(freq_vec)\n", + "tau = 1/freq_vec\n", + "\n", + "# define the frequency range used for prediction\n", + "# note: we could have used other values\n", + "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 the above equations\n", + "R_inf = 10\n", + "R_ct = 50\n", + "phi = 0.8\n", + "tau_0 = 1.\n", + "\n", + "C = tau_0**phi/R_ct\n", + "Z_exact = R_inf+1./(1./R_ct+C*(1j*2.*pi*freq_vec)**phi)\n", + "gamma_fct = (R_ct)/(2.*pi)*sin((1.-phi)*pi)/(np.cosh(phi*np.log(tau/tau_0))-cos((1.-phi)*pi))\n", + "\n", + "# we will use a finer mesh for plotting the results\n", + "freq_vec_plot = np.logspace(-4., 4., num=10*(N_freqs-1), endpoint=True)\n", + "tau_plot = 1/freq_vec_plot\n", + "# for plotting only\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))\n", + "\n", + "# we will add noise to the impedance computed analytically\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))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2) Show the synthetic impedance in the Nyquist plot" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.rc('text', usetex=True)\n", + "plt.rc('font', family='serif', size=15)\n", + "plt.rc('xtick', labelsize=15)\n", + "plt.rc('ytick', labelsize=15)\n", + "\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", + "plt.legend(frameon=False, fontsize = 15)\n", + "plt.axis('scaled')\n", + "\n", + "plt.xticks(range(10, 70, 10))\n", + "plt.yticks(range(0, 60, 10))\n", + "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", + "plt.annotate(r'$10^{-1}$', xy=(np.real(Z_exp[30]), -np.imag(Z_exp[30])), \n", + " xytext=(np.real(Z_exp[30])-2, 6-np.imag(Z_exp[30])), \n", + " arrowprops=dict(arrowstyle=\"-\",connectionstyle=\"arc\"))\n", + "plt.annotate(r'$1$', xy=(np.real(Z_exp[40]), -np.imag(Z_exp[40])), \n", + " xytext=(np.real(Z_exp[40]), 10-np.imag(Z_exp[40])), \n", + " arrowprops=dict(arrowstyle=\"-\",connectionstyle=\"arc\"))\n", + "plt.annotate(r'$10$', xy=(np.real(Z_exp[50]), -np.imag(Z_exp[50])), \n", + " xytext=(np.real(Z_exp[50])-1, 10-np.imag(Z_exp[50])), \n", + " arrowprops=dict(arrowstyle=\"-\",connectionstyle=\"arc\"))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3) Compute the optimal hyperparameters" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sigma_n, sigma_f, ell\n", + "1.0000290 5.0000028 0.0079106\n", + "1.0000582 5.0000205 0.0135268\n", + "1.0001011 5.0000654 0.0218110\n", + "1.0001540 5.0001736 0.0342186\n", + "1.0001779 5.0004275 0.0527574\n", + "1.0000006 5.0010074 0.0802152\n", + "0.9989934 5.0022977 0.1203504\n", + "0.9950320 5.0050874 0.1780736\n", + "0.9810932 5.0109940 0.2604866\n", + "0.9323377 5.0238470 0.3836633\n", + "0.8036473 5.0473572 0.5451553\n", + "0.8278384 5.0853525 0.7852677\n", + "0.8287949 5.1293254 1.2514261\n", + "0.8303948 5.1721020 1.2189826\n", + "0.8304461 5.2594414 1.2326420\n", + "0.8305238 5.3960799 1.2534148\n", + "0.8305327 5.4070244 1.2546809\n", + "0.8305262 5.4070989 1.2546864\n", + "0.8305267 5.4070910 1.2546867\n", + "Optimization terminated successfully.\n", + " Current function value: 53.657989\n", + " Iterations: 19\n", + " Function evaluations: 20\n", + " Gradient evaluations: 87\n", + " Hessian evaluations: 0\n" + ] + } + ], + "source": [ + "# initialize the parameters for the minimization of the NMLL, see (31) in the manuscript\n", + "sigma_n = 1.0\n", + "sigma_f = 5.0\n", + "ell = 0.001\n", + "\n", + "theta_0 = np.array([sigma_n, sigma_f, ell])\n", + "seq_theta = np.copy(theta_0)\n", + "def print_results(theta):\n", + " global seq_theta\n", + " seq_theta = np.vstack((seq_theta, theta))\n", + " print('{0:.7f} {1:.7f} {2:.7f}'.format(theta[0], theta[1], theta[2]))\n", + "\n", + "print('sigma_n, sigma_f, ell')\n", + "\n", + "# minimize the NMLL L(\\theta) w.r.t sigma_n, sigma_f, ell using the Newton-CG method as implemented in scipy\n", + "# Here we will show one solution to handle the exception that may be raised in np.linalg.cholesky(K_im_full) \n", + "# due to the non-positive definite K_im_full\n", + "# Once the message of \"numpy.linalg.LinAlgError: Matrix is not positive definite\" appears, we modify the theta_0\n", + "# to ensure that the K_im_full becomes positive definite\n", + "\n", + "# the flag to denote whether the K_im_full can be successfully decomposed\n", + "ch_flag = True\n", + "while ch_flag:\n", + " try:\n", + " res = minimize(GP_DRT.NMLL_fct, theta_0, args=(Z_exp, xi_vec), method='Newton-CG', \n", + " jac=GP_DRT.grad_NMLL_fct, callback=print_results, options={'disp': True})\n", + " ch_flag = False\n", + " except np.linalg.LinAlgError as err:\n", + " if 'positive definite' in str(err):\n", + " theta_0 = np.abs([sigma_n, sigma_f, ell]) + np.random.random()*np.ones((3))\n", + " \n", + "# collect the optimized parameters\n", + "sigma_n, sigma_f, ell = res.x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4) Core of the GP-DRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4a) Compute matrices" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "K = GP_DRT.matrix_K(xi_vec, xi_vec, sigma_f, ell)\n", + "L_im_K = GP_DRT.matrix_L_im_K(xi_vec, xi_vec, sigma_f, ell)\n", + "L2_im_K = GP_DRT.matrix_L2_im_K(xi_vec, xi_vec, sigma_f, ell)\n", + "Sigma = (sigma_n**2)*np.eye(N_freqs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4b) Factorize the matrices and solve the linear equations" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# 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 a lower-triangular matrix\n", + "L = np.linalg.cholesky(K_im_full)\n", + "\n", + "# solve for alpha\n", + "alpha = np.linalg.solve(L, Z_exp.imag)\n", + "alpha = np.linalg.solve(L.T, alpha)\n", + "\n", + "# estimate the gamma of eq (21a)\n", + "gamma_fct_est = np.dot(L_im_K, alpha)\n", + "\n", + "# covariance matrix\n", + "inv_L = np.linalg.inv(L)\n", + "inv_K_im_full = np.dot(inv_L.T, inv_L)\n", + "\n", + "# estimate the sigma of gamma for eq (21b)\n", + "cov_gamma_fct_est = K - np.dot(L_im_K, np.dot(inv_K_im_full, L_im_K.T))\n", + "sigma_gamma_fct_est = np.sqrt(np.diag(cov_gamma_fct_est))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4c) Plot the obtained DRT against the analytical DRT" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot the DRT and its confidence region\n", + "plt.semilogx(freq_vec_plot, gamma_fct_plot, linewidth=4, color=\"black\", label=\"exact\")\n", + "plt.semilogx(freq_vec, gamma_fct_est, linewidth=4, color=\"red\", label=\"GP-DRT\")\n", + "plt.fill_between(freq_vec, gamma_fct_est-3*sigma_gamma_fct_est, gamma_fct_est+3*sigma_gamma_fct_est, color=\"0.4\", alpha=0.3)\n", + "plt.rc('text', usetex=True)\n", + "plt.rc('font', family='serif', size=15)\n", + "plt.rc('xtick', labelsize=15)\n", + "plt.rc('ytick', labelsize=15)\n", + "plt.axis([1E-4,1E4,-5,25])\n", + "plt.legend(frameon=False, fontsize = 15)\n", + "plt.xlabel(r'$f/{\\rm Hz}$', fontsize = 20)\n", + "plt.ylabel(r'$\\gamma/\\Omega$', fontsize = 20)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4d) Predict the $\\gamma$ and the imaginary part of the GP-DRT impedance" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# initialize the imaginary part of impedance vector\n", + "Z_im_vec_star = np.empty_like(xi_vec_star)\n", + "Sigma_Z_im_vec_star = np.empty_like(xi_vec_star)\n", + "\n", + "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 the plot\n", + "for index, val in enumerate(xi_vec_star):\n", + " xi_star = np.array([val])\n", + "\n", + " # compute matrices shown in eq (23), xi_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_up = GP_DRT.matrix_L_im_K(xi_star, xi_vec, sigma_f, ell)\n", + " L2_im_k_star = GP_DRT.matrix_L2_im_K(xi_vec, xi_star, sigma_f, ell)\n", + " k_star_star = GP_DRT.matrix_K(xi_star, xi_star, sigma_f, ell)\n", + " L_im_k_star_star = GP_DRT.matrix_L_im_K(xi_star, xi_star, sigma_f, ell)\n", + " L2_im_k_star_star = GP_DRT.matrix_L2_im_K(xi_star, xi_star, sigma_f, ell)\n", + "\n", + " # compute Z_im_star mean and standard deviation using eq (26)\n", + " Z_im_vec_star[index] = np.dot(L2_im_k_star.T, np.dot(inv_K_im_full, Z_exp.imag))\n", + " Sigma_Z_im_vec_star[index] = L2_im_k_star_star-np.dot(L2_im_k_star.T, np.dot(inv_K_im_full, L2_im_k_star))\n", + " \n", + " # compute gamma_star mean and standard deviation using eq (29)\n", + " gamma_vec_star[index] = np.dot(L_im_k_star_up, np.dot(inv_K_im_full, Z_exp.imag))\n", + " Sigma_gamma_vec_star[index] = k_star_star-np.dot(L_im_k_star_up, np.dot(inv_K_im_full, L_im_k_star_up.T))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4e) Plot the imaginary part of the GP-DRT impedance together with the exact one and the synthetic experiment" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.semilogx(freq_vec_star, -np.imag(Z_exact), \":\", linewidth=4, color=\"blue\", label=\"exact\")\n", + "plt.semilogx(freq_vec, -Z_exp.imag, \"o\", markersize=10, color=\"black\", label=\"synth exp\")\n", + "plt.semilogx(freq_vec_star, -Z_im_vec_star, linewidth=4, color=\"red\", label=\"GP-DRT\")\n", + "plt.fill_between(freq_vec_star, -Z_im_vec_star-3*np.sqrt(abs(Sigma_Z_im_vec_star)), -Z_im_vec_star+3*np.sqrt(abs(Sigma_Z_im_vec_star)), alpha=0.3)\n", + "plt.rc('text', usetex=True)\n", + "plt.rc('font', family='serif', size=15)\n", + "plt.rc('xtick', labelsize=15)\n", + "plt.rc('ytick', labelsize=15)\n", + "plt.axis([1E-4,1E4,-5,25])\n", + "plt.legend(frameon=False, fontsize = 15)\n", + "plt.xlabel(r'$f/{\\rm Hz}$', fontsize = 20)\n", + "plt.ylabel(r'$-Z_{\\rm im}/\\Omega$', fontsize = 20)\n", + "plt.show()" + ] + } + ], + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/__pycache__/GP_DRT.cpython-38.pyc b/tutorials/__pycache__/GP_DRT.cpython-38.pyc new file mode 100644 index 0000000..f9dda99 Binary files /dev/null and b/tutorials/__pycache__/GP_DRT.cpython-38.pyc differ diff --git a/tutorials/ex6_exception_handling.ipynb b/tutorials/ex6_exception_handling.ipynb new file mode 100644 index 0000000..d2a890f --- /dev/null +++ b/tutorials/ex6_exception_handling.ipynb @@ -0,0 +1,430 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gaussian Process Distribution of Relaxation Times" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## In this tutorial, we will try to handle the exception that may be encountered while doing the Cholesky decomposition for $\\mathbf K_{\\rm im}^{\\rm full}$ https://doi.org/10.1016/j.electacta.2019.135316" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This tutorial is based on that `ex1_simple_ZARC.ipynb` and we will handle the exception during in the `np.linalg.cholesky(K_im_full)`." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from math import sin, cos, pi\n", + "import GP_DRT\n", + "from scipy.optimize import minimize\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1) Define parameters of the ZARC circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# define the frequency range\n", + "N_freqs = 81\n", + "freq_vec = np.logspace(-4., 4., num=N_freqs, endpoint=True)\n", + "xi_vec = np.log(freq_vec)\n", + "tau = 1/freq_vec\n", + "\n", + "# define the frequency range used for prediction\n", + "# note: we could have used other values\n", + "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 the above equations\n", + "R_inf = 10\n", + "R_ct = 50\n", + "phi = 0.8\n", + "tau_0 = 1.\n", + "\n", + "C = tau_0**phi/R_ct\n", + "Z_exact = R_inf+1./(1./R_ct+C*(1j*2.*pi*freq_vec)**phi)\n", + "gamma_fct = (R_ct)/(2.*pi)*sin((1.-phi)*pi)/(np.cosh(phi*np.log(tau/tau_0))-cos((1.-phi)*pi))\n", + "\n", + "# we will use a finer mesh for plotting the results\n", + "freq_vec_plot = np.logspace(-4., 4., num=10*(N_freqs-1), endpoint=True)\n", + "tau_plot = 1/freq_vec_plot\n", + "# for plotting only\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))\n", + "\n", + "# we will add noise to the impedance computed analytically\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))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2) Show the synthetic impedance in the Nyquist plot" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.rc('text', usetex=True)\n", + "plt.rc('font', family='serif', size=15)\n", + "plt.rc('xtick', labelsize=15)\n", + "plt.rc('ytick', labelsize=15)\n", + "\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", + "plt.legend(frameon=False, fontsize = 15)\n", + "plt.axis('scaled')\n", + "\n", + "plt.xticks(range(10, 70, 10))\n", + "plt.yticks(range(0, 60, 10))\n", + "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", + "plt.annotate(r'$10^{-1}$', xy=(np.real(Z_exp[30]), -np.imag(Z_exp[30])), \n", + " xytext=(np.real(Z_exp[30])-2, 6-np.imag(Z_exp[30])), \n", + " arrowprops=dict(arrowstyle=\"-\",connectionstyle=\"arc\"))\n", + "plt.annotate(r'$1$', xy=(np.real(Z_exp[40]), -np.imag(Z_exp[40])), \n", + " xytext=(np.real(Z_exp[40]), 10-np.imag(Z_exp[40])), \n", + " arrowprops=dict(arrowstyle=\"-\",connectionstyle=\"arc\"))\n", + "plt.annotate(r'$10$', xy=(np.real(Z_exp[50]), -np.imag(Z_exp[50])), \n", + " xytext=(np.real(Z_exp[50])-1, 10-np.imag(Z_exp[50])), \n", + " arrowprops=dict(arrowstyle=\"-\",connectionstyle=\"arc\"))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3) Compute the optimal hyperparameters" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sigma_n, sigma_f, ell\n", + "1.0000290 5.0000028 0.0079106\n", + "1.0000582 5.0000205 0.0135268\n", + "1.0001011 5.0000654 0.0218110\n", + "1.0001540 5.0001736 0.0342186\n", + "1.0001779 5.0004275 0.0527574\n", + "1.0000006 5.0010074 0.0802152\n", + "0.9989934 5.0022977 0.1203504\n", + "0.9950320 5.0050874 0.1780736\n", + "0.9810932 5.0109940 0.2604866\n", + "0.9323377 5.0238470 0.3836633\n", + "0.8036473 5.0473572 0.5451553\n", + "0.8278384 5.0853525 0.7852677\n", + "0.8287949 5.1293254 1.2514261\n", + "0.8303948 5.1721020 1.2189826\n", + "0.8304461 5.2594414 1.2326420\n", + "0.8305238 5.3960799 1.2534148\n", + "0.8305327 5.4070244 1.2546809\n", + "0.8305262 5.4070989 1.2546864\n", + "0.8305267 5.4070910 1.2546867\n", + "Optimization terminated successfully.\n", + " Current function value: 53.657989\n", + " Iterations: 19\n", + " Function evaluations: 20\n", + " Gradient evaluations: 87\n", + " Hessian evaluations: 0\n" + ] + } + ], + "source": [ + "# initialize the parameters for the minimization of the NMLL, see (31) in the manuscript\n", + "sigma_n = 1.0\n", + "sigma_f = 5.0\n", + "ell = 0.001\n", + "\n", + "theta_0 = np.array([sigma_n, sigma_f, ell])\n", + "seq_theta = np.copy(theta_0)\n", + "def print_results(theta):\n", + " global seq_theta\n", + " seq_theta = np.vstack((seq_theta, theta))\n", + " print('{0:.7f} {1:.7f} {2:.7f}'.format(theta[0], theta[1], theta[2]))\n", + "\n", + "print('sigma_n, sigma_f, ell')\n", + "\n", + "# minimize the NMLL L(\\theta) w.r.t sigma_n, sigma_f, ell using the Newton-CG method as implemented in scipy\n", + "# Here we will show one solution to handle the exception that may be raised in np.linalg.cholesky(K_im_full) \n", + "# due to the non-positive definite K_im_full\n", + "# Once the message of \"numpy.linalg.LinAlgError: Matrix is not positive definite\" appears, we modify the theta_0\n", + "# to ensure that the K_im_full becomes positive definite\n", + "\n", + "# the flag to denote whether the K_im_full can be successfully decomposed\n", + "ch_flag = True\n", + "while ch_flag:\n", + " try:\n", + " res = minimize(GP_DRT.NMLL_fct, theta_0, args=(Z_exp, xi_vec), method='Newton-CG', \n", + " jac=GP_DRT.grad_NMLL_fct, callback=print_results, options={'disp': True})\n", + " ch_flag = False\n", + " except np.linalg.LinAlgError as err:\n", + " if 'positive definite' in str(err):\n", + " theta_0 = np.abs([sigma_n, sigma_f, ell]) + np.random.random()*np.ones((3))\n", + " \n", + "# collect the optimized parameters\n", + "sigma_n, sigma_f, ell = res.x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4) Core of the GP-DRT" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4a) Compute matrices" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "K = GP_DRT.matrix_K(xi_vec, xi_vec, sigma_f, ell)\n", + "L_im_K = GP_DRT.matrix_L_im_K(xi_vec, xi_vec, sigma_f, ell)\n", + "L2_im_K = GP_DRT.matrix_L2_im_K(xi_vec, xi_vec, sigma_f, ell)\n", + "Sigma = (sigma_n**2)*np.eye(N_freqs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4b) Factorize the matrices and solve the linear equations" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# 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 a lower-triangular matrix\n", + "L = np.linalg.cholesky(K_im_full)\n", + "\n", + "# solve for alpha\n", + "alpha = np.linalg.solve(L, Z_exp.imag)\n", + "alpha = np.linalg.solve(L.T, alpha)\n", + "\n", + "# estimate the gamma of eq (21a)\n", + "gamma_fct_est = np.dot(L_im_K, alpha)\n", + "\n", + "# covariance matrix\n", + "inv_L = np.linalg.inv(L)\n", + "inv_K_im_full = np.dot(inv_L.T, inv_L)\n", + "\n", + "# estimate the sigma of gamma for eq (21b)\n", + "cov_gamma_fct_est = K - np.dot(L_im_K, np.dot(inv_K_im_full, L_im_K.T))\n", + "sigma_gamma_fct_est = np.sqrt(np.diag(cov_gamma_fct_est))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4c) Plot the obtained DRT against the analytical DRT" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot the DRT and its confidence region\n", + "plt.semilogx(freq_vec_plot, gamma_fct_plot, linewidth=4, color=\"black\", label=\"exact\")\n", + "plt.semilogx(freq_vec, gamma_fct_est, linewidth=4, color=\"red\", label=\"GP-DRT\")\n", + "plt.fill_between(freq_vec, gamma_fct_est-3*sigma_gamma_fct_est, gamma_fct_est+3*sigma_gamma_fct_est, color=\"0.4\", alpha=0.3)\n", + "plt.rc('text', usetex=True)\n", + "plt.rc('font', family='serif', size=15)\n", + "plt.rc('xtick', labelsize=15)\n", + "plt.rc('ytick', labelsize=15)\n", + "plt.axis([1E-4,1E4,-5,25])\n", + "plt.legend(frameon=False, fontsize = 15)\n", + "plt.xlabel(r'$f/{\\rm Hz}$', fontsize = 20)\n", + "plt.ylabel(r'$\\gamma/\\Omega$', fontsize = 20)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4d) Predict the $\\gamma$ and the imaginary part of the GP-DRT impedance" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# initialize the imaginary part of impedance vector\n", + "Z_im_vec_star = np.empty_like(xi_vec_star)\n", + "Sigma_Z_im_vec_star = np.empty_like(xi_vec_star)\n", + "\n", + "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 the plot\n", + "for index, val in enumerate(xi_vec_star):\n", + " xi_star = np.array([val])\n", + "\n", + " # compute matrices shown in eq (23), xi_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_up = GP_DRT.matrix_L_im_K(xi_star, xi_vec, sigma_f, ell)\n", + " L2_im_k_star = GP_DRT.matrix_L2_im_K(xi_vec, xi_star, sigma_f, ell)\n", + " k_star_star = GP_DRT.matrix_K(xi_star, xi_star, sigma_f, ell)\n", + " L_im_k_star_star = GP_DRT.matrix_L_im_K(xi_star, xi_star, sigma_f, ell)\n", + " L2_im_k_star_star = GP_DRT.matrix_L2_im_K(xi_star, xi_star, sigma_f, ell)\n", + "\n", + " # compute Z_im_star mean and standard deviation using eq (26)\n", + " Z_im_vec_star[index] = np.dot(L2_im_k_star.T, np.dot(inv_K_im_full, Z_exp.imag))\n", + " Sigma_Z_im_vec_star[index] = L2_im_k_star_star-np.dot(L2_im_k_star.T, np.dot(inv_K_im_full, L2_im_k_star))\n", + " \n", + " # compute gamma_star mean and standard deviation using eq (29)\n", + " gamma_vec_star[index] = np.dot(L_im_k_star_up, np.dot(inv_K_im_full, Z_exp.imag))\n", + " Sigma_gamma_vec_star[index] = k_star_star-np.dot(L_im_k_star_up, np.dot(inv_K_im_full, L_im_k_star_up.T))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4e) Plot the imaginary part of the GP-DRT impedance together with the exact one and the synthetic experiment" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.semilogx(freq_vec_star, -np.imag(Z_exact), \":\", linewidth=4, color=\"blue\", label=\"exact\")\n", + "plt.semilogx(freq_vec, -Z_exp.imag, \"o\", markersize=10, color=\"black\", label=\"synth exp\")\n", + "plt.semilogx(freq_vec_star, -Z_im_vec_star, linewidth=4, color=\"red\", label=\"GP-DRT\")\n", + "plt.fill_between(freq_vec_star, -Z_im_vec_star-3*np.sqrt(abs(Sigma_Z_im_vec_star)), -Z_im_vec_star+3*np.sqrt(abs(Sigma_Z_im_vec_star)), alpha=0.3)\n", + "plt.rc('text', usetex=True)\n", + "plt.rc('font', family='serif', size=15)\n", + "plt.rc('xtick', labelsize=15)\n", + "plt.rc('ytick', labelsize=15)\n", + "plt.axis([1E-4,1E4,-5,25])\n", + "plt.legend(frameon=False, fontsize = 15)\n", + "plt.xlabel(r'$f/{\\rm Hz}$', fontsize = 20)\n", + "plt.ylabel(r'$-Z_{\\rm im}/\\Omega$', fontsize = 20)\n", + "plt.show()" + ] + } + ], + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}