如果我有两个不同方程定义的两个图:
x = 0:0.01:30;
y1 = x .^2 + 2;
y2 = x .^3 ;
我将它们绘制为
plot(x, y1, x, y2);
如何以编程方式在交叉点周围获得一个小环(如下图所示)?
答案 0 :(得分:11)
您必须手动找到交点(p x ,p y ):
idx = find(y1 - y2 < eps, 1); %// Index of coordinate in array
px = x(idx);
py = y1(idx);
请记住,我们在浮点表示中比较两个数字,因此我们必须设置容差而不是y1 == y2
。我选择它为eps
,但由你来决定。
要围绕此点绘制一个圆,您可以计算其点然后绘制它们,但更好的方法是使用一个爆炸的圆形标记绘制一个点(对于此建议可以归功于Jonas) :
plot(px, py, 'ro', 'MarkerSize', 18)
这样,圆的尺寸不受曲线的轴和纵横比的影响。
x = 0:0.01:30;
y1 = x .^ 2 + 2;
y2 = x .^ 3;
%// Find point of intersection
idx = find(y1 - y2 < eps, 1);
px = x(idx);
py = y1(idx);
figure
plot(x, y1, x, y2, px, py, 'ro', 'MarkerSize', 18)
axis([0 10 0 10])
这应该产生以下情节:
答案 1 :(得分:2)
在您的示例中,当您有x,y1和y2时 你能做的是
idx = find(abs(y1 - y2) == min(abs(y1 - y2)));
xInter = x(idx)
yInter = y1(idx) % or y2(idx)
如果你有x1,y1和x2,y2,其中x1~ = x2 您可以先使用
进行1D插值yy2 = interp1(x2, y2, x1);
然后申请
idx = find(abs(y1 - yy2) == min(abs(y1 - yy2)));
xInter = x1(idx)
yInter = y1(idx) % or yy2(idx)
答案 2 :(得分:1)
@EitanT的优秀帖子,但是我想用一种不同的(自动的)方式来找到交集(假设有一个并且图表表现得很好)。
这是我们的出发点:
x = 0:0.01:30;
y1 = x .^2 + 2;
y2 = x .^3 ;
首先,我们检查这些值是否完全相等,对于非浮点非离散情况,这应该足够了:
idx = find(y1==y2)
如果它们从未被记录为完全相等,则如果一个超过另一个,则会发生交叉,因此我们会看到差异:
if isempty(idx)
d = y1-y2;
% At the moment of crossing, the sign will change:
s = diff(sign(d));
% Now just find the point where it changes
f = find(s,1);
end
为了在没有附加变量的紧凑形式中总结这一点,我建议使用:
idx = find(y1==y2)
if isempty(idx)
idx = find(diff(sign(y1-y2)),1)
end
答案 3 :(得分:1)
特别是在了解函数时,可以使用符号数学工具箱。
y1 = x .^2 + 2;
y2 = x .^3 ;
syms x real
intersection=simplify(solve(y1==y2))
使用vpa(intersection)
将其转换为数字或double(intersection)
将其转换为浮点值。
答案 4 :(得分:0)
最后但并非最不重要的,也许最干净的方法是命令 polyxpoly :
[xi,yi] = polyxpoly(x,y1,x,y2)
xi = 1.69560153754948
yi = 4.87508921229275
祝你好运!