2017-05-07 1 views
0

J'ai des problèmes pour déterminer cette logique de base. Étant donné 2 fonctions: y1 et y2, tracé sur x dans MATLAB. Comment déterminez-vous les intersections en utilisant une simple instruction for loop et if else. Ces y1 et y2 ont plus d'une intersection. Je suis assez sûr qu'il me manque quelque chose dans la boucleintersection MATLAB, racines multiples

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'); 

Pourriez-vous offrir de l'aide? Je suis désolé si cela semble être une question très facile mais j'ai cherché et trouvé aucune réponse. Tout ce que j'ai trouvé est en utilisant polyval/polyfit et les goûts mais ceux-ci montrent seulement 1 intersection.

Répondre

0

Essayez de changer votre boucle à:

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 
0

Vous pouvez utiliser la fonction solve pour trouver les points d'intersection des deux courbes:

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') 

enter image description here

Si vous voulez/besoin d'utiliser for et if-else instructions, vous devez, d'abord, modifier le if cond ition dans votre code:

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

alors vous devez augmenter le nombre d'échantillons x afin de réduire la distance entre eux. Vous devez également tester différentes valeurs pour le seuil tol.

Cette approche permettra d'identifier plusieurs solutions, de sorte que vous devez également identifier, parmi ceux-là, ceux pour lesquels la différence entre les valeurs de y1 et y2 est la plus faible.

Une implémentation possible pourrait être:

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 »

+0

Merci beaucoup. – mle0312

+0

De rien. Si la réponse a résolu votre problème, vous pouvez l'accepter pour informer la communauté que le problème est résolu –