简体   繁体   中英

intersection MATLAB, multiple roots

I am having problems determining this basic logic. Given 2 functions: y1 and y2, plotted on x in MATLAB. How do you determine the intersections using simple for loop and if else statement. These y1 and y2 has more than one intersections. I am pretty sure that I am missing something in the loop

clc
clear
x = linspace(0,2);
y1 = 2.*x + 1;
y2 = exp(x);
tol = 0.05;
x_intercept = zeros(size(x));
y_intersect = zeros(size(x));
for i = 1:100
    if abs(y1(i) - y2(i)) == tol
        y_intersect = y2(x(i));
        x_intercept = x(i);
    end

end

plot(x,y1)
hold on
plot(x,y2)
plot(x_intercept, y_intersect,'xr');

Could you please offer help? I am sorry if this seems to be a very easy question but I have searched and found no answer. All I found is using polyval/polyfit and the likes but those only show 1 intersection.

Try changing your for loop to:

ctr=1;
for i = 1:100
    if abs(y1(i) - y2(i)) <= tol
        y_intersect(ctr) = y2(i);
        x_intercept(ctr) = x(i);
        ctr=ctr+1;
    end

end

You can use the function solve to find the points of intersection of the two curves:

clc
clear

% Define the symbolic variables
syms x y
vars=[x y]
% Define the two eqautions
equations=([2*x+1-y == 0,exp(x)-y == 0])
% Call SOLVE to find the intersection point
[sol_x,sol_y]=solve(equations,vars,'Real', true)
% Get the values of the x and y coordinates of the intersectiin points
x_inters=double(sol_x)
y_inters=double(sol_y)


% Evaluate the two functions (only to plot them) 
x = linspace(0,2);
y1 = 2.*x + 1;
y2 = exp(x);
plot(x,y1)
hold on
plot(x,y2)
% Add the intersection points
plot(x_inters,y_inters,'or','markerfacecolor','r')

在此处输入图片说明

If you want / need to use for and if-else statements, you need to, first, modify the if condition in you code:

if abs(y1(i) - y2(i)) <= tol

then you have to increment the number of samples x in order to reduce the distance between them.

Also you have to test different values for the threshold tol .

This approach will identify several solutions, so you shouls also identify, among then, the ones for which the difference between the values of y1 and y2 is the lower.

A possible implementation could be:

clc
clear

% x = linspace(0,2);
% Define the x samaples
x=0:.001:2
y1 = 2.*x + 1;
y2 = exp(x);
% tol = 0.05;
tol = 0.001;
x_intercept = zeros(size(x));
% y_intersect = zeros(size(x));
y1_intersect = zeros(size(x));
y2_intersect = zeros(size(x));
% Initialize the counters 
cnt=0;
once=0;
% Initialize the minimun_difference
min_diff=999;
% for i = 1:100
% Loop over the xsamples
for i = 1:length(x)
   %     if abs(y1(i) - y2(i)) == tol
   y1_y2_diff=abs(y1(i) - y2(i));
   if(y1_y2_diff <= tol)
      % If the difference is lower than the threshold, set the flag to
      % increment the number of solutions
      if(~once)
         cnt=cnt+1;
         once=1;
      end
      % Store the values for the minimum difference
      if(y1_y2_diff <= min_diff)
         min_diff=y1_y2_diff;
         y1_intersect(cnt) = y1(i);
         y2_intersect(cnt) = y2(i);
         x_intercept(cnt) = x(i);
      end
   else
      % Rese the flag
      min_diff=999;
      once=0;
   end
end

plot(x,y1)
hold on
plot(x,y2)
% plot(x_intercept, y_intersect,'xr');
plot(x_intercept(1:cnt), y1_intersect(1:cnt),'xr');
plot(x_intercept(1:cnt), y2_intersect(1:cnt),'dr');

Hope this helps,

Qapla'

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