{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Batch Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this notebook, we'll learn how to analyze EIS data in batch mode. Normally, you have a single set of EIS data, i.e., set of impedance measurements at various frequencies, plus a common circuit model that you want to fit to the data. This is what we call single circuit, single dataset or SCSD in short. However, there are two other modes of analysis that you might encounter in practice:\n", "\n", "- Single circuit, multiple datasets (SCMD): You have multiple datasets, each with its own impedance measurements, but you want to fit the same circuit model to all of them. A good example of this is when you have EIS data for multiple samples which you want to compare, or a single sample under different conditions, e.g., EIS data at different cycles during battery cycling.\n", "\n", "- Multiple circuits, single dataset (MCSD): You have a single dataset, but you want to fit different circuit models to it. This is useful when you want to compare different models to see which one fits the data best, which is by the way the classic use case of AutoEIS itself!" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-09-16T20:47:09.893297Z", "iopub.status.busy": "2024-09-16T20:47:09.892740Z", "iopub.status.idle": "2024-09-16T20:47:14.344989Z", "shell.execute_reply": "2024-09-16T20:47:14.344222Z" }, "scrolled": true }, "outputs": [], "source": [ "import random\n", "\n", "import autoeis as ae\n", "import matplotlib.pyplot as plt\n", "\n", "ae.visualization.set_plot_style()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Single circuit, multiple datsets (SCMD)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To test this, we can use a toy dataset that ships with the package. This dataset contains EIS data for a coin cell battery measured at discharged state at various cycles. Let's load the dataset and see what it looks like." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2024-09-16T20:47:14.357671Z", "iopub.status.busy": "2024-09-16T20:47:14.356758Z", "iopub.status.idle": "2024-09-16T20:47:14.371092Z", "shell.execute_reply": "2024-09-16T20:47:14.370474Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of cycles: 130\n" ] } ], "source": [ "datasets = ae.io.load_battery_dataset()\n", "print(f\"Number of cycles: {len(datasets)}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To save time searching for the optimal circuit by calling the `generate_equivalent_circuits` function, we will use the circuit that we know fits the data well." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2024-09-16T20:47:14.373752Z", "iopub.status.busy": "2024-09-16T20:47:14.373565Z", "iopub.status.idle": "2024-09-16T20:47:14.382475Z", "shell.execute_reply": "2024-09-16T20:47:14.381649Z" } }, "outputs": [], "source": [ "circuit = \"R1-P2-[R3,P4]-[R5,P6]\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's run Bayesian inference on the entire dataset using the given circuit. For convenience, the API for SCSD, SCMD, and MCSD is the same, so we just need to call `perform_bayesian_inference` with the appropriate arguments: the circuit string, list of frequencies, and list of impedance measurements. Since the loaded dataset is in the form of a list of tuples (frequency, impedance), we can easily extract the frequencies and impedances:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2024-09-16T20:47:14.385129Z", "iopub.status.busy": "2024-09-16T20:47:14.384944Z", "iopub.status.idle": "2024-09-16T20:47:14.387340Z", "shell.execute_reply": "2024-09-16T20:47:14.386871Z" } }, "outputs": [], "source": [ "freq, Z = zip(*datasets)\n", "# If you don't understand the above syntax, you can use the following code instead\n", "# freq, Z = [], []\n", "# for dataset in datasets:\n", "# freq.append(dataset[0])\n", "# Z.append(dataset[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "