Note
This notebook is already available in your BattMo installation. In Matlab, run
open runFittingTime
ECM fitting from time dependent measurements
We use the class FittigTime to fit the parameters of a Thevenin model to given time dependent data. The data consists of current and voltage measurement as function of time. Here, we generate synthetically this data using a P2D model
Setup current input
[1]:
clear jsonstruct_control
jsonstruct_control.controlPolicy = "timeControl";
vals = [ 0 2.5;
799 2.5;
800 -1.5;
1599 -1.5;
1600 0;
2799 0;
2800 3.5;
4000 3.5];
clear jsonstruct;
jsonstruct.argumentList = {"time"};
jsonstruct.functionFormat = "tabulated";
jsonstruct.dataX = vals(:, 1);
jsonstruct.dataY = vals(:, 2);
jsonstruct_control.value = jsonstruct;
clear jsonstruct;
jsonstruct.argumentList = {"time"};
jsonstruct.functionFormat = "constant";
jsonstruct.value = 1;
jsonstruct_control.type = jsonstruct;
jsonstruct_material = parseBattmoJson(fullfile('ParameterData','ParameterSets','Chen2020','chen2020_lithium_ion_battery.json'));
jsonstruct_geometry = parseBattmoJson(fullfile('Examples', 'JsonDataFiles', 'geometryChen.json'));
jsonstruct = mergeStructs({jsonstruct_material, jsonstruct_geometry});
jsonstruct.Control = jsonstruct_control;
jsonstruct.TimeStepping = struct('totalTime', vals(end, 1), ...
"numberOfTimeSteps", 200);
output = runBattery(jsonstruct);
[2]:
figure
tiledlayout(1, 2);
nexttile
plot(output.time, output.E)
title('Voltage')
xlabel('time / s')
ylabel('E / V');
nexttile
plot(output.time, output.I)
title('Current')
xlabel('time / s')
ylabel('I / V');
[2]:
[3]:
params0 = [5e-2; 1e-1; 6e5; 3e-3; 1e5];
clear inputs
inputs.jsonstruct = jsonstruct;
inputs.output = output;
clear options
options.useP2Dmodel = true;
options.useSimulationOutput = true;
options.scaleFactor = 1e2;
ftime = FittingTime(params0, inputs, options);
[~, ~, best_params, fitting_error] = ftime.optimizationBFGS();
[3]:
It: 0 | val: 5.444e-02 | ls-its: NaN | pgrad: 3.441e+01
It: 1 | val: 4.409e-02 | ls-its: 2 | pgrad: 3.438e+01
It: 2 | val: 4.321e-02 | ls-its: 3 | pgrad: 5.316e-01
It: 3 | val: 4.077e-02 | ls-its: 2 | pgrad: 5.164e-01
It: 4 | val: 4.000e-02 | ls-its: 1 | pgrad: 1.743e+00
It: 5 | val: 3.725e-02 | ls-its: 3 | pgrad: 2.211e+00
It: 6 | val: 2.946e-02 | ls-its: 1 | pgrad: 4.489e+00
It: 7 | val: 2.899e-02 | ls-its: 3 | pgrad: 4.345e+00
It: 8 | val: 2.711e-02 | ls-its: 3 | pgrad: 3.006e+00
It: 9 | val: 2.473e-02 | ls-its: 2 | pgrad: 3.970e+00
It: 10 | val: 2.401e-02 | ls-its: 1 | pgrad: 8.537e+00
It: 11 | val: 2.395e-02 | ls-its: 3 | pgrad: 2.452e+00
It: 12 | val: 2.378e-02 | ls-its: 1 | pgrad: 2.715e+00
It: 13 | val: 2.377e-02 | ls-its: 1 | pgrad: 1.080e+00
It: 14 | val: 2.377e-02 | ls-its: 1 | pgrad: 1.762e-01
It: 15 | val: 2.377e-02 | ls-its: 1 | pgrad: 4.753e-02
It: 16 | val: 2.377e-02 | ls-its: 1 | pgrad: 8.855e-02
It: 17 | val: 2.377e-02 | ls-its: 1 | pgrad: 1.017e-01
It: 18 | val: 2.376e-02 | ls-its: 1 | pgrad: 4.234e-01
It: 19 | val: 2.375e-02 | ls-its: 1 | pgrad: 4.026e-01
It: 20 | val: 2.372e-02 | ls-its: 1 | pgrad: 4.648e-01
It: 21 | val: 2.363e-02 | ls-its: 1 | pgrad: 9.106e-01
It: 22 | val: 2.354e-02 | ls-its: 1 | pgrad: 7.890e-01
It: 23 | val: 2.330e-02 | ls-its: 1 | pgrad: 5.166e+00
It: 24 | val: 2.298e-02 | ls-its: 1 | pgrad: 2.623e+00
It: 25 | val: 2.274e-02 | ls-its: 1 | pgrad: 3.239e+00
It: 26 | val: 2.266e-02 | ls-its: 1 | pgrad: 3.291e+00
It: 27 | val: 2.256e-02 | ls-its: 1 | pgrad: 4.542e+00
It: 28 | val: 2.253e-02 | ls-its: 1 | pgrad: 1.151e+00
It: 29 | val: 2.252e-02 | ls-its: 1 | pgrad: 3.996e-01
It: 30 | val: 2.249e-02 | ls-its: 1 | pgrad: 5.911e-01
It: 31 | val: 2.243e-02 | ls-its: 1 | pgrad: 8.721e-01
It: 32 | val: 2.235e-02 | ls-its: 1 | pgrad: 1.202e+00
It: 33 | val: 2.234e-02 | ls-its: 2 | pgrad: 1.201e+00
Line search at max step size, Wolfe conditions not satisfied for this step.
Hessian not updated during iteration 34.
It: 34 | val: 2.227e-02 | ls-its: 1 | pgrad: 1.032e+00
It: 35 | val: 2.227e-02 | ls-its: 1 | pgrad: 2.169e-01
It: 36 | val: 2.227e-02 | ls-its: 1 | pgrad: 2.777e-02
It: 37 | val: 2.226e-02 | ls-its: 1 | pgrad: 2.128e-01
It: 38 | val: 2.226e-02 | ls-its: 1 | pgrad: 2.131e-01
It: 39 | val: 2.226e-02 | ls-its: 1 | pgrad: 9.935e-02
It: 40 | val: 2.226e-02 | ls-its: 1 | pgrad: 1.607e-02
It: 41 | val: 2.226e-02 | ls-its: 1 | pgrad: 2.230e-02
It: 42 | val: 2.226e-02 | ls-its: 1 | pgrad: 3.652e-02
It: 43 | val: 2.226e-02 | ls-its: 1 | pgrad: 7.946e-02
It: 44 | val: 2.226e-02 | ls-its: 1 | pgrad: 1.265e-01
It: 45 | val: 2.226e-02 | ls-its: 1 | pgrad: 2.132e-01
It: 46 | val: 2.226e-02 | ls-its: 1 | pgrad: 3.375e-01
It: 47 | val: 2.226e-02 | ls-its: 1 | pgrad: 4.898e-01
It: 48 | val: 2.226e-02 | ls-its: 2 | pgrad: 5.681e-01
It: 49 | val: 2.225e-02 | ls-its: 1 | pgrad: 4.250e-01
It: 50 | val: 2.225e-02 | ls-its: 1 | pgrad: 3.291e-01
It: 51 | val: 2.225e-02 | ls-its: 1 | pgrad: 9.897e-02
It: 52 | val: 2.225e-02 | ls-its: 1 | pgrad: 8.533e-02
It: 53 | val: 2.225e-02 | ls-its: 1 | pgrad: 1.314e-01
It: 54 | val: 2.225e-02 | ls-its: 1 | pgrad: 2.925e-01
It: 55 | val: 2.224e-02 | ls-its: 1 | pgrad: 5.547e-01
It: 56 | val: 2.224e-02 | ls-its: 2 | pgrad: 8.437e-01
It: 57 | val: 2.222e-02 | ls-its: 1 | pgrad: 1.304e+00
It: 58 | val: 2.219e-02 | ls-its: 1 | pgrad: 1.254e+00
It: 59 | val: 2.218e-02 | ls-its: 1 | pgrad: 5.773e-01
It: 60 | val: 2.217e-02 | ls-its: 1 | pgrad: 1.339e-01
It: 61 | val: 2.217e-02 | ls-its: 1 | pgrad: 1.506e-01
It: 62 | val: 2.217e-02 | ls-its: 2 | pgrad: 1.862e-01
It: 63 | val: 2.217e-02 | ls-its: 1 | pgrad: 3.347e-01
It: 64 | val: 2.217e-02 | ls-its: 3 | pgrad: 3.534e-01
It: 65 | val: 2.215e-02 | ls-its: 1 | pgrad: 5.748e-01
It: 66 | val: 2.212e-02 | ls-its: 1 | pgrad: 4.700e-01
It: 67 | val: 2.212e-02 | ls-its: 1 | pgrad: 1.581e-01
It: 68 | val: 2.212e-02 | ls-its: 2 | pgrad: 8.788e-02
It: 69 | val: 2.212e-02 | ls-its: 1 | pgrad: 6.105e-02
It: 70 | val: 2.212e-02 | ls-its: 2 | pgrad: 6.210e-03
It: 71 | val: 2.212e-02 | ls-its: 1 | pgrad: 4.357e-04
It: 72 | val: 2.212e-02 | ls-its: 1 | pgrad: 1.015e-05
Stopped because reached objChangeTol = 1.000000e-15.
[4]:
p = best_params;
Printing results
[5]:
ftime.plotresults_thevenin(best_params, fitting_error);
[5]:
[6]:
ftime.printResults(best_params, fitting_error);
[6]:
=======================================
FITTING RESULTS (TIME DOMAIN)
=======================================
Total Error (SSR) : 2.2117e-02 V²
R0 : 3.6032e-02 Ohms
R1 : 1.0000e-03 Ohms
C1 : 6.0000e+07 Farads
R2 : 1.5640e-02 Ohms
C2 : 4.6831e+03 Farads
[7]: