Finding intersection of plotted dataset and line

11 次查看(过去 30 天)
I am working with a stress strain curve at the moment and want to find the yield stress at 0.2%. I basically wanna find where the plotted dataset and the plotted line cross each other.
I feel like there should be a really easy way to do this, that is not using graph tools. Help is much appreciated and more info can be given if needed
youngs_modulus = strain([900:1600])\sigma([900:1600]);
offset_line = youngs_modulus*strain - youngs_modulus*0.002;
plot(strain, sigma)
hold on
plot(strain, offset_line)

回答(1 个)

Star Strider
Star Strider 2019-2-3
One approach:
x = 0:20; % Create Data
y1 = 15 - 3*x; % Create Line
y2 = 2*x - 20; % Create Line
yd = y1 - y2; % Subtract
x_cross = interp1(yd, x, 0); % X-Coordinate
y_cross = 15 - 3*x_cross; % Substitute Into One Equation To Get Y-Coordinate
figure
plot(x, y1, x, y2, x_cross, y_cross, '+r')
grid
text(x_cross, y_cross, sprintf('x = %.3f\ny = %.3f', x_cross, y_cross), 'VerticalAlignment','bottom')
This appears to be linear. This code just subtracts the data of one line from the other, interpolates to find the x-intersection, and uses one of the equations to calculate the y-intersection.
If you know the equations for both lines, you can use basic algebra to calculate the intersection from the slopes and intercepts.
  8 个评论
Johannes Brunsbück
Made an error the first column is strain and the second is force. Sigma is force divided by the area which is assumed to be constant
Star Strider
Star Strider 2019-2-3
The lines do not appear to cross in any meaningful way. Testing for the cross using:
yd = sigma - offset_line; % Subtract
produces an irregualr area (‘strain’ ranging from 0 to 0.260) where there appears to be much oscillation. However a low-degree polynomial fit of that region indicates that the fitted line to ‘yd’ never goes below 0, so there do not appear to be any actual zero-crossings:
Finding intersection of plotted dataset and line - 2019 02 03.png
My full code —
D = dlmread('data.txt',';',3,0);
t = D(:,1);
strain = D(:,2);
force = D(:,3);
load = D(:,4);
sigma = force;
youngs_modulus = strain([900:1600])\sigma([900:1600]);
offset_line = youngs_modulus*strain - youngs_modulus*0.002;
yd = sigma - offset_line; % Subtract
zci = @(v) find(v(:).*circshift(v(:), [-1 0]) <= 0); % Returns Approximate Zero-Crossing Indices Of Argument Vector
xcidx = zci(yd); % Zero-Crossing Indices
p = polyfit(strain(1:max(xcidx)), yd(1:max(xcidx)), 3); % Smoothing Function
fv = polyval(p, strain(1:max(xcidx))); % Smoothing Function Evaluated
figure
plot(strain, sigma)
hold on
plot(strain, offset_line)
plot(strain, yd)
plot(strain(xcidx), yd(xcidx), '+r')
hold off
legend('Sigma', 'Offset Line', 'Location','NW')
xlabel('Strain')
figure
plot(strain, yd)
hold on
plot(strain(xcidx), yd(xcidx), '+r')
plot(strain(1:max(xcidx)), fv, '-g', 'Linewidth',1)
hold off
title('Intersection Region')
xlabel('Strain')
ylabel('Sigma - Offset Line')
legend('yd = sigma - offset_line', 'Zero-Crossings Detected', 'Smoothing Function', 'Location','N')
axis([0 0.3 -0.0001 0.0002])
Look through this to be certain I imported and calculated everything correctly. If I did, there is likely nothing further that I can offer.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Stress and Strain 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by