Skip to content

Commit

Permalink
publish release v2.0.3
Browse files Browse the repository at this point in the history
  • Loading branch information
teasit committed May 18, 2023
1 parent 13e528f commit c9b4438
Show file tree
Hide file tree
Showing 9 changed files with 80 additions and 24 deletions.
9 changes: 5 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Changelog

- FIX: Definition of enumeration "MagicFormulaVersion" caused unnecessary
dependency to Simulink, so it had to be installed for MATLAB-only.
- NEW: Automatic unit tests on GitHub; this tells you which MATLAB releases
are compatible.
- CHANGED: input handling of "VX" was not ideal; now has more fallback levels
- CHANGED: Fitter settings are not stored as `optim.options.SolverOptions` but as struct.
This is easier to handle when storing settings in the global MATLAB `settings()`.
- FIX: parser handling of FSAE TTC MAT files
- improved error handling
8 changes: 4 additions & 4 deletions ToolboxPackager.prj
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<deployment-project plugin="plugin.toolbox" plugin-version="1.0">
<configuration build-checksum="1575047207" file="C:\Users\Tom\Documents\magic-formula-tyre-library\ToolboxPackager.prj" location="C:\Users\Tom\Documents\magic-formula-tyre-library" name="ToolboxPackager" target="target.toolbox" target-name="Package Toolbox">
<configuration build-checksum="1575047207" file="C:\Users\Tom\Documents\magic-formula-tyre-tool\src\magic-formula-tyre-library\ToolboxPackager.prj" location="C:\Users\Tom\Documents\magic-formula-tyre-tool\src\magic-formula-tyre-library" name="ToolboxPackager" target="target.toolbox" target-name="Package Toolbox">
<param.appname>MagicFormulaTyreLibrary</param.appname>
<param.authnamewatermark>Tom Teasdale</param.authnamewatermark>
<param.email>[email protected]</param.email>
<param.company />
<param.summary>MATLAB library for Magic Formula Tyre Modeling</param.summary>
<param.description />
<param.screenshot>${PROJECT_ROOT}\doc\images\toolboximage.png</param.screenshot>
<param.version>2.0.2</param.version>
<param.version>2.0.3</param.version>
<param.output>${PROJECT_ROOT}\MagicFormulaTyreLibrary.mltbx</param.output>
<param.products.name>
<item>MATLAB</item>
Expand Down Expand Up @@ -131,11 +131,11 @@ sandbox</param.exclude.filters>
<fileset.depfun.excluded />
<fileset.package />
<build-deliverables>
<file location="${PROJECT_ROOT}" name="MagicFormulaTyreLibrary.mltbx" optional="false">C:\Users\Tom\Documents\magic-formula-tyre-library\MagicFormulaTyreLibrary.mltbx</file>
<file location="${PROJECT_ROOT}" name="MagicFormulaTyreLibrary.mltbx" optional="false">C:\Users\Tom\Documents\magic-formula-tyre-tool\src\magic-formula-tyre-library\MagicFormulaTyreLibrary.mltbx</file>
</build-deliverables>
<workflow />
<matlab>
<root>C:\Program Files\MATLAB\R2021a</root>
<root>C:\Program Files\MATLAB\R2022b</root>
<toolboxes />
</matlab>
<platform>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info>
<Category UUID="FileClassCategory">
<Label UUID="design"/>
</Category>
</Info>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8'?>
<Info location="EmptyMeasurementChannel.m" type="File"/>
18 changes: 18 additions & 0 deletions src/+magicformula/+exceptions/EmptyMeasurementChannel.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
classdef (Hidden) EmptyMeasurementChannel < MException
properties (SetAccess = private)
Channel char
end
methods
function obj = EmptyMeasurementChannel(channelName)
arguments
channelName char
end
errId = 'MagicFormulaTyreLibrary:EmptyMeasurementChannel';
msgtext = sprintf(...
'Measurement channel "%s" is empty.', channelName);
obj@MException(errId, msgtext)
obj.Channel = channelName;
end
end
end

28 changes: 21 additions & 7 deletions src/+magicformula/+v61/Fitter.m
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@
FitModes magicformula.FitMode

