From 135739b8aff646ba013041ca528daf9fd741a87c Mon Sep 17 00:00:00 2001 From: Pengtao Xie Date: Thu, 4 Jan 2024 16:50:05 +0100 Subject: [PATCH 1/2] PT:average absoulte residuals --- scripts/createFit.m | 40 ++++++++++++++++++++++++++++ scripts/similarities.m | 26 +++++++++++++++--- scripts/similarities2.m | 58 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 scripts/createFit.m create mode 100644 scripts/similarities2.m diff --git a/scripts/createFit.m b/scripts/createFit.m new file mode 100644 index 0000000..74854fe --- /dev/null +++ b/scripts/createFit.m @@ -0,0 +1,40 @@ +function [fitresult, gof] = createFit(SA, FY) +%CREATEFIT(SA,FY) +% Create a fit. +% +% Data for 'untitled fit 1' fit: +% X Input: SA +% Y Output: FY +% Output: +% fitresult : a fit object representing the fit. +% gof : structure with goodness-of fit info. +% +% See also FIT, CFIT, SFIT. + +% Auto-generated by MATLAB on 04-Jan-2024 14:49:41 + + +%% Fit: 'untitled fit 1'. +[xData, yData] = prepareCurveData( SA, FY ); + +% Set up fittype and options. +ft = fittype( 'fourier8' ); +opts = fitoptions( 'Method', 'NonlinearLeastSquares' ); +opts.Display = 'Off'; +opts.MaxFunEvals = 100000; +opts.MaxIter = 50000; +opts.StartPoint = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7.29927003160889]; + +% Fit model to data. +[fitresult, gof] = fit( xData, yData, ft, opts ); + +% % Plot fit with data. +% figure( 'Name', 'untitled fit 1' ); +% h = plot( fitresult, xData, yData ); +% legend( h, 'FY vs. SA', 'untitled fit 1', 'Location', 'NorthEast', 'Interpreter', 'none' ); +% % Label axes +% xlabel( 'SA', 'Interpreter', 'none' ); +% ylabel( 'FY', 'Interpreter', 'none' ); +% grid on + + diff --git a/scripts/similarities.m b/scripts/similarities.m index ed0a591..84def03 100644 --- a/scripts/similarities.m +++ b/scripts/similarities.m @@ -1,6 +1,7 @@ %% please open Magic Formular APP first clear -n = 20; % <=60 +n = 20 +mkdir('similarityData'); %% directoryPath = "..\sorted_data"; subdirectories = getSubdirectories(directoryPath); @@ -13,7 +14,7 @@ subdirectories_list = contents([contents.isdir] & ~ismember({contents.name}, {'. % Extract and display the names of the subdirectories subdirectoryNames = {subdirectories_list.name}; -%% +%% figure() for i=1:length(subdirectories) @@ -23,6 +24,7 @@ for i=1:length(subdirectories) measurement = measurements(n); [SX,SA,FZ,IP,IA,VX,FX,FY,MZ,MY,MX,W,T] = unpack(measurement); + FY = smoothdata(FY, "gaussian",100); if i < length(subdirectories)/3 plot(SA, FY, 'LineWidth', 1) elseif i <= length(subdirectories)/3*2 @@ -30,9 +32,27 @@ for i=1:length(subdirectories) else plot(SA, FY, '-.','LineWidth', 1) end + SAA{i} = SA; + FYY{i} = FY; hold on end legend(subdirectoryNames{:}) title("Similarities, n=",n) xlabel("Slip Angle") -ylabel("FY") \ No newline at end of file +ylabel("FY") +%% without plot +for n=1:60 + for i=1:length(subdirectories) + fileMeasurement = fullfile("..\sorted_data", subdirectories{i}, "\cornering.mat"); + parser = tydex.parsers.FSAETTC_SI_ISO_Mat(); + measurements = parser.run(fileMeasurement); + measurement = measurements(n); + + [SX,SA,FZ,IP,IA,VX,FX,FY,MZ,MY,MX,W,T] = unpack(measurement); + FY = smoothdata(FY, "gaussian",100); + SAA{i} = SA; + FYY{i} = FY; + end + file_name = ['similarityData\nEqu' num2str(n) '.mat']; + save(file_name, 'SAA', 'FYY'); +end diff --git a/scripts/similarities2.m b/scripts/similarities2.m new file mode 100644 index 0000000..28f90b8 --- /dev/null +++ b/scripts/similarities2.m @@ -0,0 +1,58 @@ +clear; +clc; +% Use the dir function to get information about files and directories +directoryPath = ".\similarityData"; + +% Get a list of all files in the directory +files = dir(fullfile(directoryPath, '*.mat')); % You can adjust the file extension as needed + +% Extract file names +fileNames = {files.name}; + +for n=1:length(fileNames) + % fit the curve of 43075 , 8 inch + filePath = fullfile(directoryPath, fileNames(n)); + load(filePath) + [fitresult, gof] = createFit(SAA{8},FYY{8}); + residual = []; + + % Evaluate the fitted curves + for i=1:length(SAA) + y_fit = fitresult(SAA{i}); + % Calculate residuals + residual = [residual, mean(abs(FYY{i} - y_fit))]; + end + residuals{n} = residual; +end + +for i=1:length(residual) + residuals_sum{i} = 0; + num = length(fileNames); + for j=1:length(fileNames) + if isnan(residuals{j}(i)) + num = num - 1; + residuals{j}(i) = 0; + end + residuals_sum{i} = residuals{j}(i) + residuals_sum{i}; + end + residuals_mean{i} = residuals_sum{i}/num; +end +% figure() +% idx = linspace(1,length(SAA),length(SAA)); +% for i=1:length(fileNames) +% plot(idx, residuals{i}, "-*") +% hold on; +% end +% title("Residuials") +% legend(fileNames) +% xlabel("order of the tires(8 is our traget tire)") + +figure() +idx = linspace(1,length(SAA),length(SAA)); +y = cell2mat(residuals_mean) +plot(idx, y, "-*") +title("Average Absolute Residuials") +legend(fileNames) +xlabel("order of the tires(8 is our traget tire)") +xticks(idx) +grid on \ No newline at end of file From 96459e2b8f05314f30054bee9a971b9dfe17225b Mon Sep 17 00:00:00 2001 From: Pengtao Xie Date: Thu, 4 Jan 2024 21:11:59 +0100 Subject: [PATCH 2/2] PT: plot to compare. Add Median und Mode --- scripts/similarities.m | 2 +- scripts/similarities2.m | 86 +++++++++++++++++++++++++++-------------- 2 files changed, 57 insertions(+), 31 deletions(-) diff --git a/scripts/similarities.m b/scripts/similarities.m index 84def03..a164687 100644 --- a/scripts/similarities.m +++ b/scripts/similarities.m @@ -1,6 +1,6 @@ %% please open Magic Formular APP first clear -n = 20 +n = 20; mkdir('similarityData'); %% directoryPath = "..\sorted_data"; diff --git a/scripts/similarities2.m b/scripts/similarities2.m index 28f90b8..baabba9 100644 --- a/scripts/similarities2.m +++ b/scripts/similarities2.m @@ -12,47 +12,73 @@ fileNames = {files.name}; for n=1:length(fileNames) % fit the curve of 43075 , 8 inch filePath = fullfile(directoryPath, fileNames(n)); - load(filePath) + load(filePath); [fitresult, gof] = createFit(SAA{8},FYY{8}); - residual = []; - % Evaluate the fitted curves - for i=1:length(SAA) - y_fit = fitresult(SAA{i}); + for tire=1:length(SAA) + y_fit = fitresult(SAA{tire}); % Calculate residuals - residual = [residual, mean(abs(FYY{i} - y_fit))]; + residuals{tire}{n} = abs(FYY{tire} - fitresult(SAA{tire})); end - residuals{n} = residual; end -for i=1:length(residual) - residuals_sum{i} = 0; - num = length(fileNames); - for j=1:length(fileNames) - if isnan(residuals{j}(i)) - num = num - 1; - residuals{j}(i) = 0; - end - residuals_sum{i} = residuals{j}(i) + residuals_sum{i}; +for tire=1:length(SAA) + residuals_one_tire = []; + for n=1:length(fileNames) + residuals_one_tire = [residuals_one_tire; residuals{tire}{n}]; end - residuals_mean{i} = residuals_sum{i}/num; + residuals_tire{tire} = residuals_one_tire; end -% figure() -% idx = linspace(1,length(SAA),length(SAA)); -% for i=1:length(fileNames) -% plot(idx, residuals{i}, "-*") -% hold on; -% end -% title("Residuials") -% legend(fileNames) -% xlabel("order of the tires(8 is our traget tire)") +%% mean +for tire=1:length(SAA) + num = 0; + % each tire under 60 measurement conditions + for i=1:length(residuals_tire{tire}) + if not(isnan(residuals_tire{tire}(i))) + num = num + 1; + else + residuals_tire{tire}(i) = 0; + end + end + residuals_mean{tire} = sum(residuals_tire{tire})/num; +end +%% median +for tire=1:length(SAA) + residuals_median{tire} = median(residuals_tire{tire}); +end +%% mode +for tire=1:length(SAA) + residuals_mode{tire} = mode(residuals_tire{tire}); +end + +%% plots +idx = linspace(1,length(SAA),length(SAA)); figure() -idx = linspace(1,length(SAA),length(SAA)); -y = cell2mat(residuals_mean) +subplot(311) +y = cell2mat(residuals_mean); plot(idx, y, "-*") title("Average Absolute Residuials") -legend(fileNames) -xlabel("order of the tires(8 is our traget tire)") +xlabel("Order of the tires(8 is our traget tire)") +ylabel("in 1") +xticks(idx) +grid on + +subplot(312) +y = cell2mat(residuals_median); +plot(idx, y, "-o") +title("Median of the Absolute Residuials") +xlabel("Order of the tires(8 is our traget tire)") +ylabel("in 1") +xticks(idx) +grid on + + +subplot(313) +y = cell2mat(residuals_mode); +plot(idx, y, "-o") +title("Mode of the Absolute Residuials") +xlabel("Order of the tires(8 is our traget tire)") +ylabel("in 1") xticks(idx) grid on \ No newline at end of file