HomeCalculatorsElectricalBattery & Energy StorageLinear Battery Aging Calculator
Electrical calculator

Linear Battery Aging Calculator

Estimate battery capacity with a simple linear cycle + calendar aging model: SOH = max(0, 1 − k_cycle·N − k_cal·t), C = C0·SOH. Default coefficients are illustrative. Runs locally in your browser.

Instant result
Result

Enter values to calculate.

Inputs
Mode
Formula
Trust summary CVP VERIFIED · CVP protocol 1.0.0-proposed · Engineering assurance
Input interpretation
Enter values to calculate.
Result
Assurance
Engineering
Declared partition coverage
PASS · 4/4 declared partitions (cycle-calendar, cycle-dominant, zero-aging, invalid-domain) · Matrix
Known limitations
  • Empirical linear model — not chemistry-specific calendar/cycle physics
  • Core CVP does not include live graph, viewport, or pointer interaction.
Model
Linear capacity fade / SOH from independent cycle and calendar terms.
Scope
Independent linear cycle + calendar fade
Verification
Engine tested · Source checked · v1.0.2 · CVP VERIFIED · CVP protocol 1.0.0-proposed · Engineering assurance· View Manifest · CVP overview · Specification
Versions
Calculation 1.0.2 · CVP protocol 1.0.0-proposed
CVP identity
5/5 property · digest a53cfab6ba6b
Legacy regression
14/14 tests · Production surface contract 4/4
Reference
O1 model · O2 expected_values · O2 numerical_behavior
Interfaces
PASS · UI (SSR) / REST / MCP — ui-ssr is query-result HTML, not a live browser session.
Supplemental domain review
Internal · Pass · electrical-engineer
Named expert review
Not performed
CVP suite
3/3 golden · 6/6 CVP boundary · 5/5 invalid · 5/5 property · 1/1 cross-interface · 1/1 CVP contract · Manifest
Implementation conventions
  • Linear approximation, not a digital twin — CalculatorX uses a deliberately simplified independent linear cycle + calendar model. It is not the NREL BLAST/life model, not an Arrhenius / √t calendar fit, and not chemistry-specific.
  • Illustrative default coefficients — If k_cycle or k_cal is omitted, the engine uses 0.0002 /cycle and 0.02 /year. Explicitly supplied coefficients keep user-specified provenance even when the numeric values match those defaults.
  • Cycle count / EFC semantics — N_cycles is a dimensionless cycle count matching the calibration of k_cycle — the engine does not assert that a caller’s N is EFC. Prefer EFC from discharged-Ah throughput ÷ C_nom when applicable. If charge+discharge throughput is accumulated, use EFC = (Ah_charge + Ah_discharge)/(2·C_nom) consistently — do not mix conventions.
  • Schema pin follows calculation_version — Published input/output schema pins are keyed by calculation_version. Contract-only tightenings (normalized inputs, required result fields, required input_provenance) bump the patch version even when the fade formulas are unchanged, so latest alias and /{version}/ pins stay body-identical except $id. A future api_contract_version pin may decouple this further.
  • Capacity clamp and fade_frac — SOH = max(0, 1 − k_cycle·N − k_cal·t). fade_frac is the unclamped linear exposure k_cycle·N + k_cal·t and may exceed 1; remaining capacity and SOH are clamped at 0. Actual capacity loss fraction is 1 − SOH. fade_frac is a required formal output.
Evidence
3 legacy golden · 6 legacy boundary · legacy regression suite · 3/3 oracle-backed golden · 5/5 invalid · Artifact integrity PASS · CalculatorX electrical review
This calculator CURRENT · Public schema 1.0.2 matches · Semantic contract ✓ · Production attested · Public/cache ✓ · Origin ✓
Semantic contract
PASS
Full verification

Manifest identity, reference classes, interfaces, suite, and production records.

Formulas

Core equations used by this calculator.

