交集 MATLAB,多根
intersection MATLAB, multiple roots
我在确定这个基本逻辑时遇到问题。给定 2 个函数:y1 和 y2,在 MATLAB 中绘制在 x 上。如何使用简单的 for 循环和 if else 语句来确定交叉点。这些 y1 和 y2 有多个交点。我很确定我在循环中遗漏了一些东西
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');
你能帮忙吗?如果这似乎是一个非常简单的问题,我很抱歉,但我已经搜索过但没有找到答案。我发现的只是使用 polyval/polyfit 之类的东西,但那些只显示 1 个交集。
尝试将 for 循环更改为:
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
您可以使用函数solve求两条曲线的交点:
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')
如果你想/需要使用 for
和 if-else
语句,你需要首先修改代码中的 if
条件:
if abs(y1(i) - y2(i)) <= tol
然后你必须增加样本数量x
以减少它们之间的距离。
您还必须测试阈值的不同值 tol
。
这种方法将确定几个解决方案,因此您还应该确定其中 y1
和 y2
的值之间的差异较小的那些。
一个可能的实现可能是:
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');
希望这对您有所帮助,
Qapla'
我在确定这个基本逻辑时遇到问题。给定 2 个函数:y1 和 y2,在 MATLAB 中绘制在 x 上。如何使用简单的 for 循环和 if else 语句来确定交叉点。这些 y1 和 y2 有多个交点。我很确定我在循环中遗漏了一些东西
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');
你能帮忙吗?如果这似乎是一个非常简单的问题,我很抱歉,但我已经搜索过但没有找到答案。我发现的只是使用 polyval/polyfit 之类的东西,但那些只显示 1 个交集。
尝试将 for 循环更改为:
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
您可以使用函数solve求两条曲线的交点:
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')
如果你想/需要使用 for
和 if-else
语句,你需要首先修改代码中的 if
条件:
if abs(y1(i) - y2(i)) <= tol
然后你必须增加样本数量x
以减少它们之间的距离。
您还必须测试阈值的不同值 tol
。
这种方法将确定几个解决方案,因此您还应该确定其中 y1
和 y2
的值之间的差异较小的那些。
一个可能的实现可能是:
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');
希望这对您有所帮助,
Qapla'