Local Slope and Maxima of a Curve
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Hello,
My experimental data are in GRF.mat. The curve shows the evolution of the ground reaction force for one step when a subject walk on a forceplate.
My aim is to determine the Value 1 and the Slope between 20% and 80% of this Value 1 (see attached image)
As I'm relative new in Matlab, I've really no idea how to define this Value 1, because this latter is not the same for each subject and each step.
Thanks in advance for your help,
Louise
0 Kommentare
Antworten (2)
Image Analyst
am 30 Jan. 2020
I'll solve the last part for you - the fitting once you know what value1 is:
s = load('grf.mat')
GroundReactionForce = s.GroundReactionForce;
x = 1 : length(GroundReactionForce);
plot(x, GroundReactionForce, 'b-', 'LineWidth', 2);
grid on;
fontSize = 20;
title('GroundReactionForce', 'fontSize', fontSize);
% Enlarge figure.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0.1, 0.2, 0.8, 0.7]);
% Find value1
value1 = GroundReactionForce(50); % Or however you do it.
% Get indexes that give the 20% and 80% of this
index1 = find(GroundReactionForce > 0.2 * value1, 1, 'first');
index2 = find(GroundReactionForce > 0.8 * value1, 1, 'first');
xline(index1, 'Color', 'r', 'LineWidth', 2);
xline(index2, 'Color', 'r', 'LineWidth', 2);
yline(GroundReactionForce(index1), 'Color', 'r', 'LineWidth', 2);
yline(GroundReactionForce(index2), 'Color', 'r', 'LineWidth', 2);
xLine = x(index1:index2)';
yLine = GroundReactionForce(index1:index2);
% Fit a line
coefficients = polyfit(xLine, yLine, 1);
% Get fitted values
yFit = polyval(coefficients, xLine);
% Plot fit.
hold on;
plot(xLine, yFit, 'k-', 'LineWidth', 4);
0 Kommentare
Star Strider
am 30 Jan. 2020
This should get you started:
D = load('GRF.mat');
GRF = D.GroundReactionForce; % Column Vector
t = linspace(0,1,numel(GRF)); % Create Time Vector
[cp,m,b] = ischange(GRF, 'linear', 'Threshold',1500); % Slope Changes
idx = find(cp, 3, 'first'); % Indices For First Two Slope Changes
DM = [t(idx([1 2]))' ones(2,1)]; % Design Matrix
B = [t(idx([1 2]))' ones(2,1)] \ GRF(idx([1 2])); % Estimate Regression Parameters
RLine = DM * B; % Regression Line
slope = B(1);
Value1 = [t(idx(3)) GRF(idx(3))];
figure
plot(t, GRF)
hold on
plot(t(idx), GRF(idx), '+r', 'MarkerSize',10, 'LineWidth',1.5)
plot(t(idx([1 2])), RLine, '-k', 'LineWidth',2)
hold off
grid
text(median(t(idx([1 2]))), median(GRF(idx([1 2]))), sprintf('\\leftarrow Slope = %.3f', slope), 'HorizontalAlignment','left')
text(median(t(idx(3))), median(GRF(idx(3))), sprintf('\\leftarrow Value_1 = (%.3f, %.3f)', Value1), 'HorizontalAlignment','left')
producing:
The ischange function was iuntroduced in R2017b. A similar function with different syntax is the Signal Processing Toolbox findchangepts (introduced in R2016a).
You may need to alter the arguments to ischange to make this robues to different records. These appear to work for this one.
0 Kommentare
Siehe auch
Kategorien
Mehr zu Regression Tree Ensembles finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!