find first time where data crosses 1

24 visualizzazioni (ultimi 30 giorni)
Benjamin
Benjamin il 11 Apr 2019
Commentato: Mark Sherstan il 11 Apr 2019
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!

Risposte (2)

Mark Sherstan
Mark Sherstan il 11 Apr 2019
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 Commenti
Benjamin
Benjamin il 11 Apr 2019
Modificato: Benjamin il 11 Apr 2019
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 il 11 Apr 2019
You can use the built in function interp1 as you have a region of interest.

Accedi per commentare.


Star Strider
Star Strider il 11 Apr 2019
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.

Categorie

Scopri di più su Interpolation in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by