find first time where data crosses 1

48 次查看(过去 30 天)
I have data stored in variables r and f. At some point the variable f goes above 1. How can I return the value of r the FIRST time f goes above 1? Interpolation of the r-value to find where f goes above 1 may be needed to be more precise. Any help would be greatly appreciated!

回答(2 个)

Mark Sherstan
Mark Sherstan 2019-4-11
This example should help you with your data set
x = -2*pi:pi/12:2*pi;
y = 2*sin(x);
idx = find(y>1);
solution = idx(1)
fprintf("Solution at index %0.0f, x = %0.2f, y = %0.2f\n",solution,x(solution),y(solution))
figure(1)
hold on
plot(x,y)
plot(x(solution),y(solution),'*r')
  2 个评论
Benjamin
Benjamin 2019-4-11
编辑:Benjamin 2019-4-11
Does this actually interpolate though? I have this:
ix = find(y > 1, 1, 'first');
ix_r(count) = r(:,ix);
ix_r = ix_r';
but the problem is that it just returns r for when f exceeds the threshold of 1. How can I interpolate to find exactly where it would cross 1? then interpolate r
Mark Sherstan
Mark Sherstan 2019-4-11
You can use the built in function interp1 as you have a region of interest.

请先登录,再进行评论。


Star Strider
Star Strider 2019-4-11
I created ‘zci’ to do just that:
zci = @(v) find(v(:).*circshift(v(:), [-1 0]) <= 0); % Returns Approximate Zero-Crossing Indices Of Argument Vector
Then either use the interp1 function to do the interpolation, or create your own linear interpolation function:
x = 0:0.2:5; % Create Data
y = x.^2 - rand(size(x))*5; % Create Data
zci = @(v) find(v(:).*circshift(v(:), [-1 0]) <= 0); % Returns Approximate Zero-Crossing Indices Of Argument Vector
yzi = zci(y-1);
lintrp = [[x(yzi(1));x(yzi(1)+1)] ones(2,1)] \ [y(yzi(1));y(yzi(1)+1)] % Linear Interpolation
xint = (1-lintrp(2))/lintrp(1); % y=1 X-Value
figure
plot(x, y, xint, 1, '+')
grid
Experiment to get the result you want.

类别

Help CenterFile Exchange 中查找有关 Interpolation 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by