Battery Degradation Mode Analysis - Python implementation of TUM-EES DegradationModeAnalysis
Project description
PyDMA - Battery Degradation Mode Analysis
🔭 Overview
PyDMA is a Python package for performing degradation mode analysis of lithium-ion and sodium-ion batteries. Among others, both electrodes can be modeled as blends, and inhomogeneity is available for both electrodes. It reconstructs measured pseudo-OCV curves using half-cell electrode potential curves to quantify three degradation mechanisms:
- LLI: Loss of lithium inventory (charge carrier loss)
- LAM_an: Loss of active material at anode
- LAM_ca: Loss of active material at cathode
The core algorithm reconstructs full-cell OCV as:
OCV_cell(SOC) = U_cathode(α_ca · SOC + β_ca) - U_anode(α_an · SOC + β_an)
Where α scales capacity and β shifts the SOC window.
⚙️ Installation
Install from PyPI:
pip install pydma
Or install from source:
git clone https://github.com/tum-ees/pydma.git
cd pydma
pip install .
For development installation:
git clone https://github.com/tum-ees/pydma.git
cd pydma
pip install -e ".[dev,notebook]"
🎮 Quick Start
import pydma
from pydma import DMAAnalyzer, DMAConfig
# Load your electrode OCP data
anode = pydma.load_ocp("path/to/anode_ocp.csv", electrode_type="anode")
cathode = pydma.load_ocp("path/to/cathode_ocp.csv", electrode_type="cathode")
# Create analyzer with configuration
config = DMAConfig(
direction="charge",
weight_ocv=100,
weight_dva=1,
weight_ica=0,
)
analyzer = DMAAnalyzer(
config=config,
anode=anode,
cathode=cathode,
)
# Run analysis on aging study data
# The analyzer uses config.direction when loading the study.
results = analyzer.analyze_aging_study("path/to/aging_data")
# Access degradation modes
print(f"LLI: {results['CU2'].degradation_modes.lli:.2%}")
print(f"LAM_an: {results['CU2'].degradation_modes.lam_anode:.2%}")
print(f"LAM_ca: {results['CU2'].degradation_modes.lam_cathode:.2%}")
# Plot results
results.plot_degradation_modes()
📖 Key Features
Blend Electrode Model
Supports blended electrodes (e.g., Silicon-Graphite anodes):
from pydma import BlendElectrode
config = DMAConfig(
use_anode_blend=True,
gamma_anode_blend2_upper=0.30, # Max 30% silicon
)
si_gr_anode = BlendElectrode(blend1=graphite_ocp, blend2=silicon_ocp)
analyzer = DMAAnalyzer(
config=config,
anode=si_gr_anode,
cathode=cathode,
)
Inhomogeneity Modeling
Models electrode inhomogeneity effects:
config = DMAConfig(
allow_anode_inhomogeneity=True,
allow_cathode_inhomogeneity=True,
max_inhomogeneity=0.3,
inhom_anode_offset=0.2,
inhom_cathode_offset=0.0,
)
Multiple Fitting Objectives
Combine OCV, DVA, and ICA fitting with custom weights:
config = DMAConfig(
weight_ocv=100,
weight_dva=1,
weight_ica=0,
roi_dva_min=0.1,
roi_dva_max=0.9,
)
Speed Presets
Choose optimization thoroughness:
config = DMAConfig(speed_preset="thorough") # "fast", "medium", or "thorough"
🔧 Silicon OCP Generation
Generate silicon OCP from measured blend electrode data:
from pydma.silicon import generate_si_curve
result = generate_si_curve(
blend_path="path/to/blend_ocp.mat",
graphite_path="path/to/graphite_ocp.mat",
gamma_si=0.245,
)
📊 Parameter Vector Layout
The optimizer uses an 8-element parameter vector internally:
| Index | Parameter | Description |
|---|---|---|
| 0 | α_an | Anode scaling / capacity ratio |
| 1 | β_an | Anode offset / SOC shift |
| 2 | α_ca | Cathode scaling |
| 3 | β_ca | Cathode offset |
| 4 | γ_blend2_an | Anode blend2 fraction (0 if disabled) |
| 5 | γ_blend2_ca | Cathode blend2 fraction (0 if disabled) |
| 6 | σ_an | Anode inhomogeneity magnitude |
| 7 | σ_ca | Cathode inhomogeneity magnitude |
📚 Documentation
See the Getting Started Notebook for detailed examples.
📝 Release Notes
See CHANGELOG.md for the full release history.
1.0.0 highlights:
- New: inhomogeneity offset (
inhom_anode_offset,inhom_cathode_offset) lets a fraction of the maximum inhomogeneity spread be present already at SOC = 0, matching MATLAB's newinhomOffsetFractionargument. - Numerical change:
q0is now the span of the normalized SOC axis (≈ 1.0), matching MATLAB. Previously, PyDMA multiplied DVA/ICA costs by the raw Ah capacity, so fits withweight_dva > 0and/orweight_ica > 0may produce small numerical differences compared with PyDMA ≤ 0.1.0. Fits are now cell-size independent and consistent with the MATLAB-tuned weight defaults. OCV-only fits are unaffected.
🎖️ Acknowledgments
This is a Python translation of the TUM-EES DegradationModeAnalysis MATLAB framework. We would like to thank Johannes Natterer for providing the aging data set of a cyclic aged P45B cell and for help in translating into Python.
📯 Developers
- Mathias Rehm, Chair of Electrical Energy Storage Technology, School of Engineering and Design, Technical University of Munich, 80333 Munich, Germany
- Josef Eizenhammer, Chair of Electrical Energy Storage Technology, School of Engineering and Design, Technical University of Munich, 80333 Munich, Germany
- Moritz Günthner (student research project)
- Can Korkmaz (student research project)
✒️ Citation
This framework is the Python implementation of the MATLAB DegradationModeAnalysis toolbox. If you use this repository in any publication, please cite:
M. Rehm et al., "How to determine the degradation modes of lithium-ion batteries with silicon–graphite blend electrodes," Journal of Power Sources, 2026, DOI: 10.1016/j.jpowsour.2026.239418
The framework is also applied and validated on commercial sodium-ion batteries in the following publication. We appreciate citing this work as well, and kindly ask you to do so if your work involves sodium-ion cells:
M. Rehm et al., "Aging of commercial sodium-ion batteries with layered oxides: how to measure and analyze it?," EES Batteries, 2026, DOI: 10.1039/D5EB00221D
📜 License
BSD 3-Clause "New" or "Revised" License - see LICENSE for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pydma-1.0.1.tar.gz.
File metadata
- Download URL: pydma-1.0.1.tar.gz
- Upload date:
- Size: 92.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa13797ae06166ab729414cdb88113cff09181a12facc3882fd35ff2274bf323
|
|
| MD5 |
46232c9e21f010c99aeff13047a5bb95
|
|
| BLAKE2b-256 |
ca9b08bee37f7933e33063b29b8ce4e09a86f3561b2b062b037013e22eeb7bf5
|
File details
Details for the file pydma-1.0.1-py3-none-any.whl.
File metadata
- Download URL: pydma-1.0.1-py3-none-any.whl
- Upload date:
- Size: 95.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
416c54f67820fcf9aec641ead256911359fb6c660d3b782b17b28930334c91bf
|
|
| MD5 |
b4d2fb2cbd2ef5f2f9c35bdca3495073
|
|
| BLAKE2b-256 |
158b0c7ca43814a4d14c2807de2b5bb85e29f6546f3540ad6ae3ecdd29c80aa3
|