BESS Ageing Calculator: FCR, Peak Shaving and SEI Fade
Predict BESS capacity loss, resistance growth and end of life from frequency response and peak shaving using published NMC/LFP ageing models and rainflow counting.
Estimate how a battery energy storage system ages when it alternates between frequency containment reserve and daily peak shaving. This BESS degradation calculator is for engineers comparing operating strategies, students studying battery ageing, and owners assessing whether calendar exposure or cycling is likely to set service life. It predicts capacity loss, resistance growth, remaining energy and the first end-of-life threshold reached within the chosen forecast.
Choose either the Sony/Murata LFP model of Naumann and colleagues or the Sanyo NMC model of Schmalstieg and colleagues. These are published cell-specific parameterizations, not universal properties of a chemistry. Enter the cell temperature rather than outdoor ambient temperature. Set the initial battery energy, forecast horizon, allowable capacity retention and resistance ratio. Resistance is compared at the same reference measurement conditions; it does not include an instantaneous temperature-induced resistance change.
The operating fraction separates service days from storage days. The FCR share then divides service days between frequency response and peak shaving. For example, a share of 0.7 assigns 70% of operating days to FCR. The services run on separate days; this is not simultaneous power stacking. Calendar ageing continues during every day, including storage.
For FCR, enter the initial FCR power and the standard deviation and correlation time of grid frequency deviations. The tool generates a repeatable seven-day signal, applies a deadband and saturated droop response, and integrates state of charge with an energy-management recovery action. The recovery-power result identifies additional power needed for that action. Change the seed to explore another realization. A Gaussian distribution represents the frequency core; rare disturbances and scheduled trading jumps require measured frequency data.
For peak shaving, enter the daily SoC excursion and charge and discharge durations. Charging starts at 05:00 and discharge at 17:00. The daily trace and the FCR trace are separately rainflow-counted, including residual half cycles. Each cycle retains its depth, mean SoC and active-period C-rate. The depth chart compares their contributions to charge throughput, while the service-share curve shows the effect of changing the duty mix.
Calendar and cycle losses accumulate through equivalent-age states rather than restarting a square-root law each day. The LFP calendar capacity term represents diffusion-limited SEI growth proportional to √t. The NMC fit retains its published t⁰·⁷⁵ dependence. The preview-age control animates the schematic; its layer width is illustrative.
The forecast repeats the same fractional SoC duty as the battery ages. Delivered MW and MWh therefore decrease with remaining capacity. Maintaining fixed absolute dispatch requires an updated dispatch and thermal simulation. The tool does not cover augmentation, cell imbalance, lithium plating, failure probability, commercial warranties or market qualification. Treat predictions after the first end-of-life threshold as extrapolation, and calibrate a procurement decision against measurements of the actual cell.
How it is calculated
Profiles and rainflow. A seeded Park–Miller generator and Box–Muller transform drive a stationary Gaussian AR(1) frequency process, with . A warm-up of at least six hours and six recovery time constants precedes seven days sampled every 15 s. FCR follows Celi Cortés et al. (2025), Eq. (9): zero inside the deadband, outside it, saturated at ±1. High frequency charges the battery. SoC recovery uses , clipped to the SoC window. Recovery is an additional exchange, not deducted from the initial FCR command. The peak-shaving day is an exact piecewise-linear charge–hold–discharge trace. A three-point stack rainflow algorithm retains full cycles and residual half cycles. A cycle's C-rate is mean absolute SoC movement per active time within its endpoint interval.
LFP, Naumann 2018/2020. Capacity calendar loss is , with . Resistance calendar growth is , with . Cycle coefficients, in fractional loss per √EFC and gain per EFC, are and . Calendar resistance uses the quadratic SoC factor in Naumann's dissertation (2018), Eq. (5.14); the cycle-resistance coefficient 0.91882 follows Table 5.3. The 0.6 offset follows the TUM implementation and the explicit reproduction in doi:10.1016/j.est.2026.121158; it is not the 0.5 offset appearing in some secondary accounts. The SEI-associated calendar capacity loss is the √t term, not an extra additive loss.
NMC, Schmalstieg 2014. and , with and . Cyclic terms are and , with and . The source cell is 2.15 Ah, hence independent of pack size. Open-circuit voltage uses the NREL source digitization with PCHIP interpolation; five-point Simpson integration estimates cycle RMS voltage.
Accumulation. For a power law , evolve : . Thus square-root cycle laws add to their capacity-loss clock, not a fresh loss per counted cycle. Time-integrated calendar clocks and daily cycle clocks are mixed by operating-day share, with storage included. The stationary-duty forecast evaluates the resulting power laws exactly at 241 ages; bisection locates capacity and resistance limits. Capacity losses and resistance gains are added separately.
Assumptions
Fresh cells start at normalized capacity and resistance of 1. Temperature is constant and uniform. SoC is a fraction of current available capacity. The same fractional SoC profiles repeat throughout life, so absolute service power and energy scale with remaining capacity; the initial FCR power is used only to establish that profile. No annual reset, augmentation, thermal feedback or stochastic failure is included.
FCR uses an illustrative Gaussian core with user-specified correlation; the 35 mHz spread and 120 s correlation are scenario defaults, not a fit to a particular grid. Coulombic efficiency is taken as unity and voltage is treated as approximately constant when converting pack MW/MWh into C-rate. Peak shaving performs one daily excursion on each allocated day. Storage days remain at target SoC. Mixed-service equivalent-age averaging assumes day types are well interleaved. Transfers between the starting SoCs of different day types are excluded; the share is an exposure mixture rather than a chronological dispatch schedule.
The film in the schematic is an exaggerated proxy for calendar ageing, not a calculated SEI thickness in nanometres. Capacity lost through SEI cannot identify physical film thickness without electrode area, composition and density. The NMC exponent 0.75 is an empirical calendar fit; it is not relabelled as pure diffusion growth.
Where it applies
These coefficients describe specific legacy cells, not all NMC or LFP products. Long-horizon results extrapolate experiments lasting roughly 29 months. Use the model principally up to the first end-of-life threshold; subsequent curves are scenario extrapolations. No knee, plating, gas evolution, cell imbalance, reversible shallow-cycle LFP capacity loss, SEI cracking feedback or pack thermal gradients are modelled. The original NMC cycle fit was obtained near 1C and 35 °C, and the LFP cycling data cover warm operation. FCR microcycles and lower rates are extrapolations. This tool does not establish a warranty or the reliability of an installation.
The Gaussian frequency model omits heavy tails, long biases and deterministic trading-hour events. Fifteen-second sampling resolves the default 120 s correlation with eight samples, but misses faster current pulses and very shallow cycles. A finite seven-day realization has sampling uncertainty: vary the seed and frequency assumptions. The example-day chart shows one-minute samples of the full 15-second solution; rainflow and damage retain every solved sample. The depth chart groups EFC into 5 percentage-point bins; all individual counted cycles, not bin centres, enter the ageing calculation. Five-point integration approximates cycle RMS OCV in NMC. Lifetime curves use the exact power laws, not a coarse annual interpolation.
Negative cyclic resistance coefficients produced by extrapolating empirical polynomials are constrained to zero; the model never treats cycling as resistance healing. This particularly affects shallow NMC cycles and changes their predicted resistance growth. SoC clipping reduces delivered service; the condition flags appreciable clipping, and predictions then describe the clipped trace. Recovery power assumes separate converter headroom and unrestricted recovery transactions.
The FCR characteristic follows the research example in Celi Cortés et al. (2025), describing 2022 Continental Europe requirements; it is not a check of current market rules or prequalification. The forecast is an ageing model, not a dispatch feasibility, fire-safety or electrical installation assessment.
Service-specific input checks apply only to allocated operating days. Inactive service traces rest at target SoC. The share-sensitivity curve omits counterfactual shares whose service profile violates the model's SoC, rate or droop limits.
References
- Schmalstieg, Käbitz, Ecker & Sauer (2014), A holistic aging model for Li(NiMnCo)O₂ based 18650 lithium-ion batteries. Journal of Power Sources 257, 325–334. https://doi.org/10.1016/j.jpowsour.2014.02.012
- Naumann et al. (2018), Analysis and modeling of calendar aging of a commercial LiFePO₄/graphite cell. Journal of Energy Storage 17, 153–169. https://doi.org/10.1016/j.est.2018.01.019
- Naumann, Spingler & Jossen (2020), Analysis and modeling of cycle aging of a commercial LiFePO₄/graphite cell. Journal of Power Sources 451, 227666. https://doi.org/10.1016/j.jpowsour.2019.227666
- Naumann (2021), calendar-ageing measurement dataset V1, CC BY 4.0; selected workbook cells extracted in attached source s5. https://doi.org/10.17632/kxh42bfgtj.1
- NREL BLAST-Lite, Schmalstieg model replication and digitized Sanyo OCV. https://github.com/NREL/BLAST-Lite/blob/main/blast/models/nmc111_gr_Sanyo2Ah_2014.py
- TUM SimSES, Naumann cycle-model implementation (DoC offset 0.6); its resistance-depth coefficient is corrected here against the primary dissertation's 0.91882. https://github.com/tum-ees/simses/blob/main/src/simses/model/degradation/sony_lfp_cyclic.py
- Hierarchical energy management for hybrid large-scale battery storage and power-to-gas systems in multi-use PV park applications (2026): the cycle-capacity DoC offset 0.6 agrees with Naumann; its cubic calendar-resistance SoC expression disagrees with Naumann Eq. 5.14 and is not used. No application-specific 0.55 cycle multiplier is used. https://doi.org/10.1016/j.est.2026.121158
- Celi Cortés et al. (2025), Deterministic grid frequency deviations and the provision of frequency containment reserve with battery storage systems, Energy Reports 13, 1029–1040, Eq. (9). https://doi.org/10.1016/j.egyr.2024.12.057
- Rainflow 3.2.0, independently published range/count example and three-point counting algorithm. https://pypi.org/project/rainflow/
- Naumann, M. (2018), Techno-economic evaluation of stationary battery energy storage systems with special consideration of aging, TUM dissertation, Eq. 5.14 and Tables 5.1/5.3, printed pp. 74 and 82 (original PDF pp. 92 and 100). https://mediatum.ub.tum.de/doc/1434981/document.pdf
Inputs
| Input | Symbol | Unit | Default |
|---|---|---|---|
| Cell ageing model Published cell-specific fits; chemistry alone does not identify your cell. | chem | LFP — Naumann 2018/2020 | |
| Initial energy | E_nom | MWh | 2 |
| Cell temperature | T_cell | °C | 25 |
| Forecast horizon | years | year | 20 |
| Capacity end-of-life fraction | q_limit | 0.8 | |
| Resistance end-of-life ratio Relative to the initial 10 s DC resistance at the same measurement conditions. | r_limit | 2 | |
| Operating fraction Fraction of days providing either service; remaining days are stored at the target SoC. | oper | 0.95 | |
| FCR share of operating days Other operating days perform one peak-shaving cycle. | share | 0.7 | |
| Target state of charge | z_mid | 0.5 | |
| Lower SoC limit | z_low | 0.1 | |
| Upper SoC limit | z_high | 0.9 | |
| Initial FCR power Delivered FCR power scales down with remaining capacity throughout the forecast. | P_fcr | MW | 1 |
| Frequency deviation standard deviation Gaussian core of a synthetic frequency distribution, not a recorded grid trace. | sigma_f | Hz | 0.035 |
| Frequency correlation time | corr_s | s | 120 |
| SoC recovery time constant Energy management returns SoC toward target and adds its own cycling. | bal_h | h | 1 |
| Full activation deviation | full_f | Hz | 0.2 |
| Droop deadband | dead_f | Hz | 0.01 |
| Peak-shaving cycle depth SoC excursion relative to current available capacity. | dod_ps | 0.6 | |
| Charging duration | charge_h | h | 3 |
| Peak-shaving duration | discharge_h | h | 2 |
| Frequency realization seed | seed | 1057 | |
| Preview age Play the schematic to see capacity fade and the calendar-ageing layer grow. | preview_age | year | 10 |
Results
With the default inputs above, the calc gives:
| Result | Value |
|---|---|
| Capacity loss (%) | 23.88 |
| Resistance increase (%) | 35.25 |
| Remaining energy | 1.522 MWh |
| End-of-life year | 14.03 year |
| End-of-life driver | Capacity limit |
| Equivalent full cycles per year | 258.7 |
| Initial peak-shaving power | 0.6 MW |
| FCR recovery headroom | 0.134 MW |
Checked against sources
Each case below was calculated by this calc and agrees with the value from its source (within the tolerance where one is shown).
LFP storage, 25 °C and 50% SoC
Source: Naumann calendar dataset V1, doi:10.17632/kxh42bfgtj.1, original measured 21241 h/initial ratios. Capacity tolerance 2.2% relative (about 2.1 percentage points); resistance tolerance 2% relative. These test the empirical model against data, not exact interpolation. Engine tolerances are absolute; the stated relative tolerances are converted by multiplying each expected ratio.
Inputs: Forecast horizon = 2.423 year; Operating fraction = 0; the others as above.
| Result | Source | This calc |
|---|---|---|
| Remaining capacity fraction at horizon | 0.9527 ± 0.02096 | 0.9338 |
| Resistance ratio at horizon | 1.055 ± 0.02111 | 1.041 |
LFP storage, 40 °C and 50% SoC
Source: Naumann calendar dataset V1, doi:10.17632/kxh42bfgtj.1, DischargeCapacity.xlsx K37/K3 and ResistanceR_DC10s.xlsx K37/K3 at 21241 h. Observed mean values; 1.2% capacity and 2% resistance relative tolerances allow model residuals. Engine tolerances are absolute; the stated relative tolerances are converted by multiplying each expected ratio.
Inputs: Cell temperature = 40 °C; Forecast horizon = 2.423 year; Operating fraction = 0; the others as above.
| Result | Source | This calc |
|---|---|---|
| Remaining capacity fraction at horizon | 0.9076 ± 0.01089 | 0.9078 |
| Resistance ratio at horizon | 1.178 ± 0.02356 | 1.163 |
Published rainflow 3.2.0 example
Source: Rainflow 3.2.0 published usage example at https://pypi.org/project/rainflow/: 201 samples on t=0…4 with 0.2+0.5sin(t)+0.2cos(10t)+0.2sin(4t). The ten published range/count pairs sum to 7 cycles; smallest/largest ranges as printed.
Inputs: the default inputs above.
| Result | Source | This calc |
|---|---|---|
| Published rainflow reference summary [1] | 7 | 7 |
| Published rainflow reference summary [2] | 1.434 | 1.434 |
| Published rainflow reference summary [3] | 0.04259 | 0.04259 |
Published FCR deadband and saturation
Source: Celi Cortés et al., Energy Reports 13 (2025), doi:10.1016/j.egyr.2024.12.057, PDF p.4 Eq.(9): zero inside ±10 mHz, Δf/200 mHz outside the deadband, saturation at ±200 mHz. The sign is charging positive at high frequency; SoC integration therefore uses a positive charge contribution.
Inputs: the default inputs above.
| Result | Source | This calc |
|---|---|---|
| FCR droop reference values [1] | -1 | -1 |
| FCR droop reference values [2] | -0.5 | -0.5 |
| FCR droop reference values [3] | 0 | 0 |
| FCR droop reference values [6] | 0.5 | 0.5 |
| FCR droop reference values [7] | 1 | 1 |
LFP storage at 10% SoC
Source: Independent review benchmark: 21.97% resistance growth at 25 °C, 10% storage SoC and 20 years, from Naumann dissertation (2018), Eq. 5.14 and Table 5.1, original PDF p.92 / printed p.74. Rounded published-law benchmark, not a measured 20-year cell result. The 1.3 resistance threshold must remain unreached.
Inputs: Target state of charge = 0.1; Lower SoC limit = 0; Upper SoC limit = 1; Operating fraction = 0; Capacity end-of-life fraction = 0.5; Resistance end-of-life ratio = 1.3; the others as above.
| Result | Source | This calc |
|---|---|---|
| Resistance ratio at horizon | 1.22 | 1.22 |
| End-of-life threshold reached | 0 | 0 |
LFP cycle resistance at 50% depth
Source: Naumann dissertation (2018), Table 5.3, original PDF p.100 / printed p.82: d_R = 0.91882. For one 50%-depth full cycle at 0.5C, the table coefficients give (-0.0020×0.5+0.0021)×0.91882×0.5/100 = 5.05351e-6 fractional resistance growth. Algebraic coefficient-transfer check, not an independent ageing measurement.
Inputs: the default inputs above.
| Result | Source | This calc |
|---|---|---|
| LFP cycle-resistance coefficient reference [2] | 5.054 × 10⁻⁶ | 5.054 × 10⁻⁶ |
Measured LFP storage, 40 °C and 25% SoC
Source: Independent measured Naumann calendar-ageing dataset V1, DOI:10.17632/kxh42bfgtj.1, ResistanceR_DC10s.xlsx I37/I3 at 21241 h, 40 °C and 25% storage SoC. A 1.5% relative resistance-ratio tolerance allows the empirical fit residual (1.34% here); the engine uses the equivalent absolute tolerance 1.1262120791022565×0.015. The former cubic SoC implementation fails this case.
Inputs: Cell temperature = 40 °C; Target state of charge = 0.25; Lower SoC limit = 0; Upper SoC limit = 1; Operating fraction = 0; Forecast horizon = 2.423 year; the others as above.
| Result | Source | This calc |
|---|---|---|
| Resistance ratio at horizon | 1.126 ± 0.01689 | 1.141 |
Related Resources
Related articles
Related courses
IEC Electrical Schematics and Industrial Control Panels
Basic Electrical Controls & Diagram Reading

Responses