%Solver options. Set max iterations, function evaluations etc.
Options optim.options.SolverOptions = optimoptions('fmincon', ...
'Display', 'iter-detailed')
Options struct = magicformula.v61.Fitter.initOptimizerOptions()
end
properties (SetAccess = protected)
%Fitted parameter values, updated after each Fit-Mode solve.
Expand Down Expand Up @@ -87,6 +86,7 @@ function run(fitter)
fitmode magicformula.FitMode
end
import magicformula.exceptions.NoMeasurementForFitMode
import magicformula.exceptions.EmptyMeasurementChannel
import magicformula.exceptions.EmptyMeasurement
import magicformula.FitMode
fitter.ActiveFitMode = fitmode;
Expand All @@ -109,18 +109,24 @@ function run(fitter)
mfinputs = fitter.preprocess(measurements);
switch fitmode
case {FitMode.Fx0, FitMode.Fx}
testdata = fitter.getTestData(measurements, 'FX');
channel = 'FX';
case {FitMode.Fy0, FitMode.Fy}
testdata = fitter.getTestData(measurements, 'FYW');
channel = 'FYW';
case {FitMode.Mz0, FitMode.Mz}
testdata = fitter.getTestData(measurements, 'MZW');
channel = 'MZW';
case FitMode.Mx
testdata = fitter.getTestData(measurements, 'MXW');
channel = 'MXW';
case FitMode.My
testdata = fitter.getTestData(measurements, 'MYW');
channel = 'MYW';
case FitMode.Fz
error('Fitmode ''%s'' not yet implemented', fitmode)
end

testdata = fitter.getTestData(measurements, channel);
if isempty(testdata)
e = EmptyMeasurementChannel(channel);
throw(e)
end

costFun = @(x) fitter.costFun(x,p,mfinputs,testdata,fitmode);
convert2fittable = @magicformula.v61.Fitter.convert2fittable;
Expand Down Expand Up @@ -447,6 +453,14 @@ function verifyHasMandatoryParameters(fitter, fitmode)
end
end
end
function opts = initOptimizerOptions()
opts = optimset('fmincon');
opts.MaxIter = 1000;
opts.MaxFunEvals = 3000;
opts.Algorithm = 'interior-point';
opts.UseParallel = false;
opts.Display = 'iter-detailed';
end
function params = appendFitted(params,x,fitmode)
arguments
params magicformula.Parameters
Expand Down
2 changes: 1 addition & 1 deletion src/+magicformula/InputArgumentParser.m
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
addOptional(parser,'FZ',[],isValidNumericVector);
addOptional(parser,'IP',[],isValidNumericVector);
addOptional(parser,'IA',0,isValidNumericVector);
addOptional(parser,'VX',0,isValidNumericVector);
addOptional(parser,'VX',[],isValidNumericVector);
addOptional(parser,'side',[],isValidTyreSide);
addOptional(parser,'version',[],isValidVersion);
end
Expand Down
24 changes: 18 additions & 6 deletions src/+tydex/+parsers/FSAETTC_SI_ISO_Mat.m
Original file line number Diff line number Diff line change
Expand Up @@ -122,12 +122,24 @@

dt = data.ET(2) - data.ET(1);
nMinPeakHeight = options.MinPeakTime/dt;
[~, locs.FZW] = findpeaks([counts.FZW(2) counts.FZW counts.FZW(end-1)], ...
'MinPeakHeight', nMinPeakHeight);
[~, locs.INFLPRES] = findpeaks([counts.INFLPRES(2) counts.INFLPRES counts.INFLPRES(end-1)], ...
'MinPeakHeight', nMinPeakHeight);
[~, locs.INCLANGL] = findpeaks([counts.INCLANGL(2) counts.INCLANGL counts.INCLANGL(end-1)], ...
'MinPeakHeight', nMinPeakHeight);
if numel(counts.FZW) > 1
[~, locs.FZW] = findpeaks([counts.FZW(2) counts.FZW counts.FZW(end-1)], ...
'MinPeakHeight', nMinPeakHeight);
else
locs.FZW = 1;
end
if numel(counts.INFLPRES) > 1
[~, locs.INFLPRES] = findpeaks([counts.INFLPRES(2) counts.INFLPRES counts.INFLPRES(end-1)], ...
'MinPeakHeight', nMinPeakHeight);
else
locs.INFLPRES = 1;
end
if numel(counts.INCLANGL) > 1
[~, locs.INCLANGL] = findpeaks([counts.INCLANGL(2) counts.INCLANGL counts.INCLANGL(end-1)], ...
'MinPeakHeight', nMinPeakHeight);
else
locs.INCLANGL = 1;
end
if isDriveBrakeTest
[~, locs.SLIPANGL] = findpeaks([counts.SLIPANGL(2) counts.SLIPANGL counts.SLIPANGL(end-1)], ...
'MinPeakHeight', nMinPeakHeight);
Expand Down
7 changes: 5 additions & 2 deletions src/magicformula.m
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
function [params,SX,SA,FZ,IP,IA,VX,side,version] = parseInputs(...
params,SX,SA,varargin)
if coder.target('MATLAB')
parser = magicformula.InputArgumentParser();
parser = magicformula.InputArgumentParser;
parser.parse(params,SX,SA,varargin{:})

results = parser.Results;
Expand Down Expand Up @@ -118,7 +118,10 @@
if isempty(VX)
VX = params.LONGVL;
if isempty(VX)
VX = 10;
VX = params.VXLOW;
if isempty(VX)
VX = 10;
end
end
end

Expand Down

0 comments on commit c9b4438

Please sign in to comment.