Matlab 显示两条曲线的交点

Matlab 显示两条曲线的交点,matlab,graph,plot,intersection,Matlab,Graph,Plot,Intersection,如果我有两个由两个不同方程式定义的图: x = 0:0.01:30; y1 = x .^2 + 2; y2 = x .^3 ; 我把它们描绘成 plot(x, y1, x, y2); 如何通过编程在交点周围获得一个小圆环(如下图所示) 您必须手动找到交点(px,py): idx = find(y1 - y2 < eps, 1); %// Index of coordinate in array px = x(idx); py = y1(idx); 这样,圆的尺寸不受轴和绘图的纵横比的

如果我有两个由两个不同方程式定义的图:

x = 0:0.01:30;
y1 = x .^2 + 2;
y2 = x .^3 ;
我把它们描绘成

plot(x, y1, x, y2);
如何通过编程在交点周围获得一个小圆环(如下图所示)


您必须手动找到交点(px,py):

idx = find(y1 - y2 < eps, 1); %// Index of coordinate in array
px = x(idx);
py = y1(idx);
这样,圆的尺寸不受轴和绘图的纵横比的影响

例子
x=0:0.01:30;
y1=x.^2+2;
y2=x.^3;
%//寻找交点
idx=find(y1-y2
这将生成以下曲线图:

@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

在您的示例中,当您有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 首先可以使用

yy2 = interp1(x2, y2, x1);
然后申请

idx = find(abs(y1 - yy2) == min(abs(y1 - yy2)));
xInter = x1(idx)
yInter = y1(idx) % or yy2(idx)

特别是在了解函数时,可以使用符号数学工具箱

y1 = x .^2 + 2;
y2 = x .^3 ;
syms x real
intersection=simplify(solve(y1==y2))

使用
vpa(交叉点)
将其转换为数字,或使用
double(交叉点)
将其转换为浮点值。

最后但并非最不重要的一点,可能最干净的方法是使用命令polyxpoly

[xi,yi] = polyxpoly(x,y1,x,y2)

xi = 1.69560153754948
yi = 4.87508921229275

祝你好运

@user57:您也可以
绘制(px,py,'or','MarkerSize',18)
来绘制一个圆形的圆,而不管该图的纵横比。@Jonas非常好!我没有想到要炸掉这个记号笔,这肯定更好!如果你不介意的话,我在回答中加入了这个。不,我当然不介意。我很高兴你愿意更新你的答案。很好的方法。但在我的例子中,我有不同的x数组。想想同样的例子,x1=rand(1500)*4;x2=兰特(1500)*4;情节是一样的,但这种方法不起作用。现在怎么解呢?@aspirin我将一个轴插入另一个轴,这样两个图的x坐标都相同。第一行可以替换为
[~,ix]=min(abs(y1-y2))
y1 = x .^2 + 2;
y2 = x .^3 ;
syms x real
intersection=simplify(solve(y1==y2))
[xi,yi] = polyxpoly(x,y1,x,y2)

xi = 1.69560153754948
yi = 4.87508921229275