简体   繁体   中英

Extracting x value given y threshold from polyfit plot (Matlab)

在此处输入图片说明 在此处输入图片说明

As shown by the solid and dashed line, I'd like to create a function where I set a threshold for y (Intensity) from that threshold it gives me corresponding x value (dashed line). Very simple but my while statement is off. Any help would be much appreciated!

%% Curve fit plotting %%

x1 = timeStamps(1:60); % taking timestamps from 1 - 120 given smoothed y1 values 
y1 = smooth(tic_lin(1:60),'sgolay',1);


% Find coefficients for polynomial (order = 4 and 6, respectively)
fitResults1 = polyfit(x1',y1, 7);

% evaluate the fitted y-values
yplot1 = polyval(fitResults1,x1');

% interpolates to find yi, the values of the underlying function Y at the points in the vector or array xi. x must be a vector. 
Time_points = interp1(yplot1, x1', yplot1);


figure( 'Name', 'Curvefit1_poly' );
h = plot(x1', y1);%smoothed-points
hold on;
plot(x1', yplot1);%polyfit points
hold on;
plot(Time_points, yplot1, '*r');%interpolated points of x given y


%given y-threshold, output x(corresponding time_point).
broken = false;

while broken == false
    if yplot1 >= 2024671226502.99
        index = find(yplot1);
        xDesired = x1(index);
        broken = true;
    else
        disp("next iteration through");
    end
end

No while loop is needed here... You can do this with logical indexing for the threshold condition and find to get the first index:

% Start with some x and y data
% x = ...
% y = ...

% Get the first index where 'y' is greater than some threshold
thresh = 10; 
idx = find( y >= thresh, 1 ); % Find 1st index where y >= thresh

% Get the x value at this index
xDesired = x( idx );

Note that xDesired will be empty if there was no y value over the threshold.


Alternatively, you already have a polynomial fit, so you could use fzero to get the x value on that polynomial for a given y (in this case your threshold).

% x = ...
% y = ...

thresh = 10;
p = polyfit( x, y, 3 ); % create polynomial fit

% Use fzero to get the root of y = a*x^n + b*x^(n-1) + ... + z when y = thresh
xDesired = fzero( @(x) polyval(p,x) - thresh, x(1) )

Note, this method may give unexpected results if the threshold is not within the range of y .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM