breos.polysun_degradation#
Polysun-style battery degradation model.
Implements the Wöhler curve + Miner’s linear damage accumulation methodology used by Polysun (Vela Solaris) for battery lifetime estimation. This serves as a comparison baseline against BREOS’s Naumann-based continuous degradation.
- Polysun methodology:
Cycle counting: 20 DOD histogram bins (equal width)
Cycle life: Wöhler curve N(DOD) = a * DOD^(-b)
Damage: Miner’s rule D = sum(n_i / N_i)
Calendar life: Fixed (20 years for Li-ion)
Total life: min(calendar_life, 1/D_annual)
No temperature effects, no continuous SOH tracking
References
Polysun User Manual, Section “Battery Lifetime” (Vela Solaris AG)
Weniger et al., “Performance Model for PV-Battery Systems (PerMod)”, HTW Berlin, 2023
Palmgren-Miner linear damage hypothesis (Miner, 1945)
Functions
|
Count cycles per DOD range from an SOC timeseries using peak detection. |
|
Compute cumulative damage using Miner's linear damage rule. |
|
Predict battery lifetime following Polysun methodology. |
|
Run Polysun-style degradation over multiple years. |
|
Cycles to failure from Wöhler curve: N(DOD) = a * DOD^(-b). |
Classes
|
Configuration for Polysun-style degradation model. |
- class breos.polysun_degradation.PolysunDegradationConfig(woehler_a=5000.0, woehler_b=1.6, calendar_life_years=20.0, n_bins=20, min_doc=0.01, deep_cycle_threshold=0.5)[source]#
Bases:
objectConfiguration for Polysun-style degradation model.
- Parameters:
- woehler_a#
Scale parameter for Wöhler curve N(DOD) = a * DOD^(-b). Equals cycles to failure at 100% DOD.
- woehler_b#
Shape parameter for Wöhler curve. Higher b means deeper cycles are disproportionately more damaging.
- calendar_life_years#
Fixed calendar lifetime in years.
- n_bins#
Number of DOD histogram bins (Polysun uses 20).
- min_doc#
Minimum DOD to count as a cycle (fraction, 0-1).
- deep_cycle_threshold#
DOD above which a cycle is classified as “deep”.
- breos.polysun_degradation.compute_dod_histogram(soc_series, n_bins=20, min_doc=0.01)[source]#
Count cycles per DOD range from an SOC timeseries using peak detection.
Uses simple local-extrema-based half-cycle detection to match Polysun’s approach (not rainflow counting). Half-cycles are paired and binned by DOD.
- Parameters:
- Returns:
bin_centers: DOD value at center of each bin (length n_bins). cycle_counts: Number of full cycles in each bin (length n_bins). total_cycles: Total number of cycles detected. deep_cycles: Number of deep cycles (DOD > deep_cycle_threshold).
- Return type:
- breos.polysun_degradation.compute_miner_damage(cycle_counts, bin_centers, woehler_a, woehler_b)[source]#
Compute cumulative damage using Miner’s linear damage rule.
D = sum(n_i / N_i) where n_i is the number of cycles at DOD_i and N_i = a * DOD_i^(-b) is the cycles to failure at that DOD.
- Parameters:
- Return type:
- Returns:
Cumulative damage fraction. D >= 1 means end of cycle life.
- breos.polysun_degradation.predict_polysun_lifetime(annual_damage, calendar_life_years)[source]#
Predict battery lifetime following Polysun methodology.
Total life = min(calendar_life, cycle_life) where cycle_life = 1 / annual_damage.
- breos.polysun_degradation.simulate_polysun_degradation(soc_series, config, n_years=20)[source]#
Run Polysun-style degradation over multiple years.
Polysun assumes constant annual usage (same SOC profile each year) and does not feed degradation back into the energy balance. Damage accumulates linearly; when cumulative damage >= 1, the battery is replaced.
- Parameters:
soc_series (
ndarray) – One year of SOC data (0-1 range). Reused each year.config (
PolysunDegradationConfig) – Polysun degradation configuration.n_years (
int) – Number of years to simulate.
- Returns:
Year, Damage_Annual, Damage_Cumulative, Cycle_Life_Years, Total_Life_Years, Replacement, SOH_Equivalent, Total_Cycles, Deep_Cycles.
- Return type: