# find first time where data crosses 1

54 ビュー (過去 30 日間)
Benjamin 2019 年 4 月 11 日
コメント済み: Mark Sherstan 2019 年 4 月 11 日
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 2019 年 4 月 11 日
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 件のコメント表示非表示 1 件の古いコメント
Mark Sherstan 2019 年 4 月 11 日
You can use the built in function interp1 as you have a region of interest.

サインインしてコメントする。

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.

サインインしてコメントする。

### Community Treasure Hunt

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

Start Hunting!