State of healthSOH = max(0, 1 − k_cycle·N − k_cal·t)
Remaining capacityC = C0·SOH
iEngineering estimate — independent linear cycle + calendar fade, not a cell-chemistry digital twin. Default k_cycle = 0.0002 /cycle and k_cal = 0.02 /year are illustrative. Prefer manufacturer cycle-life and calendar-life data when available.

How to use

1

Enter initial capacity

C0 in Ah is the beginning-of-life capacity.

2

Enter cycle count and calendar years

N should match the cycle definition used to calibrate k_cycle. Prefer EFC from discharged-Ah ÷ C_nom (or the consistent 2× convention if charge+discharge throughput is summed). Both fade terms are applied independently.

3

Review fade coefficients

k_cycle and k_cal scale capacity loss. Defaults are illustrative. Remaining capacity is clamped: C ≥ 0.

Example calculations

Common configurations with formula and result.

ϟ

3 Ah · 500 cycles · 1 y

illustrative defaults k_cycle=0.0002/cycle, k_cal=0.02/year

SOH=max(0, 1−0.1−0.02)=0.88
C=2.64 Ah
ϟ

Zero aging

N=0, t=0

SOH=max(0, 1−0−0)=1
C=C0
ϟ

Fade clamp

3 Ah · 10000 cycles · defaults

SOH=max(0, 1−2)=0
C=0 Ah

Linear Battery Aging calculator specification

Version 1.0.2 · Engine tested · Supplemental domain review · Internal · 2026-09-05

Calculation status

Review policy · Evidence · Reviewed by CalculatorX electrical review (electrical-engineer)

Definition
Linear fade model: SOH = max(0, 1 − k_cycle·N − k_cal·t), C = C0·SOH. Defaults k_cycle=0.0002/cycle and k_cal=0.02/year are illustrative — not a chemistry digital twin.
What it calculates
Linear capacity fade / SOH from independent cycle and calendar terms.
Inputs
  • C0_Ah
  • N_cycles
  • years
  • k_cycle
  • k_cal
Outputs
  • capacity_Ah
  • SOH
  • fade_frac
Formula
SOH=max(0, 1−k_cycle·N−k_cal·t); C=C0·SOH
Assumptions
  • Independent linear cycle + calendar fade
  • Default k_cycle=0.0002/cycle and k_cal=0.02/year are illustrative
  • N should match the cycle definition used to calibrate k_cycle; EFC recommended
  • Not temperature, SOC, DoD, C-rate, or chemistry aware
Units
  • Ah, cycles, years
Boundary conditions
  • C0≤0 → VALUE_MUST_BE_POSITIVE
  • N, years, k_cycle, k_cal < 0 → VALUE_MUST_BE_NON_NEGATIVE
  • Unclamped fade > 1 → SOH=0 and C=0
Example
3Ah · 500 cycles · 1y · k_cycle=0.0002 · k_cal=0.02 → 2.64Ah, SOH=88%
Validation cases

9 published on this page · 14/14 tests · Production surface contract 4/4 · View evidence

  • C0=3 N=500 years=1 (defaults) → C=2.64, SOH=0.88
  • C0=3 N=0 years=0 → C=3, SOH=1
  • C0=3 N=500 years=1 k_cycle=0.0001 k_cal=0.01 → C=2.82, SOH=0.94
  • C0=3 N=10000 years=0 → C=0, SOH=0
  • C0=0 → error VALUE_MUST_BE_POSITIVE
  • N_cycles=-1 → error VALUE_MUST_BE_NON_NEGATIVE
  • years=-1 → error VALUE_MUST_BE_NON_NEGATIVE
  • k_cycle=-0.001 → error VALUE_MUST_BE_NON_NEGATIVE
  • k_cal=-0.01 → error VALUE_MUST_BE_NON_NEGATIVE
