1 lower bound exceeds the corresponding upper bound. error

I'm using the malbat Example_DischargePulseEstimation.m file to peform battey parameter estimation. I'm using my own data
pulse discharge data, when I run the code, It does pulse idetification steps successfully, but it's getting stuck at this step which corresponds to the line 74 in the code.
% Perform the comparison
psObj.Pulse(PulsesToTest).compareRelaxationTau();
And it's showing this error
Any help will be really appreciated.

4 commentaires

Here is my full code
%
% Copyright 2016-2018 The MathWorks, Inc.
%
% Using MathWorks tools, estimation techniques, and measured lithium-ion
% or lead acid battery data, you can generate parameters for the
% Equivalent Circuit Battery block. The Equivalent Circuit Battery
% block implements a resistor-capacitor (RC) circuit battery with open
% circuit voltage, series resistance, and 1 through N RC pairs. The
% number of RC pairs reflects the number of time constants that
% characterize the battery transients. Typically, the number of RC pairs
% ranges from 1 through 5.
%% Step 1: Load and Preprocess Data
%
% Create a Pulse Sequence object, which represents a pulse sequence
% experiment
psObj = Battery.PulseSequence;
disp(psObj)
% Load in data
% Specify the file name
FileName = 'isothermardischargedata.mat';
% Read the raw data
[time,voltage,current] = Battery.loadDataFromMatFile(FileName);
% Add the data to the PulseSequence2
psObj.addData(time,voltage,current);
% Review the data
psObj.plot();
% Break up the data into Battery.Pulse objects
%
% Create the Pulse objects within the PulseSequence. This creates a
% parameter object that contains look-up tables of the correct size, given
% the number of pulses
psObj.createPulses(...
'CurrentOnThreshold',0.1,... %minimum current magnitude to identify pulse events
'NumRCBranches',2,... %how many RC pairs in the model
'RCBranchesUse2TimeConstants',false,... %do RC pairs have different time constant for discharge and rest?
'PreBufferSamples',10,... %how many samples to include before the current pulse starts
'PostBufferSamples',15); %how many samples to include after the next pulse starts
% Specify the Simulink model that matches the number of RC branches and
% time constants:
psObj.ModelName = 'BatteryEstim2RC_PTBS';
% Plot the identified pulses in the data
psObj.plotIdentifiedPulses();
%Note: if for some reason we want to exclude some of the pulses, you can do
%something like this:
%IndexToRemove=[10,11,13,14,16,17,19,20,22,23,25,26,28,29,30,31,33,34,36,37,39,40,42,43,45,46,48,49,51,52];
%psObj.removePulses(IndexToRemove);
%psObj.plotIdentifiedPulses();
%% Step 2: Determine the Number of RC Pairs
%
% This step helps us decide how many RC pairs should be used in the model.
% More RC pairs add complexity and might over-fit the data. Too few
% increases the fit error. Note: If you decide to change the number of
% pairs, you need to rerun createPulses above and change NumRCBranches to
% the new value.
% Pick a pulse near the beginning, middle, and end. Note: you could run all
% of them if you want.
PulsesToTest = [1 floor(psObj.NumPulses/2), psObj.NumPulses-1];
% Perform the comparison
psObj.Pulse(PulsesToTest).compareRelaxationTau();
%% Step 3: Estimate Parameters
% Set settings
% Pull out the parameters. Only update parameters once because it changes
% the history each time they update.
Params = psObj.Parameters;
% Set Em constraints and initial guesses (or don't and try the defaults)
Params.Em(:) = 3;
Params.EmMin(:) = 2.4;
Params.EmMax(:) = 3.7;
% Set R0 constraints and initial guesses (or don't and try the defaults)
Params.R0(:) = 0.00032;
Params.R0Min(:) = 0.0001;
Params.R0Max(:) = 0.0005;
% Set Tx constraints and initial guesses. It is important to default each
% time constant Tx to different values, otherwise the optimizer may not
% pull them apart.
Params.Tx(1,:,:) = 5;
Params.Tx(2,:,:) = 50;
%Params.Tx(3,:,:) = 200;
Params.TxMin(1,:,:) = 1;
Params.TxMax(1,:,:) = 50;
Params.TxMin(2,:,:) = 20;
Params.TxMax(2,:,:) = 1000;
%5Params.TxMin(3,:,:) = 100;
%Params.TxMax(3,:,:) = 3500; %don't set this bigger than the relaxation time available
% Set Rx constraints and initial guesses (or don't and try the defaults)
% Params.Rx(:) = 0.01;
% Params.RxMin(:) = 0.0001;
% Params.RxMax(:) = 0.5;
% Update parameters
psObj.Parameters = Params;
% Estimate initial Em and R0 values
%
% This step inspects the voltage immediately before and after the current
% is applied and removed at the start and end of each pulse. It uses that
% for a raw calculation estimating what the open-circuit voltage (Em) and
% the series resistance R0 should be.
psObj.estimateInitialEmR0(...
'SetEmConstraints',false,... %Update EmMin or EmMax values based on what we learn here
'EstimateEm',true,... %Keep this on to perform Em estimates
'EstimateR0',true); %Keep this on to perform R0 estimates
% Plot results
psObj.plotLatestParameters();
% Get initial Tx (Tau) values
%
% This step performs curve fitting on the pulse relaxation to estimate the
% RC time constant at each SOC.
psObj.estimateInitialTau(...
'UpdateEndingEm',false,... %Keep this on to update Em estimates at the end of relaxations, based on the curve fit
'ShowPlots',true,... %Set this true if you want to see plots while this runs
'ReusePlotFigure',true,... %Set this true to overwrite the plots in the same figure
'UseLoadData',false,... %Set this true if you want to estimate Time constants from the load part of the pulse, instead of relaxation
'PlotDelay',0.5); %Set this to add delay so you can see the plots
% Plot results
psObj.plotLatestParameters(); %See what the parameters look like so far
psObj.plotSimulationResults(); %See what the result looks like so far
%
% Get initial Em and Rx values using a linear system approach - pulse by
% pulse
%
% This step takes the data for each pulse and treats it as a linear system
% It attempts to fit the Rx values for each RC branch. Optionally, you can
% allow it to adjust the Em and R0 values, and if these are adjusted, you
% also have the option whether to retain the optimized values of these or
% to discard them.
psObj.estimateInitialEmRx(...
'IgnoreRelaxation',false,... %Set this true if you want to ignore the relaxation periods during this step
'ShowPlots',true,... %Set this true if you want to see plots while this runs
'ShowBeforePlots',true,... %Set this true if you want to see the 'before' value on the plots
'PlotDelay',0.5,... %Set this to add delay so you can see the plots
'EstimateEm',true,... %Set this true to allow the optimizer to change Em further in this step
'RetainEm',true,... %Set this true keep any changes made to Em in this step
'EstimateR0',true,... %Set this true to allow the optimizer to change R0 further in this step
'RetainR0',true); %Set this true keep any changes made to R0 in this step
% Plot results
psObj.plotLatestParameters(); %See what the parameters look like so far
psObj.plotSimulationResults(); %See what the result looks like so far
% Perform SDO Estimation
SDOOptimizeOptions = sdo.OptimizeOptions(...
'OptimizedModel',psObj.ModelName,...
'Method','lsqnonlin',...
'UseParallel','always');
psObj.estimateParameters(...
'CarryParamToNextPulse',true,... %Set this true to use the final parameter values from the prior pulse and SOC as initial values for the next pulse and SOC
'SDOOptimizeOptions',SDOOptimizeOptions,... %Specify the SDO options object
'ShowPlots',true,... %Set this true if you want to see plots while this runs
'EstimateEm',true,... %Set this true to allow the optimizer to change Em further in this step
'RetainEm',true,... %Set this true keep any changes made to Em in this step
'EstimateR0',true,... %Set this true to allow the optimizer to change R0 further in this step
'RetainR0',true); %Set this true keep any changes made to R0 in this step
% Plot results
psObj.plotLatestParameters(); %See what the parameters look like so far
psObj.plotSimulationResults(); %See what the result looks like so far
%% Step 4: Set Equivalent Circuit Battery Block Parameters
%
% The experiment was run at ambient temperature (303°K) only. Repeat
% the tables across the operating temperature range. If the discharge
% experiment was run at 2 different constant temperatures, then include
% these in the tables below.
EmPrime = repmat(Em,2,1)';
R0Prime = repmat(R0,2,1)';
SOC_LUTPrime = SOC_LUT;
TempPrime = [303 315.15];
CapacityAhPrime = [CapacityAh CapacityAh];
R1Prime = repmat(Rx(1,:),2,1)';
C1Prime = repmat(Tx(1,:)./Rx(1,:),2,1)';
R2Prime = repmat(Rx(2,:),2,1)';
C2Prime = repmat(Tx(2,:)./Rx(2,:),2,1)';
%R3Prime = repmat(Rx(3,:),2,1)';
%C3Prime = repmat(Tx(3,:)./Rx(3,:),2,1)';
open_system('BatteryEstim2RC_PTBS_EQ');
Hello, anyone to give some hint ? It will be really appreciated
It seems that there are wrong bounds when the iFit function gets used. While you do not call the iFit function yourself, maybe your data is not suitable and thus the error occours.
Thanks, I'll have a look.

Réponses (0)

Cette question est clôturée.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by