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]:
figure_0.png
[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.
figure_1.png
[4]:


p = best_params;

Printing results

[5]:
ftime.plotresults_thevenin(best_params, fitting_error);
[5]:
figure_2.png
[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]: