← All Use Cases
📡
Central Composite Design

Battery Management Charging

Central Composite design to optimize charge current, CV threshold, and trickle cutoff for charge time and cycle life

Summary

This experiment investigates battery management charging. Central Composite design to optimize charge current, CV threshold, and trickle cutoff for charge time and cycle life.

The design varies 3 factors: charge current ma (mA), ranging from 500 to 3000, cv threshold mv (mV), ranging from 3400 to 3650, and trickle cutoff mv (mV), ranging from 2800 to 3000. The goal is to optimize 2 responses: charge time min (min) (minimize) and cycle life count (cycles) (maximize). Fixed conditions held constant across all runs include chemistry = lifepo4, cell count = 4s.

A Central Composite Design (CCD) was selected to fit a full quadratic response surface model, including curvature and interaction effects. With 3 factors this produces 22 runs including center points and axial (star) points that extend beyond the factorial range.

Quadratic response surface models were fitted to capture potential curvature and factor interactions. The RSM contour plots below visualize how pairs of factors jointly affect each response.

Key Findings

For charge time min, the most influential factors were cv threshold mv (45.9%), trickle cutoff mv (33.3%), charge current ma (20.8%). The best observed value was 52.0 (at charge current ma = 1750, cv threshold mv = 3525, trickle cutoff mv = 3082.57).

For cycle life count, the most influential factors were cv threshold mv (47.7%), trickle cutoff mv (32.2%), charge current ma (20.1%). The best observed value was 3325.0 (at charge current ma = 500, cv threshold mv = 3400, trickle cutoff mv = 3000).

Recommended Next Steps

Experimental Setup

Factors

FactorLowHighUnit
charge_current_ma5003000mA
cv_threshold_mv34003650mV
trickle_cutoff_mv28003000mV

Fixed: chemistry = lifepo4, cell_count = 4s

Responses

ResponseDirectionUnit
charge_time_min↓ minimizemin
cycle_life_count↑ maximizecycles

Configuration

use_cases/76_battery_management_charging/config.json
{ "metadata": { "name": "Battery Management Charging", "description": "Central Composite design to optimize charge current, CV threshold, and trickle cutoff for charge time and cycle life" }, "factors": [ { "name": "charge_current_ma", "levels": [ "500", "3000" ], "type": "continuous", "unit": "mA" }, { "name": "cv_threshold_mv", "levels": [ "3400", "3650" ], "type": "continuous", "unit": "mV" }, { "name": "trickle_cutoff_mv", "levels": [ "2800", "3000" ], "type": "continuous", "unit": "mV" } ], "fixed_factors": { "chemistry": "lifepo4", "cell_count": "4s" }, "responses": [ { "name": "charge_time_min", "optimize": "minimize", "unit": "min" }, { "name": "cycle_life_count", "optimize": "maximize", "unit": "cycles" } ], "settings": { "operation": "central_composite", "test_script": "use_cases/76_battery_management_charging/sim.sh" } }

Experimental Matrix

The Central Composite Design produces 22 runs. Each row is one experiment with specific factor settings.

Runcharge_current_macv_threshold_mvtrickle_cutoff_mv
1175035252900
2300034003000
350036502800
417503753.222900
5175035252900
6-532.17735252900
7175035252717.43
8175035252900
9300036502800
104032.1835252900
11175035252900
1217503296.782900
13175035252900
1450034003000
15175035252900
16300034002800
17175035253082.57
18300036503000
19175035252900
2050034002800
2150036503000
22175035252900

Step-by-Step Workflow

1

Preview the design

Terminal
$ doe info --config use_cases/76_battery_management_charging/config.json
2

Generate the runner script

Terminal
$ doe generate --config use_cases/76_battery_management_charging/config.json \ --output use_cases/76_battery_management_charging/results/run.sh --seed 42
3

Execute the experiments

Terminal
$ bash use_cases/76_battery_management_charging/results/run.sh
4

Analyze results

Terminal
$ doe analyze --config use_cases/76_battery_management_charging/config.json
5

Get optimization recommendations

Terminal
$ doe optimize --config use_cases/76_battery_management_charging/config.json
6

Multi-objective optimization

With 2 competing responses, use --multi to find the best compromise via Derringer–Suich desirability.

Terminal
$ doe optimize --config use_cases/76_battery_management_charging/config.json --multi
7

Generate the HTML report

Terminal
$ doe report --config use_cases/76_battery_management_charging/config.json \ --output use_cases/76_battery_management_charging/results/report.html

Features Exercised

FeatureValue
Design typecentral_composite
Factor typescontinuous (all 3)
Arg styledouble-dash
Responses2 (charge_time_min ↓, cycle_life_count ↑)
Total runs22

Analysis Results

Generated from actual experiment runs using the DOE Helper Tool.

Response: charge_time_min

Top factors: cv_threshold_mv (45.9%), trickle_cutoff_mv (33.3%), charge_current_ma (20.8%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
charge_current_ma43402.2727850.56820.8070.5507
cv_threshold_mv45396.60611349.15151.2800.3467
trickle_cutoff_mv43390.6061847.65150.8040.5522
LackofFit20.00000.0000
PureError77375.8750
Error94449.78791053.6964
Total2116639.2727792.3463

Pareto Chart

Pareto chart for charge_time_min

Main Effects Plot

Main effects plot for charge_time_min

Normal Probability Plot of Effects

Normal probability plot for charge_time_min

Half-Normal Plot of Effects

Half-normal plot for charge_time_min

Model Diagnostics

Model diagnostics for charge_time_min

Response: cycle_life_count

Top factors: cv_threshold_mv (47.7%), trickle_cutoff_mv (32.2%), charge_current_ma (20.1%).

ANOVA

SourceDFSSMSFp-value
SourceDFSSMSFp-value
charge_current_ma4510833.2045127708.30110.3880.8125
cv_threshold_mv4741846.2879185461.57200.5630.6958
trickle_cutoff_mv4659639.0379164909.75950.5010.7366
LackofFit2578038.9242289019.4621
PureError72306312.0000
Error92884350.9242329473.1429
Total214796669.4545228412.8312

Pareto Chart

Pareto chart for cycle_life_count

Main Effects Plot

Main effects plot for cycle_life_count

Normal Probability Plot of Effects

Normal probability plot for cycle_life_count

Half-Normal Plot of Effects

Half-normal plot for cycle_life_count

Model Diagnostics

Model diagnostics for cycle_life_count

Response Surface Plots

3D surfaces fitted with quadratic RSM. Red dots are observed data points.

charge time min charge current ma vs cv threshold mv

RSM surface: charge time min charge current ma vs cv threshold mv

charge time min charge current ma vs trickle cutoff mv

RSM surface: charge time min charge current ma vs trickle cutoff mv

charge time min cv threshold mv vs trickle cutoff mv

RSM surface: charge time min cv threshold mv vs trickle cutoff mv

cycle life count charge current ma vs cv threshold mv

RSM surface: cycle life count charge current ma vs cv threshold mv

cycle life count charge current ma vs trickle cutoff mv

RSM surface: cycle life count charge current ma vs trickle cutoff mv

cycle life count cv threshold mv vs trickle cutoff mv

RSM surface: cycle life count cv threshold mv vs trickle cutoff mv

Multi-Objective Optimization

When responses compete, Derringer–Suich desirability finds the best compromise. Each response is scaled to a 0–1 desirability, then combined via a weighted geometric mean.

Overall Desirability
D = 0.7498

Per-Response Desirability

ResponseWeightDesirabilityPredictedDir
charge_time_min 1.0
0.7424
80.00 0.7424 80.00 min
cycle_life_count 1.5
0.7548
2903.00 0.7548 2903.00 cycles

Recommended Settings

FactorValue
charge_current_ma1750 mA
cv_threshold_mv3525 mV
trickle_cutoff_mv2900 mV

Source: from observed run #12

Trade-off Summary

Sacrifice = how much worse than single-objective best.

ResponsePredictedBest ObservedSacrifice
cycle_life_count2903.003325.00+422.00

Top 3 Runs by Desirability

RunDFactor Settings
#20.6142charge_current_ma=1750, cv_threshold_mv=3525, trickle_cutoff_mv=2900
#200.6028charge_current_ma=500, cv_threshold_mv=3650, trickle_cutoff_mv=3000

Model Quality

ResponseType
cycle_life_count0.4698quadratic

Full Multi-Objective Output

doe optimize --multi
============================================================ MULTI-OBJECTIVE OPTIMIZATION Method: Derringer-Suich Desirability Function ============================================================ Overall desirability: D = 0.7498 Response Weight Desirability Predicted Direction --------------------------------------------------------------------- charge_time_min 1.0 0.7424 80.00 min ↓ cycle_life_count 1.5 0.7548 2903.00 cycles ↑ Recommended settings: charge_current_ma = 1750 mA cv_threshold_mv = 3525 mV trickle_cutoff_mv = 2900 mV (from observed run #12) Trade-off summary: charge_time_min: 80.00 (best observed: 52.00, sacrifice: +28.00) cycle_life_count: 2903.00 (best observed: 3325.00, sacrifice: +422.00) Model quality: charge_time_min: R² = 0.0607 (linear) cycle_life_count: R² = 0.4698 (quadratic) Top 3 observed runs by overall desirability: 1. Run #12 (D=0.7498): charge_current_ma=1750, cv_threshold_mv=3525, trickle_cutoff_mv=2900 2. Run #2 (D=0.6142): charge_current_ma=1750, cv_threshold_mv=3525, trickle_cutoff_mv=2900 3. Run #20 (D=0.6028): charge_current_ma=500, cv_threshold_mv=3650, trickle_cutoff_mv=3000

Full Analysis Output

doe analyze
=== Main Effects: charge_time_min === Factor Effect Std Error % Contribution -------------------------------------------------------------- cv_threshold_mv 74.0000 6.0013 45.9% trickle_cutoff_mv 53.7500 6.0013 33.3% charge_current_ma 33.5000 6.0013 20.8% === ANOVA Table: charge_time_min === Source DF SS MS F p-value ----------------------------------------------------------------------------- charge_current_ma 4 3402.2727 850.5682 0.807 0.5507 cv_threshold_mv 4 5396.6061 1349.1515 1.280 0.3467 trickle_cutoff_mv 4 3390.6061 847.6515 0.804 0.5522 Lack of Fit 2 0.0000 0.0000 0.000 1.0000 Pure Error 7 7375.8750 1053.6964 Error 9 4449.7879 1053.6964 Total 21 16639.2727 792.3463 === Summary Statistics: charge_time_min === charge_current_ma: Level N Mean Std Min Max ------------------------------------------------------------ -532.177 1 93.0000 0.0000 93.0000 93.0000 1750 12 106.2500 33.0072 52.0000 172.0000 3000 4 96.0000 16.7133 86.0000 121.0000 4032.18 1 95.0000 0.0000 95.0000 95.0000 500 4 72.7500 11.7580 63.0000 88.0000 cv_threshold_mv: Level N Mean Std Min Max ------------------------------------------------------------ 3296.78 1 126.0000 0.0000 126.0000 126.0000 3400 4 82.2500 12.1758 64.0000 89.0000 3525 12 107.0833 28.5162 80.0000 172.0000 3650 4 86.5000 24.8529 63.0000 121.0000 3753.22 1 52.0000 0.0000 52.0000 52.0000 trickle_cutoff_mv: Level N Mean Std Min Max ------------------------------------------------------------ 2717.43 1 135.0000 0.0000 135.0000 135.0000 2800 4 87.5000 24.5561 64.0000 121.0000 2900 12 103.4167 31.6126 52.0000 172.0000 3000 4 81.2500 12.2031 63.0000 88.0000 3082.57 1 87.0000 0.0000 87.0000 87.0000 === Main Effects: cycle_life_count === Factor Effect Std Error % Contribution -------------------------------------------------------------- cv_threshold_mv 909.2500 101.8941 47.7% trickle_cutoff_mv 613.0000 101.8941 32.2% charge_current_ma 383.2500 101.8941 20.1% === ANOVA Table: cycle_life_count === Source DF SS MS F p-value ----------------------------------------------------------------------------- charge_current_ma 4 510833.2045 127708.3011 0.388 0.8125 cv_threshold_mv 4 741846.2879 185461.5720 0.563 0.6958 trickle_cutoff_mv 4 659639.0379 164909.7595 0.501 0.7366 Lack of Fit 2 578038.9242 289019.4621 0.877 0.4571 Pure Error 7 2306312.0000 329473.1429 Error 9 2884350.9242 329473.1429 Total 21 4796669.4545 228412.8312 === Summary Statistics: cycle_life_count === charge_current_ma: Level N Mean Std Min Max ------------------------------------------------------------ -532.177 1 2067.0000 0.0000 2067.0000 2067.0000 1750 12 2286.2500 532.8063 1677.0000 3325.0000 3000 4 2169.0000 486.7902 1916.0000 2899.0000 4032.18 1 1940.0000 0.0000 1940.0000 1940.0000 500 4 1903.0000 388.2585 1404.0000 2342.0000 cv_threshold_mv: Level N Mean Std Min Max ------------------------------------------------------------ 3296.78 1 2937.0000 0.0000 2937.0000 2937.0000 3400 4 2044.2500 202.1458 1916.0000 2342.0000 3525 12 2196.8333 500.0661 1677.0000 3325.0000 3650 4 2027.7500 627.5632 1404.0000 2899.0000 3753.22 1 2143.0000 0.0000 2143.0000 2143.0000 trickle_cutoff_mv: Level N Mean Std Min Max ------------------------------------------------------------ 2717.43 1 2290.0000 0.0000 2290.0000 2290.0000 2800 4 2140.2500 634.7589 1404.0000 2899.0000 2900 12 2289.5833 515.1641 1685.0000 3325.0000 3000 4 1931.7500 54.5856 1867.0000 1999.0000 3082.57 1 1677.0000 0.0000 1677.0000 1677.0000

Optimization Recommendations

doe optimize
=== Optimization: charge_time_min === Direction: minimize Best observed run: #16 charge_current_ma = 1750 cv_threshold_mv = 3525 trickle_cutoff_mv = 3082.57 Value: 52.0 RSM Model (linear, R² = 0.2139, Adj R² = 0.0828): Coefficients: intercept +97.1818 charge_current_ma -3.7149 cv_threshold_mv -14.8893 trickle_cutoff_mv +2.6716 RSM Model (quadratic, R² = 0.4743, Adj R² = 0.0799): Coefficients: intercept +102.1686 charge_current_ma -3.7149 cv_threshold_mv -14.8893 trickle_cutoff_mv +2.6716 charge_current_ma*cv_threshold_mv +8.8750 charge_current_ma*trickle_cutoff_mv -3.6250 cv_threshold_mv*trickle_cutoff_mv -12.3750 charge_current_ma^2 -4.9933 cv_threshold_mv^2 +5.2065 trickle_cutoff_mv^2 -7.6935 Curvature analysis: trickle_cutoff_mv coef=-7.6935 concave (has a maximum) cv_threshold_mv coef=+5.2065 convex (has a minimum) charge_current_ma coef=-4.9933 concave (has a maximum) Notable interactions: cv_threshold_mv*trickle_cutoff_mv coef=-12.3750 (antagonistic) charge_current_ma*cv_threshold_mv coef=+8.8750 (synergistic) charge_current_ma*trickle_cutoff_mv coef=-3.6250 (antagonistic) Predicted optimum (from linear model, at observed points): charge_current_ma = 1750 cv_threshold_mv = 3296.78 trickle_cutoff_mv = 2900 Predicted value: 124.3662 Surface optimum (via L-BFGS-B, linear model): charge_current_ma = 3000 cv_threshold_mv = 3650 trickle_cutoff_mv = 2800 Predicted value: 75.9059 Model quality: Weak fit — consider adding center points or using a different design. Factor importance: 1. trickle_cutoff_mv (effect: 63.5, contribution: 40.6%) 2. charge_current_ma (effect: 53.5, contribution: 34.2%) 3. cv_threshold_mv (effect: 39.5, contribution: 25.2%) === Optimization: cycle_life_count === Direction: maximize Best observed run: #6 charge_current_ma = 500 cv_threshold_mv = 3400 trickle_cutoff_mv = 3000 Value: 3325.0 RSM Model (linear, R² = 0.4709, Adj R² = 0.3828): Coefficients: intercept +2169.5454 charge_current_ma +53.0346 cv_threshold_mv -199.9617 trickle_cutoff_mv +333.4973 RSM Model (quadratic, R² = 0.6905, Adj R² = 0.4583): Coefficients: intercept +2141.0446 charge_current_ma +53.0346 cv_threshold_mv -199.9617 trickle_cutoff_mv +333.4973 charge_current_ma*cv_threshold_mv +150.0000 charge_current_ma*trickle_cutoff_mv +22.7500 cv_threshold_mv*trickle_cutoff_mv -206.7500 charge_current_ma^2 -37.0491 cv_threshold_mv^2 +138.1472 trickle_cutoff_mv^2 -58.3493 Curvature analysis: cv_threshold_mv coef=+138.1472 convex (has a minimum) trickle_cutoff_mv coef=-58.3493 concave (has a maximum) charge_current_ma coef=-37.0491 concave (has a maximum) Notable interactions: cv_threshold_mv*trickle_cutoff_mv coef=-206.7500 (antagonistic) charge_current_ma*cv_threshold_mv coef=+150.0000 (synergistic) charge_current_ma*trickle_cutoff_mv coef=+22.7500 (synergistic) Predicted optimum (from quadratic model, at observed points): charge_current_ma = 500 cv_threshold_mv = 3400 trickle_cutoff_mv = 3000 Predicted value: 2998.2178 Surface optimum (via L-BFGS-B, quadratic model): charge_current_ma = 500 cv_threshold_mv = 3400 trickle_cutoff_mv = 3000 Predicted value: 2998.2178 Model quality: Moderate fit — use predictions directionally, not precisely. Factor importance: 1. trickle_cutoff_mv (effect: 1366.8, contribution: 45.6%) 2. cv_threshold_mv (effect: 1017.0, contribution: 33.9%) 3. charge_current_ma (effect: 613.5, contribution: 20.5%)
← Previous: Firmware OTA Strategy Next: CI/CD Pipeline Parallelism →