Sources
Implementation conventions
  • Linear approximation, not a digital twin — CalculatorX uses a deliberately simplified independent linear cycle + calendar model. It is not the NREL BLAST/life model, not an Arrhenius / √t calendar fit, and not chemistry-specific.
  • Illustrative default coefficients — If k_cycle or k_cal is omitted, the engine uses 0.0002 /cycle and 0.02 /year. Explicitly supplied coefficients keep user-specified provenance even when the numeric values match those defaults.
  • Cycle count / EFC semantics — N_cycles is a dimensionless cycle count matching the calibration of k_cycle — the engine does not assert that a caller’s N is EFC. Prefer EFC from discharged-Ah throughput ÷ C_nom when applicable. If charge+discharge throughput is accumulated, use EFC = (Ah_charge + Ah_discharge)/(2·C_nom) consistently — do not mix conventions.
  • Schema pin follows calculation_version — Published input/output schema pins are keyed by calculation_version. Contract-only tightenings (normalized inputs, required result fields, required input_provenance) bump the patch version even when the fade formulas are unchanged, so latest alias and /{version}/ pins stay body-identical except $id. A future api_contract_version pin may decouple this further.
  • Capacity clamp and fade_frac — SOH = max(0, 1 − k_cycle·N − k_cal·t). fade_frac is the unclamped linear exposure k_cycle·N + k_cal·t and may exceed 1; remaining capacity and SOH are clamped at 0. Actual capacity loss fraction is 1 − SOH. fade_frac is a required formal output.
Last reviewed
2026-09-05
Reviewed by
CalculatorX electrical review (electrical-engineer)
Calculation version
1.0.2

Background

Interpretation and common distinctions.

Estimate battery capacity fade with a simple linear cycle + calendar model.

Default coefficients k_cycle = 0.0002 /cycle and k_cal = 0.02 /year are illustrative. This is an engineering estimate — not a cell-chemistry digital twin.

Supported and not supported

Supported — Independent linear SOH fade · custom k_cycle / k_cal · API electrical.battery.aging

Not supported — Temperature, SOC, DoD, C-rate, chemistry, Arrhenius fits, √t calendar aging, SEI growth PDE, knee detection

CalculatorX uses a deliberately simplified linear approximation, not the complete models described by the NREL and calendar-ageing references.

Agent / API notes

Capability id: electrical.battery.aging · tool id: battery-aging · pin 1.0.2.

}

Frequently asked questions

Key distinctions behind the calculation.

Are the default k values accurate?

No. k_cycle = 0.0002 /cycle (0.02%/cycle) and k_cal = 0.02 /year (2%/year) are illustrative planning defaults. Prefer manufacturer cycle-life and calendar-life data when available. Omitting k_cycle/k_cal in the API or share URL uses these fallbacks; providing them explicitly is recorded even when the values match the defaults.

What does Cycles / EFC mean?

N_cycles is a cycle count that must match the calibration of k_cycle — CalculatorX does not re-interpret an arbitrary manufacturer cycle as EFC. Equivalent full cycles are recommended when applicable. Prefer full-discharge capacity throughput: EFC = Ah_discharged / C_nom. If charge and discharge Ah are both accumulated, use the consistent 2× convention: EFC = (Ah_charge + Ah_discharge) / (2 · C_nom). The throughput convention must stay consistent with how k_cycle was calibrated. 500 cycles at 100% DoD is not the same aging exposure as 500 cycles at 10% DoD.

Is this a full battery aging model?

No. This is a deliberately simplified linear approximation. Real lithium-ion aging usually depends on temperature, SOC, DoD, C-rate, chemistry, and often uses calendar terms closer to √t rather than linear time. CalculatorX does not implement Arrhenius fits, SEI growth PDEs, or knee detection.

Why does remaining capacity stop at 0?

The engine uses SOH = max(0, 1 − k_cycle·N − k_cal·t). If the unclamped linear fade exceeds 100%, remaining capacity and SOH are clamped to 0 rather than going negative. fade_frac reports that unclamped exposure and may exceed 1.

What is fade_frac?

fade_frac is the unclamped linear aging exposure k_cycle·N + k_cal·t. It may exceed 1. Actual capacity loss fraction is 1 − SOH (always in [0, 1]).