简体   繁体   中英

Octave - Mark zero crossings with an red X mark

Hi have made this code to plot a function.

I need to mark with an red X all the crossings between x = 0 and the blue wave line in the graph.

I have made some tries but with '-xr' in the plot function but it places X marks out of the crossings.

Anyone knows how to do it. Many thanks.

Code:

% entrada
a = input('Introduza o valor de a: ');
% ficheiro fonte para a função
raizes; 
% chamada à função
x = 0:.1:50;
or = x;
or(:) = 0;
h = @(x) cos(x);
g = @(x) exp(a*x)-1;
f = @(x) h(x) - g(x);
zeros = fzero(f,0);
plot(x,f(x));
hold on
plot(zeros,f(zeros),'-xr')
hold off

Graph (it only marks one zero, i need all the zero crossings):

在此处输入图片说明

As mentioned in the comments above, you need to look for the zeros of your function before you can plot them. You can do this mathematically (in this case set f(x) = g(x) and solve for x) or you can do this analytically with something like fsolve .

If you read the documentation for fsolve , you will see that it searches for the zero closest to the provided x0 if passed a scalar or the first zero if passed an interval. What we can do for a quick attempt at a solution is to pass our x values into fsolve as initial guesses and filter out the unique values.

% Set up sample data
a = .05;
x = 0:.1:50;

% Set up equations
h = @(x) cos(x);
g = @(x) exp(a*x)-1;
f = @(x) h(x) - g(x);

% Find zeros of f(x)
crossingpoints = zeros(length(x), 1); % Initialize array
for ii = 1:length(x) % Use x data points as guesses for fzero
    try
      crossingpoints(ii) = fzero(f, x(ii)); % Find zero closest to guess
    end
end
crossingpoints(crossingpoints < 0) = []; % Throw out zeros where x < 0

% Find unique zeros
tol = 10^-8;
crossingpoints = sort(crossingpoints(:)); % Sort data for easier diff
temp = false(size(crossingpoints)); % Initialize testing array

% Find where the difference between 'zeros' is less than or equal to the
% tolerance and throw them out
temp(1:end-1) = abs(diff(crossingpoints)) <= tol; 
crossingpoints(temp) = [];

% Sometimes catches beginning of the data set, filter it out if this happens
if abs(f(crossingpoints(1))) >= (0 + tol)
    crossingpoints(1) = [];
end

% Plot data
plot(x, f(x))
hold on
plot(crossingpoints, f(crossingpoints), 'rx')
hold off
grid on
axis([0 20 -2 2]);

Which gives us the following:

好极了

Note that due to errors arising from floating point arithmetic we have to utilize a tolerance to filter our zeros rather than utilizing a function like unique .

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